From c60461f49e6de627c5b92754e5707deb2a02b28a Mon Sep 17 00:00:00 2001 From: David Young Date: Tue, 2 Sep 2025 08:50:37 -0600 Subject: [PATCH] build1 --- public/404.html | 24 +- public/categories/index.xml | 4 +- .../federated-company-backgrounder/index.html | 95 +- .../docs/about-federated-computer/index.html | 281 +- .../docs/about-federated-computer/index.xml | 19 +- .../roadmap/index.html | 95 +- public/docs/example-page/index.html | 495 - .../account-management-and-billing/index.html | 1406 -- .../account-management_and-billing/index.html | 1232 -- .../index.html | 1406 -- .../authentication/index.html | 1259 -- .../account-management-and-billing/index.html | 95 +- .../billing/index.html | 208 +- .../federated-core-platform/billing/index.xml | 10 +- .../computer/index.html | 1343 -- .../core-desktop/index.html | 1343 -- .../core-mini/index.html | 1343 -- .../core-scanner/index.html | 1343 -- .../core-server/index.html | 1343 -- .../core-workflow-intelligence/index.html | 1406 -- .../index.html | 95 +- .../core-workflow-intelligence/index.html | 95 +- .../customization/index.html | 229 +- .../customization/index.xml | 31 +- .../customization/whitelabel/index.html | 95 +- .../index.html | 95 +- .../federated-core-platform/index.html | 95 +- .../federated-management/index.html | 1343 -- .../docs/federated-core-platform/index.html | 274 +- public/docs/federated-core-platform/index.xml | 8 +- .../maintenance/core-scanner/index.html | 1477 -- .../maintenance/index.html | 1489 -- .../maintenance/index.xml | 33 - .../maintenance/monitor-and-fix/index.html | 1477 -- .../maintenance/update-and-upgrade/index.html | 1477 -- .../management/core-scanner/index.html | 99 +- .../management/index.html | 146 +- .../management/index.xml | 16 +- .../management/monitor-and-fix/index.html | 99 +- .../management/update-and-upgrade/index.html | 136 +- .../monitor-and-fix/index.html | 1343 -- .../provisioner/index.html | 1343 -- .../index.html | 1456 -- .../provisioning/authentication/index.html | 128 +- .../provisioning/computer/index.html | 118 +- .../provisioning/core-desktop/index.html | 114 +- .../provisioning/core-mini/index.html | 140 +- .../provisioning/core-scanner/index.html | 1456 -- .../provisioning/core-server/index.html | 136 +- .../provisioning/dashboard/index.html | 126 +- .../federated-core-platform/index.html | 1384 -- .../provisioning/index.html | 242 +- .../provisioning/index.xml | 44 +- .../provisioning/monitor-and-fix/index.html | 1456 -- .../provisioning/provisioner/index.html | 245 +- .../provisioning/unified-messaging/index.html | 132 +- .../provisioning/unified-storage/index.html | 136 +- .../update-and-upgrade/index.html | 1456 -- .../index.html | 1480 -- .../customer-service-and-support/index.html | 95 +- .../services/federated-management/index.html | 95 +- .../services/index.html | 148 +- .../services/index.xml | 16 +- .../unified-messaging/index.html | 1406 -- .../unified-storage/index.html | 1406 -- .../update-and-upgrade/index.html | 1406 -- .../index.html | 1406 -- public/docs/index.html | 105 +- public/docs/index.xml | 10 +- ...de0e3edcb2de867604550f88815157e4ec4ddb7.js | 1 + public/docs/js/bootstrap.js | 3800 ----- public/docs/js/bundle.js | 3142 ---- ...5c6f8e44747732e2e7c7db60af9f86359bfb251.js | 8 + public/docs/js/flexsearch.bundle.js | 33 - ...5586f3f20eaead0b6089de48f9adc669cdee771.js | 1 + public/docs/overview/index.html | 95 +- public/docs/partners/index.html | 270 +- public/docs/partners/index.xml | 30 +- .../managed-service-provider/index.html | 1253 -- .../managed-service-providers/index.html | 95 +- .../partners/on-line-affiliates/index.html | 95 +- .../operators-networks-platforms/index.html | 122 +- public/docs/partners/pro-customers/index.html | 95 +- public/docs/scss/style.css | 12049 ---------------- ...e17d7232889a012f275094455861f5339ab434.css | 3 + .../docs/software-catalog/bundles/index.html | 95 +- .../federated-commerce/index.html | 95 +- .../federated-omnimedia/index.html | 95 +- public/docs/software-catalog/index.html | 268 +- public/docs/software-catalog/index.xml | 22 +- .../software-catalog/index.html | 95 +- .../about-federated-computer/index.xml | 19 - .../federated-core-platform/index.xml | 131 - public/documentation/index.xml | 19 - public/documentation/partners/index.xml | 33 - .../documentation/software-catalog/index.xml | 40 - ...s_docs_screenshot_hu_96a4be244a204161.webp | Bin 53046 -> 0 bytes .../lotusdocs_blue_theme_colour.webp | Bin 39542 -> 0 bytes .../lotusdocs_cardinal_theme_colour.webp | Bin 40344 -> 0 bytes .../screenshots/lotusdocs_dark_v0.8.webp | Bin 48742 -> 0 bytes ...ocs_google_font_demo_inter_screenshot.webp | Bin 45738 -> 0 bytes ...oogle_font_demo_lifesavers_screenshot.webp | Bin 44350 -> 0 bytes .../screenshots/lotusdocs_light_v0.8.webp | Bin 49246 -> 0 bytes public/index.html | 24 +- public/index.xml | 136 +- ...ecae9f4a4b7cb81b1652345ce618d482091a6b2.js | 1 + public/js/bootstrap.js | 885 -- public/js/bundle.js | 30 - ...8d571a26b3e2cea8da2843e8256ffc49825559c.js | 1 + public/js/image-compare.js | 1 - .../card-base-2_hu_175f5a44546d4bb4.png | Bin 34217 -> 0 bytes .../card-base-2_hu_31b032575c8c7401.png | Bin 47792 -> 0 bytes .../card-base-2_hu_6d67a1b00c964011.png | Bin 60697 -> 0 bytes .../card-base-2_hu_91f7166aabb5235b.png | Bin 34217 -> 0 bytes .../card-base-2_hu_be62d49e46818fbe.png | Bin 47646 -> 0 bytes .../card-base-2_hu_cc06f218b0207f88.png | Bin 41154 -> 0 bytes .../card-base-2_hu_f86177aaad91e4d7.png | Bin 36588 -> 0 bytes public/scss/style.css | 11033 -------------- ...3624f7b726ff56211bc8bfc0b24ae5b0a12106.css | 3 + public/sitemap.xml | 97 +- public/tags/index.xml | 4 +- ...s_2559dcb36d17cc8382d1803115bae9e1.content | 3 + ...scss_2559dcb36d17cc8382d1803115bae9e1.json | 1 + ...s_8c911ff330bb5ca9491c098c46a3173d.content | 3 + ...scss_8c911ff330bb5ca9491c098c46a3173d.json | 1 + 125 files changed, 3389 insertions(+), 73425 deletions(-) delete mode 100644 public/docs/example-page/index.html delete mode 100644 public/docs/federated-core-platform/account-management-and-billing/index.html delete mode 100644 public/docs/federated-core-platform/account-management_and-billing/index.html delete mode 100644 public/docs/federated-core-platform/adding-software-to-federated-core/index.html delete mode 100644 public/docs/federated-core-platform/authentication/index.html delete mode 100644 public/docs/federated-core-platform/computer/index.html delete mode 100644 public/docs/federated-core-platform/core-desktop/index.html delete mode 100644 public/docs/federated-core-platform/core-mini/index.html delete mode 100644 public/docs/federated-core-platform/core-scanner/index.html delete mode 100644 public/docs/federated-core-platform/core-server/index.html delete mode 100644 public/docs/federated-core-platform/core-workflow-intelligence/index.html delete mode 100644 public/docs/federated-core-platform/federated-management/index.html delete mode 100644 public/docs/federated-core-platform/maintenance/core-scanner/index.html delete mode 100644 public/docs/federated-core-platform/maintenance/index.html delete mode 100644 public/docs/federated-core-platform/maintenance/index.xml delete mode 100644 public/docs/federated-core-platform/maintenance/monitor-and-fix/index.html delete mode 100644 public/docs/federated-core-platform/maintenance/update-and-upgrade/index.html delete mode 100644 public/docs/federated-core-platform/monitor-and-fix/index.html delete mode 100644 public/docs/federated-core-platform/provisioner/index.html delete mode 100644 public/docs/federated-core-platform/provisioning/adding-software-to-federated-core/index.html delete mode 100644 public/docs/federated-core-platform/provisioning/core-scanner/index.html delete mode 100644 public/docs/federated-core-platform/provisioning/federated-core-platform/index.html delete mode 100644 public/docs/federated-core-platform/provisioning/monitor-and-fix/index.html delete mode 100644 public/docs/federated-core-platform/provisioning/update-and-upgrade/index.html delete mode 100644 public/docs/federated-core-platform/provisioning/why-open-source-projects-work-with-federated/index.html delete mode 100644 public/docs/federated-core-platform/unified-messaging/index.html delete mode 100644 public/docs/federated-core-platform/unified-storage/index.html delete mode 100644 public/docs/federated-core-platform/update-and-upgrade/index.html delete mode 100644 public/docs/federated-core-platform/why-open-source-projects-work-with-federated/index.html create mode 100644 public/docs/js/bootstrap.c7927bdd82eceb076739257add3f4b0e11379da037c07d5c7110daeb6de0e3edcb2de867604550f88815157e4ec4ddb7.js delete mode 100644 public/docs/js/bootstrap.js delete mode 100644 public/docs/js/bundle.js create mode 100644 public/docs/js/bundle.min.f738bf871acf99f047c9685619dfd0dddb34d9413e8462e16fdd002f45c6f8e44747732e2e7c7db60af9f86359bfb251.js delete mode 100644 public/docs/js/flexsearch.bundle.js create mode 100644 public/docs/js/flexsearch.bundle.min.f5159d5a2151ffbb653996ec17eaff7da4e04c286bd879fc41839d36a5586f3f20eaead0b6089de48f9adc669cdee771.js delete mode 100644 public/docs/partners/managed-service-provider/index.html delete mode 100644 public/docs/scss/style.css create mode 100644 public/docs/scss/style.min.615e280daa11bef926baef047c962047a84da05eb988d2270815010b8de17d7232889a012f275094455861f5339ab434.css delete mode 100644 public/documentation/about-federated-computer/index.xml delete mode 100644 public/documentation/federated-core-platform/index.xml delete mode 100644 public/documentation/index.xml delete mode 100644 public/documentation/partners/index.xml delete mode 100644 public/documentation/software-catalog/index.xml delete mode 100644 public/images/lotus_docs_screenshot_hu_96a4be244a204161.webp delete mode 100644 public/images/screenshots/lotusdocs_blue_theme_colour.webp delete mode 100644 public/images/screenshots/lotusdocs_cardinal_theme_colour.webp delete mode 100644 public/images/screenshots/lotusdocs_dark_v0.8.webp delete mode 100644 public/images/screenshots/lotusdocs_google_font_demo_inter_screenshot.webp delete mode 100644 public/images/screenshots/lotusdocs_google_font_demo_lifesavers_screenshot.webp delete mode 100644 public/images/screenshots/lotusdocs_light_v0.8.webp create mode 100644 public/js/bootstrap.f4edede35538f2efb186f99d61b2b4abacd0cc0d9250ca14f7a0d0456ecae9f4a4b7cb81b1652345ce618d482091a6b2.js delete mode 100644 public/js/bootstrap.js delete mode 100644 public/js/bundle.js create mode 100644 public/js/bundle.min.d26bada42aacabf0a605636aba0bce9543bb24ed6b0f215dfa05077278d571a26b3e2cea8da2843e8256ffc49825559c.js delete mode 100644 public/js/image-compare.js delete mode 100644 public/opengraph/card-base-2_hu_175f5a44546d4bb4.png delete mode 100644 public/opengraph/card-base-2_hu_31b032575c8c7401.png delete mode 100644 public/opengraph/card-base-2_hu_6d67a1b00c964011.png delete mode 100644 public/opengraph/card-base-2_hu_91f7166aabb5235b.png delete mode 100644 public/opengraph/card-base-2_hu_be62d49e46818fbe.png delete mode 100644 public/opengraph/card-base-2_hu_cc06f218b0207f88.png delete mode 100644 public/opengraph/card-base-2_hu_f86177aaad91e4d7.png delete mode 100644 public/scss/style.css create mode 100644 public/scss/style.min.ff5f0e22cd7e20982a3d2e83cf871143339614937ecdc7f7c3a7b7bfe83624f7b726ff56211bc8bfc0b24ae5b0a12106.css create mode 100644 resources/_gen/assets/docs/scss/style.scss_2559dcb36d17cc8382d1803115bae9e1.content create mode 100644 resources/_gen/assets/docs/scss/style.scss_2559dcb36d17cc8382d1803115bae9e1.json create mode 100644 resources/_gen/assets/scss/style.scss_8c911ff330bb5ca9491c098c46a3173d.content create mode 100644 resources/_gen/assets/scss/style.scss_8c911ff330bb5ca9491c098c46a3173d.json diff --git a/public/404.html b/public/404.html index 3e82fc7..2ccbc37 100644 --- a/public/404.html +++ b/public/404.html @@ -33,10 +33,9 @@ - + Federated Computer Enterprise - @@ -45,12 +44,12 @@ - - - - - - + + + + + + @@ -70,7 +69,7 @@ - + @@ -78,7 +77,10 @@ - + + + + @@ -175,7 +177,7 @@ - + diff --git a/public/categories/index.xml b/public/categories/index.xml index 9f459a9..d0c0ffa 100644 --- a/public/categories/index.xml +++ b/public/categories/index.xml @@ -2,10 +2,10 @@ Categories on Federated Computer Enterprise - http://localhost:1313/categories/ + http://enterprise.federated.computer/categories/ Recent content in Categories on Federated Computer Enterprise Hugo en-us - + diff --git a/public/docs/about-federated-computer/federated-company-backgrounder/index.html b/public/docs/about-federated-computer/federated-company-backgrounder/index.html index 1269adc..4c9afb7 100644 --- a/public/docs/about-federated-computer/federated-company-backgrounder/index.html +++ b/public/docs/about-federated-computer/federated-company-backgrounder/index.html @@ -14,10 +14,9 @@ - + Federated Company Backgrounder | Federated Computer Enterprise - @@ -25,20 +24,20 @@ - - - - - - + + + + + + - + - + @@ -50,8 +49,9 @@ Team linkWe are a small group of pioneers. We include founders of the cloud comp - - + + + @@ -72,7 +72,8 @@ Team linkWe are a small group of pioneers. We include founders of the cloud comp - + + @@ -95,7 +96,7 @@ Team linkWe are a small group of pioneers. We include founders of the cloud comp
  • - + article Overview @@ -115,7 +116,7 @@ Team linkWe are a small group of pioneers. We include founders of the cloud comp -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -130,47 +131,47 @@ Team linkWe are a small group of pioneers. We include founders of the cloud comp -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -190,17 +191,17 @@ Team linkWe are a small group of pioneers. We include founders of the cloud comp -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -220,22 +221,22 @@ Team linkWe are a small group of pioneers. We include founders of the cloud comp -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -255,7 +256,7 @@ Team linkWe are a small group of pioneers. We include founders of the cloud comp -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -275,12 +276,12 @@ Team linkWe are a small group of pioneers. We include founders of the cloud comp -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -305,22 +306,22 @@ Team linkWe are a small group of pioneers. We include founders of the cloud comp -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -340,22 +341,22 @@ Team linkWe are a small group of pioneers. We include founders of the cloud comp -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -375,12 +376,12 @@ Team linkWe are a small group of pioneers. We include founders of the cloud comp -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -686,10 +687,12 @@ Team linkWe are a small group of pioneers. We include founders of the cloud comp - + + + - + diff --git a/public/docs/about-federated-computer/index.html b/public/docs/about-federated-computer/index.html index 5ed91a4..f1e02e7 100644 --- a/public/docs/about-federated-computer/index.html +++ b/public/docs/about-federated-computer/index.html @@ -14,10 +14,9 @@ - + About Federated Computer | Federated Computer Enterprise - @@ -25,17 +24,17 @@ - - - - - - + + + + + + - - + + @@ -46,8 +45,9 @@ - - + + + @@ -68,7 +68,8 @@ - + + @@ -91,7 +92,7 @@
  • - + article Overview @@ -111,7 +112,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -126,52 +127,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • - - - - -
  • Why Open Source Projects Work With Federated
  • +
  • Core Desktop
  • @@ -184,24 +180,24 @@
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • + + + + +
  • Whitelabel
  • @@ -251,7 +252,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -271,12 +272,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -301,22 +302,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -336,22 +337,22 @@ -
  • Operators Networks Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -371,7 +372,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -554,11 +560,11 @@
    @@ -623,10 +646,12 @@ - + + + - + @@ -1006,6 +1031,13 @@ + + + + + + + @@ -1061,8 +1093,8 @@ id: 4 , href: "\/docs\/federated-core-platform\/provisioning\/provisioner\/", title: "Provisioner", - description: "", - content: "" + description: "The “Provisioner” is responsible for setting up, updating/upgrading, and tearing down Cores. It does this in an entirely stateless way communicating with either the aacount management and billing system or the management system. Naturally, there are command-line utilities and an API available to accomplish all functions.\nOrder linkWhen and order comes through the account management and billing system, a manifest is created asking for a Core to be create with the required SaaS titles. This manifest is sent to the Provisioner which then requests a virtual machine (or machines, if the manifest includes load balancing or other extended Core services), then begins to build the Core software from the manifest. You can read more about the minimal build at ", + content: "The “Provisioner” is responsible for setting up, updating/upgrading, and tearing down Cores. It does this in an entirely stateless way communicating with either the aacount management and billing system or the management system. Naturally, there are command-line utilities and an API available to accomplish all functions.\nOrder linkWhen and order comes through the account management and billing system, a manifest is created asking for a Core to be create with the required SaaS titles. This manifest is sent to the Provisioner which then requests a virtual machine (or machines, if the manifest includes load balancing or other extended Core services), then begins to build the Core software from the manifest. You can read more about the minimal build at " } ); index.add( @@ -1070,8 +1102,8 @@ id: 5 , href: "\/docs\/federated-core-platform\/provisioning\/core-server\/", title: "Core Server", - description: "", - content: "" + description: "Federated maintains its own Linux distribution for the specific purpose of control of the types and versions of software used in virtual machine. This descrease the surface area for attacks, increased maintainability for the Cores built on top, and assures our systems work on X64 and Arm (example: Ampere) systems as well as fully supporting IPv4 and IPv6 for cloud deployment.\nCore Server is based on OpenMandriva a Linux distribution lead by Federated Computer’s chief systems engineer. OpenMandriva is base on Fedora, in part.\n", + content: "Federated maintains its own Linux distribution for the specific purpose of control of the types and versions of software used in virtual machine. This descrease the surface area for attacks, increased maintainability for the Cores built on top, and assures our systems work on X64 and Arm (example: Ampere) systems as well as fully supporting IPv4 and IPv6 for cloud deployment.\nCore Server is based on OpenMandriva a Linux distribution lead by Federated Computer’s chief systems engineer. OpenMandriva is base on Fedora, in part.\n" } ); index.add( @@ -1079,8 +1111,8 @@ id: 6 , href: "\/docs\/federated-core-platform\/provisioning\/core-mini\/", title: "Core Mini", - description: "", - content: "" + description: "Core Mini is the minimal install of software on a Core before adding additional SaaS and any scaling services (e.g. load balancing). These are the fundamental services used by ever other SaaS application.\nTraefik linkFirewall and network management.\nPowerDNS linkDomain name service.\nAuthelia linkOIDC authentication provider.\nMail Services linkSMTP and IMAP services.\nPostgresql linkDatabase engine for SaaS services requiring Postgresql.\nMariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely be obsolete in the coming months.\n", + content: "Core Mini is the minimal install of software on a Core before adding additional SaaS and any scaling services (e.g. load balancing). These are the fundamental services used by ever other SaaS application.\nTraefik linkFirewall and network management.\nPowerDNS linkDomain name service.\nAuthelia linkOIDC authentication provider.\nMail Services linkSMTP and IMAP services.\nPostgresql linkDatabase engine for SaaS services requiring Postgresql.\nMariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely be obsolete in the coming months.\nAutodiscovery linkService for providing autodiscovery for SaaS service that use autodiscovery services. Example: email and calendar client configuration.\nFederated Monitors linkSoftare for communicating with Federated management systems.\n" } ); index.add( @@ -1088,8 +1120,8 @@ id: 7 , href: "\/docs\/federated-core-platform\/provisioning\/unified-storage\/", title: "Unified Storage", - description: "", - content: "" + description: "Every SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage\nEvery SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage.\n", + content: "Every SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage\nEvery SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage.\n" } ); index.add( @@ -1097,8 +1129,8 @@ id: 8 , href: "\/docs\/federated-core-platform\/provisioning\/unified-messaging\/", title: "Unified Messaging", - description: "", - content: "" + description: "Federated Core includes three systems for messaging.\nEmail linkThere is a full-featured IMAP/SMTP service available for any needed notifications to users.\nContainer-to-Container linkThere is a service for container-to-container communication allowing for complete workflow creation between SaaS applications when the native APIs are not enough.\nOptional: Matrix linkIf the Matrix service is loaded, you can use it like a message-bus for application notification to users.\n", + content: "Federated Core includes three systems for messaging.\nEmail linkThere is a full-featured IMAP/SMTP service available for any needed notifications to users.\nContainer-to-Container linkThere is a service for container-to-container communication allowing for complete workflow creation between SaaS applications when the native APIs are not enough.\nOptional: Matrix linkIf the Matrix service is loaded, you can use it like a message-bus for application notification to users.\n" } ); index.add( @@ -1106,8 +1138,8 @@ id: 9 , href: "\/docs\/federated-core-platform\/provisioning\/authentication\/", title: "Authentication", - description: "", - content: "" + description: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\n", + content: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\nLDAP services can be exposed to network outside of Core to be used by other systems that use LDAP. And example would be a collection of Windows, MacOS, Linux desktop computers where you want users to log in to this machines using their Core credentials from LDAP. You could also use Core LDAP for other software systems where you want to use a central user repository for access control such as virtual desktop environments.\nCore LDAP support users and groups. For example, you can delegate administrative access controls to certain users in Nextcloud using LDAP.\nLDAP is managed through the Federated Core app “Panel”.\nOIDC linkSingle-sign on is provided in Federated Core Platform by Authelia. This allows, for example, a customer to log in to one open source SaaS application in a browser and to automatically log in to other Core applications in the same browser. It also allows the user to log out of all applications, in the same way.\nFederated Core applications default to OIDC authentication when the application supports it. Most do. Some applications only support OIDC with a premium upgrade (also supported), but a few don’t (yet) support OIDC or only support authentication using OIDC providers such as Google, etc. Federated plans to provide work arounds for all applications to use OIDC and have done this successfully for some (eg. cal.com).\n" } ); index.add( @@ -1115,8 +1147,8 @@ id: 10 , href: "\/docs\/federated-core-platform\/provisioning\/dashboard\/", title: "Dashboard", - description: "", - content: "" + description: "Federated Dashboard is a simple launcher for users. It shows the applications available, a link to helpful documentation, and a note about user management. There are significant improvements planned for Dashboard in the coming months as it transitions to Federated ", + content: "Federated Dashboard is a simple launcher for users. It shows the applications available, a link to helpful documentation, and a note about user management. There are significant improvements planned for Dashboard in the coming months as it transitions to Federated " } ); index.add( @@ -1124,15 +1156,15 @@ id: 11 , href: "\/docs\/federated-core-platform\/provisioning\/computer\/", title: "Computer", - description: "", - content: "" + description: "Federated “Computer” is a new application coming in Fall, 2025 delivering a fully customizable front-end experience for Core users. It is a bookmarking application extended to support reminders, folders for watching applications, documents, events, the ability to pick up AI workloads and customizations, and more. Federated “Computer” is intended to be fully open-sourced, will work with other SaaS applications that support URLs, and will work natively on desktops, tablets, and mobile devices.\n", + content: "Federated “Computer” is a new application coming in Fall, 2025 delivering a fully customizable front-end experience for Core users. It is a bookmarking application extended to support reminders, folders for watching applications, documents, events, the ability to pick up AI workloads and customizations, and more. Federated “Computer” is intended to be fully open-sourced, will work with other SaaS applications that support URLs, and will work natively on desktops, tablets, and mobile devices.\n" } ); index.add( { id: 12 , - href: "\/docs\/federated-core-platform\/maintenance\/", - title: "Maintenance", + href: "\/docs\/federated-core-platform\/management\/", + title: "Management", description: "", content: "" } @@ -1140,28 +1172,28 @@ index.add( { id: 13 , - href: "\/docs\/federated-core-platform\/maintenance\/core-scanner\/", + href: "\/docs\/federated-core-platform\/management\/core-scanner\/", title: "Core Scanner", - description: "", - content: "" + description: "Core Scanner is a utility to examine and manage each Core on a given installation of Federated Core Platform. It allows a customer service person to examine the Core, look at all the configuration files, see any anomalies in the files, track usage of resources (CPU, RAM, storage, network), and perform tightly managed actions on the Core to take remedial steps as needed.\nEach installation of Core Scanner includes user and group priveleges so that the owner of the Federated Core Platform can look at all Cores running, but also partners can examine and manage the Cores of their customers. For example, a managed service provider may have a number of Cores for which they will want to be able to provide monitor and fix service3. Core Scanner allows them to see those Cores, only.\n", + content: "Core Scanner is a utility to examine and manage each Core on a given installation of Federated Core Platform. It allows a customer service person to examine the Core, look at all the configuration files, see any anomalies in the files, track usage of resources (CPU, RAM, storage, network), and perform tightly managed actions on the Core to take remedial steps as needed.\nEach installation of Core Scanner includes user and group priveleges so that the owner of the Federated Core Platform can look at all Cores running, but also partners can examine and manage the Cores of their customers. For example, a managed service provider may have a number of Cores for which they will want to be able to provide monitor and fix service3. Core Scanner allows them to see those Cores, only.\nCore Scanner provides the ability to “take action” on a Core with a large library of pre-defined “actions” for each Core depending on the applications installed and the reality of the Core at the time of inspection. If a Core needs more storage, for example, “actions” are brought forward suggesting remedial action to the support person. There are also actions available to compare a given Core to normative Cores.\nCore Scanner is supported by the “machine learning” functions in the " } ); index.add( { id: 14 , - href: "\/docs\/federated-core-platform\/maintenance\/update-and-upgrade\/", + href: "\/docs\/federated-core-platform\/management\/update-and-upgrade\/", title: "Update and Upgrade", - description: "", - content: "" + description: "Each Federated Core Platform installation has a Gitea respository where the software (OS, utilities, platform, open source SaaS) for the entire system is tracked. The operator of each installation is able to package those updates into regular upgrades pushed out to some/all Cores on the system, push them out individually for testing to some Cores, or schedule updates for a given list of Cores.\nSince the nature of the Federated Core Platform is delivering open source SaaS to customers, there needs to be a testing protocol set up to ensure updates are in fact needed/wanted. Federated Computer does this centrally, so operators using Federated Core Platform can know the software will “work”. However, there may be additional concerns with respect to security, other customizations that need to be tested, etc.\n", + content: "Each Federated Core Platform installation has a Gitea respository where the software (OS, utilities, platform, open source SaaS) for the entire system is tracked. The operator of each installation is able to package those updates into regular upgrades pushed out to some/all Cores on the system, push them out individually for testing to some Cores, or schedule updates for a given list of Cores.\nSince the nature of the Federated Core Platform is delivering open source SaaS to customers, there needs to be a testing protocol set up to ensure updates are in fact needed/wanted. Federated Computer does this centrally, so operators using Federated Core Platform can know the software will “work”. However, there may be additional concerns with respect to security, other customizations that need to be tested, etc.\nWhile Federated Core Platform draws much of the software from DockerHub, there are container images maintained by Federated Computer and, over time, more of the container images will come from Federated Computer rather than DockerHub. The principle reason for this is to add an additional step for quality and security.\n" } ); index.add( { id: 15 , - href: "\/docs\/federated-core-platform\/maintenance\/monitor-and-fix\/", + href: "\/docs\/federated-core-platform\/management\/monitor-and-fix\/", title: "Monitor and Fix", - description: "", - content: "" + description: "Every Core running on an installation of Federated Core Platform, every application running on every Core, and every service not an application running on every Core, is monitored in real time to ensure it runs, has the system resources needed, and provides customers with the best experience. If there are anomalies detected, alerts are created and can be sent to the local Matrix server, and Federated Monitor and Fix system attempts to solve the problem using patterns and the service definitions in place.\n", + content: "Every Core running on an installation of Federated Core Platform, every application running on every Core, and every service not an application running on every Core, is monitored in real time to ensure it runs, has the system resources needed, and provides customers with the best experience. If there are anomalies detected, alerts are created and can be sent to the local Matrix server, and Federated Monitor and Fix system attempts to solve the problem using patterns and the service definitions in place.\nFor example, if a customer with a 500GB storage limit for their Files service decides to upload 3TB of files, the File service will fail, and Monitor and Fix will attempt to fix the problem by adding for block storage (if that service is available AND the service definition allows that to happen without customer “approval”).\nThe Monitor and Fix system continues to get better and better as we see more patterns and improve the paths to successful amelioration of problems.\n" } ); index.add( @@ -1178,8 +1210,8 @@ id: 17 , href: "\/docs\/federated-core-platform\/customization\/core-workflow-intelligence\/", title: "Core Workflow Intelligence", - description: "", - content: "" + description: "Federated will be delivering in early 2026 an “on premise” solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.\n", + content: "Federated will be delivering in early 2026 an “on premise” solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.\nWe believe these sorts of “software intelligence” are very important for the overall success of customers using Federated Core and are central to the idea that open source is the best means to achieve maximum flexibility and business differentiation from software. Further, we believe AI is uniquely situated to provide real progress in connecting software to software for custom workflows. It need not work in “real time” but in enough time to deliver the right solution to customers reliably.\n" } ); index.add( @@ -1187,8 +1219,8 @@ id: 18 , href: "\/docs\/federated-core-platform\/customization\/adding-software-to-federated-core\/", title: "Adding Software to Federated Core", - description: "", - content: "" + description: "It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\n", + content: "It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\nIn the near future, we plan to provide a portal for projects to package and submit software for inclusion on Federated Core Platform.\n" } ); index.add( @@ -1196,13 +1228,22 @@ id: 19 , href: "\/docs\/federated-core-platform\/customization\/why-open-source-projects-work-with-federated\/", title: "Why Open Source Projects Work With Federated", - description: "", - content: "" + description: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\n", + content: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\nYou can think of an open source SaaS developer as an extension of your Federated Core Platform continually adding value to your overall go-to-market. These developers think in the same way. While their principle concern is the success and completeness of their software, they recognize the value for customers when their software is integrated into a total solution with great user management, unified storage and messaging, and the many other conveniences and services offered by Federated Core Platform.\nAll pricing for software is done outside of Federated Core Platform giving each installation the flexibility to build use cases and go-to-market solutions apart from the technology offerings.\n" } ); index.add( { id: 20 , + href: "\/docs\/federated-core-platform\/customization\/whitelabel\/", + title: "Whitelabel", + description: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n", + content: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n" + } + ); + index.add( + { + id: 21 , href: "\/docs\/federated-core-platform\/billing\/", title: "Billing", description: "", @@ -1211,16 +1252,16 @@ ); index.add( { - id: 21 , + id: 22 , href: "\/docs\/federated-core-platform\/billing\/account-management-and-billing\/", title: "Account Management and Billing", - description: "", - content: "" + description: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n", + content: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n" } ); index.add( { - id: 22 , + id: 23 , href: "\/docs\/federated-core-platform\/services\/", title: "Services", description: "", @@ -1229,38 +1270,29 @@ ); index.add( { - id: 23 , + id: 24 , href: "\/docs\/federated-core-platform\/services\/federated-management\/", title: "Federated Management", - description: "", - content: "" - } - ); - index.add( - { - id: 24 , - href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", - title: "Customer Service and Support", - description: "", - content: "" + description: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\n", + content: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\nManagement to Train linkWe can also, depending on the level of competency of your current team, work to run the Federated Core Platform for you while training your team to take over at a date certain in the future. We have found this to be the most successl approach to training rather that working on the particulars of how to run Federated Core Platform in the abstract.\n" } ); index.add( { id: 25 , - href: "\/docs\/federated-core-platform\/provisioning\/core-desktop\/", - title: "Core Desktop", - description: "", - content: "" + href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", + title: "Customer Service and Support", + description: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\n", + content: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\nChannel Partners (Managed Service Providers) linkWe can also support your channel partners. In our experience, channel partners such as managed service providers are great ways to sell software and services but each requires significant support and explanation to best support their own customers. Federated Computer has extensive operation experience providing this service to partners and we can bring our experience, content, processes to your installation of Federated Core Platform.\nOther Operators linkIt isn’t unusual for Federated Core Platform to be sold to other “operators” who don’t want their own installation. We have done this for fiber companies, universities, and other large enterprises. Federated Computer can support your own go-to-market plans with support, content, and programs designed to find and close big opportunities such as other operators.\n" } ); index.add( { id: 26 , - href: "\/docs\/federated-core-platform\/provisioning\/why-open-source-projects-work-with-federated\/", - title: "Why Open Source Projects Work With Federated", - description: "", - content: "" + href: "\/docs\/federated-core-platform\/provisioning\/core-desktop\/", + title: "Core Desktop", + description: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\n", + content: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\nCore Desktop can also be installed on laptops and other mobile computers so that on-the-go team members can get a computer that “just works” without the requirements for network access.\n" } ); index.add( @@ -1321,9 +1353,9 @@ { id: 33 , href: "\/docs\/partners\/operators-networks-platforms\/", - title: "Operators Networks Platforms", - description: "Text\n", - content: "Text\n" + title: "Operators, Networks, Platforms", + description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( @@ -1331,8 +1363,8 @@ id: 34 , href: "\/docs\/partners\/managed-service-providers\/", title: "Managed Service Provider", - description: "", - content: "" + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( @@ -1340,8 +1372,8 @@ id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1349,8 +1381,8 @@ id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1367,13 +1399,22 @@ id: 38 , href: "\/docs\/about-federated-computer\/federated-company-backgrounder\/", title: "Federated Company Backgrounder", - description: "", - content: "" + description: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\n", + content: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\nOpen Source linkThere’s no reason to use expensive, proprietary, privacy-destroying SaaS software. But in the past, running open-source software required lots of technical knowledge. Federated Computer makes it easy for any business to adopt open-source.\nWe are great stewards of the benefits of open-source. Our company actively contributes both financially and with code to a number of open-source projects offered in Federated Core and Federated Plus including Castopod, Bookstack, Headscale, Matrix, and OpenMandriva. We do all the work for you to ensure open-source projects are integrated, work well together, and provide you with the right value.\nDavid Young linkOur CEO and founder, David Young, has a long history working with impactful startups including Joyent. At Joyent he was responsible for leading the team that invented and patented cloud computing, containers-as-a-service, cloud operating system, infrastructure-as-a-service, node.js, native-web-apps as desktop/mobile apps (what became Electron) and many more fundamental cloud innovations.\nDavid’s companies have been backed by the biggest investors including Dell, Intel; and he has brought ground-breaking solutions to cloud pioneers such as Dell, Telefonica, Singtel, working for important early cloud adopters such as Twitter, Facebook Developer Platform, Linkedin, and many, many others.\n" } ); index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/about-federated-computer/index.xml b/public/docs/about-federated-computer/index.xml index 9eb59f7..5f67909 100644 --- a/public/docs/about-federated-computer/index.xml +++ b/public/docs/about-federated-computer/index.xml @@ -2,18 +2,25 @@ About Federated Computer on Federated Computer Enterprise - http://localhost:1313/docs/about-federated-computer/ + http://enterprise.federated.computer/docs/about-federated-computer/ Recent content in About Federated Computer on Federated Computer Enterprise Hugo en-us - Mon, 25 Aug 2025 12:40:08 -0600 - + Thu, 28 Aug 2025 13:41:48 -0600 + Federated Company Backgrounder - http://localhost:1313/docs/about-federated-computer/federated-company-backgrounder/ + http://enterprise.federated.computer/docs/about-federated-computer/federated-company-backgrounder/ Mon, 25 Aug 2025 12:40:08 -0600 - http://localhost:1313/docs/about-federated-computer/federated-company-backgrounder/ - + http://enterprise.federated.computer/docs/about-federated-computer/federated-company-backgrounder/ + <p>Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, &ldquo;free,&rdquo; and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.</p> <h3 id="team">Team <a href="#team" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>We are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don&rsquo;t suck away all our money, data, and sovereignty. We are FedQ&rsquo;d in Colorado Springs, Colorado, USA with colleagues around the globe.</p> + + + Roadmap + http://enterprise.federated.computer/docs/about-federated-computer/roadmap/ + Thu, 28 Aug 2025 13:41:48 -0600 + http://enterprise.federated.computer/docs/about-federated-computer/roadmap/ + <p>Federated Computer is working on the following initiatives for the benefit of our customers and partners:</p> <h3 id="fall-2025">Fall, 2025 <a href="#fall-2025" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p><strong>Computer.</strong> Our take on a central web application for managing all SaaS workloads, dates, clients, messages.</p> <h3 id="first-half-2026">First Half, 2026 <a href="#first-half-2026" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p><strong>Core Workflow Intelligence.</strong> AI services for building application workflows combined between 2 or more open source SaaS applications.</p> <h3 id="second-half-2026">Second Half, 2026 <a href="#second-half-2026" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p><strong>On Premise Provisioning of Federated Cores.</strong> This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.</p> diff --git a/public/docs/about-federated-computer/roadmap/index.html b/public/docs/about-federated-computer/roadmap/index.html index f5b55cb..eb1c487 100644 --- a/public/docs/about-federated-computer/roadmap/index.html +++ b/public/docs/about-federated-computer/roadmap/index.html @@ -14,10 +14,9 @@ - + Roadmap | Federated Computer Enterprise - @@ -25,22 +24,22 @@ - - - - - - + + + + + + - + - + - + + + @@ -76,7 +76,8 @@ Second Half, 2026 linkOn Premise Provisioning of Federated Cores. This will supp - + + @@ -99,7 +100,7 @@ Second Half, 2026 linkOn Premise Provisioning of Federated Cores. This will supp
  • - + article Overview @@ -119,7 +120,7 @@ Second Half, 2026 linkOn Premise Provisioning of Federated Cores. This will supp -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -134,47 +135,47 @@ Second Half, 2026 linkOn Premise Provisioning of Federated Cores. This will supp -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -194,17 +195,17 @@ Second Half, 2026 linkOn Premise Provisioning of Federated Cores. This will supp -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -224,22 +225,22 @@ Second Half, 2026 linkOn Premise Provisioning of Federated Cores. This will supp -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -259,7 +260,7 @@ Second Half, 2026 linkOn Premise Provisioning of Federated Cores. This will supp -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -279,12 +280,12 @@ Second Half, 2026 linkOn Premise Provisioning of Federated Cores. This will supp -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -309,22 +310,22 @@ Second Half, 2026 linkOn Premise Provisioning of Federated Cores. This will supp -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -344,22 +345,22 @@ Second Half, 2026 linkOn Premise Provisioning of Federated Cores. This will supp -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -379,12 +380,12 @@ Second Half, 2026 linkOn Premise Provisioning of Federated Cores. This will supp -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -677,10 +678,12 @@ Second Half, 2026 linkOn Premise Provisioning of Federated Cores. This will supp - + + + - + diff --git a/public/docs/example-page/index.html b/public/docs/example-page/index.html deleted file mode 100644 index ff35751..0000000 --- a/public/docs/example-page/index.html +++ /dev/null @@ -1,495 +0,0 @@ - - - - - - - - - - - - - - - - - Hello | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    -
      - -
    - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - -

    - Hello - - DRAFT - -

    -
    - -
    - - -
    - -
    - - - - -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/account-management-and-billing/index.html b/public/docs/federated-core-platform/account-management-and-billing/index.html deleted file mode 100644 index bc8c5aa..0000000 --- a/public/docs/federated-core-platform/account-management-and-billing/index.html +++ /dev/null @@ -1,1406 +0,0 @@ - - - - - - - - - - - - - - - - - - - Account Management and Billing | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Account Management and Billing - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/account-management_and-billing/index.html b/public/docs/federated-core-platform/account-management_and-billing/index.html deleted file mode 100644 index fb3be36..0000000 --- a/public/docs/federated-core-platform/account-management_and-billing/index.html +++ /dev/null @@ -1,1232 +0,0 @@ - - - - - - - - - - - - - - - - - - - Account Management_and Billing | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Account Management_and Billing - - DRAFT - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/adding-software-to-federated-core/index.html b/public/docs/federated-core-platform/adding-software-to-federated-core/index.html deleted file mode 100644 index 4d85a5b..0000000 --- a/public/docs/federated-core-platform/adding-software-to-federated-core/index.html +++ /dev/null @@ -1,1406 +0,0 @@ - - - - - - - - - - - - - - - - - - - Adding Software to Federated Core | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Adding Software to Federated Core - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/authentication/index.html b/public/docs/federated-core-platform/authentication/index.html deleted file mode 100644 index 64c6a78..0000000 --- a/public/docs/federated-core-platform/authentication/index.html +++ /dev/null @@ -1,1259 +0,0 @@ - - - - - - - - - - - - - - - - - - - Authentication | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Authentication - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/billing/account-management-and-billing/index.html b/public/docs/federated-core-platform/billing/account-management-and-billing/index.html index 2370a00..49566ac 100644 --- a/public/docs/federated-core-platform/billing/account-management-and-billing/index.html +++ b/public/docs/federated-core-platform/billing/account-management-and-billing/index.html @@ -14,10 +14,9 @@ - + Account Management and Billing | Federated Computer Enterprise - @@ -25,20 +24,20 @@ - - - - - - + + + + + + - + - + @@ -50,8 +49,9 @@ The billing engine is the accounting engine that tallies all the various product - - + + + @@ -72,7 +72,8 @@ The billing engine is the accounting engine that tallies all the various product - + + @@ -95,7 +96,7 @@ The billing engine is the accounting engine that tallies all the various product
  • - + article Overview @@ -115,7 +116,7 @@ The billing engine is the accounting engine that tallies all the various product -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -130,47 +131,47 @@ The billing engine is the accounting engine that tallies all the various product -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -190,17 +191,17 @@ The billing engine is the accounting engine that tallies all the various product -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -220,22 +221,22 @@ The billing engine is the accounting engine that tallies all the various product -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -255,7 +256,7 @@ The billing engine is the accounting engine that tallies all the various product -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -275,12 +276,12 @@ The billing engine is the accounting engine that tallies all the various product -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -305,22 +306,22 @@ The billing engine is the accounting engine that tallies all the various product -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -340,22 +341,22 @@ The billing engine is the accounting engine that tallies all the various product -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -375,12 +376,12 @@ The billing engine is the accounting engine that tallies all the various product -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -662,10 +663,12 @@ The billing engine is the accounting engine that tallies all the various product - + + + - + diff --git a/public/docs/federated-core-platform/billing/index.html b/public/docs/federated-core-platform/billing/index.html index 5f38739..713d650 100644 --- a/public/docs/federated-core-platform/billing/index.html +++ b/public/docs/federated-core-platform/billing/index.html @@ -14,10 +14,9 @@ - + Billing | Federated Computer Enterprise - @@ -25,17 +24,17 @@ - - - - - - + + + + + + - - + + @@ -46,8 +45,9 @@ - - + + + @@ -68,7 +68,8 @@ - + + @@ -91,7 +92,7 @@
  • - + article Overview @@ -111,7 +112,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -126,52 +127,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • - - - - -
  • Why Open Source Projects Work With Federated
  • +
  • Core Desktop
  • @@ -191,17 +187,17 @@ -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -221,17 +217,22 @@ -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • + + + + +
  • Whitelabel
  • @@ -251,7 +252,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -271,12 +272,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -301,22 +302,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -336,22 +337,22 @@ -
  • Operators Networks Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -371,7 +372,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -562,7 +568,7 @@
    - +
    article @@ -631,10 +637,12 @@ - + + + - + @@ -1014,6 +1022,13 @@ + + + + + + + @@ -1115,7 +1130,7 @@ href: "\/docs\/federated-core-platform\/provisioning\/authentication\/", title: "Authentication", description: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\n", - content: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\nLDAP services can be exposed to network outside of Core to be used by other systems that use LDAP. And example would be a collection of Windows, MacOS, Linux desktop computers where you want users to log in to this machines using their Core credentials from LDAP. You could also use Core LDAP for other software systems where you want to use a central user repository for access control.\nCore LDAP support users and groups. For example, you can delegate administrative access controls to certain users in Nextcloud using LDAP.\nLDAP is managed through the Federated Core app “Panel”.\nOIDC linkSingle-sign on is provided in Federated Core Platform by Authelia. This allows, for example, a customer to log in to one open source SaaS application in a browser and to automatically log in to other Core applications in the same browser. It also allows the user to log out of all applications, in the same way.\nFederated Core applications default to OIDC authentication when the application supports it. Most do. Some applications only support OIDC with a premium upgrade (also supported), but a few don’t (yet) support OIDC or only support authentication using OIDC providers such as Google, etc. Federated plans to provide work arounds for all applications to use OIDC and have done this successfully for some (eg. cal.com).\n" + content: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\nLDAP services can be exposed to network outside of Core to be used by other systems that use LDAP. And example would be a collection of Windows, MacOS, Linux desktop computers where you want users to log in to this machines using their Core credentials from LDAP. You could also use Core LDAP for other software systems where you want to use a central user repository for access control such as virtual desktop environments.\nCore LDAP support users and groups. For example, you can delegate administrative access controls to certain users in Nextcloud using LDAP.\nLDAP is managed through the Federated Core app “Panel”.\nOIDC linkSingle-sign on is provided in Federated Core Platform by Authelia. This allows, for example, a customer to log in to one open source SaaS application in a browser and to automatically log in to other Core applications in the same browser. It also allows the user to log out of all applications, in the same way.\nFederated Core applications default to OIDC authentication when the application supports it. Most do. Some applications only support OIDC with a premium upgrade (also supported), but a few don’t (yet) support OIDC or only support authentication using OIDC providers such as Google, etc. Federated plans to provide work arounds for all applications to use OIDC and have done this successfully for some (eg. cal.com).\n" } ); index.add( @@ -1186,8 +1201,8 @@ id: 17 , href: "\/docs\/federated-core-platform\/customization\/core-workflow-intelligence\/", title: "Core Workflow Intelligence", - description: "", - content: "" + description: "Federated will be delivering in early 2026 an “on premise” solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.\n", + content: "Federated will be delivering in early 2026 an “on premise” solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.\nWe believe these sorts of “software intelligence” are very important for the overall success of customers using Federated Core and are central to the idea that open source is the best means to achieve maximum flexibility and business differentiation from software. Further, we believe AI is uniquely situated to provide real progress in connecting software to software for custom workflows. It need not work in “real time” but in enough time to deliver the right solution to customers reliably.\n" } ); index.add( @@ -1195,8 +1210,8 @@ id: 18 , href: "\/docs\/federated-core-platform\/customization\/adding-software-to-federated-core\/", title: "Adding Software to Federated Core", - description: "", - content: "" + description: "It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\n", + content: "It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\nIn the near future, we plan to provide a portal for projects to package and submit software for inclusion on Federated Core Platform.\n" } ); index.add( @@ -1204,13 +1219,22 @@ id: 19 , href: "\/docs\/federated-core-platform\/customization\/why-open-source-projects-work-with-federated\/", title: "Why Open Source Projects Work With Federated", - description: "", - content: "" + description: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\n", + content: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\nYou can think of an open source SaaS developer as an extension of your Federated Core Platform continually adding value to your overall go-to-market. These developers think in the same way. While their principle concern is the success and completeness of their software, they recognize the value for customers when their software is integrated into a total solution with great user management, unified storage and messaging, and the many other conveniences and services offered by Federated Core Platform.\nAll pricing for software is done outside of Federated Core Platform giving each installation the flexibility to build use cases and go-to-market solutions apart from the technology offerings.\n" } ); index.add( { id: 20 , + href: "\/docs\/federated-core-platform\/customization\/whitelabel\/", + title: "Whitelabel", + description: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n", + content: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n" + } + ); + index.add( + { + id: 21 , href: "\/docs\/federated-core-platform\/billing\/", title: "Billing", description: "", @@ -1219,16 +1243,16 @@ ); index.add( { - id: 21 , + id: 22 , href: "\/docs\/federated-core-platform\/billing\/account-management-and-billing\/", title: "Account Management and Billing", - description: "", - content: "" + description: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n", + content: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n" } ); index.add( { - id: 22 , + id: 23 , href: "\/docs\/federated-core-platform\/services\/", title: "Services", description: "", @@ -1237,38 +1261,29 @@ ); index.add( { - id: 23 , + id: 24 , href: "\/docs\/federated-core-platform\/services\/federated-management\/", title: "Federated Management", - description: "", - content: "" - } - ); - index.add( - { - id: 24 , - href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", - title: "Customer Service and Support", - description: "", - content: "" + description: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\n", + content: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\nManagement to Train linkWe can also, depending on the level of competency of your current team, work to run the Federated Core Platform for you while training your team to take over at a date certain in the future. We have found this to be the most successl approach to training rather that working on the particulars of how to run Federated Core Platform in the abstract.\n" } ); index.add( { id: 25 , - href: "\/docs\/federated-core-platform\/provisioning\/core-desktop\/", - title: "Core Desktop", - description: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\n", - content: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\nCore Desktop can also be installed on laptops and other mobile computers so that on-the-go team members can get a computer that “just works” without the requirements for network access.\n" + href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", + title: "Customer Service and Support", + description: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\n", + content: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\nChannel Partners (Managed Service Providers) linkWe can also support your channel partners. In our experience, channel partners such as managed service providers are great ways to sell software and services but each requires significant support and explanation to best support their own customers. Federated Computer has extensive operation experience providing this service to partners and we can bring our experience, content, processes to your installation of Federated Core Platform.\nOther Operators linkIt isn’t unusual for Federated Core Platform to be sold to other “operators” who don’t want their own installation. We have done this for fiber companies, universities, and other large enterprises. Federated Computer can support your own go-to-market plans with support, content, and programs designed to find and close big opportunities such as other operators.\n" } ); index.add( { id: 26 , - href: "\/docs\/federated-core-platform\/provisioning\/why-open-source-projects-work-with-federated\/", - title: "Why Open Source Projects Work With Federated", - description: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\n", - content: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\nIt is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\nAll pricing is done outside of Federated Core Platform.\n" + href: "\/docs\/federated-core-platform\/provisioning\/core-desktop\/", + title: "Core Desktop", + description: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\n", + content: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\nCore Desktop can also be installed on laptops and other mobile computers so that on-the-go team members can get a computer that “just works” without the requirements for network access.\n" } ); index.add( @@ -1329,9 +1344,9 @@ { id: 33 , href: "\/docs\/partners\/operators-networks-platforms\/", - title: "Operators Networks Platforms", - description: "Text\n", - content: "Text\n" + title: "Operators, Networks, Platforms", + description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( @@ -1339,8 +1354,8 @@ id: 34 , href: "\/docs\/partners\/managed-service-providers\/", title: "Managed Service Provider", - description: "", - content: "" + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( @@ -1348,8 +1363,8 @@ id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1357,8 +1372,8 @@ id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1375,13 +1390,22 @@ id: 38 , href: "\/docs\/about-federated-computer\/federated-company-backgrounder\/", title: "Federated Company Backgrounder", - description: "", - content: "" + description: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\n", + content: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\nOpen Source linkThere’s no reason to use expensive, proprietary, privacy-destroying SaaS software. But in the past, running open-source software required lots of technical knowledge. Federated Computer makes it easy for any business to adopt open-source.\nWe are great stewards of the benefits of open-source. Our company actively contributes both financially and with code to a number of open-source projects offered in Federated Core and Federated Plus including Castopod, Bookstack, Headscale, Matrix, and OpenMandriva. We do all the work for you to ensure open-source projects are integrated, work well together, and provide you with the right value.\nDavid Young linkOur CEO and founder, David Young, has a long history working with impactful startups including Joyent. At Joyent he was responsible for leading the team that invented and patented cloud computing, containers-as-a-service, cloud operating system, infrastructure-as-a-service, node.js, native-web-apps as desktop/mobile apps (what became Electron) and many more fundamental cloud innovations.\nDavid’s companies have been backed by the biggest investors including Dell, Intel; and he has brought ground-breaking solutions to cloud pioneers such as Dell, Telefonica, Singtel, working for important early cloud adopters such as Twitter, Facebook Developer Platform, Linkedin, and many, many others.\n" } ); index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/billing/index.xml b/public/docs/federated-core-platform/billing/index.xml index 9e2a040..2a0dbd4 100644 --- a/public/docs/federated-core-platform/billing/index.xml +++ b/public/docs/federated-core-platform/billing/index.xml @@ -2,18 +2,18 @@ Billing on Federated Computer Enterprise - http://localhost:1313/docs/federated-core-platform/billing/ + http://enterprise.federated.computer/docs/federated-core-platform/billing/ Recent content in Billing on Federated Computer Enterprise Hugo en-us Mon, 25 Aug 2025 12:33:38 -0600 - + Account Management and Billing - http://localhost:1313/docs/federated-core-platform/billing/account-management-and-billing/ + http://enterprise.federated.computer/docs/federated-core-platform/billing/account-management-and-billing/ Mon, 25 Aug 2025 12:33:38 -0600 - http://localhost:1313/docs/federated-core-platform/billing/account-management-and-billing/ - + http://enterprise.federated.computer/docs/federated-core-platform/billing/account-management-and-billing/ + <p>Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.</p> <p>The billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is <em>not</em> a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.</p> diff --git a/public/docs/federated-core-platform/computer/index.html b/public/docs/federated-core-platform/computer/index.html deleted file mode 100644 index f7a9423..0000000 --- a/public/docs/federated-core-platform/computer/index.html +++ /dev/null @@ -1,1343 +0,0 @@ - - - - - - - - - - - - - - - - - - - Computer | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Computer - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/core-desktop/index.html b/public/docs/federated-core-platform/core-desktop/index.html deleted file mode 100644 index f10f847..0000000 --- a/public/docs/federated-core-platform/core-desktop/index.html +++ /dev/null @@ -1,1343 +0,0 @@ - - - - - - - - - - - - - - - - - - - Core Desktop | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Core Desktop - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/core-mini/index.html b/public/docs/federated-core-platform/core-mini/index.html deleted file mode 100644 index 4662b35..0000000 --- a/public/docs/federated-core-platform/core-mini/index.html +++ /dev/null @@ -1,1343 +0,0 @@ - - - - - - - - - - - - - - - - - - - Core Mini | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Core Mini - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/core-scanner/index.html b/public/docs/federated-core-platform/core-scanner/index.html deleted file mode 100644 index a3bf1ea..0000000 --- a/public/docs/federated-core-platform/core-scanner/index.html +++ /dev/null @@ -1,1343 +0,0 @@ - - - - - - - - - - - - - - - - - - - Core Scanner | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Core Scanner - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/core-server/index.html b/public/docs/federated-core-platform/core-server/index.html deleted file mode 100644 index c62cd48..0000000 --- a/public/docs/federated-core-platform/core-server/index.html +++ /dev/null @@ -1,1343 +0,0 @@ - - - - - - - - - - - - - - - - - - - Core Server | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Core Server - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/core-workflow-intelligence/index.html b/public/docs/federated-core-platform/core-workflow-intelligence/index.html deleted file mode 100644 index 5d98eec..0000000 --- a/public/docs/federated-core-platform/core-workflow-intelligence/index.html +++ /dev/null @@ -1,1406 +0,0 @@ - - - - - - - - - - - - - - - - - - - Core Workflow Intelligence | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Core Workflow Intelligence - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/customization/adding-software-to-federated-core/index.html b/public/docs/federated-core-platform/customization/adding-software-to-federated-core/index.html index 8c82922..8483112 100644 --- a/public/docs/federated-core-platform/customization/adding-software-to-federated-core/index.html +++ b/public/docs/federated-core-platform/customization/adding-software-to-federated-core/index.html @@ -14,10 +14,9 @@ - + Adding Software to Federated Core | Federated Computer Enterprise - @@ -25,19 +24,19 @@ - - - - - - + + + + + + - + - + @@ -48,8 +47,9 @@ - - + + + @@ -70,7 +70,8 @@ - + + @@ -93,7 +94,7 @@
  • - + article Overview @@ -113,7 +114,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -128,47 +129,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -188,17 +189,17 @@ -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -218,22 +219,22 @@ -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -253,7 +254,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -273,12 +274,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -303,22 +304,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -338,22 +339,22 @@ -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -373,12 +374,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -660,10 +661,12 @@ - + + + - + diff --git a/public/docs/federated-core-platform/customization/core-workflow-intelligence/index.html b/public/docs/federated-core-platform/customization/core-workflow-intelligence/index.html index f33694f..c01fee7 100644 --- a/public/docs/federated-core-platform/customization/core-workflow-intelligence/index.html +++ b/public/docs/federated-core-platform/customization/core-workflow-intelligence/index.html @@ -14,10 +14,9 @@ - + Core Workflow Intelligence | Federated Computer Enterprise - @@ -25,19 +24,19 @@ - - - - - - + + + + + + - + - + @@ -48,8 +47,9 @@ - - + + + @@ -70,7 +70,8 @@ - + + @@ -93,7 +94,7 @@
  • - + article Overview @@ -113,7 +114,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -128,47 +129,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -188,17 +189,17 @@ -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -218,22 +219,22 @@ -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -253,7 +254,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -273,12 +274,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -303,22 +304,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -338,22 +339,22 @@ -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -373,12 +374,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -660,10 +661,12 @@ - + + + - + diff --git a/public/docs/federated-core-platform/customization/index.html b/public/docs/federated-core-platform/customization/index.html index d68357b..ed587ca 100644 --- a/public/docs/federated-core-platform/customization/index.html +++ b/public/docs/federated-core-platform/customization/index.html @@ -14,10 +14,9 @@ - + Customization | Federated Computer Enterprise - @@ -25,17 +24,17 @@ - - - - - - + + + + + + - - + + @@ -46,8 +45,9 @@ - - + + + @@ -68,7 +68,8 @@ - + + @@ -91,7 +92,7 @@
  • - + article Overview @@ -111,7 +112,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -126,52 +127,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • - - - - -
  • Why Open Source Projects Work With Federated
  • +
  • Core Desktop
  • @@ -191,17 +187,17 @@ -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -221,17 +217,22 @@ -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • + + + + +
  • Whitelabel
  • @@ -251,7 +252,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -271,12 +272,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -301,22 +302,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -336,22 +337,22 @@ -
  • Operators Networks Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -371,7 +372,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -562,7 +568,7 @@
    - +
    article @@ -579,7 +585,7 @@
    @@ -665,10 +688,12 @@ - + + + - + @@ -1048,6 +1073,13 @@ + + + + + + + @@ -1149,7 +1181,7 @@ href: "\/docs\/federated-core-platform\/provisioning\/authentication\/", title: "Authentication", description: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\n", - content: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\nLDAP services can be exposed to network outside of Core to be used by other systems that use LDAP. And example would be a collection of Windows, MacOS, Linux desktop computers where you want users to log in to this machines using their Core credentials from LDAP. You could also use Core LDAP for other software systems where you want to use a central user repository for access control.\nCore LDAP support users and groups. For example, you can delegate administrative access controls to certain users in Nextcloud using LDAP.\nLDAP is managed through the Federated Core app “Panel”.\nOIDC linkSingle-sign on is provided in Federated Core Platform by Authelia. This allows, for example, a customer to log in to one open source SaaS application in a browser and to automatically log in to other Core applications in the same browser. It also allows the user to log out of all applications, in the same way.\nFederated Core applications default to OIDC authentication when the application supports it. Most do. Some applications only support OIDC with a premium upgrade (also supported), but a few don’t (yet) support OIDC or only support authentication using OIDC providers such as Google, etc. Federated plans to provide work arounds for all applications to use OIDC and have done this successfully for some (eg. cal.com).\n" + content: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\nLDAP services can be exposed to network outside of Core to be used by other systems that use LDAP. And example would be a collection of Windows, MacOS, Linux desktop computers where you want users to log in to this machines using their Core credentials from LDAP. You could also use Core LDAP for other software systems where you want to use a central user repository for access control such as virtual desktop environments.\nCore LDAP support users and groups. For example, you can delegate administrative access controls to certain users in Nextcloud using LDAP.\nLDAP is managed through the Federated Core app “Panel”.\nOIDC linkSingle-sign on is provided in Federated Core Platform by Authelia. This allows, for example, a customer to log in to one open source SaaS application in a browser and to automatically log in to other Core applications in the same browser. It also allows the user to log out of all applications, in the same way.\nFederated Core applications default to OIDC authentication when the application supports it. Most do. Some applications only support OIDC with a premium upgrade (also supported), but a few don’t (yet) support OIDC or only support authentication using OIDC providers such as Google, etc. Federated plans to provide work arounds for all applications to use OIDC and have done this successfully for some (eg. cal.com).\n" } ); index.add( @@ -1220,8 +1252,8 @@ id: 17 , href: "\/docs\/federated-core-platform\/customization\/core-workflow-intelligence\/", title: "Core Workflow Intelligence", - description: "", - content: "" + description: "Federated will be delivering in early 2026 an “on premise” solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.\n", + content: "Federated will be delivering in early 2026 an “on premise” solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.\nWe believe these sorts of “software intelligence” are very important for the overall success of customers using Federated Core and are central to the idea that open source is the best means to achieve maximum flexibility and business differentiation from software. Further, we believe AI is uniquely situated to provide real progress in connecting software to software for custom workflows. It need not work in “real time” but in enough time to deliver the right solution to customers reliably.\n" } ); index.add( @@ -1229,8 +1261,8 @@ id: 18 , href: "\/docs\/federated-core-platform\/customization\/adding-software-to-federated-core\/", title: "Adding Software to Federated Core", - description: "", - content: "" + description: "It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\n", + content: "It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\nIn the near future, we plan to provide a portal for projects to package and submit software for inclusion on Federated Core Platform.\n" } ); index.add( @@ -1238,13 +1270,22 @@ id: 19 , href: "\/docs\/federated-core-platform\/customization\/why-open-source-projects-work-with-federated\/", title: "Why Open Source Projects Work With Federated", - description: "", - content: "" + description: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\n", + content: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\nYou can think of an open source SaaS developer as an extension of your Federated Core Platform continually adding value to your overall go-to-market. These developers think in the same way. While their principle concern is the success and completeness of their software, they recognize the value for customers when their software is integrated into a total solution with great user management, unified storage and messaging, and the many other conveniences and services offered by Federated Core Platform.\nAll pricing for software is done outside of Federated Core Platform giving each installation the flexibility to build use cases and go-to-market solutions apart from the technology offerings.\n" } ); index.add( { id: 20 , + href: "\/docs\/federated-core-platform\/customization\/whitelabel\/", + title: "Whitelabel", + description: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n", + content: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n" + } + ); + index.add( + { + id: 21 , href: "\/docs\/federated-core-platform\/billing\/", title: "Billing", description: "", @@ -1253,16 +1294,16 @@ ); index.add( { - id: 21 , + id: 22 , href: "\/docs\/federated-core-platform\/billing\/account-management-and-billing\/", title: "Account Management and Billing", - description: "", - content: "" + description: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n", + content: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n" } ); index.add( { - id: 22 , + id: 23 , href: "\/docs\/federated-core-platform\/services\/", title: "Services", description: "", @@ -1271,38 +1312,29 @@ ); index.add( { - id: 23 , + id: 24 , href: "\/docs\/federated-core-platform\/services\/federated-management\/", title: "Federated Management", - description: "", - content: "" - } - ); - index.add( - { - id: 24 , - href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", - title: "Customer Service and Support", - description: "", - content: "" + description: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\n", + content: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\nManagement to Train linkWe can also, depending on the level of competency of your current team, work to run the Federated Core Platform for you while training your team to take over at a date certain in the future. We have found this to be the most successl approach to training rather that working on the particulars of how to run Federated Core Platform in the abstract.\n" } ); index.add( { id: 25 , - href: "\/docs\/federated-core-platform\/provisioning\/core-desktop\/", - title: "Core Desktop", - description: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\n", - content: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\nCore Desktop can also be installed on laptops and other mobile computers so that on-the-go team members can get a computer that “just works” without the requirements for network access.\n" + href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", + title: "Customer Service and Support", + description: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\n", + content: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\nChannel Partners (Managed Service Providers) linkWe can also support your channel partners. In our experience, channel partners such as managed service providers are great ways to sell software and services but each requires significant support and explanation to best support their own customers. Federated Computer has extensive operation experience providing this service to partners and we can bring our experience, content, processes to your installation of Federated Core Platform.\nOther Operators linkIt isn’t unusual for Federated Core Platform to be sold to other “operators” who don’t want their own installation. We have done this for fiber companies, universities, and other large enterprises. Federated Computer can support your own go-to-market plans with support, content, and programs designed to find and close big opportunities such as other operators.\n" } ); index.add( { id: 26 , - href: "\/docs\/federated-core-platform\/provisioning\/why-open-source-projects-work-with-federated\/", - title: "Why Open Source Projects Work With Federated", - description: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\n", - content: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\nIt is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\nAll pricing is done outside of Federated Core Platform.\n" + href: "\/docs\/federated-core-platform\/provisioning\/core-desktop\/", + title: "Core Desktop", + description: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\n", + content: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\nCore Desktop can also be installed on laptops and other mobile computers so that on-the-go team members can get a computer that “just works” without the requirements for network access.\n" } ); index.add( @@ -1363,9 +1395,9 @@ { id: 33 , href: "\/docs\/partners\/operators-networks-platforms\/", - title: "Operators Networks Platforms", - description: "Text\n", - content: "Text\n" + title: "Operators, Networks, Platforms", + description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( @@ -1373,8 +1405,8 @@ id: 34 , href: "\/docs\/partners\/managed-service-providers\/", title: "Managed Service Provider", - description: "", - content: "" + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( @@ -1382,8 +1414,8 @@ id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1391,8 +1423,8 @@ id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1409,13 +1441,22 @@ id: 38 , href: "\/docs\/about-federated-computer\/federated-company-backgrounder\/", title: "Federated Company Backgrounder", - description: "", - content: "" + description: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\n", + content: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\nOpen Source linkThere’s no reason to use expensive, proprietary, privacy-destroying SaaS software. But in the past, running open-source software required lots of technical knowledge. Federated Computer makes it easy for any business to adopt open-source.\nWe are great stewards of the benefits of open-source. Our company actively contributes both financially and with code to a number of open-source projects offered in Federated Core and Federated Plus including Castopod, Bookstack, Headscale, Matrix, and OpenMandriva. We do all the work for you to ensure open-source projects are integrated, work well together, and provide you with the right value.\nDavid Young linkOur CEO and founder, David Young, has a long history working with impactful startups including Joyent. At Joyent he was responsible for leading the team that invented and patented cloud computing, containers-as-a-service, cloud operating system, infrastructure-as-a-service, node.js, native-web-apps as desktop/mobile apps (what became Electron) and many more fundamental cloud innovations.\nDavid’s companies have been backed by the biggest investors including Dell, Intel; and he has brought ground-breaking solutions to cloud pioneers such as Dell, Telefonica, Singtel, working for important early cloud adopters such as Twitter, Facebook Developer Platform, Linkedin, and many, many others.\n" } ); index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/customization/index.xml b/public/docs/federated-core-platform/customization/index.xml index 4c92ab5..8f0dbc5 100644 --- a/public/docs/federated-core-platform/customization/index.xml +++ b/public/docs/federated-core-platform/customization/index.xml @@ -2,32 +2,39 @@ Customization on Federated Computer Enterprise - http://localhost:1313/docs/federated-core-platform/customization/ + http://enterprise.federated.computer/docs/federated-core-platform/customization/ Recent content in Customization on Federated Computer Enterprise Hugo en-us - Mon, 25 Aug 2025 12:36:40 -0600 - + Thu, 28 Aug 2025 12:01:52 -0600 + Core Workflow Intelligence - http://localhost:1313/docs/federated-core-platform/customization/core-workflow-intelligence/ + http://enterprise.federated.computer/docs/federated-core-platform/customization/core-workflow-intelligence/ Mon, 25 Aug 2025 12:34:45 -0600 - http://localhost:1313/docs/federated-core-platform/customization/core-workflow-intelligence/ - + http://enterprise.federated.computer/docs/federated-core-platform/customization/core-workflow-intelligence/ + <p>Federated will be delivering in early 2026 an &ldquo;on premise&rdquo; solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.</p> Adding Software to Federated Core - http://localhost:1313/docs/federated-core-platform/customization/adding-software-to-federated-core/ + http://enterprise.federated.computer/docs/federated-core-platform/customization/adding-software-to-federated-core/ Mon, 25 Aug 2025 12:35:31 -0600 - http://localhost:1313/docs/federated-core-platform/customization/adding-software-to-federated-core/ - + http://enterprise.federated.computer/docs/federated-core-platform/customization/adding-software-to-federated-core/ + <p>It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.</p> Why Open Source Projects Work With Federated - http://localhost:1313/docs/federated-core-platform/customization/why-open-source-projects-work-with-federated/ + http://enterprise.federated.computer/docs/federated-core-platform/customization/why-open-source-projects-work-with-federated/ Mon, 25 Aug 2025 12:36:40 -0600 - http://localhost:1313/docs/federated-core-platform/customization/why-open-source-projects-work-with-federated/ - + http://enterprise.federated.computer/docs/federated-core-platform/customization/why-open-source-projects-work-with-federated/ + <p>More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.</p> + + + Whitelabel + http://enterprise.federated.computer/docs/federated-core-platform/customization/whitelabel/ + Thu, 28 Aug 2025 12:01:52 -0600 + http://enterprise.federated.computer/docs/federated-core-platform/customization/whitelabel/ + <p>Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the &ldquo;home&rdquo; website for information and ordering.</p> diff --git a/public/docs/federated-core-platform/customization/whitelabel/index.html b/public/docs/federated-core-platform/customization/whitelabel/index.html index 6460bf1..36920a4 100644 --- a/public/docs/federated-core-platform/customization/whitelabel/index.html +++ b/public/docs/federated-core-platform/customization/whitelabel/index.html @@ -14,10 +14,9 @@ - + Whitelabel | Federated Computer Enterprise - @@ -25,19 +24,19 @@ - - - - - - + + + + + + - + - + @@ -48,8 +47,9 @@ - - + + + @@ -70,7 +70,8 @@ - + + @@ -93,7 +94,7 @@
  • - + article Overview @@ -113,7 +114,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -128,47 +129,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -188,17 +189,17 @@ -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -218,22 +219,22 @@ -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -253,7 +254,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -273,12 +274,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -303,22 +304,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -338,22 +339,22 @@ -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -373,12 +374,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -659,10 +660,12 @@ - + + + - + diff --git a/public/docs/federated-core-platform/customization/why-open-source-projects-work-with-federated/index.html b/public/docs/federated-core-platform/customization/why-open-source-projects-work-with-federated/index.html index efdaab9..ace9b96 100644 --- a/public/docs/federated-core-platform/customization/why-open-source-projects-work-with-federated/index.html +++ b/public/docs/federated-core-platform/customization/why-open-source-projects-work-with-federated/index.html @@ -14,10 +14,9 @@ - + Why Open Source Projects Work With Federated | Federated Computer Enterprise - @@ -25,19 +24,19 @@ - - - - - - + + + + + + - + - + @@ -48,8 +47,9 @@ - - + + + @@ -70,7 +70,8 @@ - + + @@ -93,7 +94,7 @@
  • - + article Overview @@ -113,7 +114,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -128,47 +129,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -188,17 +189,17 @@ -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -218,22 +219,22 @@ -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -253,7 +254,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -273,12 +274,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -303,22 +304,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -338,22 +339,22 @@ -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -373,12 +374,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -661,10 +662,12 @@ - + + + - + diff --git a/public/docs/federated-core-platform/federated-core-platform/index.html b/public/docs/federated-core-platform/federated-core-platform/index.html index 8071c8c..d6079e5 100644 --- a/public/docs/federated-core-platform/federated-core-platform/index.html +++ b/public/docs/federated-core-platform/federated-core-platform/index.html @@ -14,10 +14,9 @@ - + Federated Core Platform | Federated Computer Enterprise - @@ -25,12 +24,12 @@ - - - - - - + + + + + + - + - + - + + + @@ -128,7 +128,8 @@ Customer Service and Support: let Federated Computer provide 24/7 customer suppo - + + @@ -151,7 +152,7 @@ Customer Service and Support: let Federated Computer provide 24/7 customer suppo
  • - + article Overview @@ -171,7 +172,7 @@ Customer Service and Support: let Federated Computer provide 24/7 customer suppo -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -186,47 +187,47 @@ Customer Service and Support: let Federated Computer provide 24/7 customer suppo -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -246,17 +247,17 @@ Customer Service and Support: let Federated Computer provide 24/7 customer suppo -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -276,22 +277,22 @@ Customer Service and Support: let Federated Computer provide 24/7 customer suppo -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -311,7 +312,7 @@ Customer Service and Support: let Federated Computer provide 24/7 customer suppo -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -331,12 +332,12 @@ Customer Service and Support: let Federated Computer provide 24/7 customer suppo -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -361,22 +362,22 @@ Customer Service and Support: let Federated Computer provide 24/7 customer suppo -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -396,22 +397,22 @@ Customer Service and Support: let Federated Computer provide 24/7 customer suppo -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -431,12 +432,12 @@ Customer Service and Support: let Federated Computer provide 24/7 customer suppo -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -770,10 +771,12 @@ Customer Service and Support: let Federated Computer provide 24/7 customer suppo - + + + - + diff --git a/public/docs/federated-core-platform/federated-management/index.html b/public/docs/federated-core-platform/federated-management/index.html deleted file mode 100644 index b5ce011..0000000 --- a/public/docs/federated-core-platform/federated-management/index.html +++ /dev/null @@ -1,1343 +0,0 @@ - - - - - - - - - - - - - - - - - - - Federated Management | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Federated Management - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/index.html b/public/docs/federated-core-platform/index.html index 80611b3..ef1036d 100644 --- a/public/docs/federated-core-platform/index.html +++ b/public/docs/federated-core-platform/index.html @@ -14,10 +14,9 @@ - + Federated Core Platform | Federated Computer Enterprise - @@ -25,17 +24,17 @@ - - - - - - + + + + + + - - + + @@ -46,8 +45,9 @@ - - + + + @@ -68,7 +68,8 @@ - + + @@ -91,7 +92,7 @@
  • - + article Overview @@ -111,7 +112,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -126,52 +127,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • - - - - -
  • Why Open Source Projects Work With Federated
  • +
  • Core Desktop
  • @@ -184,24 +180,24 @@
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • + + + + +
  • Whitelabel
  • @@ -251,7 +252,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -271,12 +272,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -301,22 +302,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -336,22 +337,22 @@ -
  • Operators Networks Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -371,7 +372,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -554,7 +560,7 @@
    - +
    article @@ -571,7 +577,7 @@
    - +
    article @@ -588,7 +594,7 @@
    - +
    article @@ -596,7 +602,7 @@ folder
    -

    Maintenance

    +

    Management

    @@ -605,7 +611,7 @@
    - +
    article @@ -622,7 +628,7 @@
    - +
    article @@ -639,7 +645,7 @@
    - +
    article @@ -708,10 +714,12 @@ - + + + - + @@ -1091,6 +1099,13 @@ + + + + + + + @@ -1146,8 +1161,8 @@ id: 4 , href: "\/docs\/federated-core-platform\/provisioning\/provisioner\/", title: "Provisioner", - description: "", - content: "" + description: "The “Provisioner” is responsible for setting up, updating/upgrading, and tearing down Cores. It does this in an entirely stateless way communicating with either the aacount management and billing system or the management system. Naturally, there are command-line utilities and an API available to accomplish all functions.\nOrder linkWhen and order comes through the account management and billing system, a manifest is created asking for a Core to be create with the required SaaS titles. This manifest is sent to the Provisioner which then requests a virtual machine (or machines, if the manifest includes load balancing or other extended Core services), then begins to build the Core software from the manifest. You can read more about the minimal build at ", + content: "The “Provisioner” is responsible for setting up, updating/upgrading, and tearing down Cores. It does this in an entirely stateless way communicating with either the aacount management and billing system or the management system. Naturally, there are command-line utilities and an API available to accomplish all functions.\nOrder linkWhen and order comes through the account management and billing system, a manifest is created asking for a Core to be create with the required SaaS titles. This manifest is sent to the Provisioner which then requests a virtual machine (or machines, if the manifest includes load balancing or other extended Core services), then begins to build the Core software from the manifest. You can read more about the minimal build at " } ); index.add( @@ -1155,8 +1170,8 @@ id: 5 , href: "\/docs\/federated-core-platform\/provisioning\/core-server\/", title: "Core Server", - description: "", - content: "" + description: "Federated maintains its own Linux distribution for the specific purpose of control of the types and versions of software used in virtual machine. This descrease the surface area for attacks, increased maintainability for the Cores built on top, and assures our systems work on X64 and Arm (example: Ampere) systems as well as fully supporting IPv4 and IPv6 for cloud deployment.\nCore Server is based on OpenMandriva a Linux distribution lead by Federated Computer’s chief systems engineer. OpenMandriva is base on Fedora, in part.\n", + content: "Federated maintains its own Linux distribution for the specific purpose of control of the types and versions of software used in virtual machine. This descrease the surface area for attacks, increased maintainability for the Cores built on top, and assures our systems work on X64 and Arm (example: Ampere) systems as well as fully supporting IPv4 and IPv6 for cloud deployment.\nCore Server is based on OpenMandriva a Linux distribution lead by Federated Computer’s chief systems engineer. OpenMandriva is base on Fedora, in part.\n" } ); index.add( @@ -1164,8 +1179,8 @@ id: 6 , href: "\/docs\/federated-core-platform\/provisioning\/core-mini\/", title: "Core Mini", - description: "", - content: "" + description: "Core Mini is the minimal install of software on a Core before adding additional SaaS and any scaling services (e.g. load balancing). These are the fundamental services used by ever other SaaS application.\nTraefik linkFirewall and network management.\nPowerDNS linkDomain name service.\nAuthelia linkOIDC authentication provider.\nMail Services linkSMTP and IMAP services.\nPostgresql linkDatabase engine for SaaS services requiring Postgresql.\nMariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely be obsolete in the coming months.\n", + content: "Core Mini is the minimal install of software on a Core before adding additional SaaS and any scaling services (e.g. load balancing). These are the fundamental services used by ever other SaaS application.\nTraefik linkFirewall and network management.\nPowerDNS linkDomain name service.\nAuthelia linkOIDC authentication provider.\nMail Services linkSMTP and IMAP services.\nPostgresql linkDatabase engine for SaaS services requiring Postgresql.\nMariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely be obsolete in the coming months.\nAutodiscovery linkService for providing autodiscovery for SaaS service that use autodiscovery services. Example: email and calendar client configuration.\nFederated Monitors linkSoftare for communicating with Federated management systems.\n" } ); index.add( @@ -1173,8 +1188,8 @@ id: 7 , href: "\/docs\/federated-core-platform\/provisioning\/unified-storage\/", title: "Unified Storage", - description: "", - content: "" + description: "Every SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage\nEvery SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage.\n", + content: "Every SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage\nEvery SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage.\n" } ); index.add( @@ -1182,8 +1197,8 @@ id: 8 , href: "\/docs\/federated-core-platform\/provisioning\/unified-messaging\/", title: "Unified Messaging", - description: "", - content: "" + description: "Federated Core includes three systems for messaging.\nEmail linkThere is a full-featured IMAP/SMTP service available for any needed notifications to users.\nContainer-to-Container linkThere is a service for container-to-container communication allowing for complete workflow creation between SaaS applications when the native APIs are not enough.\nOptional: Matrix linkIf the Matrix service is loaded, you can use it like a message-bus for application notification to users.\n", + content: "Federated Core includes three systems for messaging.\nEmail linkThere is a full-featured IMAP/SMTP service available for any needed notifications to users.\nContainer-to-Container linkThere is a service for container-to-container communication allowing for complete workflow creation between SaaS applications when the native APIs are not enough.\nOptional: Matrix linkIf the Matrix service is loaded, you can use it like a message-bus for application notification to users.\n" } ); index.add( @@ -1191,8 +1206,8 @@ id: 9 , href: "\/docs\/federated-core-platform\/provisioning\/authentication\/", title: "Authentication", - description: "", - content: "" + description: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\n", + content: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\nLDAP services can be exposed to network outside of Core to be used by other systems that use LDAP. And example would be a collection of Windows, MacOS, Linux desktop computers where you want users to log in to this machines using their Core credentials from LDAP. You could also use Core LDAP for other software systems where you want to use a central user repository for access control such as virtual desktop environments.\nCore LDAP support users and groups. For example, you can delegate administrative access controls to certain users in Nextcloud using LDAP.\nLDAP is managed through the Federated Core app “Panel”.\nOIDC linkSingle-sign on is provided in Federated Core Platform by Authelia. This allows, for example, a customer to log in to one open source SaaS application in a browser and to automatically log in to other Core applications in the same browser. It also allows the user to log out of all applications, in the same way.\nFederated Core applications default to OIDC authentication when the application supports it. Most do. Some applications only support OIDC with a premium upgrade (also supported), but a few don’t (yet) support OIDC or only support authentication using OIDC providers such as Google, etc. Federated plans to provide work arounds for all applications to use OIDC and have done this successfully for some (eg. cal.com).\n" } ); index.add( @@ -1200,8 +1215,8 @@ id: 10 , href: "\/docs\/federated-core-platform\/provisioning\/dashboard\/", title: "Dashboard", - description: "", - content: "" + description: "Federated Dashboard is a simple launcher for users. It shows the applications available, a link to helpful documentation, and a note about user management. There are significant improvements planned for Dashboard in the coming months as it transitions to Federated ", + content: "Federated Dashboard is a simple launcher for users. It shows the applications available, a link to helpful documentation, and a note about user management. There are significant improvements planned for Dashboard in the coming months as it transitions to Federated " } ); index.add( @@ -1209,15 +1224,15 @@ id: 11 , href: "\/docs\/federated-core-platform\/provisioning\/computer\/", title: "Computer", - description: "", - content: "" + description: "Federated “Computer” is a new application coming in Fall, 2025 delivering a fully customizable front-end experience for Core users. It is a bookmarking application extended to support reminders, folders for watching applications, documents, events, the ability to pick up AI workloads and customizations, and more. Federated “Computer” is intended to be fully open-sourced, will work with other SaaS applications that support URLs, and will work natively on desktops, tablets, and mobile devices.\n", + content: "Federated “Computer” is a new application coming in Fall, 2025 delivering a fully customizable front-end experience for Core users. It is a bookmarking application extended to support reminders, folders for watching applications, documents, events, the ability to pick up AI workloads and customizations, and more. Federated “Computer” is intended to be fully open-sourced, will work with other SaaS applications that support URLs, and will work natively on desktops, tablets, and mobile devices.\n" } ); index.add( { id: 12 , - href: "\/docs\/federated-core-platform\/maintenance\/", - title: "Maintenance", + href: "\/docs\/federated-core-platform\/management\/", + title: "Management", description: "", content: "" } @@ -1225,28 +1240,28 @@ index.add( { id: 13 , - href: "\/docs\/federated-core-platform\/maintenance\/core-scanner\/", + href: "\/docs\/federated-core-platform\/management\/core-scanner\/", title: "Core Scanner", - description: "", - content: "" + description: "Core Scanner is a utility to examine and manage each Core on a given installation of Federated Core Platform. It allows a customer service person to examine the Core, look at all the configuration files, see any anomalies in the files, track usage of resources (CPU, RAM, storage, network), and perform tightly managed actions on the Core to take remedial steps as needed.\nEach installation of Core Scanner includes user and group priveleges so that the owner of the Federated Core Platform can look at all Cores running, but also partners can examine and manage the Cores of their customers. For example, a managed service provider may have a number of Cores for which they will want to be able to provide monitor and fix service3. Core Scanner allows them to see those Cores, only.\n", + content: "Core Scanner is a utility to examine and manage each Core on a given installation of Federated Core Platform. It allows a customer service person to examine the Core, look at all the configuration files, see any anomalies in the files, track usage of resources (CPU, RAM, storage, network), and perform tightly managed actions on the Core to take remedial steps as needed.\nEach installation of Core Scanner includes user and group priveleges so that the owner of the Federated Core Platform can look at all Cores running, but also partners can examine and manage the Cores of their customers. For example, a managed service provider may have a number of Cores for which they will want to be able to provide monitor and fix service3. Core Scanner allows them to see those Cores, only.\nCore Scanner provides the ability to “take action” on a Core with a large library of pre-defined “actions” for each Core depending on the applications installed and the reality of the Core at the time of inspection. If a Core needs more storage, for example, “actions” are brought forward suggesting remedial action to the support person. There are also actions available to compare a given Core to normative Cores.\nCore Scanner is supported by the “machine learning” functions in the " } ); index.add( { id: 14 , - href: "\/docs\/federated-core-platform\/maintenance\/update-and-upgrade\/", + href: "\/docs\/federated-core-platform\/management\/update-and-upgrade\/", title: "Update and Upgrade", - description: "", - content: "" + description: "Each Federated Core Platform installation has a Gitea respository where the software (OS, utilities, platform, open source SaaS) for the entire system is tracked. The operator of each installation is able to package those updates into regular upgrades pushed out to some/all Cores on the system, push them out individually for testing to some Cores, or schedule updates for a given list of Cores.\nSince the nature of the Federated Core Platform is delivering open source SaaS to customers, there needs to be a testing protocol set up to ensure updates are in fact needed/wanted. Federated Computer does this centrally, so operators using Federated Core Platform can know the software will “work”. However, there may be additional concerns with respect to security, other customizations that need to be tested, etc.\n", + content: "Each Federated Core Platform installation has a Gitea respository where the software (OS, utilities, platform, open source SaaS) for the entire system is tracked. The operator of each installation is able to package those updates into regular upgrades pushed out to some/all Cores on the system, push them out individually for testing to some Cores, or schedule updates for a given list of Cores.\nSince the nature of the Federated Core Platform is delivering open source SaaS to customers, there needs to be a testing protocol set up to ensure updates are in fact needed/wanted. Federated Computer does this centrally, so operators using Federated Core Platform can know the software will “work”. However, there may be additional concerns with respect to security, other customizations that need to be tested, etc.\nWhile Federated Core Platform draws much of the software from DockerHub, there are container images maintained by Federated Computer and, over time, more of the container images will come from Federated Computer rather than DockerHub. The principle reason for this is to add an additional step for quality and security.\n" } ); index.add( { id: 15 , - href: "\/docs\/federated-core-platform\/maintenance\/monitor-and-fix\/", + href: "\/docs\/federated-core-platform\/management\/monitor-and-fix\/", title: "Monitor and Fix", - description: "", - content: "" + description: "Every Core running on an installation of Federated Core Platform, every application running on every Core, and every service not an application running on every Core, is monitored in real time to ensure it runs, has the system resources needed, and provides customers with the best experience. If there are anomalies detected, alerts are created and can be sent to the local Matrix server, and Federated Monitor and Fix system attempts to solve the problem using patterns and the service definitions in place.\n", + content: "Every Core running on an installation of Federated Core Platform, every application running on every Core, and every service not an application running on every Core, is monitored in real time to ensure it runs, has the system resources needed, and provides customers with the best experience. If there are anomalies detected, alerts are created and can be sent to the local Matrix server, and Federated Monitor and Fix system attempts to solve the problem using patterns and the service definitions in place.\nFor example, if a customer with a 500GB storage limit for their Files service decides to upload 3TB of files, the File service will fail, and Monitor and Fix will attempt to fix the problem by adding for block storage (if that service is available AND the service definition allows that to happen without customer “approval”).\nThe Monitor and Fix system continues to get better and better as we see more patterns and improve the paths to successful amelioration of problems.\n" } ); index.add( @@ -1263,8 +1278,8 @@ id: 17 , href: "\/docs\/federated-core-platform\/customization\/core-workflow-intelligence\/", title: "Core Workflow Intelligence", - description: "", - content: "" + description: "Federated will be delivering in early 2026 an “on premise” solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.\n", + content: "Federated will be delivering in early 2026 an “on premise” solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.\nWe believe these sorts of “software intelligence” are very important for the overall success of customers using Federated Core and are central to the idea that open source is the best means to achieve maximum flexibility and business differentiation from software. Further, we believe AI is uniquely situated to provide real progress in connecting software to software for custom workflows. It need not work in “real time” but in enough time to deliver the right solution to customers reliably.\n" } ); index.add( @@ -1272,8 +1287,8 @@ id: 18 , href: "\/docs\/federated-core-platform\/customization\/adding-software-to-federated-core\/", title: "Adding Software to Federated Core", - description: "", - content: "" + description: "It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\n", + content: "It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\nIn the near future, we plan to provide a portal for projects to package and submit software for inclusion on Federated Core Platform.\n" } ); index.add( @@ -1281,13 +1296,22 @@ id: 19 , href: "\/docs\/federated-core-platform\/customization\/why-open-source-projects-work-with-federated\/", title: "Why Open Source Projects Work With Federated", - description: "", - content: "" + description: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\n", + content: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\nYou can think of an open source SaaS developer as an extension of your Federated Core Platform continually adding value to your overall go-to-market. These developers think in the same way. While their principle concern is the success and completeness of their software, they recognize the value for customers when their software is integrated into a total solution with great user management, unified storage and messaging, and the many other conveniences and services offered by Federated Core Platform.\nAll pricing for software is done outside of Federated Core Platform giving each installation the flexibility to build use cases and go-to-market solutions apart from the technology offerings.\n" } ); index.add( { id: 20 , + href: "\/docs\/federated-core-platform\/customization\/whitelabel\/", + title: "Whitelabel", + description: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n", + content: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n" + } + ); + index.add( + { + id: 21 , href: "\/docs\/federated-core-platform\/billing\/", title: "Billing", description: "", @@ -1296,16 +1320,16 @@ ); index.add( { - id: 21 , + id: 22 , href: "\/docs\/federated-core-platform\/billing\/account-management-and-billing\/", title: "Account Management and Billing", - description: "", - content: "" + description: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n", + content: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n" } ); index.add( { - id: 22 , + id: 23 , href: "\/docs\/federated-core-platform\/services\/", title: "Services", description: "", @@ -1314,38 +1338,29 @@ ); index.add( { - id: 23 , + id: 24 , href: "\/docs\/federated-core-platform\/services\/federated-management\/", title: "Federated Management", - description: "", - content: "" - } - ); - index.add( - { - id: 24 , - href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", - title: "Customer Service and Support", - description: "", - content: "" + description: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\n", + content: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\nManagement to Train linkWe can also, depending on the level of competency of your current team, work to run the Federated Core Platform for you while training your team to take over at a date certain in the future. We have found this to be the most successl approach to training rather that working on the particulars of how to run Federated Core Platform in the abstract.\n" } ); index.add( { id: 25 , - href: "\/docs\/federated-core-platform\/provisioning\/core-desktop\/", - title: "Core Desktop", - description: "", - content: "" + href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", + title: "Customer Service and Support", + description: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\n", + content: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\nChannel Partners (Managed Service Providers) linkWe can also support your channel partners. In our experience, channel partners such as managed service providers are great ways to sell software and services but each requires significant support and explanation to best support their own customers. Federated Computer has extensive operation experience providing this service to partners and we can bring our experience, content, processes to your installation of Federated Core Platform.\nOther Operators linkIt isn’t unusual for Federated Core Platform to be sold to other “operators” who don’t want their own installation. We have done this for fiber companies, universities, and other large enterprises. Federated Computer can support your own go-to-market plans with support, content, and programs designed to find and close big opportunities such as other operators.\n" } ); index.add( { id: 26 , - href: "\/docs\/federated-core-platform\/provisioning\/why-open-source-projects-work-with-federated\/", - title: "Why Open Source Projects Work With Federated", - description: "", - content: "" + href: "\/docs\/federated-core-platform\/provisioning\/core-desktop\/", + title: "Core Desktop", + description: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\n", + content: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\nCore Desktop can also be installed on laptops and other mobile computers so that on-the-go team members can get a computer that “just works” without the requirements for network access.\n" } ); index.add( @@ -1406,9 +1421,9 @@ { id: 33 , href: "\/docs\/partners\/operators-networks-platforms\/", - title: "Operators Networks Platforms", - description: "Text\n", - content: "Text\n" + title: "Operators, Networks, Platforms", + description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( @@ -1416,8 +1431,8 @@ id: 34 , href: "\/docs\/partners\/managed-service-providers\/", title: "Managed Service Provider", - description: "", - content: "" + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( @@ -1425,8 +1440,8 @@ id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1434,8 +1449,8 @@ id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1452,13 +1467,22 @@ id: 38 , href: "\/docs\/about-federated-computer\/federated-company-backgrounder\/", title: "Federated Company Backgrounder", - description: "", - content: "" + description: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\n", + content: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\nOpen Source linkThere’s no reason to use expensive, proprietary, privacy-destroying SaaS software. But in the past, running open-source software required lots of technical knowledge. Federated Computer makes it easy for any business to adopt open-source.\nWe are great stewards of the benefits of open-source. Our company actively contributes both financially and with code to a number of open-source projects offered in Federated Core and Federated Plus including Castopod, Bookstack, Headscale, Matrix, and OpenMandriva. We do all the work for you to ensure open-source projects are integrated, work well together, and provide you with the right value.\nDavid Young linkOur CEO and founder, David Young, has a long history working with impactful startups including Joyent. At Joyent he was responsible for leading the team that invented and patented cloud computing, containers-as-a-service, cloud operating system, infrastructure-as-a-service, node.js, native-web-apps as desktop/mobile apps (what became Electron) and many more fundamental cloud innovations.\nDavid’s companies have been backed by the biggest investors including Dell, Intel; and he has brought ground-breaking solutions to cloud pioneers such as Dell, Telefonica, Singtel, working for important early cloud adopters such as Twitter, Facebook Developer Platform, Linkedin, and many, many others.\n" } ); index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/index.xml b/public/docs/federated-core-platform/index.xml index 7ba95e9..a986605 100644 --- a/public/docs/federated-core-platform/index.xml +++ b/public/docs/federated-core-platform/index.xml @@ -2,17 +2,17 @@ Federated Core Platform on Federated Computer Enterprise - http://localhost:1313/docs/federated-core-platform/ + http://enterprise.federated.computer/docs/federated-core-platform/ Recent content in Federated Core Platform on Federated Computer Enterprise Hugo en-us Mon, 25 Aug 2025 12:32:20 -0600 - + Federated Core Platform - http://localhost:1313/docs/federated-core-platform/federated-core-platform/ + http://enterprise.federated.computer/docs/federated-core-platform/federated-core-platform/ Mon, 25 Aug 2025 12:32:20 -0600 - http://localhost:1313/docs/federated-core-platform/federated-core-platform/ + http://enterprise.federated.computer/docs/federated-core-platform/federated-core-platform/ <p>The Federated Core Platform is a suite of software providing everything needed to deliver open source SaaS applications: integrate them to work well together; manage, patch, update the software; and provide bespoke customer service for customers.</p> <p>The main component groups of Federated Core Platform are:</p> <h3 id="provisioning">Provisioning <a href="#provisioning" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><ol> <li><strong>Provisioner:</strong> interacts with cloud platform (eg Hetzner, Cloud Stack, OpenStack, Triton) to spin up virtual machine and install software and network;</li> <li><strong>Core Server:</strong> Federated Linux distribution for X64 and ARM virtual machines;</li> <li><strong>Core Mini:</strong> The minimal amount of software that must always be installed for a Core;</li> <li><strong>Unified Storage:</strong> architecture for shared storage between Core docker images;</li> <li><strong>Unified Messaging:</strong> email infrastructure for all docker images including autodiscover services;</li> <li><strong>Authentication:</strong> OIDC provider;</li> <li><strong>Dashboard:</strong> user creation, domain and application preferences;</li> <li><strong>Computer:</strong> end-user application for managing software links and workflows.</li> </ol> <h3 id="maintenance">Maintenance <a href="#maintenance" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><ol> <li><strong>CoreScanner:</strong> customer support application for monitoring and locked-down actions on customer infrastructure;</li> <li><strong>Update and Upgrade:</strong> system for discovering new software versions and pushing to customers;</li> <li><strong>Monitor and Fix:</strong> machine-learning to identify and solve operational issues based on customer support patterns.</li> </ol> <h3 id="customization">Customization <a href="#customization" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><ol> <li><strong>Core Workflow Intelligence:</strong> AI-driven workflows between SaaS applications;</li> <li><strong>Adding Software to Federated Core:</strong> how to add SaaS applications to Federated Core Platform;</li> <li><strong>Why Open Source Projects Work With Federated:</strong> the benefits of Federated Core Platform for open source SaaS projects.</li> </ol> <h3 id="billing">Billing <a href="#billing" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><ol> <li><strong>Account Management and Billing:</strong> tracking what is used and billed.</li> </ol> <h3 id="services">Services <a href="#services" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><ol> <li><strong>Federated Management:</strong> let Federated Computer run your cloud for or alongside your team;</li> <li><strong>Customer Service and Support:</strong> let Federated Computer provide 24/7 customer support for or alongside your team.</li> </ol> <p>(Note: you can learn more about these components by selecting the documentation in the left navigation.)</p> diff --git a/public/docs/federated-core-platform/maintenance/core-scanner/index.html b/public/docs/federated-core-platform/maintenance/core-scanner/index.html deleted file mode 100644 index dcb6cfe..0000000 --- a/public/docs/federated-core-platform/maintenance/core-scanner/index.html +++ /dev/null @@ -1,1477 +0,0 @@ - - - - - - - - - - - - - - - - - - - Core Scanner | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Core Scanner - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/maintenance/index.html b/public/docs/federated-core-platform/maintenance/index.html deleted file mode 100644 index 2feb291..0000000 --- a/public/docs/federated-core-platform/maintenance/index.html +++ /dev/null @@ -1,1489 +0,0 @@ - - - - - - - - - - - - - - - - - - - Maintenance | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/maintenance/index.xml b/public/docs/federated-core-platform/maintenance/index.xml deleted file mode 100644 index bd9ae84..0000000 --- a/public/docs/federated-core-platform/maintenance/index.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - Maintenance on Federated Computer Enterprise - http://localhost:1313/docs/federated-core-platform/maintenance/ - Recent content in Maintenance on Federated Computer Enterprise - Hugo - en-us - Mon, 25 Aug 2025 12:36:19 -0600 - - - Core Scanner - http://localhost:1313/docs/federated-core-platform/maintenance/core-scanner/ - Mon, 25 Aug 2025 12:34:24 -0600 - http://localhost:1313/docs/federated-core-platform/maintenance/core-scanner/ - - - - Update and Upgrade - http://localhost:1313/docs/federated-core-platform/maintenance/update-and-upgrade/ - Mon, 25 Aug 2025 12:36:19 -0600 - http://localhost:1313/docs/federated-core-platform/maintenance/update-and-upgrade/ - - - - Monitor and Fix - http://localhost:1313/docs/federated-core-platform/maintenance/monitor-and-fix/ - Mon, 25 Aug 2025 12:35:43 -0600 - http://localhost:1313/docs/federated-core-platform/maintenance/monitor-and-fix/ - - - - diff --git a/public/docs/federated-core-platform/maintenance/monitor-and-fix/index.html b/public/docs/federated-core-platform/maintenance/monitor-and-fix/index.html deleted file mode 100644 index 222d05b..0000000 --- a/public/docs/federated-core-platform/maintenance/monitor-and-fix/index.html +++ /dev/null @@ -1,1477 +0,0 @@ - - - - - - - - - - - - - - - - - - - Monitor and Fix | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Monitor and Fix - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/maintenance/update-and-upgrade/index.html b/public/docs/federated-core-platform/maintenance/update-and-upgrade/index.html deleted file mode 100644 index 77fede3..0000000 --- a/public/docs/federated-core-platform/maintenance/update-and-upgrade/index.html +++ /dev/null @@ -1,1477 +0,0 @@ - - - - - - - - - - - - - - - - - - - Update and Upgrade | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Update and Upgrade - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/management/core-scanner/index.html b/public/docs/federated-core-platform/management/core-scanner/index.html index 67d0d87..0f2bc2a 100644 --- a/public/docs/federated-core-platform/management/core-scanner/index.html +++ b/public/docs/federated-core-platform/management/core-scanner/index.html @@ -14,10 +14,9 @@ - + Core Scanner | Federated Computer Enterprise - @@ -25,20 +24,20 @@ - - - - - - + + + + + + - + - + @@ -50,8 +49,9 @@ Each installation of Core Scanner includes user and group priveleges so that the - - + + + @@ -72,7 +72,8 @@ Each installation of Core Scanner includes user and group priveleges so that the - + + @@ -95,7 +96,7 @@ Each installation of Core Scanner includes user and group priveleges so that the
  • - + article Overview @@ -115,7 +116,7 @@ Each installation of Core Scanner includes user and group priveleges so that the -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -130,47 +131,47 @@ Each installation of Core Scanner includes user and group priveleges so that the -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -190,17 +191,17 @@ Each installation of Core Scanner includes user and group priveleges so that the -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -220,22 +221,22 @@ Each installation of Core Scanner includes user and group priveleges so that the -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -255,7 +256,7 @@ Each installation of Core Scanner includes user and group priveleges so that the -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -275,12 +276,12 @@ Each installation of Core Scanner includes user and group priveleges so that the -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -305,22 +306,22 @@ Each installation of Core Scanner includes user and group priveleges so that the -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -340,22 +341,22 @@ Each installation of Core Scanner includes user and group priveleges so that the -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -375,12 +376,12 @@ Each installation of Core Scanner includes user and group priveleges so that the -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -664,10 +665,12 @@ Each installation of Core Scanner includes user and group priveleges so that the - + + + - + @@ -1424,8 +1427,8 @@ Each installation of Core Scanner includes user and group priveleges so that the id: 39 , href: "\/docs\/about-federated-computer\/roadmap\/", title: "Roadmap", - description: "", - content: "" + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" } ); index.add( diff --git a/public/docs/federated-core-platform/management/index.html b/public/docs/federated-core-platform/management/index.html index b7e2e87..1d9fefc 100644 --- a/public/docs/federated-core-platform/management/index.html +++ b/public/docs/federated-core-platform/management/index.html @@ -14,10 +14,9 @@ - + Management | Federated Computer Enterprise - @@ -25,17 +24,17 @@ - - - - - - + + + + + + - - + + @@ -46,8 +45,9 @@ - - + + + @@ -68,7 +68,8 @@ - + + @@ -91,7 +92,7 @@
  • - + article Overview @@ -111,7 +112,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -126,47 +127,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -186,17 +187,17 @@ -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -216,22 +217,22 @@ -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -251,7 +252,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -271,12 +272,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -301,22 +302,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -336,22 +337,22 @@ -
  • Operators Networks Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -371,7 +372,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -562,7 +568,7 @@
    - +
    article @@ -579,7 +585,7 @@
    - +
    article @@ -596,7 +602,7 @@
    - +
    article @@ -665,10 +671,12 @@ - + + + - + @@ -1048,6 +1056,13 @@ + + + + + + + @@ -1292,8 +1307,8 @@ id: 25 , href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", title: "Customer Service and Support", - description: "", - content: "" + description: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\n", + content: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\nChannel Partners (Managed Service Providers) linkWe can also support your channel partners. In our experience, channel partners such as managed service providers are great ways to sell software and services but each requires significant support and explanation to best support their own customers. Federated Computer has extensive operation experience providing this service to partners and we can bring our experience, content, processes to your installation of Federated Core Platform.\nOther Operators linkIt isn’t unusual for Federated Core Platform to be sold to other “operators” who don’t want their own installation. We have done this for fiber companies, universities, and other large enterprises. Federated Computer can support your own go-to-market plans with support, content, and programs designed to find and close big opportunities such as other operators.\n" } ); index.add( @@ -1363,9 +1378,9 @@ { id: 33 , href: "\/docs\/partners\/operators-networks-platforms\/", - title: "Operators Networks Platforms", - description: "Text\n", - content: "Text\n" + title: "Operators, Networks, Platforms", + description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( @@ -1373,8 +1388,8 @@ id: 34 , href: "\/docs\/partners\/managed-service-providers\/", title: "Managed Service Provider", - description: "", - content: "" + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( @@ -1382,8 +1397,8 @@ id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1391,8 +1406,8 @@ id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1409,13 +1424,22 @@ id: 38 , href: "\/docs\/about-federated-computer\/federated-company-backgrounder\/", title: "Federated Company Backgrounder", - description: "", - content: "" + description: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\n", + content: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\nOpen Source linkThere’s no reason to use expensive, proprietary, privacy-destroying SaaS software. But in the past, running open-source software required lots of technical knowledge. Federated Computer makes it easy for any business to adopt open-source.\nWe are great stewards of the benefits of open-source. Our company actively contributes both financially and with code to a number of open-source projects offered in Federated Core and Federated Plus including Castopod, Bookstack, Headscale, Matrix, and OpenMandriva. We do all the work for you to ensure open-source projects are integrated, work well together, and provide you with the right value.\nDavid Young linkOur CEO and founder, David Young, has a long history working with impactful startups including Joyent. At Joyent he was responsible for leading the team that invented and patented cloud computing, containers-as-a-service, cloud operating system, infrastructure-as-a-service, node.js, native-web-apps as desktop/mobile apps (what became Electron) and many more fundamental cloud innovations.\nDavid’s companies have been backed by the biggest investors including Dell, Intel; and he has brought ground-breaking solutions to cloud pioneers such as Dell, Telefonica, Singtel, working for important early cloud adopters such as Twitter, Facebook Developer Platform, Linkedin, and many, many others.\n" } ); index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/management/index.xml b/public/docs/federated-core-platform/management/index.xml index 0d07ea0..5cb86a2 100644 --- a/public/docs/federated-core-platform/management/index.xml +++ b/public/docs/federated-core-platform/management/index.xml @@ -2,31 +2,31 @@ Management on Federated Computer Enterprise - http://localhost:1313/docs/federated-core-platform/management/ + http://enterprise.federated.computer/docs/federated-core-platform/management/ Recent content in Management on Federated Computer Enterprise Hugo en-us Mon, 25 Aug 2025 12:36:19 -0600 - + Core Scanner - http://localhost:1313/docs/federated-core-platform/management/core-scanner/ + http://enterprise.federated.computer/docs/federated-core-platform/management/core-scanner/ Mon, 25 Aug 2025 12:34:24 -0600 - http://localhost:1313/docs/federated-core-platform/management/core-scanner/ + http://enterprise.federated.computer/docs/federated-core-platform/management/core-scanner/ <p>Core Scanner is a utility to examine and manage each Core on a given installation of Federated Core Platform. It allows a customer service person to examine the Core, look at all the configuration files, see any anomalies in the files, track usage of resources (CPU, RAM, storage, network), and perform tightly managed actions on the Core to take remedial steps as needed.</p> <p>Each installation of Core Scanner includes user and group priveleges so that the owner of the Federated Core Platform can look at all Cores running, but also partners can examine and manage the Cores of their customers. For example, a managed service provider may have a number of Cores for which they will want to be able to provide monitor and fix service3. Core Scanner allows them to see those Cores, only.</p> Update and Upgrade - http://localhost:1313/docs/federated-core-platform/management/update-and-upgrade/ + http://enterprise.federated.computer/docs/federated-core-platform/management/update-and-upgrade/ Mon, 25 Aug 2025 12:36:19 -0600 - http://localhost:1313/docs/federated-core-platform/management/update-and-upgrade/ + http://enterprise.federated.computer/docs/federated-core-platform/management/update-and-upgrade/ <p>Each Federated Core Platform installation has a Gitea respository where the software (OS, utilities, platform, open source SaaS) for the entire system is tracked. The operator of each installation is able to package those updates into regular upgrades pushed out to some/all Cores on the system, push them out individually for testing to some Cores, or schedule updates for a given list of Cores.</p> <p>Since the nature of the Federated Core Platform is delivering open source SaaS to customers, there needs to be a testing protocol set up to ensure updates are in fact needed/wanted. Federated Computer does this centrally, so operators using Federated Core Platform can know the software will &ldquo;work&rdquo;. However, there may be additional concerns with respect to security, other customizations that need to be tested, etc.</p> Monitor and Fix - http://localhost:1313/docs/federated-core-platform/management/monitor-and-fix/ + http://enterprise.federated.computer/docs/federated-core-platform/management/monitor-and-fix/ Mon, 25 Aug 2025 12:35:43 -0600 - http://localhost:1313/docs/federated-core-platform/management/monitor-and-fix/ + http://enterprise.federated.computer/docs/federated-core-platform/management/monitor-and-fix/ <p>Every Core running on an installation of Federated Core Platform, every application running on every Core, and every service not an application running on every Core, is monitored in real time to ensure it runs, has the system resources needed, and provides customers with the best experience. If there are anomalies detected, alerts are created and can be sent to the local Matrix server, and Federated Monitor and Fix system attempts to solve the problem using patterns and the service definitions in place.</p> diff --git a/public/docs/federated-core-platform/management/monitor-and-fix/index.html b/public/docs/federated-core-platform/management/monitor-and-fix/index.html index 55eeea4..d18dbfe 100644 --- a/public/docs/federated-core-platform/management/monitor-and-fix/index.html +++ b/public/docs/federated-core-platform/management/monitor-and-fix/index.html @@ -14,10 +14,9 @@ - + Monitor and Fix | Federated Computer Enterprise - @@ -25,19 +24,19 @@ - - - - - - + + + + + + - + - + @@ -48,8 +47,9 @@ - - + + + @@ -70,7 +70,8 @@ - + + @@ -93,7 +94,7 @@
  • - + article Overview @@ -113,7 +114,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -128,47 +129,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -188,17 +189,17 @@ -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -218,22 +219,22 @@ -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -253,7 +254,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -273,12 +274,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -303,22 +304,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -338,22 +339,22 @@ -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -373,12 +374,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -661,10 +662,12 @@ - + + + - + @@ -1421,8 +1424,8 @@ id: 39 , href: "\/docs\/about-federated-computer\/roadmap\/", title: "Roadmap", - description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer\nFirst Half, 2026 linkCore Workflow Intelligence\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", - content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer\nFirst Half, 2026 linkCore Workflow Intelligence\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" } ); index.add( diff --git a/public/docs/federated-core-platform/management/update-and-upgrade/index.html b/public/docs/federated-core-platform/management/update-and-upgrade/index.html index 27c833a..b700991 100644 --- a/public/docs/federated-core-platform/management/update-and-upgrade/index.html +++ b/public/docs/federated-core-platform/management/update-and-upgrade/index.html @@ -14,10 +14,9 @@ - + Update and Upgrade | Federated Computer Enterprise - @@ -25,20 +24,20 @@ - - - - - - + + + + + + - + - + @@ -50,8 +49,9 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t - - + + + @@ -72,7 +72,8 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t - + + @@ -95,7 +96,7 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t
  • - + article Overview @@ -115,7 +116,7 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -130,47 +131,47 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -190,17 +191,17 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -220,22 +221,22 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -255,7 +256,7 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -275,12 +276,12 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -305,22 +306,22 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -340,22 +341,22 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t -
  • Operators Networks Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -375,7 +376,12 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -658,10 +664,12 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t - + + + - + @@ -1041,6 +1049,13 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t + + + + + + + @@ -1356,9 +1371,9 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t { id: 33 , href: "\/docs\/partners\/operators-networks-platforms\/", - title: "Operators Networks Platforms", - description: "Text\n", - content: "Text\n" + title: "Operators, Networks, Platforms", + description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( @@ -1366,8 +1381,8 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t id: 34 , href: "\/docs\/partners\/managed-service-providers\/", title: "Managed Service Provider", - description: "", - content: "" + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( @@ -1375,8 +1390,8 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1384,8 +1399,8 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1402,13 +1417,22 @@ Since the nature of the Federated Core Platform is delivering open source SaaS t id: 38 , href: "\/docs\/about-federated-computer\/federated-company-backgrounder\/", title: "Federated Company Backgrounder", - description: "", - content: "" + description: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\n", + content: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\nOpen Source linkThere’s no reason to use expensive, proprietary, privacy-destroying SaaS software. But in the past, running open-source software required lots of technical knowledge. Federated Computer makes it easy for any business to adopt open-source.\nWe are great stewards of the benefits of open-source. Our company actively contributes both financially and with code to a number of open-source projects offered in Federated Core and Federated Plus including Castopod, Bookstack, Headscale, Matrix, and OpenMandriva. We do all the work for you to ensure open-source projects are integrated, work well together, and provide you with the right value.\nDavid Young linkOur CEO and founder, David Young, has a long history working with impactful startups including Joyent. At Joyent he was responsible for leading the team that invented and patented cloud computing, containers-as-a-service, cloud operating system, infrastructure-as-a-service, node.js, native-web-apps as desktop/mobile apps (what became Electron) and many more fundamental cloud innovations.\nDavid’s companies have been backed by the biggest investors including Dell, Intel; and he has brought ground-breaking solutions to cloud pioneers such as Dell, Telefonica, Singtel, working for important early cloud adopters such as Twitter, Facebook Developer Platform, Linkedin, and many, many others.\n" } ); index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/monitor-and-fix/index.html b/public/docs/federated-core-platform/monitor-and-fix/index.html deleted file mode 100644 index 48f8f0d..0000000 --- a/public/docs/federated-core-platform/monitor-and-fix/index.html +++ /dev/null @@ -1,1343 +0,0 @@ - - - - - - - - - - - - - - - - - - - Monitor and Fix | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Monitor and Fix - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/provisioner/index.html b/public/docs/federated-core-platform/provisioner/index.html deleted file mode 100644 index 6adf12a..0000000 --- a/public/docs/federated-core-platform/provisioner/index.html +++ /dev/null @@ -1,1343 +0,0 @@ - - - - - - - - - - - - - - - - - - - Provisioner | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Provisioner - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/provisioning/adding-software-to-federated-core/index.html b/public/docs/federated-core-platform/provisioning/adding-software-to-federated-core/index.html deleted file mode 100644 index 06579ab..0000000 --- a/public/docs/federated-core-platform/provisioning/adding-software-to-federated-core/index.html +++ /dev/null @@ -1,1456 +0,0 @@ - - - - - - - - - - - - - - - - - - - Adding Software to Federated Core | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Adding Software to Federated Core - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/provisioning/authentication/index.html b/public/docs/federated-core-platform/provisioning/authentication/index.html index 896bc25..d2a620b 100644 --- a/public/docs/federated-core-platform/provisioning/authentication/index.html +++ b/public/docs/federated-core-platform/provisioning/authentication/index.html @@ -14,10 +14,9 @@ - + Authentication | Federated Computer Enterprise - @@ -25,20 +24,20 @@ - - - - - - + + + + + + - + - + @@ -50,8 +49,9 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every - - + + + @@ -72,7 +72,8 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every - + + @@ -95,7 +96,7 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every
  • - + article Overview @@ -115,7 +116,7 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -130,47 +131,47 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -190,17 +191,17 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -220,22 +221,22 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -255,7 +256,7 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -275,12 +276,12 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -305,22 +306,22 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -340,22 +341,22 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -375,7 +376,12 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -688,10 +694,12 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every - + + + - + @@ -1071,6 +1079,13 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every + + + + + + + @@ -1388,7 +1403,7 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every href: "\/docs\/partners\/operators-networks-platforms\/", title: "Operators, Networks, Platforms", description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", - content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n" + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( @@ -1396,8 +1411,8 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every id: 34 , href: "\/docs\/partners\/managed-service-providers\/", title: "Managed Service Provider", - description: "", - content: "" + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( @@ -1405,8 +1420,8 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1414,8 +1429,8 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1439,6 +1454,15 @@ LDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/provisioning/computer/index.html b/public/docs/federated-core-platform/provisioning/computer/index.html index 4f2554e..937a3ef 100644 --- a/public/docs/federated-core-platform/provisioning/computer/index.html +++ b/public/docs/federated-core-platform/provisioning/computer/index.html @@ -14,10 +14,9 @@ - + Computer | Federated Computer Enterprise - @@ -25,19 +24,19 @@ - - - - - - + + + + + + - + - + @@ -48,8 +47,9 @@ - - + + + @@ -70,7 +70,8 @@ - + + @@ -93,7 +94,7 @@
  • - + article Overview @@ -113,7 +114,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -128,47 +129,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -188,17 +189,17 @@ -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -218,22 +219,22 @@ -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -253,7 +254,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -273,12 +274,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -303,22 +304,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -338,22 +339,22 @@ -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -373,7 +374,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -654,10 +660,12 @@ - + + + - + @@ -1037,6 +1045,13 @@ + + + + + + + @@ -1380,8 +1395,8 @@ id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1405,6 +1420,15 @@ index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/provisioning/core-desktop/index.html b/public/docs/federated-core-platform/provisioning/core-desktop/index.html index 474892c..d49484f 100644 --- a/public/docs/federated-core-platform/provisioning/core-desktop/index.html +++ b/public/docs/federated-core-platform/provisioning/core-desktop/index.html @@ -14,10 +14,9 @@ - + Core Desktop | Federated Computer Enterprise - @@ -25,19 +24,19 @@ - - - - - - + + + + + + - + - + @@ -48,8 +47,9 @@ - - + + + @@ -70,7 +70,8 @@ - + + @@ -93,7 +94,7 @@
  • - + article Overview @@ -113,7 +114,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -128,47 +129,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -188,17 +189,17 @@ -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -218,22 +219,22 @@ -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -253,7 +254,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -273,12 +274,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -303,22 +304,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -338,22 +339,22 @@ -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -373,7 +374,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -655,10 +661,12 @@ - + + + - + @@ -1038,6 +1046,13 @@ + + + + + + + @@ -1406,6 +1421,15 @@ index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/provisioning/core-mini/index.html b/public/docs/federated-core-platform/provisioning/core-mini/index.html index 74fa5b1..1e208a2 100644 --- a/public/docs/federated-core-platform/provisioning/core-mini/index.html +++ b/public/docs/federated-core-platform/provisioning/core-mini/index.html @@ -14,10 +14,9 @@ - + Core Mini | Federated Computer Enterprise - @@ -25,12 +24,12 @@ - - - - - - + + + + + + - + - + - + + + @@ -82,7 +82,8 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely - + + @@ -105,7 +106,7 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely
  • - + article Overview @@ -125,7 +126,7 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -140,47 +141,47 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -200,17 +201,17 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -230,22 +231,22 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -265,7 +266,7 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -285,12 +286,12 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -315,22 +316,22 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -350,22 +351,22 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely -
  • Operators Networks Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -385,7 +386,12 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -712,10 +718,12 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely - + + + - + @@ -1095,6 +1103,13 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely + + + + + + + @@ -1339,8 +1354,8 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely id: 25 , href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", title: "Customer Service and Support", - description: "", - content: "" + description: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\n", + content: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\nChannel Partners (Managed Service Providers) linkWe can also support your channel partners. In our experience, channel partners such as managed service providers are great ways to sell software and services but each requires significant support and explanation to best support their own customers. Federated Computer has extensive operation experience providing this service to partners and we can bring our experience, content, processes to your installation of Federated Core Platform.\nOther Operators linkIt isn’t unusual for Federated Core Platform to be sold to other “operators” who don’t want their own installation. We have done this for fiber companies, universities, and other large enterprises. Federated Computer can support your own go-to-market plans with support, content, and programs designed to find and close big opportunities such as other operators.\n" } ); index.add( @@ -1410,9 +1425,9 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely { id: 33 , href: "\/docs\/partners\/operators-networks-platforms\/", - title: "Operators Networks Platforms", - description: "Text\n", - content: "Text\n" + title: "Operators, Networks, Platforms", + description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( @@ -1420,8 +1435,8 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely id: 34 , href: "\/docs\/partners\/managed-service-providers\/", title: "Managed Service Provider", - description: "", - content: "" + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( @@ -1429,8 +1444,8 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1438,8 +1453,8 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1456,13 +1471,22 @@ MariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely id: 38 , href: "\/docs\/about-federated-computer\/federated-company-backgrounder\/", title: "Federated Company Backgrounder", - description: "", - content: "" + description: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\n", + content: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\nOpen Source linkThere’s no reason to use expensive, proprietary, privacy-destroying SaaS software. But in the past, running open-source software required lots of technical knowledge. Federated Computer makes it easy for any business to adopt open-source.\nWe are great stewards of the benefits of open-source. Our company actively contributes both financially and with code to a number of open-source projects offered in Federated Core and Federated Plus including Castopod, Bookstack, Headscale, Matrix, and OpenMandriva. We do all the work for you to ensure open-source projects are integrated, work well together, and provide you with the right value.\nDavid Young linkOur CEO and founder, David Young, has a long history working with impactful startups including Joyent. At Joyent he was responsible for leading the team that invented and patented cloud computing, containers-as-a-service, cloud operating system, infrastructure-as-a-service, node.js, native-web-apps as desktop/mobile apps (what became Electron) and many more fundamental cloud innovations.\nDavid’s companies have been backed by the biggest investors including Dell, Intel; and he has brought ground-breaking solutions to cloud pioneers such as Dell, Telefonica, Singtel, working for important early cloud adopters such as Twitter, Facebook Developer Platform, Linkedin, and many, many others.\n" } ); index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/provisioning/core-scanner/index.html b/public/docs/federated-core-platform/provisioning/core-scanner/index.html deleted file mode 100644 index 22f7229..0000000 --- a/public/docs/federated-core-platform/provisioning/core-scanner/index.html +++ /dev/null @@ -1,1456 +0,0 @@ - - - - - - - - - - - - - - - - - - - Core Scanner | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Core Scanner - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/provisioning/core-server/index.html b/public/docs/federated-core-platform/provisioning/core-server/index.html index b936eb2..a8f4906 100644 --- a/public/docs/federated-core-platform/provisioning/core-server/index.html +++ b/public/docs/federated-core-platform/provisioning/core-server/index.html @@ -14,10 +14,9 @@ - + Core Server | Federated Computer Enterprise - @@ -25,20 +24,20 @@ - - - - - - + + + + + + - + - + @@ -50,8 +49,9 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp - - + + + @@ -72,7 +72,8 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp - + + @@ -95,7 +96,7 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp
  • - + article Overview @@ -115,7 +116,7 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -130,47 +131,47 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -190,17 +191,17 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -220,22 +221,22 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -255,7 +256,7 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -275,12 +276,12 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -305,22 +306,22 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -340,22 +341,22 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp -
  • Operators Networks Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -375,7 +376,12 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -657,10 +663,12 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp - + + + - + @@ -1040,6 +1048,13 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp + + + + + + + @@ -1355,9 +1370,9 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp { id: 33 , href: "\/docs\/partners\/operators-networks-platforms\/", - title: "Operators Networks Platforms", - description: "Text\n", - content: "Text\n" + title: "Operators, Networks, Platforms", + description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( @@ -1365,8 +1380,8 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp id: 34 , href: "\/docs\/partners\/managed-service-providers\/", title: "Managed Service Provider", - description: "", - content: "" + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( @@ -1374,8 +1389,8 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1383,8 +1398,8 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1401,13 +1416,22 @@ Core Server is based on OpenMandriva a Linux distribution lead by Federated Comp id: 38 , href: "\/docs\/about-federated-computer\/federated-company-backgrounder\/", title: "Federated Company Backgrounder", - description: "", - content: "" + description: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\n", + content: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\nOpen Source linkThere’s no reason to use expensive, proprietary, privacy-destroying SaaS software. But in the past, running open-source software required lots of technical knowledge. Federated Computer makes it easy for any business to adopt open-source.\nWe are great stewards of the benefits of open-source. Our company actively contributes both financially and with code to a number of open-source projects offered in Federated Core and Federated Plus including Castopod, Bookstack, Headscale, Matrix, and OpenMandriva. We do all the work for you to ensure open-source projects are integrated, work well together, and provide you with the right value.\nDavid Young linkOur CEO and founder, David Young, has a long history working with impactful startups including Joyent. At Joyent he was responsible for leading the team that invented and patented cloud computing, containers-as-a-service, cloud operating system, infrastructure-as-a-service, node.js, native-web-apps as desktop/mobile apps (what became Electron) and many more fundamental cloud innovations.\nDavid’s companies have been backed by the biggest investors including Dell, Intel; and he has brought ground-breaking solutions to cloud pioneers such as Dell, Telefonica, Singtel, working for important early cloud adopters such as Twitter, Facebook Developer Platform, Linkedin, and many, many others.\n" } ); index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/provisioning/dashboard/index.html b/public/docs/federated-core-platform/provisioning/dashboard/index.html index cec1656..3d6dd25 100644 --- a/public/docs/federated-core-platform/provisioning/dashboard/index.html +++ b/public/docs/federated-core-platform/provisioning/dashboard/index.html @@ -14,10 +14,9 @@ - + Dashboard | Federated Computer Enterprise - @@ -25,12 +24,12 @@ - - - - - - + + + + + + - + - + - + + + @@ -94,7 +94,8 @@ - + + @@ -117,7 +118,7 @@
  • - + article Overview @@ -137,7 +138,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -152,47 +153,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -212,17 +213,17 @@ -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -242,22 +243,22 @@ -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -277,7 +278,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -297,12 +298,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -327,22 +328,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -362,22 +363,22 @@ -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -397,7 +398,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -690,10 +696,12 @@ - + + + - + @@ -1073,6 +1081,13 @@ + + + + + + + @@ -1398,8 +1413,8 @@ id: 34 , href: "\/docs\/partners\/managed-service-providers\/", title: "Managed Service Provider", - description: "", - content: "" + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( @@ -1407,8 +1422,8 @@ id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1416,8 +1431,8 @@ id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1441,6 +1456,15 @@ index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/provisioning/federated-core-platform/index.html b/public/docs/federated-core-platform/provisioning/federated-core-platform/index.html deleted file mode 100644 index 352a38d..0000000 --- a/public/docs/federated-core-platform/provisioning/federated-core-platform/index.html +++ /dev/null @@ -1,1384 +0,0 @@ - - - - - - - - - - - - - - - - - - - Federated Core Platform | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Federated Core Platform - -

    -
    - -

    - -
    - - -
    -

    The Federated Core Platform is a suite of software providing everything needed to deliver open source SaaS applications: integrate them to work well together; manage, patch, update the software; and provide bespoke customer service for customers.

    -

    The main component groups of Federated Core Platform are:

    -

    Provisioning

      -
    1. Provisioner
    2. -
    3. Core Server
    4. -
    5. Core Mini
    6. -
    7. Unified Storage
    8. -
    9. Unified Messaging
    10. -
    11. Authentication
    12. -
    13. Dashboard
    14. -
    15. Computer
    16. -
    -

    Maintenance

      -
    1. CoreScanner
    2. -
    3. Update and Upgrade
    4. -
    5. Monitor and Fix
    6. -
    -

    Customization

      -
    1. Core Workflow Intelligence
    2. -
    3. Adding Software to Federated Core
    4. -
    5. Why Open Source Projects Work With Federated
    6. -
    -

    Billing

      -
    1. Account Management and Billing
    2. -
    -

    Services

      -
    1. Federated Management
    2. -
    3. Customer Service and Support
    4. -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/provisioning/index.html b/public/docs/federated-core-platform/provisioning/index.html index f859a35..2073538 100644 --- a/public/docs/federated-core-platform/provisioning/index.html +++ b/public/docs/federated-core-platform/provisioning/index.html @@ -14,10 +14,9 @@ - + Provisioning | Federated Computer Enterprise - @@ -25,17 +24,17 @@ - - - - - - + + + + + + - - + + @@ -46,8 +45,9 @@ - - + + + @@ -68,7 +68,8 @@ - + + @@ -91,7 +92,7 @@
  • - + article Overview @@ -111,7 +112,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -126,47 +127,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -186,17 +187,17 @@ -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -216,22 +217,22 @@ -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -251,7 +252,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -271,12 +272,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -301,22 +302,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -336,22 +337,22 @@ -
  • Operators Networks Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -371,7 +372,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -562,7 +568,7 @@
    - +
    article @@ -579,7 +585,7 @@
    - +
    article @@ -596,7 +602,7 @@
    - +
    article @@ -613,7 +619,7 @@
    - +
    article @@ -630,7 +636,7 @@
    - +
    article @@ -647,7 +653,7 @@
    - +
    article @@ -664,7 +670,7 @@
    - +
    article @@ -681,7 +687,7 @@
    - +
    article @@ -698,7 +704,7 @@
    - +
    article @@ -767,10 +773,12 @@ - + + + - + @@ -1150,6 +1158,13 @@ + + + + + + + @@ -1347,6 +1362,15 @@ index.add( { id: 20 , + href: "\/docs\/federated-core-platform\/customization\/whitelabel\/", + title: "Whitelabel", + description: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n", + content: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n" + } + ); + index.add( + { + id: 21 , href: "\/docs\/federated-core-platform\/billing\/", title: "Billing", description: "", @@ -1355,16 +1379,16 @@ ); index.add( { - id: 21 , + id: 22 , href: "\/docs\/federated-core-platform\/billing\/account-management-and-billing\/", title: "Account Management and Billing", - description: "Federated Core Platform includes a service allowing your customers to sign up for\n", - content: "Federated Core Platform includes a service allowing your customers to sign up for\n" + description: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n", + content: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n" } ); index.add( { - id: 22 , + id: 23 , href: "\/docs\/federated-core-platform\/services\/", title: "Services", description: "", @@ -1373,25 +1397,25 @@ ); index.add( { - id: 23 , + id: 24 , href: "\/docs\/federated-core-platform\/services\/federated-management\/", title: "Federated Management", - description: "", - content: "" - } - ); - index.add( - { - id: 24 , - href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", - title: "Customer Service and Support", - description: "", - content: "" + description: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\n", + content: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\nManagement to Train linkWe can also, depending on the level of competency of your current team, work to run the Federated Core Platform for you while training your team to take over at a date certain in the future. We have found this to be the most successl approach to training rather that working on the particulars of how to run Federated Core Platform in the abstract.\n" } ); index.add( { id: 25 , + href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", + title: "Customer Service and Support", + description: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\n", + content: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\nChannel Partners (Managed Service Providers) linkWe can also support your channel partners. In our experience, channel partners such as managed service providers are great ways to sell software and services but each requires significant support and explanation to best support their own customers. Federated Computer has extensive operation experience providing this service to partners and we can bring our experience, content, processes to your installation of Federated Core Platform.\nOther Operators linkIt isn’t unusual for Federated Core Platform to be sold to other “operators” who don’t want their own installation. We have done this for fiber companies, universities, and other large enterprises. Federated Computer can support your own go-to-market plans with support, content, and programs designed to find and close big opportunities such as other operators.\n" + } + ); + index.add( + { + id: 26 , href: "\/docs\/federated-core-platform\/provisioning\/core-desktop\/", title: "Core Desktop", description: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\n", @@ -1400,7 +1424,7 @@ ); index.add( { - id: 26 , + id: 27 , href: "\/docs\/software-catalog\/", title: "Software Catalog", description: "", @@ -1409,7 +1433,7 @@ ); index.add( { - id: 27 , + id: 28 , href: "\/docs\/software-catalog\/software-catalog\/", title: "Software Catalog", description: "Federated offers a wide range of open source SaaS software. These can be provisioned individually or as part of a bundle. Provisions can happen on the same machine or virtual machine or on separate virtual machines for the sake of vertical scaling. Load balancers can also be applied for the SaaS applications that require it for horizontal scaling.\nThis catalog describes the software offerings available to customers at https://www.federated.computer today. For go-to-market reasons, we offer a reduced sub-set of this catalog based on Federated Computer’s own website but all titles can be provisioned for customers as-needed.\n", @@ -1418,7 +1442,7 @@ ); index.add( { - id: 28 , + id: 29 , href: "\/docs\/software-catalog\/bundles\/", title: "Bundles", description: "Bundles are great ways to package software for use by a type of business, a size of business, or a job function, among many other go-to-market motivations for bundling software.\nThe Federated Core Provisioner can spin up Federated Cores based on a software manifest that can be created “just in time” or based on a predefined collection of software and virtual machine. This allows you to fully manage the the expects margins for a sale.\n", @@ -1427,7 +1451,7 @@ ); index.add( { - id: 29 , + id: 30 , href: "\/docs\/software-catalog\/federated-commerce\/", title: "Federated Commerce", description: "Federated Commerce is a bundle designed by Federated Computer for customers wanting to sell goods on the internet.\nFederated Commerce delivers “unbreakable” Wordpress and WooCommerce add-ons to the Federated Core “Best” bundle (including video conferencing, mailing list, etc) all on dedicated cpu virtual machines.\nIn addition to software, Federated provides essential services to customers such as product imports and updates using Federated Eversync, three hour response and resolution times for issues, proviate channels for talking to support, Wordpress theme and Listmonk template support, shopping ads consultations, and a dedicated account manager.\n", @@ -1436,7 +1460,7 @@ ); index.add( { - id: 30 , + id: 31 , href: "\/docs\/software-catalog\/federated-omnimedia\/", title: "Federated Omnimedia", description: "Federated Omnimedia is a comprehensive bundle offered by Federated Computer to customers. It demonstrates what is possible.\nFederated Omnimedia is a complete offering for those with large digital communities. Examples are publishers, video channels, podcast channels, communities of interest.\nThe purpose of Federated Omnimedia is to give these sorts of customers access to every sort of tool required to successfully monetize the community. It includes:\nWordpress or Ghost for publishing; WooCommerce for eCommerce; Discourse for community discussion, a forum; Podcasting and videocasting platforms; Ad server to sell and display static and dynamic across all properties; Premium content service to “rope off” parts of content (posts, forums, podcasts, videos) only for premium subscribers. Federated Omnimedia provides ample opportunities for additional professional and technical service delivery to the customer.\n", @@ -1445,52 +1469,52 @@ ); index.add( { - id: 31 , + id: 32 , href: "\/docs\/partners\/", title: "Partners", description: "", content: "" } ); - index.add( - { - id: 32 , - href: "\/docs\/partners\/operators-networks-platforms\/", - title: "Operators Networks Platforms", - description: "Text\n", - content: "Text\n" - } - ); index.add( { id: 33 , - href: "\/docs\/partners\/managed-service-providers\/", - title: "Managed Service Provider", - description: "", - content: "" + href: "\/docs\/partners\/operators-networks-platforms\/", + title: "Operators, Networks, Platforms", + description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( { id: 34 , - href: "\/docs\/partners\/pro-customers\/", - title: "Pro Customers", - description: "", - content: "" + href: "\/docs\/partners\/managed-service-providers\/", + title: "Managed Service Provider", + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( { id: 35 , - href: "\/docs\/partners\/on-line-affiliates\/", - title: "On Line Affiliates", - description: "", - content: "" + href: "\/docs\/partners\/pro-customers\/", + title: "Pro Customers", + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( { id: 36 , + href: "\/docs\/partners\/on-line-affiliates\/", + title: "On Line Affiliates", + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" + } + ); + index.add( + { + id: 37 , href: "\/docs\/about-federated-computer\/", title: "About Federated Computer", description: "", @@ -1499,25 +1523,25 @@ ); index.add( { - id: 37 , + id: 38 , href: "\/docs\/about-federated-computer\/federated-company-backgrounder\/", title: "Federated Company Backgrounder", - description: "", - content: "" - } - ); - index.add( - { - id: 38 , - href: "\/docs\/federated-core-platform\/customization\/whitelabel\/", - title: "Whitelabel", - description: "", - content: "" + description: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\n", + content: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\nOpen Source linkThere’s no reason to use expensive, proprietary, privacy-destroying SaaS software. But in the past, running open-source software required lots of technical knowledge. Federated Computer makes it easy for any business to adopt open-source.\nWe are great stewards of the benefits of open-source. Our company actively contributes both financially and with code to a number of open-source projects offered in Federated Core and Federated Plus including Castopod, Bookstack, Headscale, Matrix, and OpenMandriva. We do all the work for you to ensure open-source projects are integrated, work well together, and provide you with the right value.\nDavid Young linkOur CEO and founder, David Young, has a long history working with impactful startups including Joyent. At Joyent he was responsible for leading the team that invented and patented cloud computing, containers-as-a-service, cloud operating system, infrastructure-as-a-service, node.js, native-web-apps as desktop/mobile apps (what became Electron) and many more fundamental cloud innovations.\nDavid’s companies have been backed by the biggest investors including Dell, Intel; and he has brought ground-breaking solutions to cloud pioneers such as Dell, Telefonica, Singtel, working for important early cloud adopters such as Twitter, Facebook Developer Platform, Linkedin, and many, many others.\n" } ); index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/provisioning/index.xml b/public/docs/federated-core-platform/provisioning/index.xml index b5274be..4114752 100644 --- a/public/docs/federated-core-platform/provisioning/index.xml +++ b/public/docs/federated-core-platform/provisioning/index.xml @@ -2,73 +2,73 @@ Provisioning on Federated Computer Enterprise - http://localhost:1313/docs/federated-core-platform/provisioning/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/ Recent content in Provisioning on Federated Computer Enterprise Hugo en-us Tue, 26 Aug 2025 14:43:09 -0600 - + Provisioner - http://localhost:1313/docs/federated-core-platform/provisioning/provisioner/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/provisioner/ Mon, 25 Aug 2025 12:35:51 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/provisioner/ - <p>The &ldquo;Provisioner&rdquo; is responsible for setting up, updating/upgrading, and tearing down Cores. It does this in an entirely stateless way communicating with either the aacount management and billing system or the management system. Naturally, there are command-line utilities and an API available to accomplish all functions.</p> <h3 id="order">Order <a href="#order" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>When and order comes through the account management and billing system, a manifest is created asking for a Core to be create with the required SaaS titles. This <em>manifest</em> is sent to the Provisioner which then requests a virtual machine (or machines, if the manifest includes load balancing or other extended Core services), then begins to build the Core software from the manifest. You can read more about the minimal build at <a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://localhost:1313/docs/federated-core-platform/provisioning/core-mini/'><p>PROVISIONING</p> + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/provisioner/ + <p>The &ldquo;Provisioner&rdquo; is responsible for setting up, updating/upgrading, and tearing down Cores. It does this in an entirely stateless way communicating with either the aacount management and billing system or the management system. Naturally, there are command-line utilities and an API available to accomplish all functions.</p> <h3 id="order">Order <a href="#order" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>When and order comes through the account management and billing system, a manifest is created asking for a Core to be create with the required SaaS titles. This <em>manifest</em> is sent to the Provisioner which then requests a virtual machine (or machines, if the manifest includes load balancing or other extended Core services), then begins to build the Core software from the manifest. You can read more about the minimal build at <a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://enterprise.federated.computer/docs/federated-core-platform/provisioning/core-mini/'><p>PROVISIONING</p> Core Server - http://localhost:1313/docs/federated-core-platform/provisioning/core-server/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/core-server/ Mon, 25 Aug 2025 12:34:34 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/core-server/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/core-server/ <p>Federated maintains its own Linux distribution for the specific purpose of control of the types and versions of software used in virtual machine. This descrease the surface area for attacks, increased maintainability for the Cores built on top, and assures our systems work on X64 and Arm (example: Ampere) systems as well as fully supporting IPv4 and IPv6 for cloud deployment.</p> <p>Core Server is based on <a href="https://www.openmandriva.org" rel="external" target="_blank">OpenMandriva<svg width="16" height="16" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M14 5c-.552 0-1-.448-1-1s.448-1 1-1h6c.552 0 1 .448 1 1v6c0 .552-.448 1-1 1s-1-.448-1-1v-3.586l-7.293 7.293c-.391.39-1.024.39-1.414 0-.391-.391-.391-1.024 0-1.414l7.293-7.293h-3.586zm-9 2c-.552 0-1 .448-1 1v11c0 .552.448 1 1 1h11c.552 0 1-.448 1-1v-4.563c0-.552.448-1 1-1s1 .448 1 1v4.563c0 1.657-1.343 3-3 3h-11c-1.657 0-3-1.343-3-3v-11c0-1.657 1.343-3 3-3h4.563c.552 0 1 .448 1 1s-.448 1-1 1h-4.563z"/></svg></a> a Linux distribution lead by Federated Computer&rsquo;s chief systems engineer. OpenMandriva is base on Fedora, in part.</p> Core Mini - http://localhost:1313/docs/federated-core-platform/provisioning/core-mini/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/core-mini/ Mon, 25 Aug 2025 12:34:18 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/core-mini/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/core-mini/ <p>Core Mini is the minimal install of software on a Core before adding additional SaaS and any scaling services (e.g. load balancing). These are the fundamental services used by ever other SaaS application.</p> <h3 id="traefik">Traefik <a href="#traefik" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>Firewall and network management.</p> <h3 id="powerdns">PowerDNS <a href="#powerdns" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>Domain name service.</p> <h3 id="authelia">Authelia <a href="#authelia" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>OIDC authentication provider.</p> <h3 id="mail-services">Mail Services <a href="#mail-services" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>SMTP and IMAP services.</p> <h3 id="postgresql">Postgresql <a href="#postgresql" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>Database engine for SaaS services requiring Postgresql.</p> <h3 id="mariadb">MariaDB <a href="#mariadb" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>Database engine for SaaS services requiring MariaDB. The will likely be obsolete in the coming months.</p> Unified Storage - http://localhost:1313/docs/federated-core-platform/provisioning/unified-storage/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/unified-storage/ Mon, 25 Aug 2025 12:36:10 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/unified-storage/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/unified-storage/ <p>Every SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage</p> <p>Every SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage.</p> Unified Messaging - http://localhost:1313/docs/federated-core-platform/provisioning/unified-messaging/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/unified-messaging/ Mon, 25 Aug 2025 12:36:03 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/unified-messaging/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/unified-messaging/ <p>Federated Core includes three systems for messaging.</p> <h3 id="email">Email <a href="#email" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>There is a full-featured IMAP/SMTP service available for any needed notifications to users.</p> <h3 id="container-to-container">Container-to-Container <a href="#container-to-container" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>There is a service for container-to-container communication allowing for complete workflow creation between SaaS applications when the native APIs are not enough.</p> <h3 id="optional-matrix">Optional: Matrix <a href="#optional-matrix" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>If the Matrix service is loaded, you can use it like a message-bus for application notification to users.</p> Authentication - http://localhost:1313/docs/federated-core-platform/provisioning/authentication/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/authentication/ Mon, 25 Aug 2025 12:33:49 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/authentication/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/authentication/ <p>One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.</p> <h3 id="ldap">LDAP <a href="#ldap" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>The foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn&rsquo;t use LDAP, it doesn&rsquo;t work on the platform. There are some applications for which the <em>only</em> account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden <em>outside</em> of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).</p> Dashboard - http://localhost:1313/docs/federated-core-platform/provisioning/dashboard/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/dashboard/ Tue, 26 Aug 2025 14:43:09 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/dashboard/ - <p>Federated Dashboard is a simple launcher for users. It shows the applications available, a link to helpful documentation, and a note about user management. There are significant improvements planned for Dashboard in the coming months as it transitions to Federated <a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://localhost:1313/docs/federated-core-platform/provisioning/computer/'><p>PROVISIONING</p><strong>Computer</strong><br></a>" data-bs-toggle="tooltip" href="http://localhost:1313/docs/federated-core-platform/provisioning/computer/">Computer</a>.</p> <p> </p> + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/dashboard/ + <p>Federated Dashboard is a simple launcher for users. It shows the applications available, a link to helpful documentation, and a note about user management. There are significant improvements planned for Dashboard in the coming months as it transitions to Federated <a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://enterprise.federated.computer/docs/federated-core-platform/provisioning/computer/'><p>PROVISIONING</p><strong>Computer</strong><br></a>" data-bs-toggle="tooltip" href="http://enterprise.federated.computer/docs/federated-core-platform/provisioning/computer/">Computer</a>.</p> <p> </p> Computer - http://localhost:1313/docs/federated-core-platform/provisioning/computer/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/computer/ Mon, 25 Aug 2025 12:33:56 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/computer/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/computer/ <p>Federated &ldquo;Computer&rdquo; is a new application coming in Fall, 2025 delivering a fully customizable front-end experience for Core users. It is a bookmarking application extended to support reminders, folders for watching applications, documents, events, the ability to pick up AI workloads and customizations, and more. Federated &ldquo;Computer&rdquo; is intended to be fully open-sourced, will work with other SaaS applications that support URLs, and will work natively on desktops, tablets, and mobile devices.</p> Core Desktop - http://localhost:1313/docs/federated-core-platform/provisioning/core-desktop/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/core-desktop/ Mon, 25 Aug 2025 12:34:05 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/core-desktop/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/core-desktop/ <p>Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the &ldquo;correct&rdquo; software and services so that it &ldquo;just works&rdquo;.</p> diff --git a/public/docs/federated-core-platform/provisioning/monitor-and-fix/index.html b/public/docs/federated-core-platform/provisioning/monitor-and-fix/index.html deleted file mode 100644 index a6bbb2d..0000000 --- a/public/docs/federated-core-platform/provisioning/monitor-and-fix/index.html +++ /dev/null @@ -1,1456 +0,0 @@ - - - - - - - - - - - - - - - - - - - Monitor and Fix | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Monitor and Fix - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/provisioning/provisioner/index.html b/public/docs/federated-core-platform/provisioning/provisioner/index.html index 48eb038..02a3f51 100644 --- a/public/docs/federated-core-platform/provisioning/provisioner/index.html +++ b/public/docs/federated-core-platform/provisioning/provisioner/index.html @@ -14,10 +14,9 @@ - + Provisioner | Federated Computer Enterprise - @@ -25,20 +24,20 @@ - - - - - - + + + + + + - + - + @@ -50,8 +49,9 @@ Order linkWhen and order comes through the account management and billing system - - + + + @@ -72,7 +72,8 @@ Order linkWhen and order comes through the account management and billing system - + + @@ -95,7 +96,7 @@ Order linkWhen and order comes through the account management and billing system
  • - + article Overview @@ -115,7 +116,7 @@ Order linkWhen and order comes through the account management and billing system -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -130,47 +131,47 @@ Order linkWhen and order comes through the account management and billing system -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -190,17 +191,17 @@ Order linkWhen and order comes through the account management and billing system -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -220,17 +221,22 @@ Order linkWhen and order comes through the account management and billing system -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • + + + + +
  • Whitelabel
  • @@ -250,7 +256,7 @@ Order linkWhen and order comes through the account management and billing system -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -270,12 +276,12 @@ Order linkWhen and order comes through the account management and billing system -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -300,22 +306,22 @@ Order linkWhen and order comes through the account management and billing system -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -335,22 +341,22 @@ Order linkWhen and order comes through the account management and billing system -
  • Operators Networks Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -370,7 +376,12 @@ Order linkWhen and order comes through the account management and billing system -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -683,10 +694,12 @@ Order linkWhen and order comes through the account management and billing system - + + + - + @@ -1052,6 +1065,20 @@ Order linkWhen and order comes through the account management and billing system + + + + + + + + + + + + + + @@ -1160,7 +1187,7 @@ Order linkWhen and order comes through the account management and billing system href: "\/docs\/federated-core-platform\/provisioning\/authentication\/", title: "Authentication", description: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\n", - content: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\nLDAP services can be exposed to network outside of Core to be used by other systems that use LDAP. And example would be a collection of Windows, MacOS, Linux desktop computers where you want users to log in to this machines using their Core credentials from LDAP. You could also use Core LDAP for other software systems where you want to use a central user repository for access control.\nCore LDAP support users and groups. For example, you can delegate administrative access controls to certain users in Nextcloud using LDAP.\nLDAP is managed through the Federated Core app “Panel”.\nOIDC linkSingle-sign on is provided in Federated Core Platform by Authelia. This allows, for example, a customer to log in to one open source SaaS application in a browser and to automatically log in to other Core applications in the same browser. It also allows the user to log out of all applications, in the same way.\nFederated Core applications default to OIDC authentication when the application supports it. Most do. Some applications only support OIDC with a premium upgrade (also supported), but a few don’t (yet) support OIDC or only support authentication using OIDC providers such as Google, etc. Federated plans to provide work arounds for all applications to use OIDC and have done this successfully for some (eg. cal.com).\n" + content: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\nLDAP services can be exposed to network outside of Core to be used by other systems that use LDAP. And example would be a collection of Windows, MacOS, Linux desktop computers where you want users to log in to this machines using their Core credentials from LDAP. You could also use Core LDAP for other software systems where you want to use a central user repository for access control such as virtual desktop environments.\nCore LDAP support users and groups. For example, you can delegate administrative access controls to certain users in Nextcloud using LDAP.\nLDAP is managed through the Federated Core app “Panel”.\nOIDC linkSingle-sign on is provided in Federated Core Platform by Authelia. This allows, for example, a customer to log in to one open source SaaS application in a browser and to automatically log in to other Core applications in the same browser. It also allows the user to log out of all applications, in the same way.\nFederated Core applications default to OIDC authentication when the application supports it. Most do. Some applications only support OIDC with a premium upgrade (also supported), but a few don’t (yet) support OIDC or only support authentication using OIDC providers such as Google, etc. Federated plans to provide work arounds for all applications to use OIDC and have done this successfully for some (eg. cal.com).\n" } ); index.add( @@ -1231,8 +1258,8 @@ Order linkWhen and order comes through the account management and billing system id: 17 , href: "\/docs\/federated-core-platform\/customization\/core-workflow-intelligence\/", title: "Core Workflow Intelligence", - description: "", - content: "" + description: "Federated will be delivering in early 2026 an “on premise” solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.\n", + content: "Federated will be delivering in early 2026 an “on premise” solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.\nWe believe these sorts of “software intelligence” are very important for the overall success of customers using Federated Core and are central to the idea that open source is the best means to achieve maximum flexibility and business differentiation from software. Further, we believe AI is uniquely situated to provide real progress in connecting software to software for custom workflows. It need not work in “real time” but in enough time to deliver the right solution to customers reliably.\n" } ); index.add( @@ -1240,13 +1267,31 @@ Order linkWhen and order comes through the account management and billing system id: 18 , href: "\/docs\/federated-core-platform\/customization\/adding-software-to-federated-core\/", title: "Adding Software to Federated Core", - description: "", - content: "" + description: "It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\n", + content: "It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\nIn the near future, we plan to provide a portal for projects to package and submit software for inclusion on Federated Core Platform.\n" } ); index.add( { id: 19 , + href: "\/docs\/federated-core-platform\/customization\/why-open-source-projects-work-with-federated\/", + title: "Why Open Source Projects Work With Federated", + description: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\n", + content: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\nYou can think of an open source SaaS developer as an extension of your Federated Core Platform continually adding value to your overall go-to-market. These developers think in the same way. While their principle concern is the success and completeness of their software, they recognize the value for customers when their software is integrated into a total solution with great user management, unified storage and messaging, and the many other conveniences and services offered by Federated Core Platform.\nAll pricing for software is done outside of Federated Core Platform giving each installation the flexibility to build use cases and go-to-market solutions apart from the technology offerings.\n" + } + ); + index.add( + { + id: 20 , + href: "\/docs\/federated-core-platform\/customization\/whitelabel\/", + title: "Whitelabel", + description: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n", + content: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n" + } + ); + index.add( + { + id: 21 , href: "\/docs\/federated-core-platform\/billing\/", title: "Billing", description: "", @@ -1255,16 +1300,16 @@ Order linkWhen and order comes through the account management and billing system ); index.add( { - id: 20 , + id: 22 , href: "\/docs\/federated-core-platform\/billing\/account-management-and-billing\/", title: "Account Management and Billing", - description: "", - content: "" + description: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n", + content: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n" } ); index.add( { - id: 21 , + id: 23 , href: "\/docs\/federated-core-platform\/services\/", title: "Services", description: "", @@ -1273,25 +1318,25 @@ Order linkWhen and order comes through the account management and billing system ); index.add( { - id: 22 , + id: 24 , href: "\/docs\/federated-core-platform\/services\/federated-management\/", title: "Federated Management", - description: "", - content: "" + description: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\n", + content: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\nManagement to Train linkWe can also, depending on the level of competency of your current team, work to run the Federated Core Platform for you while training your team to take over at a date certain in the future. We have found this to be the most successl approach to training rather that working on the particulars of how to run Federated Core Platform in the abstract.\n" } ); index.add( { - id: 23 , + id: 25 , href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", title: "Customer Service and Support", - description: "", - content: "" + description: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\n", + content: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\nChannel Partners (Managed Service Providers) linkWe can also support your channel partners. In our experience, channel partners such as managed service providers are great ways to sell software and services but each requires significant support and explanation to best support their own customers. Federated Computer has extensive operation experience providing this service to partners and we can bring our experience, content, processes to your installation of Federated Core Platform.\nOther Operators linkIt isn’t unusual for Federated Core Platform to be sold to other “operators” who don’t want their own installation. We have done this for fiber companies, universities, and other large enterprises. Federated Computer can support your own go-to-market plans with support, content, and programs designed to find and close big opportunities such as other operators.\n" } ); index.add( { - id: 24 , + id: 26 , href: "\/docs\/federated-core-platform\/provisioning\/core-desktop\/", title: "Core Desktop", description: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\n", @@ -1300,16 +1345,7 @@ Order linkWhen and order comes through the account management and billing system ); index.add( { - id: 25 , - href: "\/docs\/federated-core-platform\/customization\/why-open-source-projects-work-with-federated\/", - title: "Why Open Source Projects Work With Federated", - description: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\n", - content: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\nIt is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\nAll pricing is done outside of Federated Core Platform.\n" - } - ); - index.add( - { - id: 26 , + id: 27 , href: "\/docs\/software-catalog\/", title: "Software Catalog", description: "", @@ -1318,7 +1354,7 @@ Order linkWhen and order comes through the account management and billing system ); index.add( { - id: 27 , + id: 28 , href: "\/docs\/software-catalog\/software-catalog\/", title: "Software Catalog", description: "Federated offers a wide range of open source SaaS software. These can be provisioned individually or as part of a bundle. Provisions can happen on the same machine or virtual machine or on separate virtual machines for the sake of vertical scaling. Load balancers can also be applied for the SaaS applications that require it for horizontal scaling.\nThis catalog describes the software offerings available to customers at https://www.federated.computer today. For go-to-market reasons, we offer a reduced sub-set of this catalog based on Federated Computer’s own website but all titles can be provisioned for customers as-needed.\n", @@ -1327,7 +1363,7 @@ Order linkWhen and order comes through the account management and billing system ); index.add( { - id: 28 , + id: 29 , href: "\/docs\/software-catalog\/bundles\/", title: "Bundles", description: "Bundles are great ways to package software for use by a type of business, a size of business, or a job function, among many other go-to-market motivations for bundling software.\nThe Federated Core Provisioner can spin up Federated Cores based on a software manifest that can be created “just in time” or based on a predefined collection of software and virtual machine. This allows you to fully manage the the expects margins for a sale.\n", @@ -1336,7 +1372,7 @@ Order linkWhen and order comes through the account management and billing system ); index.add( { - id: 29 , + id: 30 , href: "\/docs\/software-catalog\/federated-commerce\/", title: "Federated Commerce", description: "Federated Commerce is a bundle designed by Federated Computer for customers wanting to sell goods on the internet.\nFederated Commerce delivers “unbreakable” Wordpress and WooCommerce add-ons to the Federated Core “Best” bundle (including video conferencing, mailing list, etc) all on dedicated cpu virtual machines.\nIn addition to software, Federated provides essential services to customers such as product imports and updates using Federated Eversync, three hour response and resolution times for issues, proviate channels for talking to support, Wordpress theme and Listmonk template support, shopping ads consultations, and a dedicated account manager.\n", @@ -1345,7 +1381,7 @@ Order linkWhen and order comes through the account management and billing system ); index.add( { - id: 30 , + id: 31 , href: "\/docs\/software-catalog\/federated-omnimedia\/", title: "Federated Omnimedia", description: "Federated Omnimedia is a comprehensive bundle offered by Federated Computer to customers. It demonstrates what is possible.\nFederated Omnimedia is a complete offering for those with large digital communities. Examples are publishers, video channels, podcast channels, communities of interest.\nThe purpose of Federated Omnimedia is to give these sorts of customers access to every sort of tool required to successfully monetize the community. It includes:\nWordpress or Ghost for publishing; WooCommerce for eCommerce; Discourse for community discussion, a forum; Podcasting and videocasting platforms; Ad server to sell and display static and dynamic across all properties; Premium content service to “rope off” parts of content (posts, forums, podcasts, videos) only for premium subscribers. Federated Omnimedia provides ample opportunities for additional professional and technical service delivery to the customer.\n", @@ -1354,52 +1390,52 @@ Order linkWhen and order comes through the account management and billing system ); index.add( { - id: 31 , + id: 32 , href: "\/docs\/partners\/", title: "Partners", description: "", content: "" } ); - index.add( - { - id: 32 , - href: "\/docs\/partners\/operators-networks-platforms\/", - title: "Operators Networks Platforms", - description: "Text\n", - content: "Text\n" - } - ); index.add( { id: 33 , - href: "\/docs\/partners\/managed-service-providers\/", - title: "Managed Service Provider", - description: "", - content: "" + href: "\/docs\/partners\/operators-networks-platforms\/", + title: "Operators, Networks, Platforms", + description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( { id: 34 , - href: "\/docs\/partners\/pro-customers\/", - title: "Pro Customers", - description: "", - content: "" + href: "\/docs\/partners\/managed-service-providers\/", + title: "Managed Service Provider", + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( { id: 35 , - href: "\/docs\/partners\/on-line-affiliates\/", - title: "On Line Affiliates", - description: "", - content: "" + href: "\/docs\/partners\/pro-customers\/", + title: "Pro Customers", + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( { id: 36 , + href: "\/docs\/partners\/on-line-affiliates\/", + title: "On Line Affiliates", + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" + } + ); + index.add( + { + id: 37 , href: "\/docs\/about-federated-computer\/", title: "About Federated Computer", description: "", @@ -1408,16 +1444,25 @@ Order linkWhen and order comes through the account management and billing system ); index.add( { - id: 37 , + id: 38 , href: "\/docs\/about-federated-computer\/federated-company-backgrounder\/", title: "Federated Company Backgrounder", - description: "", - content: "" + description: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\n", + content: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\nOpen Source linkThere’s no reason to use expensive, proprietary, privacy-destroying SaaS software. But in the past, running open-source software required lots of technical knowledge. Federated Computer makes it easy for any business to adopt open-source.\nWe are great stewards of the benefits of open-source. Our company actively contributes both financially and with code to a number of open-source projects offered in Federated Core and Federated Plus including Castopod, Bookstack, Headscale, Matrix, and OpenMandriva. We do all the work for you to ensure open-source projects are integrated, work well together, and provide you with the right value.\nDavid Young linkOur CEO and founder, David Young, has a long history working with impactful startups including Joyent. At Joyent he was responsible for leading the team that invented and patented cloud computing, containers-as-a-service, cloud operating system, infrastructure-as-a-service, node.js, native-web-apps as desktop/mobile apps (what became Electron) and many more fundamental cloud innovations.\nDavid’s companies have been backed by the biggest investors including Dell, Intel; and he has brought ground-breaking solutions to cloud pioneers such as Dell, Telefonica, Singtel, working for important early cloud adopters such as Twitter, Facebook Developer Platform, Linkedin, and many, many others.\n" } ); index.add( { - id: 38 , + id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/provisioning/unified-messaging/index.html b/public/docs/federated-core-platform/provisioning/unified-messaging/index.html index 47f4fb5..7799f4d 100644 --- a/public/docs/federated-core-platform/provisioning/unified-messaging/index.html +++ b/public/docs/federated-core-platform/provisioning/unified-messaging/index.html @@ -14,10 +14,9 @@ - + Unified Messaging | Federated Computer Enterprise - @@ -25,22 +24,22 @@ - - - - - - + + + + + + - + - + - + + + @@ -76,7 +76,8 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess - + + @@ -99,7 +100,7 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess
  • - + article Overview @@ -119,7 +120,7 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -134,47 +135,47 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -194,17 +195,17 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -224,22 +225,22 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -259,7 +260,7 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -279,12 +280,12 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -309,22 +310,22 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -344,22 +345,22 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -379,7 +380,12 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -691,10 +697,12 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess - + + + - + @@ -1074,6 +1082,13 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess + + + + + + + @@ -1391,7 +1406,7 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess href: "\/docs\/partners\/operators-networks-platforms\/", title: "Operators, Networks, Platforms", description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", - content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n" + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( @@ -1399,8 +1414,8 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess id: 34 , href: "\/docs\/partners\/managed-service-providers\/", title: "Managed Service Provider", - description: "", - content: "" + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( @@ -1408,8 +1423,8 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1417,8 +1432,8 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1435,13 +1450,22 @@ Optional: Matrix linkIf the Matrix service is loaded, you can use it like a mess id: 38 , href: "\/docs\/about-federated-computer\/federated-company-backgrounder\/", title: "Federated Company Backgrounder", - description: "", - content: "" + description: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\n", + content: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\nOpen Source linkThere’s no reason to use expensive, proprietary, privacy-destroying SaaS software. But in the past, running open-source software required lots of technical knowledge. Federated Computer makes it easy for any business to adopt open-source.\nWe are great stewards of the benefits of open-source. Our company actively contributes both financially and with code to a number of open-source projects offered in Federated Core and Federated Plus including Castopod, Bookstack, Headscale, Matrix, and OpenMandriva. We do all the work for you to ensure open-source projects are integrated, work well together, and provide you with the right value.\nDavid Young linkOur CEO and founder, David Young, has a long history working with impactful startups including Joyent. At Joyent he was responsible for leading the team that invented and patented cloud computing, containers-as-a-service, cloud operating system, infrastructure-as-a-service, node.js, native-web-apps as desktop/mobile apps (what became Electron) and many more fundamental cloud innovations.\nDavid’s companies have been backed by the biggest investors including Dell, Intel; and he has brought ground-breaking solutions to cloud pioneers such as Dell, Telefonica, Singtel, working for important early cloud adopters such as Twitter, Facebook Developer Platform, Linkedin, and many, many others.\n" } ); index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/provisioning/unified-storage/index.html b/public/docs/federated-core-platform/provisioning/unified-storage/index.html index b5d96bf..9b10164 100644 --- a/public/docs/federated-core-platform/provisioning/unified-storage/index.html +++ b/public/docs/federated-core-platform/provisioning/unified-storage/index.html @@ -14,10 +14,9 @@ - + Unified Storage | Federated Computer Enterprise - @@ -25,20 +24,20 @@ - - - - - - + + + + + + - + - + @@ -50,8 +49,9 @@ Every SaaS software deployed to a Federated Core using a single expandable stora - - + + + @@ -72,7 +72,8 @@ Every SaaS software deployed to a Federated Core using a single expandable stora - + + @@ -95,7 +96,7 @@ Every SaaS software deployed to a Federated Core using a single expandable stora
  • - + article Overview @@ -115,7 +116,7 @@ Every SaaS software deployed to a Federated Core using a single expandable stora -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -130,47 +131,47 @@ Every SaaS software deployed to a Federated Core using a single expandable stora -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -190,17 +191,17 @@ Every SaaS software deployed to a Federated Core using a single expandable stora -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -220,22 +221,22 @@ Every SaaS software deployed to a Federated Core using a single expandable stora -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -255,7 +256,7 @@ Every SaaS software deployed to a Federated Core using a single expandable stora -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -275,12 +276,12 @@ Every SaaS software deployed to a Federated Core using a single expandable stora -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -305,22 +306,22 @@ Every SaaS software deployed to a Federated Core using a single expandable stora -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -340,22 +341,22 @@ Every SaaS software deployed to a Federated Core using a single expandable stora -
  • Operators Networks Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -375,7 +376,12 @@ Every SaaS software deployed to a Federated Core using a single expandable stora -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -657,10 +663,12 @@ Every SaaS software deployed to a Federated Core using a single expandable stora - + + + - + @@ -1040,6 +1048,13 @@ Every SaaS software deployed to a Federated Core using a single expandable stora + + + + + + + @@ -1355,9 +1370,9 @@ Every SaaS software deployed to a Federated Core using a single expandable stora { id: 33 , href: "\/docs\/partners\/operators-networks-platforms\/", - title: "Operators Networks Platforms", - description: "Text\n", - content: "Text\n" + title: "Operators, Networks, Platforms", + description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( @@ -1365,8 +1380,8 @@ Every SaaS software deployed to a Federated Core using a single expandable stora id: 34 , href: "\/docs\/partners\/managed-service-providers\/", title: "Managed Service Provider", - description: "", - content: "" + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( @@ -1374,8 +1389,8 @@ Every SaaS software deployed to a Federated Core using a single expandable stora id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1383,8 +1398,8 @@ Every SaaS software deployed to a Federated Core using a single expandable stora id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1401,13 +1416,22 @@ Every SaaS software deployed to a Federated Core using a single expandable stora id: 38 , href: "\/docs\/about-federated-computer\/federated-company-backgrounder\/", title: "Federated Company Backgrounder", - description: "", - content: "" + description: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\n", + content: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\nOpen Source linkThere’s no reason to use expensive, proprietary, privacy-destroying SaaS software. But in the past, running open-source software required lots of technical knowledge. Federated Computer makes it easy for any business to adopt open-source.\nWe are great stewards of the benefits of open-source. Our company actively contributes both financially and with code to a number of open-source projects offered in Federated Core and Federated Plus including Castopod, Bookstack, Headscale, Matrix, and OpenMandriva. We do all the work for you to ensure open-source projects are integrated, work well together, and provide you with the right value.\nDavid Young linkOur CEO and founder, David Young, has a long history working with impactful startups including Joyent. At Joyent he was responsible for leading the team that invented and patented cloud computing, containers-as-a-service, cloud operating system, infrastructure-as-a-service, node.js, native-web-apps as desktop/mobile apps (what became Electron) and many more fundamental cloud innovations.\nDavid’s companies have been backed by the biggest investors including Dell, Intel; and he has brought ground-breaking solutions to cloud pioneers such as Dell, Telefonica, Singtel, working for important early cloud adopters such as Twitter, Facebook Developer Platform, Linkedin, and many, many others.\n" } ); index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/provisioning/update-and-upgrade/index.html b/public/docs/federated-core-platform/provisioning/update-and-upgrade/index.html deleted file mode 100644 index d186ba8..0000000 --- a/public/docs/federated-core-platform/provisioning/update-and-upgrade/index.html +++ /dev/null @@ -1,1456 +0,0 @@ - - - - - - - - - - - - - - - - - - - Update and Upgrade | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Update and Upgrade - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/provisioning/why-open-source-projects-work-with-federated/index.html b/public/docs/federated-core-platform/provisioning/why-open-source-projects-work-with-federated/index.html deleted file mode 100644 index 972125d..0000000 --- a/public/docs/federated-core-platform/provisioning/why-open-source-projects-work-with-federated/index.html +++ /dev/null @@ -1,1480 +0,0 @@ - - - - - - - - - - - - - - - - - - - Why Open Source Projects Work With Federated | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Why Open Source Projects Work With Federated - -

    -
    - -

    - -
    - - -
    -

    More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.

    -

    It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.

    -

    All pricing is done outside of Federated Core Platform.

    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/services/customer-service-and-support/index.html b/public/docs/federated-core-platform/services/customer-service-and-support/index.html index 48bcbc3..df6e2ed 100644 --- a/public/docs/federated-core-platform/services/customer-service-and-support/index.html +++ b/public/docs/federated-core-platform/services/customer-service-and-support/index.html @@ -14,10 +14,9 @@ - + Customer Service and Support | Federated Computer Enterprise - @@ -25,21 +24,21 @@ - - - - - - + + + + + + - + - + - + + + @@ -74,7 +74,8 @@ End-user Businesses and Team linkFederated Computer can use Freescout (a great F - + + @@ -97,7 +98,7 @@ End-user Businesses and Team linkFederated Computer can use Freescout (a great F
  • - + article Overview @@ -117,7 +118,7 @@ End-user Businesses and Team linkFederated Computer can use Freescout (a great F -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -132,47 +133,47 @@ End-user Businesses and Team linkFederated Computer can use Freescout (a great F -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -192,17 +193,17 @@ End-user Businesses and Team linkFederated Computer can use Freescout (a great F -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -222,22 +223,22 @@ End-user Businesses and Team linkFederated Computer can use Freescout (a great F -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -257,7 +258,7 @@ End-user Businesses and Team linkFederated Computer can use Freescout (a great F -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -277,12 +278,12 @@ End-user Businesses and Team linkFederated Computer can use Freescout (a great F -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -307,22 +308,22 @@ End-user Businesses and Team linkFederated Computer can use Freescout (a great F -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -342,22 +343,22 @@ End-user Businesses and Team linkFederated Computer can use Freescout (a great F -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -377,12 +378,12 @@ End-user Businesses and Team linkFederated Computer can use Freescout (a great F -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -695,10 +696,12 @@ End-user Businesses and Team linkFederated Computer can use Freescout (a great F - + + + - + diff --git a/public/docs/federated-core-platform/services/federated-management/index.html b/public/docs/federated-core-platform/services/federated-management/index.html index 7a386cc..836f470 100644 --- a/public/docs/federated-core-platform/services/federated-management/index.html +++ b/public/docs/federated-core-platform/services/federated-management/index.html @@ -14,10 +14,9 @@ - + Federated Management | Federated Computer Enterprise - @@ -25,20 +24,20 @@ - - - - - - + + + + + + - + - + @@ -50,8 +49,9 @@ Complete Management linkWe can run your installation of Federated Core Platform - - + + + @@ -72,7 +72,8 @@ Complete Management linkWe can run your installation of Federated Core Platform - + + @@ -95,7 +96,7 @@ Complete Management linkWe can run your installation of Federated Core Platform
  • - + article Overview @@ -115,7 +116,7 @@ Complete Management linkWe can run your installation of Federated Core Platform -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -130,47 +131,47 @@ Complete Management linkWe can run your installation of Federated Core Platform -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -190,17 +191,17 @@ Complete Management linkWe can run your installation of Federated Core Platform -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -220,22 +221,22 @@ Complete Management linkWe can run your installation of Federated Core Platform -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -255,7 +256,7 @@ Complete Management linkWe can run your installation of Federated Core Platform -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -275,12 +276,12 @@ Complete Management linkWe can run your installation of Federated Core Platform -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -305,22 +306,22 @@ Complete Management linkWe can run your installation of Federated Core Platform -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -340,22 +341,22 @@ Complete Management linkWe can run your installation of Federated Core Platform -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -375,12 +376,12 @@ Complete Management linkWe can run your installation of Federated Core Platform -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -689,10 +690,12 @@ Complete Management linkWe can run your installation of Federated Core Platform - + + + - + diff --git a/public/docs/federated-core-platform/services/index.html b/public/docs/federated-core-platform/services/index.html index 2e8095e..5408751 100644 --- a/public/docs/federated-core-platform/services/index.html +++ b/public/docs/federated-core-platform/services/index.html @@ -14,10 +14,9 @@ - + Services | Federated Computer Enterprise - @@ -25,17 +24,17 @@ - - - - - - + + + + + + - - + + @@ -46,8 +45,9 @@ - - + + + @@ -68,7 +68,8 @@ - + + @@ -91,7 +92,7 @@
  • - + article Overview @@ -111,7 +112,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -126,47 +127,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -186,17 +187,17 @@ -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -216,22 +217,22 @@ -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -251,7 +252,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -271,12 +272,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -301,22 +302,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -336,22 +337,22 @@ -
  • Operators Networks Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -371,7 +372,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -562,7 +568,7 @@
    - +
    article @@ -579,7 +585,7 @@
    - +
    article @@ -648,10 +654,12 @@ - + + + - + @@ -1031,6 +1039,13 @@ + + + + + + + @@ -1266,8 +1281,8 @@ id: 24 , href: "\/docs\/federated-core-platform\/services\/federated-management\/", title: "Federated Management", - description: "", - content: "" + description: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\n", + content: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\nManagement to Train linkWe can also, depending on the level of competency of your current team, work to run the Federated Core Platform for you while training your team to take over at a date certain in the future. We have found this to be the most successl approach to training rather that working on the particulars of how to run Federated Core Platform in the abstract.\n" } ); index.add( @@ -1275,8 +1290,8 @@ id: 25 , href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", title: "Customer Service and Support", - description: "", - content: "" + description: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\n", + content: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\nChannel Partners (Managed Service Providers) linkWe can also support your channel partners. In our experience, channel partners such as managed service providers are great ways to sell software and services but each requires significant support and explanation to best support their own customers. Federated Computer has extensive operation experience providing this service to partners and we can bring our experience, content, processes to your installation of Federated Core Platform.\nOther Operators linkIt isn’t unusual for Federated Core Platform to be sold to other “operators” who don’t want their own installation. We have done this for fiber companies, universities, and other large enterprises. Federated Computer can support your own go-to-market plans with support, content, and programs designed to find and close big opportunities such as other operators.\n" } ); index.add( @@ -1346,9 +1361,9 @@ { id: 33 , href: "\/docs\/partners\/operators-networks-platforms\/", - title: "Operators Networks Platforms", - description: "Text\n", - content: "Text\n" + title: "Operators, Networks, Platforms", + description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( @@ -1356,8 +1371,8 @@ id: 34 , href: "\/docs\/partners\/managed-service-providers\/", title: "Managed Service Provider", - description: "", - content: "" + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( @@ -1365,8 +1380,8 @@ id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1374,8 +1389,8 @@ id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1392,13 +1407,22 @@ id: 38 , href: "\/docs\/about-federated-computer\/federated-company-backgrounder\/", title: "Federated Company Backgrounder", - description: "", - content: "" + description: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\n", + content: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\nOpen Source linkThere’s no reason to use expensive, proprietary, privacy-destroying SaaS software. But in the past, running open-source software required lots of technical knowledge. Federated Computer makes it easy for any business to adopt open-source.\nWe are great stewards of the benefits of open-source. Our company actively contributes both financially and with code to a number of open-source projects offered in Federated Core and Federated Plus including Castopod, Bookstack, Headscale, Matrix, and OpenMandriva. We do all the work for you to ensure open-source projects are integrated, work well together, and provide you with the right value.\nDavid Young linkOur CEO and founder, David Young, has a long history working with impactful startups including Joyent. At Joyent he was responsible for leading the team that invented and patented cloud computing, containers-as-a-service, cloud operating system, infrastructure-as-a-service, node.js, native-web-apps as desktop/mobile apps (what became Electron) and many more fundamental cloud innovations.\nDavid’s companies have been backed by the biggest investors including Dell, Intel; and he has brought ground-breaking solutions to cloud pioneers such as Dell, Telefonica, Singtel, working for important early cloud adopters such as Twitter, Facebook Developer Platform, Linkedin, and many, many others.\n" } ); index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/federated-core-platform/services/index.xml b/public/docs/federated-core-platform/services/index.xml index dacfdc6..2e7d8fb 100644 --- a/public/docs/federated-core-platform/services/index.xml +++ b/public/docs/federated-core-platform/services/index.xml @@ -2,25 +2,25 @@ Services on Federated Computer Enterprise - http://localhost:1313/docs/federated-core-platform/services/ + http://enterprise.federated.computer/docs/federated-core-platform/services/ Recent content in Services on Federated Computer Enterprise Hugo en-us Tue, 26 Aug 2025 14:47:00 -0600 - + Federated Management - http://localhost:1313/docs/federated-core-platform/services/federated-management/ + http://enterprise.federated.computer/docs/federated-core-platform/services/federated-management/ Mon, 25 Aug 2025 12:35:12 -0600 - http://localhost:1313/docs/federated-core-platform/services/federated-management/ - + http://enterprise.federated.computer/docs/federated-core-platform/services/federated-management/ + <p>Federated Computer can work to get your to market in the fastest and most convenient way for your organization.</p> <h3 id="complete-management">Complete Management <a href="#complete-management" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>We can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform &ldquo;just runs&rdquo; and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).</p> Customer Service and Support - http://localhost:1313/docs/federated-core-platform/services/customer-service-and-support/ + http://enterprise.federated.computer/docs/federated-core-platform/services/customer-service-and-support/ Tue, 26 Aug 2025 14:47:00 -0600 - http://localhost:1313/docs/federated-core-platform/services/customer-service-and-support/ - + http://enterprise.federated.computer/docs/federated-core-platform/services/customer-service-and-support/ + <p>Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.</p> <p>In addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.</p> <h3 id="end-user-businesses-and-team">End-user Businesses and Team <a href="#end-user-businesses-and-team" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>Federated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.</p> diff --git a/public/docs/federated-core-platform/unified-messaging/index.html b/public/docs/federated-core-platform/unified-messaging/index.html deleted file mode 100644 index f39f0c2..0000000 --- a/public/docs/federated-core-platform/unified-messaging/index.html +++ /dev/null @@ -1,1406 +0,0 @@ - - - - - - - - - - - - - - - - - - - Unified Messaging | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Unified Messaging - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/unified-storage/index.html b/public/docs/federated-core-platform/unified-storage/index.html deleted file mode 100644 index 48c7275..0000000 --- a/public/docs/federated-core-platform/unified-storage/index.html +++ /dev/null @@ -1,1406 +0,0 @@ - - - - - - - - - - - - - - - - - - - Unified Storage | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Unified Storage - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/update-and-upgrade/index.html b/public/docs/federated-core-platform/update-and-upgrade/index.html deleted file mode 100644 index e88f7b1..0000000 --- a/public/docs/federated-core-platform/update-and-upgrade/index.html +++ /dev/null @@ -1,1406 +0,0 @@ - - - - - - - - - - - - - - - - - - - Update and Upgrade | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Update and Upgrade - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/federated-core-platform/why-open-source-projects-work-with-federated/index.html b/public/docs/federated-core-platform/why-open-source-projects-work-with-federated/index.html deleted file mode 100644 index 16eb4af..0000000 --- a/public/docs/federated-core-platform/why-open-source-projects-work-with-federated/index.html +++ /dev/null @@ -1,1406 +0,0 @@ - - - - - - - - - - - - - - - - - - - Why Open Source Projects Work With Federated | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Why Open Source Projects Work With Federated - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/index.html b/public/docs/index.html index 558563f..5acd1ea 100644 --- a/public/docs/index.html +++ b/public/docs/index.html @@ -14,10 +14,9 @@ - + Docs | Federated Computer Enterprise - @@ -25,17 +24,17 @@ - - - - - - + + + + + + - - + + @@ -46,8 +45,9 @@ - - + + + @@ -68,7 +68,8 @@ - + + @@ -91,7 +92,7 @@
  • - + article Overview @@ -111,7 +112,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -126,47 +127,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -186,17 +187,17 @@ -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -216,22 +217,22 @@ -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -251,7 +252,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -271,12 +272,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -301,22 +302,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -336,22 +337,22 @@ -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -371,12 +372,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -551,7 +552,7 @@
    - +
    article @@ -568,7 +569,7 @@
    - +
    article @@ -585,7 +586,7 @@
    - +
    article @@ -602,7 +603,7 @@
    - +
    article @@ -619,7 +620,7 @@
    - +
    article @@ -688,10 +689,12 @@ - + + + - + diff --git a/public/docs/index.xml b/public/docs/index.xml index f586219..3619488 100644 --- a/public/docs/index.xml +++ b/public/docs/index.xml @@ -2,18 +2,18 @@ Docs on Federated Computer Enterprise - http://localhost:1313/docs/ + http://enterprise.federated.computer/docs/ Recent content in Docs on Federated Computer Enterprise Hugo en-us Mon, 25 Aug 2025 12:25:51 -0600 - + Overview - http://localhost:1313/docs/overview/ + http://enterprise.federated.computer/docs/overview/ Mon, 25 Aug 2025 12:25:51 -0600 - http://localhost:1313/docs/overview/ - <p>We&rsquo;ve made this portal so you can learn about Federated Computer enterprise offerings.</p> <h2 id="federated-core-platform">Federated Core Platform <a href="#federated-core-platform" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h2><p><a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://localhost:1313/docs/federated-core-platform/federated-core-platform/'><p>FEDERATED CORE PLATFORM</p><strong>Federated Core Platform</strong><br></a>" data-bs-toggle="tooltip" href="http://localhost:1313/docs/federated-core-platform/federated-core-platform/">Federated Core Platform</a> delivers offerings and services based on the best open source software useful to businesses, teams, individuals looking for breaktrhough price, privacy, flexiblity and value from SaaS software. The <a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://localhost:1313/docs/federated-core-platform/federated-core-platform/'><p>FEDERATED CORE PLATFORM</p><strong>Federated Core Platform</strong><br></a>" data-bs-toggle="tooltip" href="http://localhost:1313/docs/federated-core-platform/federated-core-platform/">Federated Core Platfrom</a> enables operators and networks, managed service providers, &ldquo;pro&rdquo; customer partners, and on-line affiliates to deliver great software and services to their customers.</p> + http://enterprise.federated.computer/docs/overview/ + <p>We&rsquo;ve made this portal so you can learn about Federated Computer enterprise offerings.</p> <h2 id="federated-core-platform">Federated Core Platform <a href="#federated-core-platform" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h2><p><a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://enterprise.federated.computer/docs/federated-core-platform/federated-core-platform/'><p>FEDERATED CORE PLATFORM</p><strong>Federated Core Platform</strong><br></a>" data-bs-toggle="tooltip" href="http://enterprise.federated.computer/docs/federated-core-platform/federated-core-platform/">Federated Core Platform</a> delivers offerings and services based on the best open source software useful to businesses, teams, individuals looking for breaktrhough price, privacy, flexiblity and value from SaaS software. The <a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://enterprise.federated.computer/docs/federated-core-platform/federated-core-platform/'><p>FEDERATED CORE PLATFORM</p><strong>Federated Core Platform</strong><br></a>" data-bs-toggle="tooltip" href="http://enterprise.federated.computer/docs/federated-core-platform/federated-core-platform/">Federated Core Platfrom</a> enables operators and networks, managed service providers, &ldquo;pro&rdquo; customer partners, and on-line affiliates to deliver great software and services to their customers.</p> diff --git a/public/docs/js/bootstrap.c7927bdd82eceb076739257add3f4b0e11379da037c07d5c7110daeb6de0e3edcb2de867604550f88815157e4ec4ddb7.js b/public/docs/js/bootstrap.c7927bdd82eceb076739257add3f4b0e11379da037c07d5c7110daeb6de0e3edcb2de867604550f88815157e4ec4ddb7.js new file mode 100644 index 0000000..6156eae --- /dev/null +++ b/public/docs/js/bootstrap.c7927bdd82eceb076739257add3f4b0e11379da037c07d5c7110daeb6de0e3edcb2de867604550f88815157e4ec4ddb7.js @@ -0,0 +1 @@ +(()=>{var hn=Object.create;var rr=Object.defineProperty;var mn=Object.getOwnPropertyDescriptor;var gn=Object.getOwnPropertyNames;var _n=Object.getPrototypeOf,vn=Object.prototype.hasOwnProperty;var En=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var bn=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of gn(t))!vn.call(e,o)&&o!==r&&rr(e,o,{get:()=>t[o],enumerable:!(n=mn(t,o))||n.enumerable});return e};var nr=(e,t,r)=>(r=e!=null?hn(_n(e)):{},bn(t||!e||!e.__esModule?rr(r,"default",{value:e,enumerable:!0}):r,e));var ke=En(x=>{"use strict";Object.defineProperty(x,"__esModule",{value:!0});function B(e){if(e==null)return window;if(e.toString()!=="[object Window]"){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function mt(e){var t=B(e).Element;return e instanceof t||e instanceof Element}function $(e){var t=B(e).HTMLElement;return e instanceof t||e instanceof HTMLElement}function Rr(e){if(typeof ShadowRoot=="undefined")return!1;var t=B(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot}var at=Math.max,Gt=Math.min,gt=Math.round;function _t(e,t){t===void 0&&(t=!1);var r=e.getBoundingClientRect(),n=1,o=1;if($(e)&&t){var s=e.offsetHeight,i=e.offsetWidth;i>0&&(n=gt(r.width)/i||1),s>0&&(o=gt(r.height)/s||1)}return{width:r.width/n,height:r.height/o,top:r.top/o,right:r.right/n,bottom:r.bottom/o,left:r.left/n,x:r.left/n,y:r.top/o}}function Ce(e){var t=B(e),r=t.pageXOffset,n=t.pageYOffset;return{scrollLeft:r,scrollTop:n}}function po(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function ho(e){return e===B(e)||!$(e)?Ce(e):po(e)}function z(e){return e?(e.nodeName||"").toLowerCase():null}function tt(e){return((mt(e)?e.ownerDocument:e.document)||window.document).documentElement}function Se(e){return _t(tt(e)).left+Ce(e).scrollLeft}function G(e){return B(e).getComputedStyle(e)}function Ne(e){var t=G(e),r=t.overflow,n=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(r+o+n)}function mo(e){var t=e.getBoundingClientRect(),r=gt(t.width)/e.offsetWidth||1,n=gt(t.height)/e.offsetHeight||1;return r!==1||n!==1}function go(e,t,r){r===void 0&&(r=!1);var n=$(t),o=$(t)&&mo(t),s=tt(t),i=_t(e,o),a={scrollLeft:0,scrollTop:0},l={x:0,y:0};return(n||!n&&!r)&&((z(t)!=="body"||Ne(s))&&(a=ho(t)),$(t)?(l=_t(t,!0),l.x+=t.clientLeft,l.y+=t.clientTop):s&&(l.x=Se(s))),{x:i.left+a.scrollLeft-l.x,y:i.top+a.scrollTop-l.y,width:i.width,height:i.height}}function De(e){var t=_t(e),r=e.offsetWidth,n=e.offsetHeight;return Math.abs(t.width-r)<=1&&(r=t.width),Math.abs(t.height-n)<=1&&(n=t.height),{x:e.offsetLeft,y:e.offsetTop,width:r,height:n}}function Qt(e){return z(e)==="html"?e:e.assignedSlot||e.parentNode||(Rr(e)?e.host:null)||tt(e)}function Ir(e){return["html","body","#document"].indexOf(z(e))>=0?e.ownerDocument.body:$(e)&&Ne(e)?e:Ir(Qt(e))}function Lt(e,t){var r;t===void 0&&(t=[]);var n=Ir(e),o=n===((r=e.ownerDocument)==null?void 0:r.body),s=B(n),i=o?[s].concat(s.visualViewport||[],Ne(n)?n:[]):n,a=t.concat(i);return o?a:a.concat(Lt(Qt(i)))}function _o(e){return["table","td","th"].indexOf(z(e))>=0}function Tr(e){return!$(e)||G(e).position==="fixed"?null:e.offsetParent}function vo(e){var t=navigator.userAgent.toLowerCase().indexOf("firefox")!==-1,r=navigator.userAgent.indexOf("Trident")!==-1;if(r&&$(e)){var n=G(e);if(n.position==="fixed")return null}for(var o=Qt(e);$(o)&&["html","body"].indexOf(z(o))<0;){var s=G(o);if(s.transform!=="none"||s.perspective!=="none"||s.contain==="paint"||["transform","perspective"].indexOf(s.willChange)!==-1||t&&s.willChange==="filter"||t&&s.filter&&s.filter!=="none")return o;o=o.parentNode}return null}function Rt(e){for(var t=B(e),r=Tr(e);r&&_o(r)&&G(r).position==="static";)r=Tr(r);return r&&(z(r)==="html"||z(r)==="body"&&G(r).position==="static")?t:r||vo(e)||t}var P="top",k="bottom",H="right",R="left",Le="auto",It=[P,k,H,R],vt="start",Pt="end",Eo="clippingParents",Mr="viewport",Dt="popper",bo="reference",Or=It.reduce(function(e,t){return e.concat([t+"-"+vt,t+"-"+Pt])},[]),$r=[].concat(It,[Le]).reduce(function(e,t){return e.concat([t,t+"-"+vt,t+"-"+Pt])},[]),yo="beforeRead",Ao="read",wo="afterRead",To="beforeMain",Oo="main",Co="afterMain",So="beforeWrite",No="write",Do="afterWrite",Lo=[yo,Ao,wo,To,Oo,Co,So,No,Do];function xo(e){var t=new Map,r=new Set,n=[];e.forEach(function(s){t.set(s.name,s)});function o(s){r.add(s.name);var i=[].concat(s.requires||[],s.requiresIfExists||[]);i.forEach(function(a){if(!r.has(a)){var l=t.get(a);l&&o(l)}}),n.push(s)}return e.forEach(function(s){r.has(s.name)||o(s)}),n}function Po(e){var t=xo(e);return Lo.reduce(function(r,n){return r.concat(t.filter(function(o){return o.phase===n}))},[])}function Ro(e){var t;return function(){return t||(t=new Promise(function(r){Promise.resolve().then(function(){t=void 0,r(e())})})),t}}function q(e){return e.split("-")[0]}function Io(e){var t=e.reduce(function(r,n){var o=r[n.name];return r[n.name]=o?Object.assign({},o,n,{options:Object.assign({},o.options,n.options),data:Object.assign({},o.data,n.data)}):n,r},{});return Object.keys(t).map(function(r){return t[r]})}function Mo(e){var t=B(e),r=tt(e),n=t.visualViewport,o=r.clientWidth,s=r.clientHeight,i=0,a=0;return n&&(o=n.width,s=n.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(i=n.offsetLeft,a=n.offsetTop)),{width:o,height:s,x:i+Se(e),y:a}}function $o(e){var t,r=tt(e),n=Ce(e),o=(t=e.ownerDocument)==null?void 0:t.body,s=at(r.scrollWidth,r.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),i=at(r.scrollHeight,r.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),a=-n.scrollLeft+Se(e),l=-n.scrollTop;return G(o||r).direction==="rtl"&&(a+=at(r.clientWidth,o?o.clientWidth:0)-s),{width:s,height:i,x:a,y:l}}function kr(e,t){var r=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(r&&Rr(r)){var n=t;do{if(n&&e.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function Oe(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function ko(e){var t=_t(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}function Cr(e,t){return t===Mr?Oe(Mo(e)):mt(t)?ko(t):Oe($o(tt(e)))}function Ho(e){var t=Lt(Qt(e)),r=["absolute","fixed"].indexOf(G(e).position)>=0,n=r&&$(e)?Rt(e):e;return mt(n)?t.filter(function(o){return mt(o)&&kr(o,n)&&z(o)!=="body"&&(r?G(o).position!=="static":!0)}):[]}function Vo(e,t,r){var n=t==="clippingParents"?Ho(e):[].concat(t),o=[].concat(n,[r]),s=o[0],i=o.reduce(function(a,l){var u=Cr(e,l);return a.top=at(u.top,a.top),a.right=Gt(u.right,a.right),a.bottom=Gt(u.bottom,a.bottom),a.left=at(u.left,a.left),a},Cr(e,s));return i.width=i.right-i.left,i.height=i.bottom-i.top,i.x=i.left,i.y=i.top,i}function Et(e){return e.split("-")[1]}function xe(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function Hr(e){var t=e.reference,r=e.element,n=e.placement,o=n?q(n):null,s=n?Et(n):null,i=t.x+t.width/2-r.width/2,a=t.y+t.height/2-r.height/2,l;switch(o){case P:l={x:i,y:t.y-r.height};break;case k:l={x:i,y:t.y+t.height};break;case H:l={x:t.x+t.width,y:a};break;case R:l={x:t.x-r.width,y:a};break;default:l={x:t.x,y:t.y}}var u=o?xe(o):null;if(u!=null){var c=u==="y"?"height":"width";switch(s){case vt:l[u]=l[u]-(t[c]/2-r[c]/2);break;case Pt:l[u]=l[u]+(t[c]/2-r[c]/2);break}}return l}function Vr(){return{top:0,right:0,bottom:0,left:0}}function jr(e){return Object.assign({},Vr(),e)}function Br(e,t){return t.reduce(function(r,n){return r[n]=e,r},{})}function bt(e,t){t===void 0&&(t={});var r=t,n=r.placement,o=n===void 0?e.placement:n,s=r.boundary,i=s===void 0?Eo:s,a=r.rootBoundary,l=a===void 0?Mr:a,u=r.elementContext,c=u===void 0?Dt:u,d=r.altBoundary,v=d===void 0?!1:d,h=r.padding,g=h===void 0?0:h,_=jr(typeof g!="number"?g:Br(g,It)),m=c===Dt?bo:Dt,T=e.rects.popper,O=e.elements[v?m:c],C=Vo(mt(O)?O:O.contextElement||tt(e.elements.popper),i,l),E=_t(e.elements.reference),A=Hr({reference:E,element:T,strategy:"absolute",placement:o}),b=Oe(Object.assign({},T,A)),y=c===Dt?b:E,S={top:C.top-y.top+_.top,bottom:y.bottom-C.bottom+_.bottom,left:C.left-y.left+_.left,right:y.right-C.right+_.right},N=e.modifiersData.offset;if(c===Dt&&N){var D=N[o];Object.keys(S).forEach(function(w){var L=[H,k].indexOf(w)>=0?1:-1,et=[P,k].indexOf(w)>=0?"y":"x";S[w]+=D[et]*L})}return S}var Sr={placement:"bottom",modifiers:[],strategy:"absolute"};function Nr(){for(var e=arguments.length,t=new Array(e),r=0;r=0?-1:1,s=typeof r=="function"?r(Object.assign({},t,{placement:e})):r,i=s[0],a=s[1];return i=i||0,a=(a||0)*o,[R,H].indexOf(n)>=0?{x:a,y:i}:{x:i,y:a}}function zo(e){var t=e.state,r=e.options,n=e.name,o=r.offset,s=o===void 0?[0,0]:o,i=$r.reduce(function(c,d){return c[d]=qo(d,t.rects,s),c},{}),a=i[t.placement],l=a.x,u=a.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=u),t.modifiersData[n]=i}var Fr={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:zo},Go={left:"right",right:"left",bottom:"top",top:"bottom"};function zt(e){return e.replace(/left|right|bottom|top/g,function(t){return Go[t]})}var Qo={start:"end",end:"start"};function Lr(e){return e.replace(/start|end/g,function(t){return Qo[t]})}function Xo(e,t){t===void 0&&(t={});var r=t,n=r.placement,o=r.boundary,s=r.rootBoundary,i=r.padding,a=r.flipVariations,l=r.allowedAutoPlacements,u=l===void 0?$r:l,c=Et(n),d=c?a?Or:Or.filter(function(g){return Et(g)===c}):It,v=d.filter(function(g){return u.indexOf(g)>=0});v.length===0&&(v=d);var h=v.reduce(function(g,_){return g[_]=bt(e,{placement:_,boundary:o,rootBoundary:s,padding:i})[q(_)],g},{});return Object.keys(h).sort(function(g,_){return h[g]-h[_]})}function Jo(e){if(q(e)===Le)return[];var t=zt(e);return[Lr(e),t,Lr(t)]}function Zo(e){var t=e.state,r=e.options,n=e.name;if(!t.modifiersData[n]._skip){for(var o=r.mainAxis,s=o===void 0?!0:o,i=r.altAxis,a=i===void 0?!0:i,l=r.fallbackPlacements,u=r.padding,c=r.boundary,d=r.rootBoundary,v=r.altBoundary,h=r.flipVariations,g=h===void 0?!0:h,_=r.allowedAutoPlacements,m=t.options.placement,T=q(m),O=T===m,C=l||(O||!g?[zt(m)]:Jo(m)),E=[m].concat(C).reduce(function(ut,X){return ut.concat(q(X)===Le?Xo(t,{placement:X,boundary:c,rootBoundary:d,padding:u,flipVariations:g,allowedAutoPlacements:_}):X)},[]),A=t.rects.reference,b=t.rects.popper,y=new Map,S=!0,N=E[0],D=0;D=0,Tt=wt?"width":"height",I=bt(t,{placement:w,boundary:c,rootBoundary:d,altBoundary:v,padding:u}),V=wt?et?H:R:et?k:P;A[Tt]>b[Tt]&&(V=zt(V));var kt=zt(V),rt=[];if(s&&rt.push(I[L]<=0),a&&rt.push(I[V]<=0,I[kt]<=0),rt.every(function(ut){return ut})){N=w,S=!1;break}y.set(w,rt)}if(S)for(var Ht=g?3:1,ee=function(X){var Ct=E.find(function(jt){var nt=y.get(jt);if(nt)return nt.slice(0,X).every(function(re){return re})});if(Ct)return N=Ct,"break"},Ot=Ht;Ot>0;Ot--){var Vt=ee(Ot);if(Vt==="break")break}t.placement!==N&&(t.modifiersData[n]._skip=!0,t.placement=N,t.reset=!0)}}var Wr={name:"flip",enabled:!0,phase:"main",fn:Zo,requiresIfExists:["offset"],data:{_skip:!1}};function ti(e){return e==="x"?"y":"x"}function xt(e,t,r){return at(e,Gt(t,r))}function ei(e,t,r){var n=xt(e,t,r);return n>r?r:n}function ri(e){var t=e.state,r=e.options,n=e.name,o=r.mainAxis,s=o===void 0?!0:o,i=r.altAxis,a=i===void 0?!1:i,l=r.boundary,u=r.rootBoundary,c=r.altBoundary,d=r.padding,v=r.tether,h=v===void 0?!0:v,g=r.tetherOffset,_=g===void 0?0:g,m=bt(t,{boundary:l,rootBoundary:u,padding:d,altBoundary:c}),T=q(t.placement),O=Et(t.placement),C=!O,E=xe(T),A=ti(E),b=t.modifiersData.popperOffsets,y=t.rects.reference,S=t.rects.popper,N=typeof _=="function"?_(Object.assign({},t.rects,{placement:t.placement})):_,D=typeof N=="number"?{mainAxis:N,altAxis:N}:Object.assign({mainAxis:0,altAxis:0},N),w=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,L={x:0,y:0};if(b){if(s){var et,wt=E==="y"?P:R,Tt=E==="y"?k:H,I=E==="y"?"height":"width",V=b[E],kt=V+m[wt],rt=V-m[Tt],Ht=h?-S[I]/2:0,ee=O===vt?y[I]:S[I],Ot=O===vt?-S[I]:-y[I],Vt=t.elements.arrow,ut=h&&Vt?De(Vt):{width:0,height:0},X=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:Vr(),Ct=X[wt],jt=X[Tt],nt=xt(0,y[I],ut[I]),re=C?y[I]/2-Ht-nt-Ct-D.mainAxis:ee-nt-Ct-D.mainAxis,ln=C?-y[I]/2+Ht+nt+jt+D.mainAxis:Ot+nt+jt+D.mainAxis,ne=t.elements.arrow&&Rt(t.elements.arrow),cn=ne?E==="y"?ne.clientTop||0:ne.clientLeft||0:0,qe=(et=w==null?void 0:w[E])!=null?et:0,un=V+re-qe-cn,fn=V+ln-qe,ze=xt(h?Gt(kt,un):kt,V,h?at(rt,fn):rt);b[E]=ze,L[E]=ze-V}if(a){var Ge,pn=E==="x"?P:R,dn=E==="x"?k:H,ot=b[A],Bt=A==="y"?"height":"width",Qe=ot+m[pn],Xe=ot-m[dn],oe=[P,R].indexOf(T)!==-1,Je=(Ge=w==null?void 0:w[A])!=null?Ge:0,Ze=oe?Qe:ot-y[Bt]-S[Bt]-Je+D.altAxis,tr=oe?ot+y[Bt]+S[Bt]-Je-D.altAxis:Xe,er=h&&oe?ei(Ze,ot,tr):xt(h?Ze:Qe,ot,h?tr:Xe);b[A]=er,L[A]=er-ot}t.modifiersData[n]=L}}var Kr={name:"preventOverflow",enabled:!0,phase:"main",fn:ri,requiresIfExists:["offset"]},ni=function(t,r){return t=typeof t=="function"?t(Object.assign({},r.rects,{placement:r.placement})):t,jr(typeof t!="number"?t:Br(t,It))};function oi(e){var t,r=e.state,n=e.name,o=e.options,s=r.elements.arrow,i=r.modifiersData.popperOffsets,a=q(r.placement),l=xe(a),u=[R,H].indexOf(a)>=0,c=u?"height":"width";if(!(!s||!i)){var d=ni(o.padding,r),v=De(s),h=l==="y"?P:R,g=l==="y"?k:H,_=r.rects.reference[c]+r.rects.reference[l]-i[l]-r.rects.popper[c],m=i[l]-r.rects.reference[l],T=Rt(s),O=T?l==="y"?T.clientHeight||0:T.clientWidth||0:0,C=_/2-m/2,E=d[h],A=O-v[c]-d[g],b=O/2-v[c]/2+C,y=xt(E,b,A),S=l;r.modifiersData[n]=(t={},t[S]=y,t.centerOffset=y-b,t)}}function ii(e){var t=e.state,r=e.options,n=r.element,o=n===void 0?"[data-popper-arrow]":n;o!=null&&(typeof o=="string"&&(o=t.elements.popper.querySelector(o),!o)||kr(t.elements.popper,o)&&(t.elements.arrow=o))}var Ur={name:"arrow",enabled:!0,phase:"main",fn:oi,effect:ii,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function xr(e,t,r){return r===void 0&&(r={x:0,y:0}),{top:e.top-t.height-r.y,right:e.right-t.width+r.x,bottom:e.bottom-t.height+r.y,left:e.left-t.width-r.x}}function Pr(e){return[P,H,k,R].some(function(t){return e[t]>=0})}function si(e){var t=e.state,r=e.name,n=t.rects.reference,o=t.rects.popper,s=t.modifiersData.preventOverflow,i=bt(t,{elementContext:"reference"}),a=bt(t,{altBoundary:!0}),l=xr(i,n),u=xr(a,o,s),c=Pr(l),d=Pr(u);t.modifiersData[r]={referenceClippingOffsets:l,popperEscapeOffsets:u,isReferenceHidden:c,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":c,"data-popper-escaped":d})}var Yr={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:si},ai=[Re,Ie,Me,$e],li=Pe({defaultModifiers:ai}),qr=[Re,Ie,Me,$e,Fr,Wr,Kr,Ur,Yr],ci=Pe({defaultModifiers:qr});x.applyStyles=$e;x.arrow=Ur;x.computeStyles=Me;x.createPopper=ci;x.createPopperLite=li;x.defaultModifiers=qr;x.detectOverflow=bt;x.eventListeners=Re;x.flip=Wr;x.hide=Yr;x.offset=Fr;x.popperGenerator=Pe;x.popperOffsets=Ie;x.preventOverflow=Kr});var J=new Map,Ft={set(e,t,r){J.has(e)||J.set(e,new Map);let n=J.get(e);if(!n.has(t)&&n.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`);return}n.set(t,r)},get(e,t){return J.has(e)&&J.get(e).get(t)||null},remove(e,t){if(!J.has(e))return;let r=J.get(e);r.delete(t),r.size===0&&J.delete(e)}};var se="transitionend",ae=e=>(e&&window.CSS&&window.CSS.escape&&(e=e.replace(/#([^\s"#']+)/g,(t,r)=>`#${CSS.escape(r)}`)),e),or=e=>e==null?`${e}`:Object.prototype.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase(),ir=e=>{do e+=Math.floor(Math.random()*1e6);while(document.getElementById(e));return e},yn=e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:r}=window.getComputedStyle(e),n=Number.parseFloat(t),o=Number.parseFloat(r);return!n&&!o?0:(t=t.split(",")[0],r=r.split(",")[0],(Number.parseFloat(t)+Number.parseFloat(r))*1e3)},An=e=>{e.dispatchEvent(new Event(se))},j=e=>!e||typeof e!="object"?!1:(typeof e.jquery!="undefined"&&(e=e[0]),typeof e.nodeType!="undefined"),M=e=>j(e)?e.jquery?e[0]:e:typeof e=="string"&&e.length>0?document.querySelector(ae(e)):null,ft=e=>{if(!j(e)||e.getClientRects().length===0)return!1;let t=getComputedStyle(e).getPropertyValue("visibility")==="visible",r=e.closest("details:not([open])");if(!r)return t;if(r!==e){let n=e.closest("summary");if(n&&n.parentNode!==r||n===null)return!1}return t},W=e=>!e||e.nodeType!==Node.ELEMENT_NODE||e.classList.contains("disabled")?!0:typeof e.disabled!="undefined"?e.disabled:e.hasAttribute("disabled")&&e.getAttribute("disabled")!=="false",le=e=>{if(!document.documentElement.attachShadow)return null;if(typeof e.getRootNode=="function"){let t=e.getRootNode();return t instanceof ShadowRoot?t:null}return e instanceof ShadowRoot?e:e.parentNode?le(e.parentNode):null},pt=()=>{},sr=e=>{e.offsetHeight},ce=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,ie=[],wn=e=>{document.readyState==="loading"?(ie.length||document.addEventListener("DOMContentLoaded",()=>{for(let t of ie)t()}),ie.push(e)):e()},K=()=>document.documentElement.dir==="rtl",U=e=>{wn(()=>{let t=ce();if(t){let r=e.NAME,n=t.fn[r];t.fn[r]=e.jQueryInterface,t.fn[r].Constructor=e,t.fn[r].noConflict=()=>(t.fn[r]=n,e.jQueryInterface)}})},F=(e,t=[],r=e)=>typeof e=="function"?e(...t):r,ar=(e,t,r=!0)=>{if(!r){F(e);return}let o=yn(t)+5,s=!1,i=({target:a})=>{a===t&&(s=!0,t.removeEventListener(se,i),F(e))};t.addEventListener(se,i),setTimeout(()=>{s||An(t)},o)},Wt=(e,t,r,n)=>{let o=e.length,s=e.indexOf(t);return s===-1?!r&&n?e[o-1]:e[0]:(s+=r?1:-1,n&&(s=(s+o)%o),e[Math.max(0,Math.min(s,o-1))])};var Tn=/[^.]*(?=\..*)\.|.*/,On=/\..*/,Cn=/::\d+$/,ue={},lr=1,ur={mouseenter:"mouseover",mouseleave:"mouseout"},Sn=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function fr(e,t){return t&&`${t}::${lr++}`||e.uidEvent||lr++}function pr(e){let t=fr(e);return e.uidEvent=t,ue[t]=ue[t]||{},ue[t]}function Nn(e,t){return function r(n){return de(n,{delegateTarget:e}),r.oneOff&&pe.off(e,n.type,t),t.apply(e,[n])}}function Dn(e,t,r){return function n(o){let s=e.querySelectorAll(t);for(let{target:i}=o;i&&i!==this;i=i.parentNode)for(let a of s)if(a===i)return de(o,{delegateTarget:i}),n.oneOff&&pe.off(e,o.type,t,r),r.apply(i,[o])}}function dr(e,t,r=null){return Object.values(e).find(n=>n.callable===t&&n.delegationSelector===r)}function hr(e,t,r){let n=typeof t=="string",o=n?r:t||r,s=mr(e);return Sn.has(s)||(s=e),[n,o,s]}function cr(e,t,r,n,o){if(typeof t!="string"||!e)return;let[s,i,a]=hr(t,r,n);t in ur&&(i=(g=>function(_){if(!_.relatedTarget||_.relatedTarget!==_.delegateTarget&&!_.delegateTarget.contains(_.relatedTarget))return g.call(this,_)})(i));let l=pr(e),u=l[a]||(l[a]={}),c=dr(u,i,s?r:null);if(c){c.oneOff=c.oneOff&&o;return}let d=fr(i,t.replace(Tn,"")),v=s?Dn(e,r,i):Nn(e,i);v.delegationSelector=s?r:null,v.callable=i,v.oneOff=o,v.uidEvent=d,u[d]=v,e.addEventListener(a,v,s)}function fe(e,t,r,n,o){let s=dr(t[r],n,o);s&&(e.removeEventListener(r,s,!!o),delete t[r][s.uidEvent])}function Ln(e,t,r,n){let o=t[r]||{};for(let[s,i]of Object.entries(o))s.includes(n)&&fe(e,t,r,i.callable,i.delegationSelector)}function mr(e){return e=e.replace(On,""),ur[e]||e}var pe={on(e,t,r,n){cr(e,t,r,n,!1)},one(e,t,r,n){cr(e,t,r,n,!0)},off(e,t,r,n){if(typeof t!="string"||!e)return;let[o,s,i]=hr(t,r,n),a=i!==t,l=pr(e),u=l[i]||{},c=t.startsWith(".");if(typeof s!="undefined"){if(!Object.keys(u).length)return;fe(e,l,i,s,o?r:null);return}if(c)for(let d of Object.keys(l))Ln(e,l,d,t.slice(1));for(let[d,v]of Object.entries(u)){let h=d.replace(Cn,"");(!a||t.includes(h))&&fe(e,l,i,v.callable,v.delegationSelector)}},trigger(e,t,r){if(typeof t!="string"||!e)return null;let n=ce(),o=mr(t),s=t!==o,i=null,a=!0,l=!0,u=!1;s&&n&&(i=n.Event(t,r),n(e).trigger(i),a=!i.isPropagationStopped(),l=!i.isImmediatePropagationStopped(),u=i.isDefaultPrevented());let c=de(new Event(t,{bubbles:a,cancelable:!0}),r);return u&&c.preventDefault(),l&&e.dispatchEvent(c),c.defaultPrevented&&i&&i.preventDefault(),c}};function de(e,t={}){for(let[r,n]of Object.entries(t))try{e[r]=n}catch(o){Object.defineProperty(e,r,{configurable:!0,get(){return n}})}return e}var f=pe;function gr(e){if(e==="true")return!0;if(e==="false")return!1;if(e===Number(e).toString())return Number(e);if(e===""||e==="null")return null;if(typeof e!="string")return e;try{return JSON.parse(decodeURIComponent(e))}catch(t){return e}}function he(e){return e.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}var xn={setDataAttribute(e,t,r){e.setAttribute(`data-bs-${he(t)}`,r)},removeDataAttribute(e,t){e.removeAttribute(`data-bs-${he(t)}`)},getDataAttributes(e){if(!e)return{};let t={},r=Object.keys(e.dataset).filter(n=>n.startsWith("bs")&&!n.startsWith("bsConfig"));for(let n of r){let o=n.replace(/^bs/,"");o=o.charAt(0).toLowerCase()+o.slice(1,o.length),t[o]=gr(e.dataset[n])}return t},getDataAttribute(e,t){return gr(e.getAttribute(`data-bs-${he(t)}`))}},Z=xn;var me=class{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,r){let n=j(r)?Z.getDataAttribute(r,"config"):{};return{...this.constructor.Default,...typeof n=="object"?n:{},...j(r)?Z.getDataAttributes(r):{},...typeof t=="object"?t:{}}}_typeCheckConfig(t,r=this.constructor.DefaultType){for(let[n,o]of Object.entries(r)){let s=t[n],i=j(s)?"element":or(s);if(!new RegExp(o).test(i))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${i}" but expected type "${o}".`)}}},Kt=me;var Pn="5.3.3",ge=class extends Kt{constructor(t,r){super(),t=M(t),t&&(this._element=t,this._config=this._getConfig(r),Ft.set(this._element,this.constructor.DATA_KEY,this))}dispose(){Ft.remove(this._element,this.constructor.DATA_KEY),f.off(this._element,this.constructor.EVENT_KEY);for(let t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,r,n=!0){ar(t,r,n)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return Ft.get(M(t),this.DATA_KEY)}static getOrCreateInstance(t,r={}){return this.getInstance(t)||new this(t,typeof r=="object"?r:null)}static get VERSION(){return Pn}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}},Y=ge;var _e=e=>{let t=e.getAttribute("data-bs-target");if(!t||t==="#"){let r=e.getAttribute("href");if(!r||!r.includes("#")&&!r.startsWith("."))return null;r.includes("#")&&!r.startsWith("#")&&(r=`#${r.split("#")[1]}`),t=r&&r!=="#"?r.trim():null}return t?t.split(",").map(r=>ae(r)).join(","):null},Ut={find(e,t=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(t,e))},findOne(e,t=document.documentElement){return Element.prototype.querySelector.call(t,e)},children(e,t){return[].concat(...e.children).filter(r=>r.matches(t))},parents(e,t){let r=[],n=e.parentNode.closest(t);for(;n;)r.push(n),n=n.parentNode.closest(t);return r},prev(e,t){let r=e.previousElementSibling;for(;r;){if(r.matches(t))return[r];r=r.previousElementSibling}return[]},next(e,t){let r=e.nextElementSibling;for(;r;){if(r.matches(t))return[r];r=r.nextElementSibling}return[]},focusableChildren(e){let t=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(r=>`${r}:not([tabindex^="-"])`).join(",");return this.find(t,e).filter(r=>!W(r)&&ft(r))},getSelectorFromElement(e){let t=_e(e);return t&&Ut.findOne(t)?t:null},getElementFromSelector(e){let t=_e(e);return t?Ut.findOne(t):null},getMultipleElementsFromSelector(e){let t=_e(e);return t?Ut.find(t):[]}},p=Ut;var Rn="tab",In="bs.tab",st=`.${In}`,Mn=`hide${st}`,$n=`hidden${st}`,kn=`show${st}`,Hn=`shown${st}`,Vn=`click${st}`,jn=`keydown${st}`,Bn=`load${st}`,Fn="ArrowLeft",_r="ArrowRight",Wn="ArrowUp",vr="ArrowDown",ve="Home",Er="End",it="active",br="fade",Ee="show",Kn="dropdown",yr=".dropdown-toggle",Un=".dropdown-menu",be=`:not(${yr})`,Yn='.list-group, .nav, [role="tablist"]',qn=".nav-item, .list-group-item",zn=`.nav-link${be}, .list-group-item${be}, [role="tab"]${be}`,Ar='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',ye=`${zn}, ${Ar}`,Gn=`.${it}[data-bs-toggle="tab"], .${it}[data-bs-toggle="pill"], .${it}[data-bs-toggle="list"]`,dt=class e extends Y{constructor(t){super(t),this._parent=this._element.closest(Yn),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),f.on(this._element,jn,r=>this._keydown(r)))}static get NAME(){return Rn}show(){let t=this._element;if(this._elemIsActive(t))return;let r=this._getActiveElem(),n=r?f.trigger(r,Mn,{relatedTarget:t}):null;f.trigger(t,kn,{relatedTarget:r}).defaultPrevented||n&&n.defaultPrevented||(this._deactivate(r,t),this._activate(t,r))}_activate(t,r){if(!t)return;t.classList.add(it),this._activate(p.getElementFromSelector(t));let n=()=>{if(t.getAttribute("role")!=="tab"){t.classList.add(Ee);return}t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),f.trigger(t,Hn,{relatedTarget:r})};this._queueCallback(n,t,t.classList.contains(br))}_deactivate(t,r){if(!t)return;t.classList.remove(it),t.blur(),this._deactivate(p.getElementFromSelector(t));let n=()=>{if(t.getAttribute("role")!=="tab"){t.classList.remove(Ee);return}t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),f.trigger(t,$n,{relatedTarget:r})};this._queueCallback(n,t,t.classList.contains(br))}_keydown(t){if(![Fn,_r,Wn,vr,ve,Er].includes(t.key))return;t.stopPropagation(),t.preventDefault();let r=this._getChildren().filter(o=>!W(o)),n;if([ve,Er].includes(t.key))n=r[t.key===ve?0:r.length-1];else{let o=[_r,vr].includes(t.key);n=Wt(r,t.target,o,!0)}n&&(n.focus({preventScroll:!0}),e.getOrCreateInstance(n).show())}_getChildren(){return p.find(ye,this._parent)}_getActiveElem(){return this._getChildren().find(t=>this._elemIsActive(t))||null}_setInitialAttributes(t,r){this._setAttributeIfNotExists(t,"role","tablist");for(let n of r)this._setInitialAttributesOnChild(n)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);let r=this._elemIsActive(t),n=this._getOuterElement(t);t.setAttribute("aria-selected",r),n!==t&&this._setAttributeIfNotExists(n,"role","presentation"),r||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){let r=p.getElementFromSelector(t);r&&(this._setAttributeIfNotExists(r,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(r,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,r){let n=this._getOuterElement(t);if(!n.classList.contains(Kn))return;let o=(s,i)=>{let a=p.findOne(s,n);a&&a.classList.toggle(i,r)};o(yr,it),o(Un,Ee),n.setAttribute("aria-expanded",r)}_setAttributeIfNotExists(t,r,n){t.hasAttribute(r)||t.setAttribute(r,n)}_elemIsActive(t){return t.classList.contains(it)}_getInnerElement(t){return t.matches(ye)?t:p.findOne(ye,t)}_getOuterElement(t){return t.closest(qn)||t}static jQueryInterface(t){return this.each(function(){let r=e.getOrCreateInstance(this);if(typeof t=="string"){if(r[t]===void 0||t.startsWith("_")||t==="constructor")throw new TypeError(`No method named "${t}"`);r[t]()}})}};f.on(document,Vn,Ar,function(e){["A","AREA"].includes(this.tagName)&&e.preventDefault(),!W(this)&&dt.getOrCreateInstance(this).show()});f.on(window,Bn,()=>{for(let e of p.find(Gn))dt.getOrCreateInstance(e)});U(dt);var wr=dt;var Qn="collapse",Xn="bs.collapse",Nt=`.${Xn}`,Jn=".data-api",Zn=`show${Nt}`,to=`shown${Nt}`,eo=`hide${Nt}`,ro=`hidden${Nt}`,no=`click${Nt}${Jn}`,Ae="show",ht="collapse",Yt="collapsing",oo="collapsed",io=`:scope .${ht} .${ht}`,so="collapse-horizontal",ao="width",lo="height",co=".collapse.show, .collapse.collapsing",we='[data-bs-toggle="collapse"]',uo={parent:null,toggle:!0},fo={parent:"(null|element)",toggle:"boolean"},St=class e extends Y{constructor(t,r){super(t,r),this._isTransitioning=!1,this._triggerArray=[];let n=p.find(we);for(let o of n){let s=p.getSelectorFromElement(o),i=p.find(s).filter(a=>a===this._element);s!==null&&i.length&&this._triggerArray.push(o)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return uo}static get DefaultType(){return fo}static get NAME(){return Qn}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(co).filter(a=>a!==this._element).map(a=>e.getOrCreateInstance(a,{toggle:!1}))),t.length&&t[0]._isTransitioning||f.trigger(this._element,Zn).defaultPrevented)return;for(let a of t)a.hide();let n=this._getDimension();this._element.classList.remove(ht),this._element.classList.add(Yt),this._element.style[n]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;let o=()=>{this._isTransitioning=!1,this._element.classList.remove(Yt),this._element.classList.add(ht,Ae),this._element.style[n]="",f.trigger(this._element,to)},i=`scroll${n[0].toUpperCase()+n.slice(1)}`;this._queueCallback(o,this._element,!0),this._element.style[n]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown()||f.trigger(this._element,eo).defaultPrevented)return;let r=this._getDimension();this._element.style[r]=`${this._element.getBoundingClientRect()[r]}px`,sr(this._element),this._element.classList.add(Yt),this._element.classList.remove(ht,Ae);for(let o of this._triggerArray){let s=p.getElementFromSelector(o);s&&!this._isShown(s)&&this._addAriaAndCollapsedClass([o],!1)}this._isTransitioning=!0;let n=()=>{this._isTransitioning=!1,this._element.classList.remove(Yt),this._element.classList.add(ht),f.trigger(this._element,ro)};this._element.style[r]="",this._queueCallback(n,this._element,!0)}_isShown(t=this._element){return t.classList.contains(Ae)}_configAfterMerge(t){return t.toggle=!!t.toggle,t.parent=M(t.parent),t}_getDimension(){return this._element.classList.contains(so)?ao:lo}_initializeChildren(){if(!this._config.parent)return;let t=this._getFirstLevelChildren(we);for(let r of t){let n=p.getElementFromSelector(r);n&&this._addAriaAndCollapsedClass([r],this._isShown(n))}}_getFirstLevelChildren(t){let r=p.find(io,this._config.parent);return p.find(t,this._config.parent).filter(n=>!r.includes(n))}_addAriaAndCollapsedClass(t,r){if(t.length)for(let n of t)n.classList.toggle(oo,!r),n.setAttribute("aria-expanded",r)}static jQueryInterface(t){let r={};return typeof t=="string"&&/show|hide/.test(t)&&(r.toggle=!1),this.each(function(){let n=e.getOrCreateInstance(this,r);if(typeof t=="string"){if(typeof n[t]=="undefined")throw new TypeError(`No method named "${t}"`);n[t]()}})}};f.on(document,no,we,function(e){(e.target.tagName==="A"||e.delegateTarget&&e.delegateTarget.tagName==="A")&&e.preventDefault();for(let t of p.getMultipleElementsFromSelector(this))St.getOrCreateInstance(t,{toggle:!1}).toggle()});U(St);var Te=St;var He=nr(ke());var zr="dropdown",ui="bs.dropdown",ct=`.${ui}`,Ve=".data-api",fi="Escape",Gr="Tab",pi="ArrowUp",Qr="ArrowDown",di=2,hi=`hide${ct}`,mi=`hidden${ct}`,gi=`show${ct}`,_i=`shown${ct}`,Xr=`click${ct}${Ve}`,Jr=`keydown${ct}${Ve}`,vi=`keyup${ct}${Ve}`,yt="show",Ei="dropup",bi="dropend",yi="dropstart",Ai="dropup-center",wi="dropdown-center",lt='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Ti=`${lt}.${yt}`,Xt=".dropdown-menu",Oi=".navbar",Ci=".navbar-nav",Si=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Ni=K()?"top-end":"top-start",Di=K()?"top-start":"top-end",Li=K()?"bottom-end":"bottom-start",xi=K()?"bottom-start":"bottom-end",Pi=K()?"left-start":"right-start",Ri=K()?"right-start":"left-start",Ii="top",Mi="bottom",$i={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},ki={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"},Q=class e extends Y{constructor(t,r){super(t,r),this._popper=null,this._parent=this._element.parentNode,this._menu=p.next(this._element,Xt)[0]||p.prev(this._element,Xt)[0]||p.findOne(Xt,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return $i}static get DefaultType(){return ki}static get NAME(){return zr}toggle(){return this._isShown()?this.hide():this.show()}show(){if(W(this._element)||this._isShown())return;let t={relatedTarget:this._element};if(!f.trigger(this._element,gi,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(Ci))for(let n of[].concat(...document.body.children))f.on(n,"mouseover",pt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(yt),this._element.classList.add(yt),f.trigger(this._element,_i,t)}}hide(){if(W(this._element)||!this._isShown())return;let t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!f.trigger(this._element,hi,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(let n of[].concat(...document.body.children))f.off(n,"mouseover",pt);this._popper&&this._popper.destroy(),this._menu.classList.remove(yt),this._element.classList.remove(yt),this._element.setAttribute("aria-expanded","false"),Z.removeDataAttribute(this._menu,"popper"),f.trigger(this._element,mi,t)}}_getConfig(t){if(t=super._getConfig(t),typeof t.reference=="object"&&!j(t.reference)&&typeof t.reference.getBoundingClientRect!="function")throw new TypeError(`${zr.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(typeof He=="undefined")throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;this._config.reference==="parent"?t=this._parent:j(this._config.reference)?t=M(this._config.reference):typeof this._config.reference=="object"&&(t=this._config.reference);let r=this._getPopperConfig();this._popper=He.createPopper(t,this._menu,r)}_isShown(){return this._menu.classList.contains(yt)}_getPlacement(){let t=this._parent;if(t.classList.contains(bi))return Pi;if(t.classList.contains(yi))return Ri;if(t.classList.contains(Ai))return Ii;if(t.classList.contains(wi))return Mi;let r=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";return t.classList.contains(Ei)?r?Di:Ni:r?xi:Li}_detectNavbar(){return this._element.closest(Oi)!==null}_getOffset(){let{offset:t}=this._config;return typeof t=="string"?t.split(",").map(r=>Number.parseInt(r,10)):typeof t=="function"?r=>t(r,this._element):t}_getPopperConfig(){let t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display==="static")&&(Z.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...F(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:r}){let n=p.find(Si,this._menu).filter(o=>ft(o));n.length&&Wt(n,r,t===Qr,!n.includes(r)).focus()}static jQueryInterface(t){return this.each(function(){let r=e.getOrCreateInstance(this,t);if(typeof t=="string"){if(typeof r[t]=="undefined")throw new TypeError(`No method named "${t}"`);r[t]()}})}static clearMenus(t){if(t.button===di||t.type==="keyup"&&t.key!==Gr)return;let r=p.find(Ti);for(let n of r){let o=e.getInstance(n);if(!o||o._config.autoClose===!1)continue;let s=t.composedPath(),i=s.includes(o._menu);if(s.includes(o._element)||o._config.autoClose==="inside"&&!i||o._config.autoClose==="outside"&&i||o._menu.contains(t.target)&&(t.type==="keyup"&&t.key===Gr||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;let a={relatedTarget:o._element};t.type==="click"&&(a.clickEvent=t),o._completeHide(a)}}static dataApiKeydownHandler(t){let r=/input|textarea/i.test(t.target.tagName),n=t.key===fi,o=[pi,Qr].includes(t.key);if(!o&&!n||r&&!n)return;t.preventDefault();let s=this.matches(lt)?this:p.prev(this,lt)[0]||p.next(this,lt)[0]||p.findOne(lt,t.delegateTarget.parentNode),i=e.getOrCreateInstance(s);if(o){t.stopPropagation(),i.show(),i._selectMenuItem(t);return}i._isShown()&&(t.stopPropagation(),i.hide(),s.focus())}};f.on(document,Jr,lt,Q.dataApiKeydownHandler);f.on(document,Jr,Xt,Q.dataApiKeydownHandler);f.on(document,Xr,Q.clearMenus);f.on(document,vi,Q.clearMenus);f.on(document,Xr,lt,function(e){e.preventDefault(),Q.getOrCreateInstance(this).toggle()});U(Q);var Zr=Q;var Hi="scrollspy",Vi="bs.scrollspy",Be=`.${Vi}`,ji=".data-api",Bi=`activate${Be}`,tn=`click${Be}`,Fi=`load${Be}${ji}`,Wi="dropdown-item",At="active",Ki='[data-bs-spy="scroll"]',je="[href]",Ui=".nav, .list-group",en=".nav-link",Yi=".nav-item",qi=".list-group-item",zi=`${en}, ${Yi} > ${en}, ${qi}`,Gi=".dropdown",Qi=".dropdown-toggle",Xi={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Ji={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"},Mt=class e extends Y{constructor(t,r){super(t,r),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Xi}static get DefaultType(){return Ji}static get NAME(){return Hi}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(let t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=M(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,typeof t.threshold=="string"&&(t.threshold=t.threshold.split(",").map(r=>Number.parseFloat(r))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(f.off(this._config.target,tn),f.on(this._config.target,tn,je,t=>{let r=this._observableSections.get(t.target.hash);if(r){t.preventDefault();let n=this._rootElement||window,o=r.offsetTop-this._element.offsetTop;if(n.scrollTo){n.scrollTo({top:o,behavior:"smooth"});return}n.scrollTop=o}}))}_getNewObserver(){let t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(r=>this._observerCallback(r),t)}_observerCallback(t){let r=i=>this._targetLinks.get(`#${i.target.id}`),n=i=>{this._previousScrollData.visibleEntryTop=i.target.offsetTop,this._process(r(i))},o=(this._rootElement||document.documentElement).scrollTop,s=o>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=o;for(let i of t){if(!i.isIntersecting){this._activeTarget=null,this._clearActiveClass(r(i));continue}let a=i.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&a){if(n(i),!o)return;continue}!s&&!a&&n(i)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;let t=p.find(je,this._config.target);for(let r of t){if(!r.hash||W(r))continue;let n=p.findOne(decodeURI(r.hash),this._element);ft(n)&&(this._targetLinks.set(decodeURI(r.hash),r),this._observableSections.set(r.hash,n))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(At),this._activateParents(t),f.trigger(this._element,Bi,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains(Wi)){p.findOne(Qi,t.closest(Gi)).classList.add(At);return}for(let r of p.parents(t,Ui))for(let n of p.prev(r,zi))n.classList.add(At)}_clearActiveClass(t){t.classList.remove(At);let r=p.find(`${je}.${At}`,t);for(let n of r)n.classList.remove(At)}static jQueryInterface(t){return this.each(function(){let r=e.getOrCreateInstance(this,t);if(typeof t=="string"){if(r[t]===void 0||t.startsWith("_")||t==="constructor")throw new TypeError(`No method named "${t}"`);r[t]()}})}};f.on(window,Fi,()=>{for(let e of p.find(Ki))Mt.getOrCreateInstance(e)});U(Mt);var rn=Mt;var Ue=nr(ke());var Zi=/^aria-[\w-]*$/i,Jt={"*":["class","dir","id","lang","role",Zi],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},ts=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),es=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,rs=(e,t)=>{let r=e.nodeName.toLowerCase();return t.includes(r)?ts.has(r)?!!es.test(e.nodeValue):!0:t.filter(n=>n instanceof RegExp).some(n=>n.test(r))};function nn(e,t,r){if(!e.length)return e;if(r&&typeof r=="function")return r(e);let o=new window.DOMParser().parseFromString(e,"text/html"),s=[].concat(...o.body.querySelectorAll("*"));for(let i of s){let a=i.nodeName.toLowerCase();if(!Object.keys(t).includes(a)){i.remove();continue}let l=[].concat(...i.attributes),u=[].concat(t["*"]||[],t[a]||[]);for(let c of l)rs(c,u)||i.removeAttribute(c.nodeName)}return o.body.innerHTML}var ns="TemplateFactory",os={allowList:Jt,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
    "},is={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},ss={entry:"(string|element|function|null)",selector:"(string|element)"},Fe=class extends Kt{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return os}static get DefaultType(){return is}static get NAME(){return ns}getContent(){return Object.values(this._config.content).map(t=>this._resolvePossibleFunction(t)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){let t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(let[o,s]of Object.entries(this._config.content))this._setContent(t,s,o);let r=t.children[0],n=this._resolvePossibleFunction(this._config.extraClass);return n&&r.classList.add(...n.split(" ")),r}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(let[r,n]of Object.entries(t))super._typeCheckConfig({selector:r,entry:n},ss)}_setContent(t,r,n){let o=p.findOne(n,t);if(o){if(r=this._resolvePossibleFunction(r),!r){o.remove();return}if(j(r)){this._putElementInTemplate(M(r),o);return}if(this._config.html){o.innerHTML=this._maybeSanitize(r);return}o.textContent=r}}_maybeSanitize(t){return this._config.sanitize?nn(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return F(t,[this])}_putElementInTemplate(t,r){if(this._config.html){r.innerHTML="",r.append(t);return}r.textContent=t.textContent}},on=Fe;var as="tooltip",ls=new Set(["sanitize","allowList","sanitizeFn"]),We="fade",cs="modal",Zt="show",us=".tooltip-inner",sn=`.${cs}`,an="hide.bs.modal",$t="hover",Ke="focus",fs="click",ps="manual",ds="hide",hs="hidden",ms="show",gs="shown",_s="inserted",vs="click",Es="focusin",bs="focusout",ys="mouseenter",As="mouseleave",ws={AUTO:"auto",TOP:"top",RIGHT:K()?"left":"right",BOTTOM:"bottom",LEFT:K()?"right":"left"},Ts={allowList:Jt,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},Os={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"},te=class e extends Y{constructor(t,r){if(typeof Ue=="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,r),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Ts}static get DefaultType(){return Os}static get NAME(){return as}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(this._isEnabled){if(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()){this._leave();return}this._enter()}}dispose(){clearTimeout(this._timeout),f.off(this._element.closest(sn),an,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!(this._isWithContent()&&this._isEnabled))return;let t=f.trigger(this._element,this.constructor.eventName(ms)),n=(le(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!n)return;this._disposePopper();let o=this._getTipElement();this._element.setAttribute("aria-describedby",o.getAttribute("id"));let{container:s}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(s.append(o),f.trigger(this._element,this.constructor.eventName(_s))),this._popper=this._createPopper(o),o.classList.add(Zt),"ontouchstart"in document.documentElement)for(let a of[].concat(...document.body.children))f.on(a,"mouseover",pt);let i=()=>{f.trigger(this._element,this.constructor.eventName(gs)),this._isHovered===!1&&this._leave(),this._isHovered=!1};this._queueCallback(i,this.tip,this._isAnimated())}hide(){if(!this._isShown()||f.trigger(this._element,this.constructor.eventName(ds)).defaultPrevented)return;if(this._getTipElement().classList.remove(Zt),"ontouchstart"in document.documentElement)for(let o of[].concat(...document.body.children))f.off(o,"mouseover",pt);this._activeTrigger[fs]=!1,this._activeTrigger[Ke]=!1,this._activeTrigger[$t]=!1,this._isHovered=null;let n=()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),f.trigger(this._element,this.constructor.eventName(hs)))};this._queueCallback(n,this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return!!this._getTitle()}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){let r=this._getTemplateFactory(t).toHtml();if(!r)return null;r.classList.remove(We,Zt),r.classList.add(`bs-${this.constructor.NAME}-auto`);let n=ir(this.constructor.NAME).toString();return r.setAttribute("id",n),this._isAnimated()&&r.classList.add(We),r}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new on({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[us]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(We)}_isShown(){return this.tip&&this.tip.classList.contains(Zt)}_createPopper(t){let r=F(this._config.placement,[this,t,this._element]),n=ws[r.toUpperCase()];return Ue.createPopper(this._element,t,this._getPopperConfig(n))}_getOffset(){let{offset:t}=this._config;return typeof t=="string"?t.split(",").map(r=>Number.parseInt(r,10)):typeof t=="function"?r=>t(r,this._element):t}_resolvePossibleFunction(t){return F(t,[this._element])}_getPopperConfig(t){let r={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:n=>{this._getTipElement().setAttribute("data-popper-placement",n.state.placement)}}]};return{...r,...F(this._config.popperConfig,[r])}}_setListeners(){let t=this._config.trigger.split(" ");for(let r of t)if(r==="click")f.on(this._element,this.constructor.eventName(vs),this._config.selector,n=>{this._initializeOnDelegatedTarget(n).toggle()});else if(r!==ps){let n=r===$t?this.constructor.eventName(ys):this.constructor.eventName(Es),o=r===$t?this.constructor.eventName(As):this.constructor.eventName(bs);f.on(this._element,n,this._config.selector,s=>{let i=this._initializeOnDelegatedTarget(s);i._activeTrigger[s.type==="focusin"?Ke:$t]=!0,i._enter()}),f.on(this._element,o,this._config.selector,s=>{let i=this._initializeOnDelegatedTarget(s);i._activeTrigger[s.type==="focusout"?Ke:$t]=i._element.contains(s.relatedTarget),i._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},f.on(this._element.closest(sn),an,this._hideModalHandler)}_fixTitle(){let t=this._element.getAttribute("title");t&&(!this._element.getAttribute("aria-label")&&!this._element.textContent.trim()&&this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide))}_setTimeout(t,r){clearTimeout(this._timeout),this._timeout=setTimeout(t,r)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){let r=Z.getDataAttributes(this._element);for(let n of Object.keys(r))ls.has(n)&&delete r[n];return t={...r,...typeof t=="object"&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=t.container===!1?document.body:M(t.container),typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),typeof t.title=="number"&&(t.title=t.title.toString()),typeof t.content=="number"&&(t.content=t.content.toString()),t}_getDelegateConfig(){let t={};for(let[r,n]of Object.entries(this._config))this.constructor.Default[r]!==n&&(t[r]=n);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each(function(){let r=e.getOrCreateInstance(this,t);if(typeof t=="string"){if(typeof r[t]=="undefined")throw new TypeError(`No method named "${t}"`);r[t]()}})}};U(te);var Ye=te;var Na={Tab:wr,Collapse:Te,Dropdown:Zr,ScrollSpy:rn,Tooltip:Ye};window.Collapse=Te;window.Tooltip=Ye;})(); diff --git a/public/docs/js/bootstrap.js b/public/docs/js/bootstrap.js deleted file mode 100644 index 9b93406..0000000 --- a/public/docs/js/bootstrap.js +++ /dev/null @@ -1,3800 +0,0 @@ -(() => { - var __create = Object.create; - var __defProp = Object.defineProperty; - var __getOwnPropDesc = Object.getOwnPropertyDescriptor; - var __getOwnPropNames = Object.getOwnPropertyNames; - var __getProtoOf = Object.getPrototypeOf; - var __hasOwnProp = Object.prototype.hasOwnProperty; - var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; - }; - var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; - }; - var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod - )); - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/gohugoio/hugo-mod-jslibs-dist/popperjs/v2@v2.21100.20000/package/dist/cjs/popper.js - var require_popper = __commonJS({ - "ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/gohugoio/hugo-mod-jslibs-dist/popperjs/v2@v2.21100.20000/package/dist/cjs/popper.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - function getWindow(node) { - if (node == null) { - return window; - } - if (node.toString() !== "[object Window]") { - var ownerDocument = node.ownerDocument; - return ownerDocument ? ownerDocument.defaultView || window : window; - } - return node; - } - function isElement2(node) { - var OwnElement = getWindow(node).Element; - return node instanceof OwnElement || node instanceof Element; - } - function isHTMLElement(node) { - var OwnElement = getWindow(node).HTMLElement; - return node instanceof OwnElement || node instanceof HTMLElement; - } - function isShadowRoot(node) { - if (typeof ShadowRoot === "undefined") { - return false; - } - var OwnElement = getWindow(node).ShadowRoot; - return node instanceof OwnElement || node instanceof ShadowRoot; - } - var max = Math.max; - var min = Math.min; - var round = Math.round; - function getBoundingClientRect(element, includeScale) { - if (includeScale === void 0) { - includeScale = false; - } - var rect = element.getBoundingClientRect(); - var scaleX = 1; - var scaleY = 1; - if (isHTMLElement(element) && includeScale) { - var offsetHeight = element.offsetHeight; - var offsetWidth = element.offsetWidth; - if (offsetWidth > 0) { - scaleX = round(rect.width) / offsetWidth || 1; - } - if (offsetHeight > 0) { - scaleY = round(rect.height) / offsetHeight || 1; - } - } - return { - width: rect.width / scaleX, - height: rect.height / scaleY, - top: rect.top / scaleY, - right: rect.right / scaleX, - bottom: rect.bottom / scaleY, - left: rect.left / scaleX, - x: rect.left / scaleX, - y: rect.top / scaleY - }; - } - function getWindowScroll(node) { - var win = getWindow(node); - var scrollLeft = win.pageXOffset; - var scrollTop = win.pageYOffset; - return { - scrollLeft, - scrollTop - }; - } - function getHTMLElementScroll(element) { - return { - scrollLeft: element.scrollLeft, - scrollTop: element.scrollTop - }; - } - function getNodeScroll(node) { - if (node === getWindow(node) || !isHTMLElement(node)) { - return getWindowScroll(node); - } else { - return getHTMLElementScroll(node); - } - } - function getNodeName(element) { - return element ? (element.nodeName || "").toLowerCase() : null; - } - function getDocumentElement(element) { - return ((isElement2(element) ? element.ownerDocument : ( - // $FlowFixMe[prop-missing] - element.document - )) || window.document).documentElement; - } - function getWindowScrollBarX(element) { - return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; - } - function getComputedStyle2(element) { - return getWindow(element).getComputedStyle(element); - } - function isScrollParent(element) { - var _getComputedStyle = getComputedStyle2(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY; - return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); - } - function isElementScaled(element) { - var rect = element.getBoundingClientRect(); - var scaleX = round(rect.width) / element.offsetWidth || 1; - var scaleY = round(rect.height) / element.offsetHeight || 1; - return scaleX !== 1 || scaleY !== 1; - } - function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { - if (isFixed === void 0) { - isFixed = false; - } - var isOffsetParentAnElement = isHTMLElement(offsetParent); - var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); - var documentElement = getDocumentElement(offsetParent); - var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled); - var scroll = { - scrollLeft: 0, - scrollTop: 0 - }; - var offsets = { - x: 0, - y: 0 - }; - if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { - if (getNodeName(offsetParent) !== "body" || // https://github.com/popperjs/popper-core/issues/1078 - isScrollParent(documentElement)) { - scroll = getNodeScroll(offsetParent); - } - if (isHTMLElement(offsetParent)) { - offsets = getBoundingClientRect(offsetParent, true); - offsets.x += offsetParent.clientLeft; - offsets.y += offsetParent.clientTop; - } else if (documentElement) { - offsets.x = getWindowScrollBarX(documentElement); - } - } - return { - x: rect.left + scroll.scrollLeft - offsets.x, - y: rect.top + scroll.scrollTop - offsets.y, - width: rect.width, - height: rect.height - }; - } - function getLayoutRect(element) { - var clientRect = getBoundingClientRect(element); - var width = element.offsetWidth; - var height = element.offsetHeight; - if (Math.abs(clientRect.width - width) <= 1) { - width = clientRect.width; - } - if (Math.abs(clientRect.height - height) <= 1) { - height = clientRect.height; - } - return { - x: element.offsetLeft, - y: element.offsetTop, - width, - height - }; - } - function getParentNode(element) { - if (getNodeName(element) === "html") { - return element; - } - return ( - // this is a quicker (but less type safe) way to save quite some bytes from the bundle - // $FlowFixMe[incompatible-return] - // $FlowFixMe[prop-missing] - element.assignedSlot || // step into the shadow DOM of the parent of a slotted node - element.parentNode || // DOM Element detected - (isShadowRoot(element) ? element.host : null) || // ShadowRoot detected - // $FlowFixMe[incompatible-call]: HTMLElement is a Node - getDocumentElement(element) - ); - } - function getScrollParent(node) { - if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) { - return node.ownerDocument.body; - } - if (isHTMLElement(node) && isScrollParent(node)) { - return node; - } - return getScrollParent(getParentNode(node)); - } - function listScrollParents(element, list) { - var _element$ownerDocumen; - if (list === void 0) { - list = []; - } - var scrollParent = getScrollParent(element); - var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); - var win = getWindow(scrollParent); - var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; - var updatedList = list.concat(target); - return isBody ? updatedList : ( - // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here - updatedList.concat(listScrollParents(getParentNode(target))) - ); - } - function isTableElement(element) { - return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0; - } - function getTrueOffsetParent(element) { - if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837 - getComputedStyle2(element).position === "fixed") { - return null; - } - return element.offsetParent; - } - function getContainingBlock(element) { - var isFirefox = navigator.userAgent.toLowerCase().indexOf("firefox") !== -1; - var isIE = navigator.userAgent.indexOf("Trident") !== -1; - if (isIE && isHTMLElement(element)) { - var elementCss = getComputedStyle2(element); - if (elementCss.position === "fixed") { - return null; - } - } - var currentNode = getParentNode(element); - while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) { - var css = getComputedStyle2(currentNode); - if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") { - return currentNode; - } else { - currentNode = currentNode.parentNode; - } - } - return null; - } - function getOffsetParent(element) { - var window2 = getWindow(element); - var offsetParent = getTrueOffsetParent(element); - while (offsetParent && isTableElement(offsetParent) && getComputedStyle2(offsetParent).position === "static") { - offsetParent = getTrueOffsetParent(offsetParent); - } - if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle2(offsetParent).position === "static")) { - return window2; - } - return offsetParent || getContainingBlock(element) || window2; - } - var top = "top"; - var bottom = "bottom"; - var right = "right"; - var left = "left"; - var auto = "auto"; - var basePlacements = [top, bottom, right, left]; - var start = "start"; - var end = "end"; - var clippingParents = "clippingParents"; - var viewport = "viewport"; - var popper = "popper"; - var reference = "reference"; - var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) { - return acc.concat([placement + "-" + start, placement + "-" + end]); - }, []); - var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) { - return acc.concat([placement, placement + "-" + start, placement + "-" + end]); - }, []); - var beforeRead = "beforeRead"; - var read = "read"; - var afterRead = "afterRead"; - var beforeMain = "beforeMain"; - var main = "main"; - var afterMain = "afterMain"; - var beforeWrite = "beforeWrite"; - var write = "write"; - var afterWrite = "afterWrite"; - var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; - function order(modifiers) { - var map = /* @__PURE__ */ new Map(); - var visited = /* @__PURE__ */ new Set(); - var result = []; - modifiers.forEach(function(modifier) { - map.set(modifier.name, modifier); - }); - function sort(modifier) { - visited.add(modifier.name); - var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); - requires.forEach(function(dep) { - if (!visited.has(dep)) { - var depModifier = map.get(dep); - if (depModifier) { - sort(depModifier); - } - } - }); - result.push(modifier); - } - modifiers.forEach(function(modifier) { - if (!visited.has(modifier.name)) { - sort(modifier); - } - }); - return result; - } - function orderModifiers(modifiers) { - var orderedModifiers = order(modifiers); - return modifierPhases.reduce(function(acc, phase) { - return acc.concat(orderedModifiers.filter(function(modifier) { - return modifier.phase === phase; - })); - }, []); - } - function debounce(fn) { - var pending; - return function() { - if (!pending) { - pending = new Promise(function(resolve) { - Promise.resolve().then(function() { - pending = void 0; - resolve(fn()); - }); - }); - } - return pending; - }; - } - function format(str) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - return [].concat(args).reduce(function(p, c) { - return p.replace(/%s/, c); - }, str); - } - var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s'; - var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available'; - var VALID_PROPERTIES = ["name", "enabled", "phase", "fn", "effect", "requires", "options"]; - function validateModifiers(modifiers) { - modifiers.forEach(function(modifier) { - [].concat(Object.keys(modifier), VALID_PROPERTIES).filter(function(value, index, self) { - return self.indexOf(value) === index; - }).forEach(function(key) { - switch (key) { - case "name": - if (typeof modifier.name !== "string") { - console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', '"' + String(modifier.name) + '"')); - } - break; - case "enabled": - if (typeof modifier.enabled !== "boolean") { - console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', '"' + String(modifier.enabled) + '"')); - } - break; - case "phase": - if (modifierPhases.indexOf(modifier.phase) < 0) { - console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + modifierPhases.join(", "), '"' + String(modifier.phase) + '"')); - } - break; - case "fn": - if (typeof modifier.fn !== "function") { - console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', '"' + String(modifier.fn) + '"')); - } - break; - case "effect": - if (modifier.effect != null && typeof modifier.effect !== "function") { - console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', '"' + String(modifier.fn) + '"')); - } - break; - case "requires": - if (modifier.requires != null && !Array.isArray(modifier.requires)) { - console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', '"' + String(modifier.requires) + '"')); - } - break; - case "requiresIfExists": - if (!Array.isArray(modifier.requiresIfExists)) { - console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', '"' + String(modifier.requiresIfExists) + '"')); - } - break; - case "options": - case "data": - break; - default: - console.error('PopperJS: an invalid property has been provided to the "' + modifier.name + '" modifier, valid properties are ' + VALID_PROPERTIES.map(function(s) { - return '"' + s + '"'; - }).join(", ") + '; but "' + key + '" was provided.'); - } - modifier.requires && modifier.requires.forEach(function(requirement) { - if (modifiers.find(function(mod) { - return mod.name === requirement; - }) == null) { - console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement)); - } - }); - }); - }); - } - function uniqueBy(arr, fn) { - var identifiers = /* @__PURE__ */ new Set(); - return arr.filter(function(item) { - var identifier = fn(item); - if (!identifiers.has(identifier)) { - identifiers.add(identifier); - return true; - } - }); - } - function getBasePlacement(placement) { - return placement.split("-")[0]; - } - function mergeByName(modifiers) { - var merged = modifiers.reduce(function(merged2, current) { - var existing = merged2[current.name]; - merged2[current.name] = existing ? Object.assign({}, existing, current, { - options: Object.assign({}, existing.options, current.options), - data: Object.assign({}, existing.data, current.data) - }) : current; - return merged2; - }, {}); - return Object.keys(merged).map(function(key) { - return merged[key]; - }); - } - function getViewportRect(element) { - var win = getWindow(element); - var html = getDocumentElement(element); - var visualViewport = win.visualViewport; - var width = html.clientWidth; - var height = html.clientHeight; - var x = 0; - var y = 0; - if (visualViewport) { - width = visualViewport.width; - height = visualViewport.height; - if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { - x = visualViewport.offsetLeft; - y = visualViewport.offsetTop; - } - } - return { - width, - height, - x: x + getWindowScrollBarX(element), - y - }; - } - function getDocumentRect(element) { - var _element$ownerDocumen; - var html = getDocumentElement(element); - var winScroll = getWindowScroll(element); - var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; - var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); - var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); - var x = -winScroll.scrollLeft + getWindowScrollBarX(element); - var y = -winScroll.scrollTop; - if (getComputedStyle2(body || html).direction === "rtl") { - x += max(html.clientWidth, body ? body.clientWidth : 0) - width; - } - return { - width, - height, - x, - y - }; - } - function contains(parent, child) { - var rootNode = child.getRootNode && child.getRootNode(); - if (parent.contains(child)) { - return true; - } else if (rootNode && isShadowRoot(rootNode)) { - var next = child; - do { - if (next && parent.isSameNode(next)) { - return true; - } - next = next.parentNode || next.host; - } while (next); - } - return false; - } - function rectToClientRect(rect) { - return Object.assign({}, rect, { - left: rect.x, - top: rect.y, - right: rect.x + rect.width, - bottom: rect.y + rect.height - }); - } - function getInnerBoundingClientRect(element) { - var rect = getBoundingClientRect(element); - rect.top = rect.top + element.clientTop; - rect.left = rect.left + element.clientLeft; - rect.bottom = rect.top + element.clientHeight; - rect.right = rect.left + element.clientWidth; - rect.width = element.clientWidth; - rect.height = element.clientHeight; - rect.x = rect.left; - rect.y = rect.top; - return rect; - } - function getClientRectFromMixedType(element, clippingParent) { - return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isElement2(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element))); - } - function getClippingParents(element) { - var clippingParents2 = listScrollParents(getParentNode(element)); - var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle2(element).position) >= 0; - var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; - if (!isElement2(clipperElement)) { - return []; - } - return clippingParents2.filter(function(clippingParent) { - return isElement2(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body" && (canEscapeClipping ? getComputedStyle2(clippingParent).position !== "static" : true); - }); - } - function getClippingRect(element, boundary, rootBoundary) { - var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary); - var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]); - var firstClippingParent = clippingParents2[0]; - var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) { - var rect = getClientRectFromMixedType(element, clippingParent); - accRect.top = max(rect.top, accRect.top); - accRect.right = min(rect.right, accRect.right); - accRect.bottom = min(rect.bottom, accRect.bottom); - accRect.left = max(rect.left, accRect.left); - return accRect; - }, getClientRectFromMixedType(element, firstClippingParent)); - clippingRect.width = clippingRect.right - clippingRect.left; - clippingRect.height = clippingRect.bottom - clippingRect.top; - clippingRect.x = clippingRect.left; - clippingRect.y = clippingRect.top; - return clippingRect; - } - function getVariation(placement) { - return placement.split("-")[1]; - } - function getMainAxisFromPlacement(placement) { - return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y"; - } - function computeOffsets(_ref) { - var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement; - var basePlacement = placement ? getBasePlacement(placement) : null; - var variation = placement ? getVariation(placement) : null; - var commonX = reference2.x + reference2.width / 2 - element.width / 2; - var commonY = reference2.y + reference2.height / 2 - element.height / 2; - var offsets; - switch (basePlacement) { - case top: - offsets = { - x: commonX, - y: reference2.y - element.height - }; - break; - case bottom: - offsets = { - x: commonX, - y: reference2.y + reference2.height - }; - break; - case right: - offsets = { - x: reference2.x + reference2.width, - y: commonY - }; - break; - case left: - offsets = { - x: reference2.x - element.width, - y: commonY - }; - break; - default: - offsets = { - x: reference2.x, - y: reference2.y - }; - } - var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; - if (mainAxis != null) { - var len = mainAxis === "y" ? "height" : "width"; - switch (variation) { - case start: - offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2); - break; - case end: - offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2); - break; - } - } - return offsets; - } - function getFreshSideObject() { - return { - top: 0, - right: 0, - bottom: 0, - left: 0 - }; - } - function mergePaddingObject(paddingObject) { - return Object.assign({}, getFreshSideObject(), paddingObject); - } - function expandToHashMap(value, keys) { - return keys.reduce(function(hashMap, key) { - hashMap[key] = value; - return hashMap; - }, {}); - } - function detectOverflow(state, options) { - if (options === void 0) { - options = {}; - } - var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding; - var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); - var altContext = elementContext === popper ? reference : popper; - var popperRect = state.rects.popper; - var element = state.elements[altBoundary ? altContext : elementContext]; - var clippingClientRect = getClippingRect(isElement2(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary); - var referenceClientRect = getBoundingClientRect(state.elements.reference); - var popperOffsets2 = computeOffsets({ - reference: referenceClientRect, - element: popperRect, - strategy: "absolute", - placement - }); - var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2)); - var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; - var overflowOffsets = { - top: clippingClientRect.top - elementClientRect.top + paddingObject.top, - bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, - left: clippingClientRect.left - elementClientRect.left + paddingObject.left, - right: elementClientRect.right - clippingClientRect.right + paddingObject.right - }; - var offsetData = state.modifiersData.offset; - if (elementContext === popper && offsetData) { - var offset2 = offsetData[placement]; - Object.keys(overflowOffsets).forEach(function(key) { - var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; - var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x"; - overflowOffsets[key] += offset2[axis] * multiply; - }); - } - return overflowOffsets; - } - var INVALID_ELEMENT_ERROR = "Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element."; - var INFINITE_LOOP_ERROR = "Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash."; - var DEFAULT_OPTIONS = { - placement: "bottom", - modifiers: [], - strategy: "absolute" - }; - function areValidElements() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - return !args.some(function(element) { - return !(element && typeof element.getBoundingClientRect === "function"); - }); - } - function popperGenerator(generatorOptions) { - if (generatorOptions === void 0) { - generatorOptions = {}; - } - var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers2 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; - return function createPopper4(reference2, popper2, options) { - if (options === void 0) { - options = defaultOptions; - } - var state = { - placement: "bottom", - orderedModifiers: [], - options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), - modifiersData: {}, - elements: { - reference: reference2, - popper: popper2 - }, - attributes: {}, - styles: {} - }; - var effectCleanupFns = []; - var isDestroyed = false; - var instance = { - state, - setOptions: function setOptions(setOptionsAction) { - var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction; - cleanupModifierEffects(); - state.options = Object.assign({}, defaultOptions, state.options, options2); - state.scrollParents = { - reference: isElement2(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [], - popper: listScrollParents(popper2) - }; - var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers2, state.options.modifiers))); - state.orderedModifiers = orderedModifiers.filter(function(m) { - return m.enabled; - }); - if (true) { - var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function(_ref) { - var name = _ref.name; - return name; - }); - validateModifiers(modifiers); - if (getBasePlacement(state.options.placement) === auto) { - var flipModifier = state.orderedModifiers.find(function(_ref2) { - var name = _ref2.name; - return name === "flip"; - }); - if (!flipModifier) { - console.error(['Popper: "auto" placements require the "flip" modifier be', "present and enabled to work."].join(" ")); - } - } - var _getComputedStyle = getComputedStyle2(popper2), marginTop = _getComputedStyle.marginTop, marginRight = _getComputedStyle.marginRight, marginBottom = _getComputedStyle.marginBottom, marginLeft = _getComputedStyle.marginLeft; - if ([marginTop, marginRight, marginBottom, marginLeft].some(function(margin) { - return parseFloat(margin); - })) { - console.warn(['Popper: CSS "margin" styles cannot be used to apply padding', "between the popper and its reference element or boundary.", "To replicate margin, use the `offset` modifier, as well as", "the `padding` option in the `preventOverflow` and `flip`", "modifiers."].join(" ")); - } - } - runModifierEffects(); - return instance.update(); - }, - // Sync update – it will always be executed, even if not necessary. This - // is useful for low frequency updates where sync behavior simplifies the - // logic. - // For high frequency updates (e.g. `resize` and `scroll` events), always - // prefer the async Popper#update method - forceUpdate: function forceUpdate() { - if (isDestroyed) { - return; - } - var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper; - if (!areValidElements(reference3, popper3)) { - if (true) { - console.error(INVALID_ELEMENT_ERROR); - } - return; - } - state.rects = { - reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"), - popper: getLayoutRect(popper3) - }; - state.reset = false; - state.placement = state.options.placement; - state.orderedModifiers.forEach(function(modifier) { - return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); - }); - var __debug_loops__ = 0; - for (var index = 0; index < state.orderedModifiers.length; index++) { - if (true) { - __debug_loops__ += 1; - if (__debug_loops__ > 100) { - console.error(INFINITE_LOOP_ERROR); - break; - } - } - if (state.reset === true) { - state.reset = false; - index = -1; - continue; - } - var _state$orderedModifie = state.orderedModifiers[index], fn = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name; - if (typeof fn === "function") { - state = fn({ - state, - options: _options, - name, - instance - }) || state; - } - } - }, - // Async and optimistically optimized update – it will not be executed if - // not necessary (debounced to run at most once-per-tick) - update: debounce(function() { - return new Promise(function(resolve) { - instance.forceUpdate(); - resolve(state); - }); - }), - destroy: function destroy() { - cleanupModifierEffects(); - isDestroyed = true; - } - }; - if (!areValidElements(reference2, popper2)) { - if (true) { - console.error(INVALID_ELEMENT_ERROR); - } - return instance; - } - instance.setOptions(options).then(function(state2) { - if (!isDestroyed && options.onFirstUpdate) { - options.onFirstUpdate(state2); - } - }); - function runModifierEffects() { - state.orderedModifiers.forEach(function(_ref3) { - var name = _ref3.name, _ref3$options = _ref3.options, options2 = _ref3$options === void 0 ? {} : _ref3$options, effect2 = _ref3.effect; - if (typeof effect2 === "function") { - var cleanupFn = effect2({ - state, - name, - instance, - options: options2 - }); - var noopFn = function noopFn2() { - }; - effectCleanupFns.push(cleanupFn || noopFn); - } - }); - } - function cleanupModifierEffects() { - effectCleanupFns.forEach(function(fn) { - return fn(); - }); - effectCleanupFns = []; - } - return instance; - }; - } - var passive = { - passive: true - }; - function effect$2(_ref) { - var state = _ref.state, instance = _ref.instance, options = _ref.options; - var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize; - var window2 = getWindow(state.elements.popper); - var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); - if (scroll) { - scrollParents.forEach(function(scrollParent) { - scrollParent.addEventListener("scroll", instance.update, passive); - }); - } - if (resize) { - window2.addEventListener("resize", instance.update, passive); - } - return function() { - if (scroll) { - scrollParents.forEach(function(scrollParent) { - scrollParent.removeEventListener("scroll", instance.update, passive); - }); - } - if (resize) { - window2.removeEventListener("resize", instance.update, passive); - } - }; - } - var eventListeners = { - name: "eventListeners", - enabled: true, - phase: "write", - fn: function fn() { - }, - effect: effect$2, - data: {} - }; - function popperOffsets(_ref) { - var state = _ref.state, name = _ref.name; - state.modifiersData[name] = computeOffsets({ - reference: state.rects.reference, - element: state.rects.popper, - strategy: "absolute", - placement: state.placement - }); - } - var popperOffsets$1 = { - name: "popperOffsets", - enabled: true, - phase: "read", - fn: popperOffsets, - data: {} - }; - var unsetSides = { - top: "auto", - right: "auto", - bottom: "auto", - left: "auto" - }; - function roundOffsetsByDPR(_ref) { - var x = _ref.x, y = _ref.y; - var win = window; - var dpr = win.devicePixelRatio || 1; - return { - x: round(x * dpr) / dpr || 0, - y: round(y * dpr) / dpr || 0 - }; - } - function mapToStyles(_ref2) { - var _Object$assign2; - var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed; - var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === "function" ? roundOffsets(offsets) : offsets, _ref3$x = _ref3.x, x = _ref3$x === void 0 ? 0 : _ref3$x, _ref3$y = _ref3.y, y = _ref3$y === void 0 ? 0 : _ref3$y; - var hasX = offsets.hasOwnProperty("x"); - var hasY = offsets.hasOwnProperty("y"); - var sideX = left; - var sideY = top; - var win = window; - if (adaptive) { - var offsetParent = getOffsetParent(popper2); - var heightProp = "clientHeight"; - var widthProp = "clientWidth"; - if (offsetParent === getWindow(popper2)) { - offsetParent = getDocumentElement(popper2); - if (getComputedStyle2(offsetParent).position !== "static" && position === "absolute") { - heightProp = "scrollHeight"; - widthProp = "scrollWidth"; - } - } - offsetParent = offsetParent; - if (placement === top || (placement === left || placement === right) && variation === end) { - sideY = bottom; - var offsetY = isFixed && win.visualViewport ? win.visualViewport.height : ( - // $FlowFixMe[prop-missing] - offsetParent[heightProp] - ); - y -= offsetY - popperRect.height; - y *= gpuAcceleration ? 1 : -1; - } - if (placement === left || (placement === top || placement === bottom) && variation === end) { - sideX = right; - var offsetX = isFixed && win.visualViewport ? win.visualViewport.width : ( - // $FlowFixMe[prop-missing] - offsetParent[widthProp] - ); - x -= offsetX - popperRect.width; - x *= gpuAcceleration ? 1 : -1; - } - } - var commonStyles = Object.assign({ - position - }, adaptive && unsetSides); - if (gpuAcceleration) { - var _Object$assign; - return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); - } - return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : "", _Object$assign2[sideX] = hasX ? x + "px" : "", _Object$assign2.transform = "", _Object$assign2)); - } - function computeStyles(_ref4) { - var state = _ref4.state, options = _ref4.options; - var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; - if (true) { - var transitionProperty = getComputedStyle2(state.elements.popper).transitionProperty || ""; - if (adaptive && ["transform", "top", "right", "bottom", "left"].some(function(property) { - return transitionProperty.indexOf(property) >= 0; - })) { - console.warn(["Popper: Detected CSS transitions on at least one of the following", 'CSS properties: "transform", "top", "right", "bottom", "left".', "\n\n", 'Disable the "computeStyles" modifier\'s `adaptive` option to allow', "for smooth transitions, or remove these properties from the CSS", "transition declaration on the popper element if only transitioning", "opacity or background-color for example.", "\n\n", "We recommend using the popper element as a wrapper around an inner", "element that can have any CSS property transitioned for animations."].join(" ")); - } - } - var commonStyles = { - placement: getBasePlacement(state.placement), - variation: getVariation(state.placement), - popper: state.elements.popper, - popperRect: state.rects.popper, - gpuAcceleration, - isFixed: state.options.strategy === "fixed" - }; - if (state.modifiersData.popperOffsets != null) { - state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { - offsets: state.modifiersData.popperOffsets, - position: state.options.strategy, - adaptive, - roundOffsets - }))); - } - if (state.modifiersData.arrow != null) { - state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { - offsets: state.modifiersData.arrow, - position: "absolute", - adaptive: false, - roundOffsets - }))); - } - state.attributes.popper = Object.assign({}, state.attributes.popper, { - "data-popper-placement": state.placement - }); - } - var computeStyles$1 = { - name: "computeStyles", - enabled: true, - phase: "beforeWrite", - fn: computeStyles, - data: {} - }; - function applyStyles(_ref) { - var state = _ref.state; - Object.keys(state.elements).forEach(function(name) { - var style = state.styles[name] || {}; - var attributes = state.attributes[name] || {}; - var element = state.elements[name]; - if (!isHTMLElement(element) || !getNodeName(element)) { - return; - } - Object.assign(element.style, style); - Object.keys(attributes).forEach(function(name2) { - var value = attributes[name2]; - if (value === false) { - element.removeAttribute(name2); - } else { - element.setAttribute(name2, value === true ? "" : value); - } - }); - }); - } - function effect$1(_ref2) { - var state = _ref2.state; - var initialStyles = { - popper: { - position: state.options.strategy, - left: "0", - top: "0", - margin: "0" - }, - arrow: { - position: "absolute" - }, - reference: {} - }; - Object.assign(state.elements.popper.style, initialStyles.popper); - state.styles = initialStyles; - if (state.elements.arrow) { - Object.assign(state.elements.arrow.style, initialStyles.arrow); - } - return function() { - Object.keys(state.elements).forEach(function(name) { - var element = state.elements[name]; - var attributes = state.attributes[name] || {}; - var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); - var style = styleProperties.reduce(function(style2, property) { - style2[property] = ""; - return style2; - }, {}); - if (!isHTMLElement(element) || !getNodeName(element)) { - return; - } - Object.assign(element.style, style); - Object.keys(attributes).forEach(function(attribute) { - element.removeAttribute(attribute); - }); - }); - }; - } - var applyStyles$1 = { - name: "applyStyles", - enabled: true, - phase: "write", - fn: applyStyles, - effect: effect$1, - requires: ["computeStyles"] - }; - function distanceAndSkiddingToXY(placement, rects, offset2) { - var basePlacement = getBasePlacement(placement); - var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; - var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, { - placement - })) : offset2, skidding = _ref[0], distance = _ref[1]; - skidding = skidding || 0; - distance = (distance || 0) * invertDistance; - return [left, right].indexOf(basePlacement) >= 0 ? { - x: distance, - y: skidding - } : { - x: skidding, - y: distance - }; - } - function offset(_ref2) { - var state = _ref2.state, options = _ref2.options, name = _ref2.name; - var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset; - var data = placements.reduce(function(acc, placement) { - acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2); - return acc; - }, {}); - var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y; - if (state.modifiersData.popperOffsets != null) { - state.modifiersData.popperOffsets.x += x; - state.modifiersData.popperOffsets.y += y; - } - state.modifiersData[name] = data; - } - var offset$1 = { - name: "offset", - enabled: true, - phase: "main", - requires: ["popperOffsets"], - fn: offset - }; - var hash$1 = { - left: "right", - right: "left", - bottom: "top", - top: "bottom" - }; - function getOppositePlacement(placement) { - return placement.replace(/left|right|bottom|top/g, function(matched) { - return hash$1[matched]; - }); - } - var hash = { - start: "end", - end: "start" - }; - function getOppositeVariationPlacement(placement) { - return placement.replace(/start|end/g, function(matched) { - return hash[matched]; - }); - } - function computeAutoPlacement(state, options) { - if (options === void 0) { - options = {}; - } - var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; - var variation = getVariation(placement); - var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) { - return getVariation(placement2) === variation; - }) : basePlacements; - var allowedPlacements = placements$1.filter(function(placement2) { - return allowedAutoPlacements.indexOf(placement2) >= 0; - }); - if (allowedPlacements.length === 0) { - allowedPlacements = placements$1; - if (true) { - console.error(["Popper: The `allowedAutoPlacements` option did not allow any", "placements. Ensure the `placement` option matches the variation", "of the allowed placements.", 'For example, "auto" cannot be used to allow "bottom-start".', 'Use "auto-start" instead.'].join(" ")); - } - } - var overflows = allowedPlacements.reduce(function(acc, placement2) { - acc[placement2] = detectOverflow(state, { - placement: placement2, - boundary, - rootBoundary, - padding - })[getBasePlacement(placement2)]; - return acc; - }, {}); - return Object.keys(overflows).sort(function(a, b) { - return overflows[a] - overflows[b]; - }); - } - function getExpandedFallbackPlacements(placement) { - if (getBasePlacement(placement) === auto) { - return []; - } - var oppositePlacement = getOppositePlacement(placement); - return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; - } - function flip(_ref) { - var state = _ref.state, options = _ref.options, name = _ref.name; - if (state.modifiersData[name]._skip) { - return; - } - var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements; - var preferredPlacement = state.options.placement; - var basePlacement = getBasePlacement(preferredPlacement); - var isBasePlacement = basePlacement === preferredPlacement; - var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); - var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) { - return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, { - placement: placement2, - boundary, - rootBoundary, - padding, - flipVariations, - allowedAutoPlacements - }) : placement2); - }, []); - var referenceRect = state.rects.reference; - var popperRect = state.rects.popper; - var checksMap = /* @__PURE__ */ new Map(); - var makeFallbackChecks = true; - var firstFittingPlacement = placements2[0]; - for (var i = 0; i < placements2.length; i++) { - var placement = placements2[i]; - var _basePlacement = getBasePlacement(placement); - var isStartVariation = getVariation(placement) === start; - var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; - var len = isVertical ? "width" : "height"; - var overflow = detectOverflow(state, { - placement, - boundary, - rootBoundary, - altBoundary, - padding - }); - var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; - if (referenceRect[len] > popperRect[len]) { - mainVariationSide = getOppositePlacement(mainVariationSide); - } - var altVariationSide = getOppositePlacement(mainVariationSide); - var checks = []; - if (checkMainAxis) { - checks.push(overflow[_basePlacement] <= 0); - } - if (checkAltAxis) { - checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); - } - if (checks.every(function(check) { - return check; - })) { - firstFittingPlacement = placement; - makeFallbackChecks = false; - break; - } - checksMap.set(placement, checks); - } - if (makeFallbackChecks) { - var numberOfChecks = flipVariations ? 3 : 1; - var _loop = function _loop2(_i2) { - var fittingPlacement = placements2.find(function(placement2) { - var checks2 = checksMap.get(placement2); - if (checks2) { - return checks2.slice(0, _i2).every(function(check) { - return check; - }); - } - }); - if (fittingPlacement) { - firstFittingPlacement = fittingPlacement; - return "break"; - } - }; - for (var _i = numberOfChecks; _i > 0; _i--) { - var _ret = _loop(_i); - if (_ret === "break") break; - } - } - if (state.placement !== firstFittingPlacement) { - state.modifiersData[name]._skip = true; - state.placement = firstFittingPlacement; - state.reset = true; - } - } - var flip$1 = { - name: "flip", - enabled: true, - phase: "main", - fn: flip, - requiresIfExists: ["offset"], - data: { - _skip: false - } - }; - function getAltAxis(axis) { - return axis === "x" ? "y" : "x"; - } - function within(min$1, value, max$1) { - return max(min$1, min(value, max$1)); - } - function withinMaxClamp(min2, value, max2) { - var v = within(min2, value, max2); - return v > max2 ? max2 : v; - } - function preventOverflow(_ref) { - var state = _ref.state, options = _ref.options, name = _ref.name; - var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; - var overflow = detectOverflow(state, { - boundary, - rootBoundary, - padding, - altBoundary - }); - var basePlacement = getBasePlacement(state.placement); - var variation = getVariation(state.placement); - var isBasePlacement = !variation; - var mainAxis = getMainAxisFromPlacement(basePlacement); - var altAxis = getAltAxis(mainAxis); - var popperOffsets2 = state.modifiersData.popperOffsets; - var referenceRect = state.rects.reference; - var popperRect = state.rects.popper; - var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, { - placement: state.placement - })) : tetherOffset; - var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? { - mainAxis: tetherOffsetValue, - altAxis: tetherOffsetValue - } : Object.assign({ - mainAxis: 0, - altAxis: 0 - }, tetherOffsetValue); - var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; - var data = { - x: 0, - y: 0 - }; - if (!popperOffsets2) { - return; - } - if (checkMainAxis) { - var _offsetModifierState$; - var mainSide = mainAxis === "y" ? top : left; - var altSide = mainAxis === "y" ? bottom : right; - var len = mainAxis === "y" ? "height" : "width"; - var offset2 = popperOffsets2[mainAxis]; - var min$1 = offset2 + overflow[mainSide]; - var max$1 = offset2 - overflow[altSide]; - var additive = tether ? -popperRect[len] / 2 : 0; - var minLen = variation === start ? referenceRect[len] : popperRect[len]; - var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; - var arrowElement = state.elements.arrow; - var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { - width: 0, - height: 0 - }; - var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject(); - var arrowPaddingMin = arrowPaddingObject[mainSide]; - var arrowPaddingMax = arrowPaddingObject[altSide]; - var arrowLen = within(0, referenceRect[len], arrowRect[len]); - var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; - var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; - var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); - var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; - var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; - var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset; - var tetherMax = offset2 + maxOffset - offsetModifierValue; - var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset2, tether ? max(max$1, tetherMax) : max$1); - popperOffsets2[mainAxis] = preventedOffset; - data[mainAxis] = preventedOffset - offset2; - } - if (checkAltAxis) { - var _offsetModifierState$2; - var _mainSide = mainAxis === "x" ? top : left; - var _altSide = mainAxis === "x" ? bottom : right; - var _offset = popperOffsets2[altAxis]; - var _len = altAxis === "y" ? "height" : "width"; - var _min = _offset + overflow[_mainSide]; - var _max = _offset - overflow[_altSide]; - var isOriginSide = [top, left].indexOf(basePlacement) !== -1; - var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; - var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; - var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; - var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); - popperOffsets2[altAxis] = _preventedOffset; - data[altAxis] = _preventedOffset - _offset; - } - state.modifiersData[name] = data; - } - var preventOverflow$1 = { - name: "preventOverflow", - enabled: true, - phase: "main", - fn: preventOverflow, - requiresIfExists: ["offset"] - }; - var toPaddingObject = function toPaddingObject2(padding, state) { - padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, { - placement: state.placement - })) : padding; - return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); - }; - function arrow(_ref) { - var _state$modifiersData$; - var state = _ref.state, name = _ref.name, options = _ref.options; - var arrowElement = state.elements.arrow; - var popperOffsets2 = state.modifiersData.popperOffsets; - var basePlacement = getBasePlacement(state.placement); - var axis = getMainAxisFromPlacement(basePlacement); - var isVertical = [left, right].indexOf(basePlacement) >= 0; - var len = isVertical ? "height" : "width"; - if (!arrowElement || !popperOffsets2) { - return; - } - var paddingObject = toPaddingObject(options.padding, state); - var arrowRect = getLayoutRect(arrowElement); - var minProp = axis === "y" ? top : left; - var maxProp = axis === "y" ? bottom : right; - var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len]; - var startDiff = popperOffsets2[axis] - state.rects.reference[axis]; - var arrowOffsetParent = getOffsetParent(arrowElement); - var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; - var centerToReference = endDiff / 2 - startDiff / 2; - var min2 = paddingObject[minProp]; - var max2 = clientSize - arrowRect[len] - paddingObject[maxProp]; - var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; - var offset2 = within(min2, center, max2); - var axisProp = axis; - state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$); - } - function effect(_ref2) { - var state = _ref2.state, options = _ref2.options; - var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element; - if (arrowElement == null) { - return; - } - if (typeof arrowElement === "string") { - arrowElement = state.elements.popper.querySelector(arrowElement); - if (!arrowElement) { - return; - } - } - if (true) { - if (!isHTMLElement(arrowElement)) { - console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).', "To use an SVG arrow, wrap it in an HTMLElement that will be used as", "the arrow."].join(" ")); - } - } - if (!contains(state.elements.popper, arrowElement)) { - if (true) { - console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper', "element."].join(" ")); - } - return; - } - state.elements.arrow = arrowElement; - } - var arrow$1 = { - name: "arrow", - enabled: true, - phase: "main", - fn: arrow, - effect, - requires: ["popperOffsets"], - requiresIfExists: ["preventOverflow"] - }; - function getSideOffsets(overflow, rect, preventedOffsets) { - if (preventedOffsets === void 0) { - preventedOffsets = { - x: 0, - y: 0 - }; - } - return { - top: overflow.top - rect.height - preventedOffsets.y, - right: overflow.right - rect.width + preventedOffsets.x, - bottom: overflow.bottom - rect.height + preventedOffsets.y, - left: overflow.left - rect.width - preventedOffsets.x - }; - } - function isAnySideFullyClipped(overflow) { - return [top, right, bottom, left].some(function(side) { - return overflow[side] >= 0; - }); - } - function hide(_ref) { - var state = _ref.state, name = _ref.name; - var referenceRect = state.rects.reference; - var popperRect = state.rects.popper; - var preventedOffsets = state.modifiersData.preventOverflow; - var referenceOverflow = detectOverflow(state, { - elementContext: "reference" - }); - var popperAltOverflow = detectOverflow(state, { - altBoundary: true - }); - var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); - var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); - var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); - var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); - state.modifiersData[name] = { - referenceClippingOffsets, - popperEscapeOffsets, - isReferenceHidden, - hasPopperEscaped - }; - state.attributes.popper = Object.assign({}, state.attributes.popper, { - "data-popper-reference-hidden": isReferenceHidden, - "data-popper-escaped": hasPopperEscaped - }); - } - var hide$1 = { - name: "hide", - enabled: true, - phase: "main", - requiresIfExists: ["preventOverflow"], - fn: hide - }; - var defaultModifiers$1 = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1]; - var createPopper$1 = /* @__PURE__ */ popperGenerator({ - defaultModifiers: defaultModifiers$1 - }); - var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1]; - var createPopper3 = /* @__PURE__ */ popperGenerator({ - defaultModifiers - }); - exports.applyStyles = applyStyles$1; - exports.arrow = arrow$1; - exports.computeStyles = computeStyles$1; - exports.createPopper = createPopper3; - exports.createPopperLite = createPopper$1; - exports.defaultModifiers = defaultModifiers; - exports.detectOverflow = detectOverflow; - exports.eventListeners = eventListeners; - exports.flip = flip$1; - exports.hide = hide$1; - exports.offset = offset$1; - exports.popperGenerator = popperGenerator; - exports.popperOffsets = popperOffsets$1; - exports.preventOverflow = preventOverflow$1; - } - }); - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/dom/data.js - var elementMap = /* @__PURE__ */ new Map(); - var data_default = { - set(element, key, instance) { - if (!elementMap.has(element)) { - elementMap.set(element, /* @__PURE__ */ new Map()); - } - const instanceMap = elementMap.get(element); - if (!instanceMap.has(key) && instanceMap.size !== 0) { - console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`); - return; - } - instanceMap.set(key, instance); - }, - get(element, key) { - if (elementMap.has(element)) { - return elementMap.get(element).get(key) || null; - } - return null; - }, - remove(element, key) { - if (!elementMap.has(element)) { - return; - } - const instanceMap = elementMap.get(element); - instanceMap.delete(key); - if (instanceMap.size === 0) { - elementMap.delete(element); - } - } - }; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/util/index.js - var MAX_UID = 1e6; - var MILLISECONDS_MULTIPLIER = 1e3; - var TRANSITION_END = "transitionend"; - var parseSelector = (selector) => { - if (selector && window.CSS && window.CSS.escape) { - selector = selector.replace(/#([^\s"#']+)/g, (match, id) => `#${CSS.escape(id)}`); - } - return selector; - }; - var toType = (object) => { - if (object === null || object === void 0) { - return `${object}`; - } - return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase(); - }; - var getUID = (prefix) => { - do { - prefix += Math.floor(Math.random() * MAX_UID); - } while (document.getElementById(prefix)); - return prefix; - }; - var getTransitionDurationFromElement = (element) => { - if (!element) { - return 0; - } - let { transitionDuration, transitionDelay } = window.getComputedStyle(element); - const floatTransitionDuration = Number.parseFloat(transitionDuration); - const floatTransitionDelay = Number.parseFloat(transitionDelay); - if (!floatTransitionDuration && !floatTransitionDelay) { - return 0; - } - transitionDuration = transitionDuration.split(",")[0]; - transitionDelay = transitionDelay.split(",")[0]; - return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; - }; - var triggerTransitionEnd = (element) => { - element.dispatchEvent(new Event(TRANSITION_END)); - }; - var isElement = (object) => { - if (!object || typeof object !== "object") { - return false; - } - if (typeof object.jquery !== "undefined") { - object = object[0]; - } - return typeof object.nodeType !== "undefined"; - }; - var getElement = (object) => { - if (isElement(object)) { - return object.jquery ? object[0] : object; - } - if (typeof object === "string" && object.length > 0) { - return document.querySelector(parseSelector(object)); - } - return null; - }; - var isVisible = (element) => { - if (!isElement(element) || element.getClientRects().length === 0) { - return false; - } - const elementIsVisible = getComputedStyle(element).getPropertyValue("visibility") === "visible"; - const closedDetails = element.closest("details:not([open])"); - if (!closedDetails) { - return elementIsVisible; - } - if (closedDetails !== element) { - const summary = element.closest("summary"); - if (summary && summary.parentNode !== closedDetails) { - return false; - } - if (summary === null) { - return false; - } - } - return elementIsVisible; - }; - var isDisabled = (element) => { - if (!element || element.nodeType !== Node.ELEMENT_NODE) { - return true; - } - if (element.classList.contains("disabled")) { - return true; - } - if (typeof element.disabled !== "undefined") { - return element.disabled; - } - return element.hasAttribute("disabled") && element.getAttribute("disabled") !== "false"; - }; - var findShadowRoot = (element) => { - if (!document.documentElement.attachShadow) { - return null; - } - if (typeof element.getRootNode === "function") { - const root = element.getRootNode(); - return root instanceof ShadowRoot ? root : null; - } - if (element instanceof ShadowRoot) { - return element; - } - if (!element.parentNode) { - return null; - } - return findShadowRoot(element.parentNode); - }; - var noop = () => { - }; - var reflow = (element) => { - element.offsetHeight; - }; - var getjQuery = () => { - if (window.jQuery && !document.body.hasAttribute("data-bs-no-jquery")) { - return window.jQuery; - } - return null; - }; - var DOMContentLoadedCallbacks = []; - var onDOMContentLoaded = (callback) => { - if (document.readyState === "loading") { - if (!DOMContentLoadedCallbacks.length) { - document.addEventListener("DOMContentLoaded", () => { - for (const callback2 of DOMContentLoadedCallbacks) { - callback2(); - } - }); - } - DOMContentLoadedCallbacks.push(callback); - } else { - callback(); - } - }; - var isRTL = () => document.documentElement.dir === "rtl"; - var defineJQueryPlugin = (plugin) => { - onDOMContentLoaded(() => { - const $ = getjQuery(); - if ($) { - const name = plugin.NAME; - const JQUERY_NO_CONFLICT = $.fn[name]; - $.fn[name] = plugin.jQueryInterface; - $.fn[name].Constructor = plugin; - $.fn[name].noConflict = () => { - $.fn[name] = JQUERY_NO_CONFLICT; - return plugin.jQueryInterface; - }; - } - }); - }; - var execute = (possibleCallback, args = [], defaultValue = possibleCallback) => { - return typeof possibleCallback === "function" ? possibleCallback(...args) : defaultValue; - }; - var executeAfterTransition = (callback, transitionElement, waitForTransition = true) => { - if (!waitForTransition) { - execute(callback); - return; - } - const durationPadding = 5; - const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding; - let called = false; - const handler = ({ target }) => { - if (target !== transitionElement) { - return; - } - called = true; - transitionElement.removeEventListener(TRANSITION_END, handler); - execute(callback); - }; - transitionElement.addEventListener(TRANSITION_END, handler); - setTimeout(() => { - if (!called) { - triggerTransitionEnd(transitionElement); - } - }, emulatedDuration); - }; - var getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => { - const listLength = list.length; - let index = list.indexOf(activeElement); - if (index === -1) { - return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]; - } - index += shouldGetNext ? 1 : -1; - if (isCycleAllowed) { - index = (index + listLength) % listLength; - } - return list[Math.max(0, Math.min(index, listLength - 1))]; - }; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/dom/event-handler.js - var namespaceRegex = /[^.]*(?=\..*)\.|.*/; - var stripNameRegex = /\..*/; - var stripUidRegex = /::\d+$/; - var eventRegistry = {}; - var uidEvent = 1; - var customEvents = { - mouseenter: "mouseover", - mouseleave: "mouseout" - }; - var nativeEvents = /* @__PURE__ */ new Set([ - "click", - "dblclick", - "mouseup", - "mousedown", - "contextmenu", - "mousewheel", - "DOMMouseScroll", - "mouseover", - "mouseout", - "mousemove", - "selectstart", - "selectend", - "keydown", - "keypress", - "keyup", - "orientationchange", - "touchstart", - "touchmove", - "touchend", - "touchcancel", - "pointerdown", - "pointermove", - "pointerup", - "pointerleave", - "pointercancel", - "gesturestart", - "gesturechange", - "gestureend", - "focus", - "blur", - "change", - "reset", - "select", - "submit", - "focusin", - "focusout", - "load", - "unload", - "beforeunload", - "resize", - "move", - "DOMContentLoaded", - "readystatechange", - "error", - "abort", - "scroll" - ]); - function makeEventUid(element, uid) { - return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++; - } - function getElementEvents(element) { - const uid = makeEventUid(element); - element.uidEvent = uid; - eventRegistry[uid] = eventRegistry[uid] || {}; - return eventRegistry[uid]; - } - function bootstrapHandler(element, fn) { - return function handler(event) { - hydrateObj(event, { delegateTarget: element }); - if (handler.oneOff) { - EventHandler.off(element, event.type, fn); - } - return fn.apply(element, [event]); - }; - } - function bootstrapDelegationHandler(element, selector, fn) { - return function handler(event) { - const domElements = element.querySelectorAll(selector); - for (let { target } = event; target && target !== this; target = target.parentNode) { - for (const domElement of domElements) { - if (domElement !== target) { - continue; - } - hydrateObj(event, { delegateTarget: target }); - if (handler.oneOff) { - EventHandler.off(element, event.type, selector, fn); - } - return fn.apply(target, [event]); - } - } - }; - } - function findHandler(events, callable, delegationSelector = null) { - return Object.values(events).find((event) => event.callable === callable && event.delegationSelector === delegationSelector); - } - function normalizeParameters(originalTypeEvent, handler, delegationFunction) { - const isDelegated = typeof handler === "string"; - const callable = isDelegated ? delegationFunction : handler || delegationFunction; - let typeEvent = getTypeEvent(originalTypeEvent); - if (!nativeEvents.has(typeEvent)) { - typeEvent = originalTypeEvent; - } - return [isDelegated, callable, typeEvent]; - } - function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) { - if (typeof originalTypeEvent !== "string" || !element) { - return; - } - let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); - if (originalTypeEvent in customEvents) { - const wrapFunction = (fn2) => { - return function(event) { - if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) { - return fn2.call(this, event); - } - }; - }; - callable = wrapFunction(callable); - } - const events = getElementEvents(element); - const handlers = events[typeEvent] || (events[typeEvent] = {}); - const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null); - if (previousFunction) { - previousFunction.oneOff = previousFunction.oneOff && oneOff; - return; - } - const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, "")); - const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable); - fn.delegationSelector = isDelegated ? handler : null; - fn.callable = callable; - fn.oneOff = oneOff; - fn.uidEvent = uid; - handlers[uid] = fn; - element.addEventListener(typeEvent, fn, isDelegated); - } - function removeHandler(element, events, typeEvent, handler, delegationSelector) { - const fn = findHandler(events[typeEvent], handler, delegationSelector); - if (!fn) { - return; - } - element.removeEventListener(typeEvent, fn, Boolean(delegationSelector)); - delete events[typeEvent][fn.uidEvent]; - } - function removeNamespacedHandlers(element, events, typeEvent, namespace) { - const storeElementEvent = events[typeEvent] || {}; - for (const [handlerKey, event] of Object.entries(storeElementEvent)) { - if (handlerKey.includes(namespace)) { - removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); - } - } - } - function getTypeEvent(event) { - event = event.replace(stripNameRegex, ""); - return customEvents[event] || event; - } - var EventHandler = { - on(element, event, handler, delegationFunction) { - addHandler(element, event, handler, delegationFunction, false); - }, - one(element, event, handler, delegationFunction) { - addHandler(element, event, handler, delegationFunction, true); - }, - off(element, originalTypeEvent, handler, delegationFunction) { - if (typeof originalTypeEvent !== "string" || !element) { - return; - } - const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); - const inNamespace = typeEvent !== originalTypeEvent; - const events = getElementEvents(element); - const storeElementEvent = events[typeEvent] || {}; - const isNamespace = originalTypeEvent.startsWith("."); - if (typeof callable !== "undefined") { - if (!Object.keys(storeElementEvent).length) { - return; - } - removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null); - return; - } - if (isNamespace) { - for (const elementEvent of Object.keys(events)) { - removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1)); - } - } - for (const [keyHandlers, event] of Object.entries(storeElementEvent)) { - const handlerKey = keyHandlers.replace(stripUidRegex, ""); - if (!inNamespace || originalTypeEvent.includes(handlerKey)) { - removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); - } - } - }, - trigger(element, event, args) { - if (typeof event !== "string" || !element) { - return null; - } - const $ = getjQuery(); - const typeEvent = getTypeEvent(event); - const inNamespace = event !== typeEvent; - let jQueryEvent = null; - let bubbles = true; - let nativeDispatch = true; - let defaultPrevented = false; - if (inNamespace && $) { - jQueryEvent = $.Event(event, args); - $(element).trigger(jQueryEvent); - bubbles = !jQueryEvent.isPropagationStopped(); - nativeDispatch = !jQueryEvent.isImmediatePropagationStopped(); - defaultPrevented = jQueryEvent.isDefaultPrevented(); - } - const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args); - if (defaultPrevented) { - evt.preventDefault(); - } - if (nativeDispatch) { - element.dispatchEvent(evt); - } - if (evt.defaultPrevented && jQueryEvent) { - jQueryEvent.preventDefault(); - } - return evt; - } - }; - function hydrateObj(obj, meta = {}) { - for (const [key, value] of Object.entries(meta)) { - try { - obj[key] = value; - } catch (e) { - Object.defineProperty(obj, key, { - configurable: true, - get() { - return value; - } - }); - } - } - return obj; - } - var event_handler_default = EventHandler; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/dom/manipulator.js - function normalizeData(value) { - if (value === "true") { - return true; - } - if (value === "false") { - return false; - } - if (value === Number(value).toString()) { - return Number(value); - } - if (value === "" || value === "null") { - return null; - } - if (typeof value !== "string") { - return value; - } - try { - return JSON.parse(decodeURIComponent(value)); - } catch (e) { - return value; - } - } - function normalizeDataKey(key) { - return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`); - } - var Manipulator = { - setDataAttribute(element, key, value) { - element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value); - }, - removeDataAttribute(element, key) { - element.removeAttribute(`data-bs-${normalizeDataKey(key)}`); - }, - getDataAttributes(element) { - if (!element) { - return {}; - } - const attributes = {}; - const bsKeys = Object.keys(element.dataset).filter((key) => key.startsWith("bs") && !key.startsWith("bsConfig")); - for (const key of bsKeys) { - let pureKey = key.replace(/^bs/, ""); - pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); - attributes[pureKey] = normalizeData(element.dataset[key]); - } - return attributes; - }, - getDataAttribute(element, key) { - return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`)); - } - }; - var manipulator_default = Manipulator; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/util/config.js - var Config = class { - // Getters - static get Default() { - return {}; - } - static get DefaultType() { - return {}; - } - static get NAME() { - throw new Error('You have to implement the static method "NAME", for each component!'); - } - _getConfig(config) { - config = this._mergeConfigObj(config); - config = this._configAfterMerge(config); - this._typeCheckConfig(config); - return config; - } - _configAfterMerge(config) { - return config; - } - _mergeConfigObj(config, element) { - const jsonConfig = isElement(element) ? manipulator_default.getDataAttribute(element, "config") : {}; - return { - ...this.constructor.Default, - ...typeof jsonConfig === "object" ? jsonConfig : {}, - ...isElement(element) ? manipulator_default.getDataAttributes(element) : {}, - ...typeof config === "object" ? config : {} - }; - } - _typeCheckConfig(config, configTypes = this.constructor.DefaultType) { - for (const [property, expectedTypes] of Object.entries(configTypes)) { - const value = config[property]; - const valueType = isElement(value) ? "element" : toType(value); - if (!new RegExp(expectedTypes).test(valueType)) { - throw new TypeError( - `${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".` - ); - } - } - } - }; - var config_default = Config; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/base-component.js - var VERSION = "5.3.3"; - var BaseComponent = class extends config_default { - constructor(element, config) { - super(); - element = getElement(element); - if (!element) { - return; - } - this._element = element; - this._config = this._getConfig(config); - data_default.set(this._element, this.constructor.DATA_KEY, this); - } - // Public - dispose() { - data_default.remove(this._element, this.constructor.DATA_KEY); - event_handler_default.off(this._element, this.constructor.EVENT_KEY); - for (const propertyName of Object.getOwnPropertyNames(this)) { - this[propertyName] = null; - } - } - _queueCallback(callback, element, isAnimated = true) { - executeAfterTransition(callback, element, isAnimated); - } - _getConfig(config) { - config = this._mergeConfigObj(config, this._element); - config = this._configAfterMerge(config); - this._typeCheckConfig(config); - return config; - } - // Static - static getInstance(element) { - return data_default.get(getElement(element), this.DATA_KEY); - } - static getOrCreateInstance(element, config = {}) { - return this.getInstance(element) || new this(element, typeof config === "object" ? config : null); - } - static get VERSION() { - return VERSION; - } - static get DATA_KEY() { - return `bs.${this.NAME}`; - } - static get EVENT_KEY() { - return `.${this.DATA_KEY}`; - } - static eventName(name) { - return `${name}${this.EVENT_KEY}`; - } - }; - var base_component_default = BaseComponent; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/dom/selector-engine.js - var getSelector = (element) => { - let selector = element.getAttribute("data-bs-target"); - if (!selector || selector === "#") { - let hrefAttribute = element.getAttribute("href"); - if (!hrefAttribute || !hrefAttribute.includes("#") && !hrefAttribute.startsWith(".")) { - return null; - } - if (hrefAttribute.includes("#") && !hrefAttribute.startsWith("#")) { - hrefAttribute = `#${hrefAttribute.split("#")[1]}`; - } - selector = hrefAttribute && hrefAttribute !== "#" ? hrefAttribute.trim() : null; - } - return selector ? selector.split(",").map((sel) => parseSelector(sel)).join(",") : null; - }; - var SelectorEngine = { - find(selector, element = document.documentElement) { - return [].concat(...Element.prototype.querySelectorAll.call(element, selector)); - }, - findOne(selector, element = document.documentElement) { - return Element.prototype.querySelector.call(element, selector); - }, - children(element, selector) { - return [].concat(...element.children).filter((child) => child.matches(selector)); - }, - parents(element, selector) { - const parents = []; - let ancestor = element.parentNode.closest(selector); - while (ancestor) { - parents.push(ancestor); - ancestor = ancestor.parentNode.closest(selector); - } - return parents; - }, - prev(element, selector) { - let previous = element.previousElementSibling; - while (previous) { - if (previous.matches(selector)) { - return [previous]; - } - previous = previous.previousElementSibling; - } - return []; - }, - // TODO: this is now unused; remove later along with prev() - next(element, selector) { - let next = element.nextElementSibling; - while (next) { - if (next.matches(selector)) { - return [next]; - } - next = next.nextElementSibling; - } - return []; - }, - focusableChildren(element) { - const focusables = [ - "a", - "button", - "input", - "textarea", - "select", - "details", - "[tabindex]", - '[contenteditable="true"]' - ].map((selector) => `${selector}:not([tabindex^="-"])`).join(","); - return this.find(focusables, element).filter((el) => !isDisabled(el) && isVisible(el)); - }, - getSelectorFromElement(element) { - const selector = getSelector(element); - if (selector) { - return SelectorEngine.findOne(selector) ? selector : null; - } - return null; - }, - getElementFromSelector(element) { - const selector = getSelector(element); - return selector ? SelectorEngine.findOne(selector) : null; - }, - getMultipleElementsFromSelector(element) { - const selector = getSelector(element); - return selector ? SelectorEngine.find(selector) : []; - } - }; - var selector_engine_default = SelectorEngine; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/tab.js - var NAME = "tab"; - var DATA_KEY = "bs.tab"; - var EVENT_KEY = `.${DATA_KEY}`; - var EVENT_HIDE = `hide${EVENT_KEY}`; - var EVENT_HIDDEN = `hidden${EVENT_KEY}`; - var EVENT_SHOW = `show${EVENT_KEY}`; - var EVENT_SHOWN = `shown${EVENT_KEY}`; - var EVENT_CLICK_DATA_API = `click${EVENT_KEY}`; - var EVENT_KEYDOWN = `keydown${EVENT_KEY}`; - var EVENT_LOAD_DATA_API = `load${EVENT_KEY}`; - var ARROW_LEFT_KEY = "ArrowLeft"; - var ARROW_RIGHT_KEY = "ArrowRight"; - var ARROW_UP_KEY = "ArrowUp"; - var ARROW_DOWN_KEY = "ArrowDown"; - var HOME_KEY = "Home"; - var END_KEY = "End"; - var CLASS_NAME_ACTIVE = "active"; - var CLASS_NAME_FADE = "fade"; - var CLASS_NAME_SHOW = "show"; - var CLASS_DROPDOWN = "dropdown"; - var SELECTOR_DROPDOWN_TOGGLE = ".dropdown-toggle"; - var SELECTOR_DROPDOWN_MENU = ".dropdown-menu"; - var NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`; - var SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]'; - var SELECTOR_OUTER = ".nav-item, .list-group-item"; - var SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`; - var SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; - var SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`; - var SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`; - var Tab = class _Tab extends base_component_default { - constructor(element) { - super(element); - this._parent = this._element.closest(SELECTOR_TAB_PANEL); - if (!this._parent) { - return; - } - this._setInitialAttributes(this._parent, this._getChildren()); - event_handler_default.on(this._element, EVENT_KEYDOWN, (event) => this._keydown(event)); - } - // Getters - static get NAME() { - return NAME; - } - // Public - show() { - const innerElem = this._element; - if (this._elemIsActive(innerElem)) { - return; - } - const active = this._getActiveElem(); - const hideEvent = active ? event_handler_default.trigger(active, EVENT_HIDE, { relatedTarget: innerElem }) : null; - const showEvent = event_handler_default.trigger(innerElem, EVENT_SHOW, { relatedTarget: active }); - if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) { - return; - } - this._deactivate(active, innerElem); - this._activate(innerElem, active); - } - // Private - _activate(element, relatedElem) { - if (!element) { - return; - } - element.classList.add(CLASS_NAME_ACTIVE); - this._activate(selector_engine_default.getElementFromSelector(element)); - const complete = () => { - if (element.getAttribute("role") !== "tab") { - element.classList.add(CLASS_NAME_SHOW); - return; - } - element.removeAttribute("tabindex"); - element.setAttribute("aria-selected", true); - this._toggleDropDown(element, true); - event_handler_default.trigger(element, EVENT_SHOWN, { - relatedTarget: relatedElem - }); - }; - this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE)); - } - _deactivate(element, relatedElem) { - if (!element) { - return; - } - element.classList.remove(CLASS_NAME_ACTIVE); - element.blur(); - this._deactivate(selector_engine_default.getElementFromSelector(element)); - const complete = () => { - if (element.getAttribute("role") !== "tab") { - element.classList.remove(CLASS_NAME_SHOW); - return; - } - element.setAttribute("aria-selected", false); - element.setAttribute("tabindex", "-1"); - this._toggleDropDown(element, false); - event_handler_default.trigger(element, EVENT_HIDDEN, { relatedTarget: relatedElem }); - }; - this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE)); - } - _keydown(event) { - if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key)) { - return; - } - event.stopPropagation(); - event.preventDefault(); - const children = this._getChildren().filter((element) => !isDisabled(element)); - let nextActiveElement; - if ([HOME_KEY, END_KEY].includes(event.key)) { - nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]; - } else { - const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key); - nextActiveElement = getNextActiveElement(children, event.target, isNext, true); - } - if (nextActiveElement) { - nextActiveElement.focus({ preventScroll: true }); - _Tab.getOrCreateInstance(nextActiveElement).show(); - } - } - _getChildren() { - return selector_engine_default.find(SELECTOR_INNER_ELEM, this._parent); - } - _getActiveElem() { - return this._getChildren().find((child) => this._elemIsActive(child)) || null; - } - _setInitialAttributes(parent, children) { - this._setAttributeIfNotExists(parent, "role", "tablist"); - for (const child of children) { - this._setInitialAttributesOnChild(child); - } - } - _setInitialAttributesOnChild(child) { - child = this._getInnerElement(child); - const isActive = this._elemIsActive(child); - const outerElem = this._getOuterElement(child); - child.setAttribute("aria-selected", isActive); - if (outerElem !== child) { - this._setAttributeIfNotExists(outerElem, "role", "presentation"); - } - if (!isActive) { - child.setAttribute("tabindex", "-1"); - } - this._setAttributeIfNotExists(child, "role", "tab"); - this._setInitialAttributesOnTargetPanel(child); - } - _setInitialAttributesOnTargetPanel(child) { - const target = selector_engine_default.getElementFromSelector(child); - if (!target) { - return; - } - this._setAttributeIfNotExists(target, "role", "tabpanel"); - if (child.id) { - this._setAttributeIfNotExists(target, "aria-labelledby", `${child.id}`); - } - } - _toggleDropDown(element, open) { - const outerElem = this._getOuterElement(element); - if (!outerElem.classList.contains(CLASS_DROPDOWN)) { - return; - } - const toggle = (selector, className) => { - const element2 = selector_engine_default.findOne(selector, outerElem); - if (element2) { - element2.classList.toggle(className, open); - } - }; - toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE); - toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW); - outerElem.setAttribute("aria-expanded", open); - } - _setAttributeIfNotExists(element, attribute, value) { - if (!element.hasAttribute(attribute)) { - element.setAttribute(attribute, value); - } - } - _elemIsActive(elem) { - return elem.classList.contains(CLASS_NAME_ACTIVE); - } - // Try to get the inner element (usually the .nav-link) - _getInnerElement(elem) { - return elem.matches(SELECTOR_INNER_ELEM) ? elem : selector_engine_default.findOne(SELECTOR_INNER_ELEM, elem); - } - // Try to get the outer element (usually the .nav-item) - _getOuterElement(elem) { - return elem.closest(SELECTOR_OUTER) || elem; - } - // Static - static jQueryInterface(config) { - return this.each(function() { - const data = _Tab.getOrCreateInstance(this); - if (typeof config !== "string") { - return; - } - if (data[config] === void 0 || config.startsWith("_") || config === "constructor") { - throw new TypeError(`No method named "${config}"`); - } - data[config](); - }); - } - }; - event_handler_default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function(event) { - if (["A", "AREA"].includes(this.tagName)) { - event.preventDefault(); - } - if (isDisabled(this)) { - return; - } - Tab.getOrCreateInstance(this).show(); - }); - event_handler_default.on(window, EVENT_LOAD_DATA_API, () => { - for (const element of selector_engine_default.find(SELECTOR_DATA_TOGGLE_ACTIVE)) { - Tab.getOrCreateInstance(element); - } - }); - defineJQueryPlugin(Tab); - var tab_default = Tab; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/collapse.js - var NAME2 = "collapse"; - var DATA_KEY2 = "bs.collapse"; - var EVENT_KEY2 = `.${DATA_KEY2}`; - var DATA_API_KEY = ".data-api"; - var EVENT_SHOW2 = `show${EVENT_KEY2}`; - var EVENT_SHOWN2 = `shown${EVENT_KEY2}`; - var EVENT_HIDE2 = `hide${EVENT_KEY2}`; - var EVENT_HIDDEN2 = `hidden${EVENT_KEY2}`; - var EVENT_CLICK_DATA_API2 = `click${EVENT_KEY2}${DATA_API_KEY}`; - var CLASS_NAME_SHOW2 = "show"; - var CLASS_NAME_COLLAPSE = "collapse"; - var CLASS_NAME_COLLAPSING = "collapsing"; - var CLASS_NAME_COLLAPSED = "collapsed"; - var CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`; - var CLASS_NAME_HORIZONTAL = "collapse-horizontal"; - var WIDTH = "width"; - var HEIGHT = "height"; - var SELECTOR_ACTIVES = ".collapse.show, .collapse.collapsing"; - var SELECTOR_DATA_TOGGLE2 = '[data-bs-toggle="collapse"]'; - var Default = { - parent: null, - toggle: true - }; - var DefaultType = { - parent: "(null|element)", - toggle: "boolean" - }; - var Collapse = class _Collapse extends base_component_default { - constructor(element, config) { - super(element, config); - this._isTransitioning = false; - this._triggerArray = []; - const toggleList = selector_engine_default.find(SELECTOR_DATA_TOGGLE2); - for (const elem of toggleList) { - const selector = selector_engine_default.getSelectorFromElement(elem); - const filterElement = selector_engine_default.find(selector).filter((foundElement) => foundElement === this._element); - if (selector !== null && filterElement.length) { - this._triggerArray.push(elem); - } - } - this._initializeChildren(); - if (!this._config.parent) { - this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()); - } - if (this._config.toggle) { - this.toggle(); - } - } - // Getters - static get Default() { - return Default; - } - static get DefaultType() { - return DefaultType; - } - static get NAME() { - return NAME2; - } - // Public - toggle() { - if (this._isShown()) { - this.hide(); - } else { - this.show(); - } - } - show() { - if (this._isTransitioning || this._isShown()) { - return; - } - let activeChildren = []; - if (this._config.parent) { - activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter((element) => element !== this._element).map((element) => _Collapse.getOrCreateInstance(element, { toggle: false })); - } - if (activeChildren.length && activeChildren[0]._isTransitioning) { - return; - } - const startEvent = event_handler_default.trigger(this._element, EVENT_SHOW2); - if (startEvent.defaultPrevented) { - return; - } - for (const activeInstance of activeChildren) { - activeInstance.hide(); - } - const dimension = this._getDimension(); - this._element.classList.remove(CLASS_NAME_COLLAPSE); - this._element.classList.add(CLASS_NAME_COLLAPSING); - this._element.style[dimension] = 0; - this._addAriaAndCollapsedClass(this._triggerArray, true); - this._isTransitioning = true; - const complete = () => { - this._isTransitioning = false; - this._element.classList.remove(CLASS_NAME_COLLAPSING); - this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW2); - this._element.style[dimension] = ""; - event_handler_default.trigger(this._element, EVENT_SHOWN2); - }; - const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); - const scrollSize = `scroll${capitalizedDimension}`; - this._queueCallback(complete, this._element, true); - this._element.style[dimension] = `${this._element[scrollSize]}px`; - } - hide() { - if (this._isTransitioning || !this._isShown()) { - return; - } - const startEvent = event_handler_default.trigger(this._element, EVENT_HIDE2); - if (startEvent.defaultPrevented) { - return; - } - const dimension = this._getDimension(); - this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`; - reflow(this._element); - this._element.classList.add(CLASS_NAME_COLLAPSING); - this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW2); - for (const trigger of this._triggerArray) { - const element = selector_engine_default.getElementFromSelector(trigger); - if (element && !this._isShown(element)) { - this._addAriaAndCollapsedClass([trigger], false); - } - } - this._isTransitioning = true; - const complete = () => { - this._isTransitioning = false; - this._element.classList.remove(CLASS_NAME_COLLAPSING); - this._element.classList.add(CLASS_NAME_COLLAPSE); - event_handler_default.trigger(this._element, EVENT_HIDDEN2); - }; - this._element.style[dimension] = ""; - this._queueCallback(complete, this._element, true); - } - _isShown(element = this._element) { - return element.classList.contains(CLASS_NAME_SHOW2); - } - // Private - _configAfterMerge(config) { - config.toggle = Boolean(config.toggle); - config.parent = getElement(config.parent); - return config; - } - _getDimension() { - return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT; - } - _initializeChildren() { - if (!this._config.parent) { - return; - } - const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE2); - for (const element of children) { - const selected = selector_engine_default.getElementFromSelector(element); - if (selected) { - this._addAriaAndCollapsedClass([element], this._isShown(selected)); - } - } - } - _getFirstLevelChildren(selector) { - const children = selector_engine_default.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent); - return selector_engine_default.find(selector, this._config.parent).filter((element) => !children.includes(element)); - } - _addAriaAndCollapsedClass(triggerArray, isOpen) { - if (!triggerArray.length) { - return; - } - for (const element of triggerArray) { - element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen); - element.setAttribute("aria-expanded", isOpen); - } - } - // Static - static jQueryInterface(config) { - const _config = {}; - if (typeof config === "string" && /show|hide/.test(config)) { - _config.toggle = false; - } - return this.each(function() { - const data = _Collapse.getOrCreateInstance(this, _config); - if (typeof config === "string") { - if (typeof data[config] === "undefined") { - throw new TypeError(`No method named "${config}"`); - } - data[config](); - } - }); - } - }; - event_handler_default.on(document, EVENT_CLICK_DATA_API2, SELECTOR_DATA_TOGGLE2, function(event) { - if (event.target.tagName === "A" || event.delegateTarget && event.delegateTarget.tagName === "A") { - event.preventDefault(); - } - for (const element of selector_engine_default.getMultipleElementsFromSelector(this)) { - Collapse.getOrCreateInstance(element, { toggle: false }).toggle(); - } - }); - defineJQueryPlugin(Collapse); - var collapse_default = Collapse; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/dropdown.js - var Popper = __toESM(require_popper()); - var NAME3 = "dropdown"; - var DATA_KEY3 = "bs.dropdown"; - var EVENT_KEY3 = `.${DATA_KEY3}`; - var DATA_API_KEY2 = ".data-api"; - var ESCAPE_KEY = "Escape"; - var TAB_KEY = "Tab"; - var ARROW_UP_KEY2 = "ArrowUp"; - var ARROW_DOWN_KEY2 = "ArrowDown"; - var RIGHT_MOUSE_BUTTON = 2; - var EVENT_HIDE3 = `hide${EVENT_KEY3}`; - var EVENT_HIDDEN3 = `hidden${EVENT_KEY3}`; - var EVENT_SHOW3 = `show${EVENT_KEY3}`; - var EVENT_SHOWN3 = `shown${EVENT_KEY3}`; - var EVENT_CLICK_DATA_API3 = `click${EVENT_KEY3}${DATA_API_KEY2}`; - var EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY3}${DATA_API_KEY2}`; - var EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY3}${DATA_API_KEY2}`; - var CLASS_NAME_SHOW3 = "show"; - var CLASS_NAME_DROPUP = "dropup"; - var CLASS_NAME_DROPEND = "dropend"; - var CLASS_NAME_DROPSTART = "dropstart"; - var CLASS_NAME_DROPUP_CENTER = "dropup-center"; - var CLASS_NAME_DROPDOWN_CENTER = "dropdown-center"; - var SELECTOR_DATA_TOGGLE3 = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)'; - var SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE3}.${CLASS_NAME_SHOW3}`; - var SELECTOR_MENU = ".dropdown-menu"; - var SELECTOR_NAVBAR = ".navbar"; - var SELECTOR_NAVBAR_NAV = ".navbar-nav"; - var SELECTOR_VISIBLE_ITEMS = ".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)"; - var PLACEMENT_TOP = isRTL() ? "top-end" : "top-start"; - var PLACEMENT_TOPEND = isRTL() ? "top-start" : "top-end"; - var PLACEMENT_BOTTOM = isRTL() ? "bottom-end" : "bottom-start"; - var PLACEMENT_BOTTOMEND = isRTL() ? "bottom-start" : "bottom-end"; - var PLACEMENT_RIGHT = isRTL() ? "left-start" : "right-start"; - var PLACEMENT_LEFT = isRTL() ? "right-start" : "left-start"; - var PLACEMENT_TOPCENTER = "top"; - var PLACEMENT_BOTTOMCENTER = "bottom"; - var Default2 = { - autoClose: true, - boundary: "clippingParents", - display: "dynamic", - offset: [0, 2], - popperConfig: null, - reference: "toggle" - }; - var DefaultType2 = { - autoClose: "(boolean|string)", - boundary: "(string|element)", - display: "string", - offset: "(array|string|function)", - popperConfig: "(null|object|function)", - reference: "(string|element|object)" - }; - var Dropdown = class _Dropdown extends base_component_default { - constructor(element, config) { - super(element, config); - this._popper = null; - this._parent = this._element.parentNode; - this._menu = selector_engine_default.next(this._element, SELECTOR_MENU)[0] || selector_engine_default.prev(this._element, SELECTOR_MENU)[0] || selector_engine_default.findOne(SELECTOR_MENU, this._parent); - this._inNavbar = this._detectNavbar(); - } - // Getters - static get Default() { - return Default2; - } - static get DefaultType() { - return DefaultType2; - } - static get NAME() { - return NAME3; - } - // Public - toggle() { - return this._isShown() ? this.hide() : this.show(); - } - show() { - if (isDisabled(this._element) || this._isShown()) { - return; - } - const relatedTarget = { - relatedTarget: this._element - }; - const showEvent = event_handler_default.trigger(this._element, EVENT_SHOW3, relatedTarget); - if (showEvent.defaultPrevented) { - return; - } - this._createPopper(); - if ("ontouchstart" in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) { - for (const element of [].concat(...document.body.children)) { - event_handler_default.on(element, "mouseover", noop); - } - } - this._element.focus(); - this._element.setAttribute("aria-expanded", true); - this._menu.classList.add(CLASS_NAME_SHOW3); - this._element.classList.add(CLASS_NAME_SHOW3); - event_handler_default.trigger(this._element, EVENT_SHOWN3, relatedTarget); - } - hide() { - if (isDisabled(this._element) || !this._isShown()) { - return; - } - const relatedTarget = { - relatedTarget: this._element - }; - this._completeHide(relatedTarget); - } - dispose() { - if (this._popper) { - this._popper.destroy(); - } - super.dispose(); - } - update() { - this._inNavbar = this._detectNavbar(); - if (this._popper) { - this._popper.update(); - } - } - // Private - _completeHide(relatedTarget) { - const hideEvent = event_handler_default.trigger(this._element, EVENT_HIDE3, relatedTarget); - if (hideEvent.defaultPrevented) { - return; - } - if ("ontouchstart" in document.documentElement) { - for (const element of [].concat(...document.body.children)) { - event_handler_default.off(element, "mouseover", noop); - } - } - if (this._popper) { - this._popper.destroy(); - } - this._menu.classList.remove(CLASS_NAME_SHOW3); - this._element.classList.remove(CLASS_NAME_SHOW3); - this._element.setAttribute("aria-expanded", "false"); - manipulator_default.removeDataAttribute(this._menu, "popper"); - event_handler_default.trigger(this._element, EVENT_HIDDEN3, relatedTarget); - } - _getConfig(config) { - config = super._getConfig(config); - if (typeof config.reference === "object" && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== "function") { - throw new TypeError(`${NAME3.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`); - } - return config; - } - _createPopper() { - if (typeof Popper === "undefined") { - throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)"); - } - let referenceElement = this._element; - if (this._config.reference === "parent") { - referenceElement = this._parent; - } else if (isElement(this._config.reference)) { - referenceElement = getElement(this._config.reference); - } else if (typeof this._config.reference === "object") { - referenceElement = this._config.reference; - } - const popperConfig = this._getPopperConfig(); - this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig); - } - _isShown() { - return this._menu.classList.contains(CLASS_NAME_SHOW3); - } - _getPlacement() { - const parentDropdown = this._parent; - if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) { - return PLACEMENT_RIGHT; - } - if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) { - return PLACEMENT_LEFT; - } - if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) { - return PLACEMENT_TOPCENTER; - } - if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) { - return PLACEMENT_BOTTOMCENTER; - } - const isEnd = getComputedStyle(this._menu).getPropertyValue("--bs-position").trim() === "end"; - if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) { - return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP; - } - return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM; - } - _detectNavbar() { - return this._element.closest(SELECTOR_NAVBAR) !== null; - } - _getOffset() { - const { offset } = this._config; - if (typeof offset === "string") { - return offset.split(",").map((value) => Number.parseInt(value, 10)); - } - if (typeof offset === "function") { - return (popperData) => offset(popperData, this._element); - } - return offset; - } - _getPopperConfig() { - const defaultBsPopperConfig = { - placement: this._getPlacement(), - modifiers: [ - { - name: "preventOverflow", - options: { - boundary: this._config.boundary - } - }, - { - name: "offset", - options: { - offset: this._getOffset() - } - } - ] - }; - if (this._inNavbar || this._config.display === "static") { - manipulator_default.setDataAttribute(this._menu, "popper", "static"); - defaultBsPopperConfig.modifiers = [{ - name: "applyStyles", - enabled: false - }]; - } - return { - ...defaultBsPopperConfig, - ...execute(this._config.popperConfig, [defaultBsPopperConfig]) - }; - } - _selectMenuItem({ key, target }) { - const items = selector_engine_default.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter((element) => isVisible(element)); - if (!items.length) { - return; - } - getNextActiveElement(items, target, key === ARROW_DOWN_KEY2, !items.includes(target)).focus(); - } - // Static - static jQueryInterface(config) { - return this.each(function() { - const data = _Dropdown.getOrCreateInstance(this, config); - if (typeof config !== "string") { - return; - } - if (typeof data[config] === "undefined") { - throw new TypeError(`No method named "${config}"`); - } - data[config](); - }); - } - static clearMenus(event) { - if (event.button === RIGHT_MOUSE_BUTTON || event.type === "keyup" && event.key !== TAB_KEY) { - return; - } - const openToggles = selector_engine_default.find(SELECTOR_DATA_TOGGLE_SHOWN); - for (const toggle of openToggles) { - const context = _Dropdown.getInstance(toggle); - if (!context || context._config.autoClose === false) { - continue; - } - const composedPath = event.composedPath(); - const isMenuTarget = composedPath.includes(context._menu); - if (composedPath.includes(context._element) || context._config.autoClose === "inside" && !isMenuTarget || context._config.autoClose === "outside" && isMenuTarget) { - continue; - } - if (context._menu.contains(event.target) && (event.type === "keyup" && event.key === TAB_KEY || /input|select|option|textarea|form/i.test(event.target.tagName))) { - continue; - } - const relatedTarget = { relatedTarget: context._element }; - if (event.type === "click") { - relatedTarget.clickEvent = event; - } - context._completeHide(relatedTarget); - } - } - static dataApiKeydownHandler(event) { - const isInput = /input|textarea/i.test(event.target.tagName); - const isEscapeEvent = event.key === ESCAPE_KEY; - const isUpOrDownEvent = [ARROW_UP_KEY2, ARROW_DOWN_KEY2].includes(event.key); - if (!isUpOrDownEvent && !isEscapeEvent) { - return; - } - if (isInput && !isEscapeEvent) { - return; - } - event.preventDefault(); - const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE3) ? this : selector_engine_default.prev(this, SELECTOR_DATA_TOGGLE3)[0] || selector_engine_default.next(this, SELECTOR_DATA_TOGGLE3)[0] || selector_engine_default.findOne(SELECTOR_DATA_TOGGLE3, event.delegateTarget.parentNode); - const instance = _Dropdown.getOrCreateInstance(getToggleButton); - if (isUpOrDownEvent) { - event.stopPropagation(); - instance.show(); - instance._selectMenuItem(event); - return; - } - if (instance._isShown()) { - event.stopPropagation(); - instance.hide(); - getToggleButton.focus(); - } - } - }; - event_handler_default.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE3, Dropdown.dataApiKeydownHandler); - event_handler_default.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler); - event_handler_default.on(document, EVENT_CLICK_DATA_API3, Dropdown.clearMenus); - event_handler_default.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus); - event_handler_default.on(document, EVENT_CLICK_DATA_API3, SELECTOR_DATA_TOGGLE3, function(event) { - event.preventDefault(); - Dropdown.getOrCreateInstance(this).toggle(); - }); - defineJQueryPlugin(Dropdown); - var dropdown_default = Dropdown; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/scrollspy.js - var NAME4 = "scrollspy"; - var DATA_KEY4 = "bs.scrollspy"; - var EVENT_KEY4 = `.${DATA_KEY4}`; - var DATA_API_KEY3 = ".data-api"; - var EVENT_ACTIVATE = `activate${EVENT_KEY4}`; - var EVENT_CLICK = `click${EVENT_KEY4}`; - var EVENT_LOAD_DATA_API2 = `load${EVENT_KEY4}${DATA_API_KEY3}`; - var CLASS_NAME_DROPDOWN_ITEM = "dropdown-item"; - var CLASS_NAME_ACTIVE2 = "active"; - var SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]'; - var SELECTOR_TARGET_LINKS = "[href]"; - var SELECTOR_NAV_LIST_GROUP = ".nav, .list-group"; - var SELECTOR_NAV_LINKS = ".nav-link"; - var SELECTOR_NAV_ITEMS = ".nav-item"; - var SELECTOR_LIST_ITEMS = ".list-group-item"; - var SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`; - var SELECTOR_DROPDOWN = ".dropdown"; - var SELECTOR_DROPDOWN_TOGGLE2 = ".dropdown-toggle"; - var Default3 = { - offset: null, - // TODO: v6 @deprecated, keep it for backwards compatibility reasons - rootMargin: "0px 0px -25%", - smoothScroll: false, - target: null, - threshold: [0.1, 0.5, 1] - }; - var DefaultType3 = { - offset: "(number|null)", - // TODO v6 @deprecated, keep it for backwards compatibility reasons - rootMargin: "string", - smoothScroll: "boolean", - target: "element", - threshold: "array" - }; - var ScrollSpy = class _ScrollSpy extends base_component_default { - constructor(element, config) { - super(element, config); - this._targetLinks = /* @__PURE__ */ new Map(); - this._observableSections = /* @__PURE__ */ new Map(); - this._rootElement = getComputedStyle(this._element).overflowY === "visible" ? null : this._element; - this._activeTarget = null; - this._observer = null; - this._previousScrollData = { - visibleEntryTop: 0, - parentScrollTop: 0 - }; - this.refresh(); - } - // Getters - static get Default() { - return Default3; - } - static get DefaultType() { - return DefaultType3; - } - static get NAME() { - return NAME4; - } - // Public - refresh() { - this._initializeTargetsAndObservables(); - this._maybeEnableSmoothScroll(); - if (this._observer) { - this._observer.disconnect(); - } else { - this._observer = this._getNewObserver(); - } - for (const section of this._observableSections.values()) { - this._observer.observe(section); - } - } - dispose() { - this._observer.disconnect(); - super.dispose(); - } - // Private - _configAfterMerge(config) { - config.target = getElement(config.target) || document.body; - config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin; - if (typeof config.threshold === "string") { - config.threshold = config.threshold.split(",").map((value) => Number.parseFloat(value)); - } - return config; - } - _maybeEnableSmoothScroll() { - if (!this._config.smoothScroll) { - return; - } - event_handler_default.off(this._config.target, EVENT_CLICK); - event_handler_default.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, (event) => { - const observableSection = this._observableSections.get(event.target.hash); - if (observableSection) { - event.preventDefault(); - const root = this._rootElement || window; - const height = observableSection.offsetTop - this._element.offsetTop; - if (root.scrollTo) { - root.scrollTo({ top: height, behavior: "smooth" }); - return; - } - root.scrollTop = height; - } - }); - } - _getNewObserver() { - const options = { - root: this._rootElement, - threshold: this._config.threshold, - rootMargin: this._config.rootMargin - }; - return new IntersectionObserver((entries) => this._observerCallback(entries), options); - } - // The logic of selection - _observerCallback(entries) { - const targetElement = (entry) => this._targetLinks.get(`#${entry.target.id}`); - const activate = (entry) => { - this._previousScrollData.visibleEntryTop = entry.target.offsetTop; - this._process(targetElement(entry)); - }; - const parentScrollTop = (this._rootElement || document.documentElement).scrollTop; - const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop; - this._previousScrollData.parentScrollTop = parentScrollTop; - for (const entry of entries) { - if (!entry.isIntersecting) { - this._activeTarget = null; - this._clearActiveClass(targetElement(entry)); - continue; - } - const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop; - if (userScrollsDown && entryIsLowerThanPrevious) { - activate(entry); - if (!parentScrollTop) { - return; - } - continue; - } - if (!userScrollsDown && !entryIsLowerThanPrevious) { - activate(entry); - } - } - } - _initializeTargetsAndObservables() { - this._targetLinks = /* @__PURE__ */ new Map(); - this._observableSections = /* @__PURE__ */ new Map(); - const targetLinks = selector_engine_default.find(SELECTOR_TARGET_LINKS, this._config.target); - for (const anchor of targetLinks) { - if (!anchor.hash || isDisabled(anchor)) { - continue; - } - const observableSection = selector_engine_default.findOne(decodeURI(anchor.hash), this._element); - if (isVisible(observableSection)) { - this._targetLinks.set(decodeURI(anchor.hash), anchor); - this._observableSections.set(anchor.hash, observableSection); - } - } - } - _process(target) { - if (this._activeTarget === target) { - return; - } - this._clearActiveClass(this._config.target); - this._activeTarget = target; - target.classList.add(CLASS_NAME_ACTIVE2); - this._activateParents(target); - event_handler_default.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target }); - } - _activateParents(target) { - if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) { - selector_engine_default.findOne(SELECTOR_DROPDOWN_TOGGLE2, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE2); - return; - } - for (const listGroup of selector_engine_default.parents(target, SELECTOR_NAV_LIST_GROUP)) { - for (const item of selector_engine_default.prev(listGroup, SELECTOR_LINK_ITEMS)) { - item.classList.add(CLASS_NAME_ACTIVE2); - } - } - } - _clearActiveClass(parent) { - parent.classList.remove(CLASS_NAME_ACTIVE2); - const activeNodes = selector_engine_default.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE2}`, parent); - for (const node of activeNodes) { - node.classList.remove(CLASS_NAME_ACTIVE2); - } - } - // Static - static jQueryInterface(config) { - return this.each(function() { - const data = _ScrollSpy.getOrCreateInstance(this, config); - if (typeof config !== "string") { - return; - } - if (data[config] === void 0 || config.startsWith("_") || config === "constructor") { - throw new TypeError(`No method named "${config}"`); - } - data[config](); - }); - } - }; - event_handler_default.on(window, EVENT_LOAD_DATA_API2, () => { - for (const spy of selector_engine_default.find(SELECTOR_DATA_SPY)) { - ScrollSpy.getOrCreateInstance(spy); - } - }); - defineJQueryPlugin(ScrollSpy); - var scrollspy_default = ScrollSpy; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/tooltip.js - var Popper2 = __toESM(require_popper()); - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/util/sanitizer.js - var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; - var DefaultAllowlist = { - // Global attributes allowed on any supplied element below. - "*": ["class", "dir", "id", "lang", "role", ARIA_ATTRIBUTE_PATTERN], - a: ["target", "href", "title", "rel"], - area: [], - b: [], - br: [], - col: [], - code: [], - dd: [], - div: [], - dl: [], - dt: [], - em: [], - hr: [], - h1: [], - h2: [], - h3: [], - h4: [], - h5: [], - h6: [], - i: [], - img: ["src", "srcset", "alt", "title", "width", "height"], - li: [], - ol: [], - p: [], - pre: [], - s: [], - small: [], - span: [], - sub: [], - sup: [], - strong: [], - u: [], - ul: [] - }; - var uriAttributes = /* @__PURE__ */ new Set([ - "background", - "cite", - "href", - "itemtype", - "longdesc", - "poster", - "src", - "xlink:href" - ]); - var SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i; - var allowedAttribute = (attribute, allowedAttributeList) => { - const attributeName = attribute.nodeName.toLowerCase(); - if (allowedAttributeList.includes(attributeName)) { - if (uriAttributes.has(attributeName)) { - return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue)); - } - return true; - } - return allowedAttributeList.filter((attributeRegex) => attributeRegex instanceof RegExp).some((regex) => regex.test(attributeName)); - }; - function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) { - if (!unsafeHtml.length) { - return unsafeHtml; - } - if (sanitizeFunction && typeof sanitizeFunction === "function") { - return sanitizeFunction(unsafeHtml); - } - const domParser = new window.DOMParser(); - const createdDocument = domParser.parseFromString(unsafeHtml, "text/html"); - const elements = [].concat(...createdDocument.body.querySelectorAll("*")); - for (const element of elements) { - const elementName = element.nodeName.toLowerCase(); - if (!Object.keys(allowList).includes(elementName)) { - element.remove(); - continue; - } - const attributeList = [].concat(...element.attributes); - const allowedAttributes = [].concat(allowList["*"] || [], allowList[elementName] || []); - for (const attribute of attributeList) { - if (!allowedAttribute(attribute, allowedAttributes)) { - element.removeAttribute(attribute.nodeName); - } - } - } - return createdDocument.body.innerHTML; - } - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/util/template-factory.js - var NAME5 = "TemplateFactory"; - var Default4 = { - allowList: DefaultAllowlist, - content: {}, - // { selector : text , selector2 : text2 , } - extraClass: "", - html: false, - sanitize: true, - sanitizeFn: null, - template: "
    " - }; - var DefaultType4 = { - allowList: "object", - content: "object", - extraClass: "(string|function)", - html: "boolean", - sanitize: "boolean", - sanitizeFn: "(null|function)", - template: "string" - }; - var DefaultContentType = { - entry: "(string|element|function|null)", - selector: "(string|element)" - }; - var TemplateFactory = class extends config_default { - constructor(config) { - super(); - this._config = this._getConfig(config); - } - // Getters - static get Default() { - return Default4; - } - static get DefaultType() { - return DefaultType4; - } - static get NAME() { - return NAME5; - } - // Public - getContent() { - return Object.values(this._config.content).map((config) => this._resolvePossibleFunction(config)).filter(Boolean); - } - hasContent() { - return this.getContent().length > 0; - } - changeContent(content) { - this._checkContent(content); - this._config.content = { ...this._config.content, ...content }; - return this; - } - toHtml() { - const templateWrapper = document.createElement("div"); - templateWrapper.innerHTML = this._maybeSanitize(this._config.template); - for (const [selector, text] of Object.entries(this._config.content)) { - this._setContent(templateWrapper, text, selector); - } - const template = templateWrapper.children[0]; - const extraClass = this._resolvePossibleFunction(this._config.extraClass); - if (extraClass) { - template.classList.add(...extraClass.split(" ")); - } - return template; - } - // Private - _typeCheckConfig(config) { - super._typeCheckConfig(config); - this._checkContent(config.content); - } - _checkContent(arg) { - for (const [selector, content] of Object.entries(arg)) { - super._typeCheckConfig({ selector, entry: content }, DefaultContentType); - } - } - _setContent(template, content, selector) { - const templateElement = selector_engine_default.findOne(selector, template); - if (!templateElement) { - return; - } - content = this._resolvePossibleFunction(content); - if (!content) { - templateElement.remove(); - return; - } - if (isElement(content)) { - this._putElementInTemplate(getElement(content), templateElement); - return; - } - if (this._config.html) { - templateElement.innerHTML = this._maybeSanitize(content); - return; - } - templateElement.textContent = content; - } - _maybeSanitize(arg) { - return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg; - } - _resolvePossibleFunction(arg) { - return execute(arg, [this]); - } - _putElementInTemplate(element, templateElement) { - if (this._config.html) { - templateElement.innerHTML = ""; - templateElement.append(element); - return; - } - templateElement.textContent = element.textContent; - } - }; - var template_factory_default = TemplateFactory; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/tooltip.js - var NAME6 = "tooltip"; - var DISALLOWED_ATTRIBUTES = /* @__PURE__ */ new Set(["sanitize", "allowList", "sanitizeFn"]); - var CLASS_NAME_FADE2 = "fade"; - var CLASS_NAME_MODAL = "modal"; - var CLASS_NAME_SHOW4 = "show"; - var SELECTOR_TOOLTIP_INNER = ".tooltip-inner"; - var SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`; - var EVENT_MODAL_HIDE = "hide.bs.modal"; - var TRIGGER_HOVER = "hover"; - var TRIGGER_FOCUS = "focus"; - var TRIGGER_CLICK = "click"; - var TRIGGER_MANUAL = "manual"; - var EVENT_HIDE4 = "hide"; - var EVENT_HIDDEN4 = "hidden"; - var EVENT_SHOW4 = "show"; - var EVENT_SHOWN4 = "shown"; - var EVENT_INSERTED = "inserted"; - var EVENT_CLICK2 = "click"; - var EVENT_FOCUSIN = "focusin"; - var EVENT_FOCUSOUT = "focusout"; - var EVENT_MOUSEENTER = "mouseenter"; - var EVENT_MOUSELEAVE = "mouseleave"; - var AttachmentMap = { - AUTO: "auto", - TOP: "top", - RIGHT: isRTL() ? "left" : "right", - BOTTOM: "bottom", - LEFT: isRTL() ? "right" : "left" - }; - var Default5 = { - allowList: DefaultAllowlist, - animation: true, - boundary: "clippingParents", - container: false, - customClass: "", - delay: 0, - fallbackPlacements: ["top", "right", "bottom", "left"], - html: false, - offset: [0, 6], - placement: "top", - popperConfig: null, - sanitize: true, - sanitizeFn: null, - selector: false, - template: '', - title: "", - trigger: "hover focus" - }; - var DefaultType5 = { - allowList: "object", - animation: "boolean", - boundary: "(string|element)", - container: "(string|element|boolean)", - customClass: "(string|function)", - delay: "(number|object)", - fallbackPlacements: "array", - html: "boolean", - offset: "(array|string|function)", - placement: "(string|function)", - popperConfig: "(null|object|function)", - sanitize: "boolean", - sanitizeFn: "(null|function)", - selector: "(string|boolean)", - template: "string", - title: "(string|element|function)", - trigger: "string" - }; - var Tooltip = class _Tooltip extends base_component_default { - constructor(element, config) { - if (typeof Popper2 === "undefined") { - throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)"); - } - super(element, config); - this._isEnabled = true; - this._timeout = 0; - this._isHovered = null; - this._activeTrigger = {}; - this._popper = null; - this._templateFactory = null; - this._newContent = null; - this.tip = null; - this._setListeners(); - if (!this._config.selector) { - this._fixTitle(); - } - } - // Getters - static get Default() { - return Default5; - } - static get DefaultType() { - return DefaultType5; - } - static get NAME() { - return NAME6; - } - // Public - enable() { - this._isEnabled = true; - } - disable() { - this._isEnabled = false; - } - toggleEnabled() { - this._isEnabled = !this._isEnabled; - } - toggle() { - if (!this._isEnabled) { - return; - } - this._activeTrigger.click = !this._activeTrigger.click; - if (this._isShown()) { - this._leave(); - return; - } - this._enter(); - } - dispose() { - clearTimeout(this._timeout); - event_handler_default.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); - if (this._element.getAttribute("data-bs-original-title")) { - this._element.setAttribute("title", this._element.getAttribute("data-bs-original-title")); - } - this._disposePopper(); - super.dispose(); - } - show() { - if (this._element.style.display === "none") { - throw new Error("Please use show on visible elements"); - } - if (!(this._isWithContent() && this._isEnabled)) { - return; - } - const showEvent = event_handler_default.trigger(this._element, this.constructor.eventName(EVENT_SHOW4)); - const shadowRoot = findShadowRoot(this._element); - const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element); - if (showEvent.defaultPrevented || !isInTheDom) { - return; - } - this._disposePopper(); - const tip = this._getTipElement(); - this._element.setAttribute("aria-describedby", tip.getAttribute("id")); - const { container } = this._config; - if (!this._element.ownerDocument.documentElement.contains(this.tip)) { - container.append(tip); - event_handler_default.trigger(this._element, this.constructor.eventName(EVENT_INSERTED)); - } - this._popper = this._createPopper(tip); - tip.classList.add(CLASS_NAME_SHOW4); - if ("ontouchstart" in document.documentElement) { - for (const element of [].concat(...document.body.children)) { - event_handler_default.on(element, "mouseover", noop); - } - } - const complete = () => { - event_handler_default.trigger(this._element, this.constructor.eventName(EVENT_SHOWN4)); - if (this._isHovered === false) { - this._leave(); - } - this._isHovered = false; - }; - this._queueCallback(complete, this.tip, this._isAnimated()); - } - hide() { - if (!this._isShown()) { - return; - } - const hideEvent = event_handler_default.trigger(this._element, this.constructor.eventName(EVENT_HIDE4)); - if (hideEvent.defaultPrevented) { - return; - } - const tip = this._getTipElement(); - tip.classList.remove(CLASS_NAME_SHOW4); - if ("ontouchstart" in document.documentElement) { - for (const element of [].concat(...document.body.children)) { - event_handler_default.off(element, "mouseover", noop); - } - } - this._activeTrigger[TRIGGER_CLICK] = false; - this._activeTrigger[TRIGGER_FOCUS] = false; - this._activeTrigger[TRIGGER_HOVER] = false; - this._isHovered = null; - const complete = () => { - if (this._isWithActiveTrigger()) { - return; - } - if (!this._isHovered) { - this._disposePopper(); - } - this._element.removeAttribute("aria-describedby"); - event_handler_default.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN4)); - }; - this._queueCallback(complete, this.tip, this._isAnimated()); - } - update() { - if (this._popper) { - this._popper.update(); - } - } - // Protected - _isWithContent() { - return Boolean(this._getTitle()); - } - _getTipElement() { - if (!this.tip) { - this.tip = this._createTipElement(this._newContent || this._getContentForTemplate()); - } - return this.tip; - } - _createTipElement(content) { - const tip = this._getTemplateFactory(content).toHtml(); - if (!tip) { - return null; - } - tip.classList.remove(CLASS_NAME_FADE2, CLASS_NAME_SHOW4); - tip.classList.add(`bs-${this.constructor.NAME}-auto`); - const tipId = getUID(this.constructor.NAME).toString(); - tip.setAttribute("id", tipId); - if (this._isAnimated()) { - tip.classList.add(CLASS_NAME_FADE2); - } - return tip; - } - setContent(content) { - this._newContent = content; - if (this._isShown()) { - this._disposePopper(); - this.show(); - } - } - _getTemplateFactory(content) { - if (this._templateFactory) { - this._templateFactory.changeContent(content); - } else { - this._templateFactory = new template_factory_default({ - ...this._config, - // the `content` var has to be after `this._config` - // to override config.content in case of popover - content, - extraClass: this._resolvePossibleFunction(this._config.customClass) - }); - } - return this._templateFactory; - } - _getContentForTemplate() { - return { - [SELECTOR_TOOLTIP_INNER]: this._getTitle() - }; - } - _getTitle() { - return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute("data-bs-original-title"); - } - // Private - _initializeOnDelegatedTarget(event) { - return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig()); - } - _isAnimated() { - return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE2); - } - _isShown() { - return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW4); - } - _createPopper(tip) { - const placement = execute(this._config.placement, [this, tip, this._element]); - const attachment = AttachmentMap[placement.toUpperCase()]; - return Popper2.createPopper(this._element, tip, this._getPopperConfig(attachment)); - } - _getOffset() { - const { offset } = this._config; - if (typeof offset === "string") { - return offset.split(",").map((value) => Number.parseInt(value, 10)); - } - if (typeof offset === "function") { - return (popperData) => offset(popperData, this._element); - } - return offset; - } - _resolvePossibleFunction(arg) { - return execute(arg, [this._element]); - } - _getPopperConfig(attachment) { - const defaultBsPopperConfig = { - placement: attachment, - modifiers: [ - { - name: "flip", - options: { - fallbackPlacements: this._config.fallbackPlacements - } - }, - { - name: "offset", - options: { - offset: this._getOffset() - } - }, - { - name: "preventOverflow", - options: { - boundary: this._config.boundary - } - }, - { - name: "arrow", - options: { - element: `.${this.constructor.NAME}-arrow` - } - }, - { - name: "preSetPlacement", - enabled: true, - phase: "beforeMain", - fn: (data) => { - this._getTipElement().setAttribute("data-popper-placement", data.state.placement); - } - } - ] - }; - return { - ...defaultBsPopperConfig, - ...execute(this._config.popperConfig, [defaultBsPopperConfig]) - }; - } - _setListeners() { - const triggers = this._config.trigger.split(" "); - for (const trigger of triggers) { - if (trigger === "click") { - event_handler_default.on(this._element, this.constructor.eventName(EVENT_CLICK2), this._config.selector, (event) => { - const context = this._initializeOnDelegatedTarget(event); - context.toggle(); - }); - } else if (trigger !== TRIGGER_MANUAL) { - const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN); - const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT); - event_handler_default.on(this._element, eventIn, this._config.selector, (event) => { - const context = this._initializeOnDelegatedTarget(event); - context._activeTrigger[event.type === "focusin" ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; - context._enter(); - }); - event_handler_default.on(this._element, eventOut, this._config.selector, (event) => { - const context = this._initializeOnDelegatedTarget(event); - context._activeTrigger[event.type === "focusout" ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget); - context._leave(); - }); - } - } - this._hideModalHandler = () => { - if (this._element) { - this.hide(); - } - }; - event_handler_default.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); - } - _fixTitle() { - const title = this._element.getAttribute("title"); - if (!title) { - return; - } - if (!this._element.getAttribute("aria-label") && !this._element.textContent.trim()) { - this._element.setAttribute("aria-label", title); - } - this._element.setAttribute("data-bs-original-title", title); - this._element.removeAttribute("title"); - } - _enter() { - if (this._isShown() || this._isHovered) { - this._isHovered = true; - return; - } - this._isHovered = true; - this._setTimeout(() => { - if (this._isHovered) { - this.show(); - } - }, this._config.delay.show); - } - _leave() { - if (this._isWithActiveTrigger()) { - return; - } - this._isHovered = false; - this._setTimeout(() => { - if (!this._isHovered) { - this.hide(); - } - }, this._config.delay.hide); - } - _setTimeout(handler, timeout) { - clearTimeout(this._timeout); - this._timeout = setTimeout(handler, timeout); - } - _isWithActiveTrigger() { - return Object.values(this._activeTrigger).includes(true); - } - _getConfig(config) { - const dataAttributes = manipulator_default.getDataAttributes(this._element); - for (const dataAttribute of Object.keys(dataAttributes)) { - if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) { - delete dataAttributes[dataAttribute]; - } - } - config = { - ...dataAttributes, - ...typeof config === "object" && config ? config : {} - }; - config = this._mergeConfigObj(config); - config = this._configAfterMerge(config); - this._typeCheckConfig(config); - return config; - } - _configAfterMerge(config) { - config.container = config.container === false ? document.body : getElement(config.container); - if (typeof config.delay === "number") { - config.delay = { - show: config.delay, - hide: config.delay - }; - } - if (typeof config.title === "number") { - config.title = config.title.toString(); - } - if (typeof config.content === "number") { - config.content = config.content.toString(); - } - return config; - } - _getDelegateConfig() { - const config = {}; - for (const [key, value] of Object.entries(this._config)) { - if (this.constructor.Default[key] !== value) { - config[key] = value; - } - } - config.selector = false; - config.trigger = "manual"; - return config; - } - _disposePopper() { - if (this._popper) { - this._popper.destroy(); - this._popper = null; - } - if (this.tip) { - this.tip.remove(); - this.tip = null; - } - } - // Static - static jQueryInterface(config) { - return this.each(function() { - const data = _Tooltip.getOrCreateInstance(this, config); - if (typeof config !== "string") { - return; - } - if (typeof data[config] === "undefined") { - throw new TypeError(`No method named "${config}"`); - } - data[config](); - }); - } - }; - defineJQueryPlugin(Tooltip); - var tooltip_default = Tooltip; - - // - var stdin_default = { - Tab: tab_default, - Collapse: collapse_default, - Dropdown: dropdown_default, - ScrollSpy: scrollspy_default, - Tooltip: tooltip_default - }; - window.Collapse = collapse_default; - window.Tooltip = tooltip_default; -})(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vZ29odWdvaW8vaHVnby1tb2QtanNsaWJzLWRpc3QvcG9wcGVyanMvdjJAdjIuMjExMDAuMjAwMDAvcGFja2FnZS9kaXN0L2Nqcy9wb3BwZXIuanMiLCAibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXBAdjUuMy4zK2luY29tcGF0aWJsZS9qcy9zcmMvZG9tL2RhdGEuanMiLCAibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXBAdjUuMy4zK2luY29tcGF0aWJsZS9qcy9zcmMvdXRpbC9pbmRleC5qcyIsICJucy1odWdvLWltcDovaG9tZS9kYXZpZC8uY2FjaGUvaHVnb19jYWNoZS9tb2R1bGVzL2ZpbGVjYWNoZS9tb2R1bGVzL3BrZy9tb2QvZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcEB2NS4zLjMraW5jb21wYXRpYmxlL2pzL3NyYy9kb20vZXZlbnQtaGFuZGxlci5qcyIsICJucy1odWdvLWltcDovaG9tZS9kYXZpZC8uY2FjaGUvaHVnb19jYWNoZS9tb2R1bGVzL2ZpbGVjYWNoZS9tb2R1bGVzL3BrZy9tb2QvZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcEB2NS4zLjMraW5jb21wYXRpYmxlL2pzL3NyYy9kb20vbWFuaXB1bGF0b3IuanMiLCAibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXBAdjUuMy4zK2luY29tcGF0aWJsZS9qcy9zcmMvdXRpbC9jb25maWcuanMiLCAibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXBAdjUuMy4zK2luY29tcGF0aWJsZS9qcy9zcmMvYmFzZS1jb21wb25lbnQuanMiLCAibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXBAdjUuMy4zK2luY29tcGF0aWJsZS9qcy9zcmMvZG9tL3NlbGVjdG9yLWVuZ2luZS5qcyIsICJucy1odWdvLWltcDovaG9tZS9kYXZpZC8uY2FjaGUvaHVnb19jYWNoZS9tb2R1bGVzL2ZpbGVjYWNoZS9tb2R1bGVzL3BrZy9tb2QvZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcEB2NS4zLjMraW5jb21wYXRpYmxlL2pzL3NyYy90YWIuanMiLCAibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXBAdjUuMy4zK2luY29tcGF0aWJsZS9qcy9zcmMvY29sbGFwc2UuanMiLCAibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXBAdjUuMy4zK2luY29tcGF0aWJsZS9qcy9zcmMvZHJvcGRvd24uanMiLCAibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXBAdjUuMy4zK2luY29tcGF0aWJsZS9qcy9zcmMvc2Nyb2xsc3B5LmpzIiwgIm5zLWh1Z28taW1wOi9ob21lL2RhdmlkLy5jYWNoZS9odWdvX2NhY2hlL21vZHVsZXMvZmlsZWNhY2hlL21vZHVsZXMvcGtnL21vZC9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwQHY1LjMuMytpbmNvbXBhdGlibGUvanMvc3JjL3Rvb2x0aXAuanMiLCAibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXBAdjUuMy4zK2luY29tcGF0aWJsZS9qcy9zcmMvdXRpbC9zYW5pdGl6ZXIuanMiLCAibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXBAdjUuMy4zK2luY29tcGF0aWJsZS9qcy9zcmMvdXRpbC90ZW1wbGF0ZS1mYWN0b3J5LmpzIiwgIjxzdGRpbj4iXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBvcHBlcmpzL2NvcmUgdjIuMTEuMCAtIE1JVCBMaWNlbnNlXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5mdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkge1xuICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIGlmIChub2RlLnRvU3RyaW5nKCkgIT09ICdbb2JqZWN0IFdpbmRvd10nKSB7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgcmV0dXJuIG93bmVyRG9jdW1lbnQgPyBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdyA6IHdpbmRvdztcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5FbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5IVE1MRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNTaGFkb3dSb290KG5vZGUpIHtcbiAgLy8gSUUgMTEgaGFzIG5vIFNoYWRvd1Jvb3RcbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLlNoYWRvd1Jvb3Q7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbn1cblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xudmFyIHJvdW5kID0gTWF0aC5yb3VuZDtcblxuZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIGluY2x1ZGVTY2FsZSkge1xuICBpZiAoaW5jbHVkZVNjYWxlID09PSB2b2lkIDApIHtcbiAgICBpbmNsdWRlU2NhbGUgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNjYWxlWCA9IDE7XG4gIHZhciBzY2FsZVkgPSAxO1xuXG4gIGlmIChpc0hUTUxFbGVtZW50KGVsZW1lbnQpICYmIGluY2x1ZGVTY2FsZSkge1xuICAgIHZhciBvZmZzZXRIZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICB2YXIgb2Zmc2V0V2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoOyAvLyBEbyBub3QgYXR0ZW1wdCB0byBkaXZpZGUgYnkgMCwgb3RoZXJ3aXNlIHdlIGdldCBgSW5maW5pdHlgIGFzIHNjYWxlXG4gICAgLy8gRmFsbGJhY2sgdG8gMSBpbiBjYXNlIGJvdGggdmFsdWVzIGFyZSBgMGBcblxuICAgIGlmIChvZmZzZXRXaWR0aCA+IDApIHtcbiAgICAgIHNjYWxlWCA9IHJvdW5kKHJlY3Qud2lkdGgpIC8gb2Zmc2V0V2lkdGggfHwgMTtcbiAgICB9XG5cbiAgICBpZiAob2Zmc2V0SGVpZ2h0ID4gMCkge1xuICAgICAgc2NhbGVZID0gcm91bmQocmVjdC5oZWlnaHQpIC8gb2Zmc2V0SGVpZ2h0IHx8IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogcmVjdC53aWR0aCAvIHNjYWxlWCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0IC8gc2NhbGVZLFxuICAgIHRvcDogcmVjdC50b3AgLyBzY2FsZVksXG4gICAgcmlnaHQ6IHJlY3QucmlnaHQgLyBzY2FsZVgsXG4gICAgYm90dG9tOiByZWN0LmJvdHRvbSAvIHNjYWxlWSxcbiAgICBsZWZ0OiByZWN0LmxlZnQgLyBzY2FsZVgsXG4gICAgeDogcmVjdC5sZWZ0IC8gc2NhbGVYLFxuICAgIHk6IHJlY3QudG9wIC8gc2NhbGVZXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbChub2RlKSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3cobm9kZSk7XG4gIHZhciBzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0O1xuICB2YXIgc2Nyb2xsVG9wID0gd2luLnBhZ2VZT2Zmc2V0O1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3BcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0SFRNTEVsZW1lbnRTY3JvbGwoZWxlbWVudCkge1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IGVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsVG9wXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldE5vZGVTY3JvbGwobm9kZSkge1xuICBpZiAobm9kZSA9PT0gZ2V0V2luZG93KG5vZGUpIHx8ICFpc0hUTUxFbGVtZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIGdldFdpbmRvd1Njcm9sbChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0SFRNTEVsZW1lbnRTY3JvbGwobm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Tm9kZU5hbWUoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudCA/IChlbGVtZW50Lm5vZGVOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICByZXR1cm4gKChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgZWxlbWVudC5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCkge1xuICAvLyBJZiA8aHRtbD4gaGFzIGEgQ1NTIHdpZHRoIGdyZWF0ZXIgdGhhbiB0aGUgdmlld3BvcnQsIHRoZW4gdGhpcyB3aWxsIGJlXG4gIC8vIGluY29ycmVjdCBmb3IgUlRMLlxuICAvLyBQb3BwZXIgMSBpcyBicm9rZW4gaW4gdGhpcyBjYXNlIGFuZCBuZXZlciBoYWQgYSBidWcgcmVwb3J0IHNvIGxldCdzIGFzc3VtZVxuICAvLyBpdCdzIG5vdCBhbiBpc3N1ZS4gSSBkb24ndCB0aGluayBhbnlvbmUgZXZlciBzcGVjaWZpZXMgd2lkdGggb24gPGh0bWw+XG4gIC8vIGFueXdheS5cbiAgLy8gQnJvd3NlcnMgd2hlcmUgdGhlIGxlZnQgc2Nyb2xsYmFyIGRvZXNuJ3QgY2F1c2UgYW4gaXNzdWUgcmVwb3J0IGAwYCBmb3JcbiAgLy8gdGhpcyAoZS5nLiBFZGdlIDIwMTksIElFMTEsIFNhZmFyaSlcbiAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpLmxlZnQgKyBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCkuc2Nyb2xsTGVmdDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSB7XG4gIHJldHVybiBnZXRXaW5kb3coZWxlbWVudCkuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gaXNTY3JvbGxQYXJlbnQoZWxlbWVudCkge1xuICAvLyBGaXJlZm94IHdhbnRzIHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG4gIHZhciBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCksXG4gICAgICBvdmVyZmxvdyA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93LFxuICAgICAgb3ZlcmZsb3dYID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dZO1xuXG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpO1xufVxuXG5mdW5jdGlvbiBpc0VsZW1lbnRTY2FsZWQoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzY2FsZVggPSByb3VuZChyZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMTtcbiAgdmFyIHNjYWxlWSA9IHJvdW5kKHJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDE7XG4gIHJldHVybiBzY2FsZVggIT09IDEgfHwgc2NhbGVZICE9PSAxO1xufSAvLyBSZXR1cm5zIHRoZSBjb21wb3NpdGUgcmVjdCBvZiBhbiBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBvZmZzZXRQYXJlbnQuXG4vLyBDb21wb3NpdGUgbWVhbnMgaXQgdGFrZXMgaW50byBhY2NvdW50IHRyYW5zZm9ybXMgYXMgd2VsbCBhcyBsYXlvdXQuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9zaXRlUmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50LCBpc0ZpeGVkKSB7XG4gIGlmIChpc0ZpeGVkID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkID0gZmFsc2U7XG4gIH1cblxuICB2YXIgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnRJc1NjYWxlZCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBpc0VsZW1lbnRTY2FsZWQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50SXNTY2FsZWQpO1xuICB2YXIgc2Nyb2xsID0ge1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgc2Nyb2xsVG9wOiAwXG4gIH07XG4gIHZhciBvZmZzZXRzID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCB8fCAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQpIHtcbiAgICBpZiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSAhPT0gJ2JvZHknIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTA3OFxuICAgIGlzU2Nyb2xsUGFyZW50KGRvY3VtZW50RWxlbWVudCkpIHtcbiAgICAgIHNjcm9sbCA9IGdldE5vZGVTY3JvbGwob2Zmc2V0UGFyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICBvZmZzZXRzID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KG9mZnNldFBhcmVudCwgdHJ1ZSk7XG4gICAgICBvZmZzZXRzLnggKz0gb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgKz0gb2Zmc2V0UGFyZW50LmNsaWVudFRvcDtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50RWxlbWVudCkge1xuICAgICAgb2Zmc2V0cy54ID0gZ2V0V2luZG93U2Nyb2xsQmFyWChkb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogcmVjdC5sZWZ0ICsgc2Nyb2xsLnNjcm9sbExlZnQgLSBvZmZzZXRzLngsXG4gICAgeTogcmVjdC50b3AgKyBzY3JvbGwuc2Nyb2xsVG9wIC0gb2Zmc2V0cy55LFxuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHRcbiAgfTtcbn1cblxuLy8gbWVhbnMgaXQgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zLlxuXG5mdW5jdGlvbiBnZXRMYXlvdXRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIGNsaWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCk7IC8vIFVzZSB0aGUgY2xpZW50UmVjdCBzaXplcyBpZiBpdCdzIG5vdCBiZWVuIHRyYW5zZm9ybWVkLlxuICAvLyBGaXhlcyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzEyMjNcblxuICB2YXIgd2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3Qud2lkdGggLSB3aWR0aCkgPD0gMSkge1xuICAgIHdpZHRoID0gY2xpZW50UmVjdC53aWR0aDtcbiAgfVxuXG4gIGlmIChNYXRoLmFicyhjbGllbnRSZWN0LmhlaWdodCAtIGhlaWdodCkgPD0gMSkge1xuICAgIGhlaWdodCA9IGNsaWVudFJlY3QuaGVpZ2h0O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiBlbGVtZW50Lm9mZnNldExlZnQsXG4gICAgeTogZWxlbWVudC5vZmZzZXRUb3AsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFBhcmVudE5vZGUoZWxlbWVudCkge1xuICBpZiAoZ2V0Tm9kZU5hbWUoZWxlbWVudCkgPT09ICdodG1sJykge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcmV0dXJuICgvLyB0aGlzIGlzIGEgcXVpY2tlciAoYnV0IGxlc3MgdHlwZSBzYWZlKSB3YXkgdG8gc2F2ZSBxdWl0ZSBzb21lIGJ5dGVzIGZyb20gdGhlIGJ1bmRsZVxuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl1cbiAgICAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICBlbGVtZW50LmFzc2lnbmVkU2xvdCB8fCAvLyBzdGVwIGludG8gdGhlIHNoYWRvdyBET00gb2YgdGhlIHBhcmVudCBvZiBhIHNsb3R0ZWQgbm9kZVxuICAgIGVsZW1lbnQucGFyZW50Tm9kZSB8fCAoIC8vIERPTSBFbGVtZW50IGRldGVjdGVkXG4gICAgaXNTaGFkb3dSb290KGVsZW1lbnQpID8gZWxlbWVudC5ob3N0IDogbnVsbCkgfHwgLy8gU2hhZG93Um9vdCBkZXRlY3RlZFxuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhbGxdOiBIVE1MRWxlbWVudCBpcyBhIE5vZGVcbiAgICBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkgLy8gZmFsbGJhY2tcblxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQobm9kZSkge1xuICBpZiAoWydodG1sJywgJ2JvZHknLCAnI2RvY3VtZW50J10uaW5kZXhPZihnZXROb2RlTmFtZShub2RlKSkgPj0gMCkge1xuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50LmJvZHk7XG4gIH1cblxuICBpZiAoaXNIVE1MRWxlbWVudChub2RlKSAmJiBpc1Njcm9sbFBhcmVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIGdldFNjcm9sbFBhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKTtcbn1cblxuLypcbmdpdmVuIGEgRE9NIGVsZW1lbnQsIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc2Nyb2xsIHBhcmVudHMsIHVwIHRoZSBsaXN0IG9mIGFuY2Vzb3JzXG51bnRpbCB3ZSBnZXQgdG8gdGhlIHRvcCB3aW5kb3cgb2JqZWN0LiBUaGlzIGxpc3QgaXMgd2hhdCB3ZSBhdHRhY2ggc2Nyb2xsIGxpc3RlbmVyc1xudG8sIGJlY2F1c2UgaWYgYW55IG9mIHRoZXNlIHBhcmVudCBlbGVtZW50cyBzY3JvbGwsIHdlJ2xsIG5lZWQgdG8gcmUtY2FsY3VsYXRlIHRoZVxucmVmZXJlbmNlIGVsZW1lbnQncyBwb3NpdGlvbi5cbiovXG5cbmZ1bmN0aW9uIGxpc3RTY3JvbGxQYXJlbnRzKGVsZW1lbnQsIGxpc3QpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICBpZiAobGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgbGlzdCA9IFtdO1xuICB9XG5cbiAgdmFyIHNjcm9sbFBhcmVudCA9IGdldFNjcm9sbFBhcmVudChlbGVtZW50KTtcbiAgdmFyIGlzQm9keSA9IHNjcm9sbFBhcmVudCA9PT0gKChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keSk7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsUGFyZW50KTtcbiAgdmFyIHRhcmdldCA9IGlzQm9keSA/IFt3aW5dLmNvbmNhdCh3aW4udmlzdWFsVmlld3BvcnQgfHwgW10sIGlzU2Nyb2xsUGFyZW50KHNjcm9sbFBhcmVudCkgPyBzY3JvbGxQYXJlbnQgOiBbXSkgOiBzY3JvbGxQYXJlbnQ7XG4gIHZhciB1cGRhdGVkTGlzdCA9IGxpc3QuY29uY2F0KHRhcmdldCk7XG4gIHJldHVybiBpc0JvZHkgPyB1cGRhdGVkTGlzdCA6IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhbGxdOiBpc0JvZHkgdGVsbHMgdXMgdGFyZ2V0IHdpbGwgYmUgYW4gSFRNTEVsZW1lbnQgaGVyZVxuICB1cGRhdGVkTGlzdC5jb25jYXQobGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZSh0YXJnZXQpKSk7XG59XG5cbmZ1bmN0aW9uIGlzVGFibGVFbGVtZW50KGVsZW1lbnQpIHtcbiAgcmV0dXJuIFsndGFibGUnLCAndGQnLCAndGgnXS5pbmRleE9mKGdldE5vZGVOYW1lKGVsZW1lbnQpKSA+PSAwO1xufVxuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvODM3XG4gIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbn0gLy8gYC5vZmZzZXRQYXJlbnRgIHJlcG9ydHMgYG51bGxgIGZvciBmaXhlZCBlbGVtZW50cywgd2hpbGUgYWJzb2x1dGUgZWxlbWVudHNcbi8vIHJldHVybiB0aGUgY29udGFpbmluZyBibG9ja1xuXG5cbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB7XG4gIHZhciBpc0ZpcmVmb3ggPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZmlyZWZveCcpICE9PSAtMTtcbiAgdmFyIGlzSUUgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1RyaWRlbnQnKSAhPT0gLTE7XG5cbiAgaWYgKGlzSUUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIEluIElFIDksIDEwIGFuZCAxMSBmaXhlZCBlbGVtZW50cyBjb250YWluaW5nIGJsb2NrIGlzIGFsd2F5cyBlc3RhYmxpc2hlZCBieSB0aGUgdmlld3BvcnRcbiAgICB2YXIgZWxlbWVudENzcyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG5cbiAgICBpZiAoZWxlbWVudENzcy5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgdmFyIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcblxuICB3aGlsZSAoaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgWydodG1sJywgJ2JvZHknXS5pbmRleE9mKGdldE5vZGVOYW1lKGN1cnJlbnROb2RlKSkgPCAwKSB7XG4gICAgdmFyIGNzcyA9IGdldENvbXB1dGVkU3R5bGUoY3VycmVudE5vZGUpOyAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgICAvLyBjcmVhdGUgYSBjb250YWluaW5nIGJsb2NrLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Db250YWluaW5nX2Jsb2NrI2lkZW50aWZ5aW5nX3RoZV9jb250YWluaW5nX2Jsb2NrXG5cbiAgICBpZiAoY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8IGNzcy5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnIHx8IGNzcy5jb250YWluID09PSAncGFpbnQnIHx8IFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJ10uaW5kZXhPZihjc3Mud2lsbENoYW5nZSkgIT09IC0xIHx8IGlzRmlyZWZveCAmJiBjc3Mud2lsbENoYW5nZSA9PT0gJ2ZpbHRlcicgfHwgaXNGaXJlZm94ICYmIGNzcy5maWx0ZXIgJiYgY3NzLmZpbHRlciAhPT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cblxuXG5mdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdodG1sJyB8fCBnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkgfHwgd2luZG93O1xufVxuXG52YXIgdG9wID0gJ3RvcCc7XG52YXIgYm90dG9tID0gJ2JvdHRvbSc7XG52YXIgcmlnaHQgPSAncmlnaHQnO1xudmFyIGxlZnQgPSAnbGVmdCc7XG52YXIgYXV0byA9ICdhdXRvJztcbnZhciBiYXNlUGxhY2VtZW50cyA9IFt0b3AsIGJvdHRvbSwgcmlnaHQsIGxlZnRdO1xudmFyIHN0YXJ0ID0gJ3N0YXJ0JztcbnZhciBlbmQgPSAnZW5kJztcbnZhciBjbGlwcGluZ1BhcmVudHMgPSAnY2xpcHBpbmdQYXJlbnRzJztcbnZhciB2aWV3cG9ydCA9ICd2aWV3cG9ydCc7XG52YXIgcG9wcGVyID0gJ3BvcHBlcic7XG52YXIgcmVmZXJlbmNlID0gJ3JlZmVyZW5jZSc7XG52YXIgdmFyaWF0aW9uUGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9iYXNlUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pO1xudmFyIHBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovW10uY29uY2F0KGJhc2VQbGFjZW1lbnRzLCBbYXV0b10pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIGFjYy5jb25jYXQoW3BsYWNlbWVudCwgcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTsgLy8gbW9kaWZpZXJzIHRoYXQgbmVlZCB0byByZWFkIHRoZSBET01cblxudmFyIGJlZm9yZVJlYWQgPSAnYmVmb3JlUmVhZCc7XG52YXIgcmVhZCA9ICdyZWFkJztcbnZhciBhZnRlclJlYWQgPSAnYWZ0ZXJSZWFkJzsgLy8gcHVyZS1sb2dpYyBtb2RpZmllcnNcblxudmFyIGJlZm9yZU1haW4gPSAnYmVmb3JlTWFpbic7XG52YXIgbWFpbiA9ICdtYWluJztcbnZhciBhZnRlck1haW4gPSAnYWZ0ZXJNYWluJzsgLy8gbW9kaWZpZXIgd2l0aCB0aGUgcHVycG9zZSB0byB3cml0ZSB0byB0aGUgRE9NIChvciB3cml0ZSBpbnRvIGEgZnJhbWV3b3JrIHN0YXRlKVxuXG52YXIgYmVmb3JlV3JpdGUgPSAnYmVmb3JlV3JpdGUnO1xudmFyIHdyaXRlID0gJ3dyaXRlJztcbnZhciBhZnRlcldyaXRlID0gJ2FmdGVyV3JpdGUnO1xudmFyIG1vZGlmaWVyUGhhc2VzID0gW2JlZm9yZVJlYWQsIHJlYWQsIGFmdGVyUmVhZCwgYmVmb3JlTWFpbiwgbWFpbiwgYWZ0ZXJNYWluLCBiZWZvcmVXcml0ZSwgd3JpdGUsIGFmdGVyV3JpdGVdO1xuXG5mdW5jdGlvbiBvcmRlcihtb2RpZmllcnMpIHtcbiAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgbWFwLnNldChtb2RpZmllci5uYW1lLCBtb2RpZmllcik7XG4gIH0pOyAvLyBPbiB2aXNpdGluZyBvYmplY3QsIGNoZWNrIGZvciBpdHMgZGVwZW5kZW5jaWVzIGFuZCB2aXNpdCB0aGVtIHJlY3Vyc2l2ZWx5XG5cbiAgZnVuY3Rpb24gc29ydChtb2RpZmllcikge1xuICAgIHZpc2l0ZWQuYWRkKG1vZGlmaWVyLm5hbWUpO1xuICAgIHZhciByZXF1aXJlcyA9IFtdLmNvbmNhdChtb2RpZmllci5yZXF1aXJlcyB8fCBbXSwgbW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cyB8fCBbXSk7XG4gICAgcmVxdWlyZXMuZm9yRWFjaChmdW5jdGlvbiAoZGVwKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGRlcCkpIHtcbiAgICAgICAgdmFyIGRlcE1vZGlmaWVyID0gbWFwLmdldChkZXApO1xuXG4gICAgICAgIGlmIChkZXBNb2RpZmllcikge1xuICAgICAgICAgIHNvcnQoZGVwTW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmVzdWx0LnB1c2gobW9kaWZpZXIpO1xuICB9XG5cbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgaWYgKCF2aXNpdGVkLmhhcyhtb2RpZmllci5uYW1lKSkge1xuICAgICAgLy8gY2hlY2sgZm9yIHZpc2l0ZWQgb2JqZWN0XG4gICAgICBzb3J0KG1vZGlmaWVyKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBvcmRlck1vZGlmaWVycyhtb2RpZmllcnMpIHtcbiAgLy8gb3JkZXIgYmFzZWQgb24gZGVwZW5kZW5jaWVzXG4gIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXIobW9kaWZpZXJzKTsgLy8gb3JkZXIgYmFzZWQgb24gcGhhc2VcblxuICByZXR1cm4gbW9kaWZpZXJQaGFzZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBoYXNlKSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQob3JkZXJlZE1vZGlmaWVycy5maWx0ZXIoZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICByZXR1cm4gbW9kaWZpZXIucGhhc2UgPT09IHBoYXNlO1xuICAgIH0pKTtcbiAgfSwgW10pO1xufVxuXG5mdW5jdGlvbiBkZWJvdW5jZShmbikge1xuICB2YXIgcGVuZGluZztcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHBlbmRpbmcgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBwZW5kaW5nID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJlc29sdmUoZm4oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlbmRpbmc7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdChzdHIpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIFtdLmNvbmNhdChhcmdzKS5yZWR1Y2UoZnVuY3Rpb24gKHAsIGMpIHtcbiAgICByZXR1cm4gcC5yZXBsYWNlKC8lcy8sIGMpO1xuICB9LCBzdHIpO1xufVxuXG52YXIgSU5WQUxJRF9NT0RJRklFUl9FUlJPUiA9ICdQb3BwZXI6IG1vZGlmaWVyIFwiJXNcIiBwcm92aWRlZCBhbiBpbnZhbGlkICVzIHByb3BlcnR5LCBleHBlY3RlZCAlcyBidXQgZ290ICVzJztcbnZhciBNSVNTSU5HX0RFUEVOREVOQ1lfRVJST1IgPSAnUG9wcGVyOiBtb2RpZmllciBcIiVzXCIgcmVxdWlyZXMgXCIlc1wiLCBidXQgXCIlc1wiIG1vZGlmaWVyIGlzIG5vdCBhdmFpbGFibGUnO1xudmFyIFZBTElEX1BST1BFUlRJRVMgPSBbJ25hbWUnLCAnZW5hYmxlZCcsICdwaGFzZScsICdmbicsICdlZmZlY3QnLCAncmVxdWlyZXMnLCAnb3B0aW9ucyddO1xuZnVuY3Rpb24gdmFsaWRhdGVNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIFtdLmNvbmNhdChPYmplY3Qua2V5cyhtb2RpZmllciksIFZBTElEX1BST1BFUlRJRVMpIC8vIElFMTEtY29tcGF0aWJsZSByZXBsYWNlbWVudCBmb3IgYG5ldyBTZXQoaXRlcmFibGUpYFxuICAgIC5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlLCBpbmRleCwgc2VsZikge1xuICAgICAgcmV0dXJuIHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4O1xuICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgICAgaWYgKHR5cGVvZiBtb2RpZmllci5uYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgU3RyaW5nKG1vZGlmaWVyLm5hbWUpLCAnXCJuYW1lXCInLCAnXCJzdHJpbmdcIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLm5hbWUpICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdlbmFibGVkJzpcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZGlmaWVyLmVuYWJsZWQgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgbW9kaWZpZXIubmFtZSwgJ1wiZW5hYmxlZFwiJywgJ1wiYm9vbGVhblwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIuZW5hYmxlZCkgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3BoYXNlJzpcbiAgICAgICAgICBpZiAobW9kaWZpZXJQaGFzZXMuaW5kZXhPZihtb2RpZmllci5waGFzZSkgPCAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJwaGFzZVwiJywgXCJlaXRoZXIgXCIgKyBtb2RpZmllclBoYXNlcy5qb2luKCcsICcpLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5waGFzZSkgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2ZuJzpcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZGlmaWVyLmZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJmblwiJywgJ1wiZnVuY3Rpb25cIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLmZuKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZWZmZWN0JzpcbiAgICAgICAgICBpZiAobW9kaWZpZXIuZWZmZWN0ICE9IG51bGwgJiYgdHlwZW9mIG1vZGlmaWVyLmVmZmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgbW9kaWZpZXIubmFtZSwgJ1wiZWZmZWN0XCInLCAnXCJmdW5jdGlvblwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIuZm4pICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdyZXF1aXJlcyc6XG4gICAgICAgICAgaWYgKG1vZGlmaWVyLnJlcXVpcmVzICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkobW9kaWZpZXIucmVxdWlyZXMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJyZXF1aXJlc1wiJywgJ1wiYXJyYXlcIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLnJlcXVpcmVzKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAncmVxdWlyZXNJZkV4aXN0cyc6XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJyZXF1aXJlc0lmRXhpc3RzXCInLCAnXCJhcnJheVwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cykgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ29wdGlvbnMnOlxuICAgICAgICBjYXNlICdkYXRhJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJQb3BwZXJKUzogYW4gaW52YWxpZCBwcm9wZXJ0eSBoYXMgYmVlbiBwcm92aWRlZCB0byB0aGUgXFxcIlwiICsgbW9kaWZpZXIubmFtZSArIFwiXFxcIiBtb2RpZmllciwgdmFsaWQgcHJvcGVydGllcyBhcmUgXCIgKyBWQUxJRF9QUk9QRVJUSUVTLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcmV0dXJuIFwiXFxcIlwiICsgcyArIFwiXFxcIlwiO1xuICAgICAgICAgIH0pLmpvaW4oJywgJykgKyBcIjsgYnV0IFxcXCJcIiArIGtleSArIFwiXFxcIiB3YXMgcHJvdmlkZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBtb2RpZmllci5yZXF1aXJlcyAmJiBtb2RpZmllci5yZXF1aXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1aXJlbWVudCkge1xuICAgICAgICBpZiAobW9kaWZpZXJzLmZpbmQoZnVuY3Rpb24gKG1vZCkge1xuICAgICAgICAgIHJldHVybiBtb2QubmFtZSA9PT0gcmVxdWlyZW1lbnQ7XG4gICAgICAgIH0pID09IG51bGwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChNSVNTSU5HX0RFUEVOREVOQ1lfRVJST1IsIFN0cmluZyhtb2RpZmllci5uYW1lKSwgcmVxdWlyZW1lbnQsIHJlcXVpcmVtZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdW5pcXVlQnkoYXJyLCBmbikge1xuICB2YXIgaWRlbnRpZmllcnMgPSBuZXcgU2V0KCk7XG4gIHJldHVybiBhcnIuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBmbihpdGVtKTtcblxuICAgIGlmICghaWRlbnRpZmllcnMuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgICBpZGVudGlmaWVycy5hZGQoaWRlbnRpZmllcik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG59XG5cbmZ1bmN0aW9uIG1lcmdlQnlOYW1lKG1vZGlmaWVycykge1xuICB2YXIgbWVyZ2VkID0gbW9kaWZpZXJzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkLCBjdXJyZW50KSB7XG4gICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkW2N1cnJlbnQubmFtZV07XG4gICAgbWVyZ2VkW2N1cnJlbnQubmFtZV0gPSBleGlzdGluZyA/IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLCBjdXJyZW50LCB7XG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5vcHRpb25zLCBjdXJyZW50Lm9wdGlvbnMpLFxuICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcuZGF0YSwgY3VycmVudC5kYXRhKVxuICAgIH0pIDogY3VycmVudDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9LCB7fSk7IC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCBPYmplY3QudmFsdWVzXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1lcmdlZCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkW2tleV07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCkge1xuICB2YXIgd2luID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgdmFyIHZpc3VhbFZpZXdwb3J0ID0gd2luLnZpc3VhbFZpZXdwb3J0O1xuICB2YXIgd2lkdGggPSBodG1sLmNsaWVudFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gaHRtbC5jbGllbnRIZWlnaHQ7XG4gIHZhciB4ID0gMDtcbiAgdmFyIHkgPSAwOyAvLyBOQjogVGhpcyBpc24ndCBzdXBwb3J0ZWQgb24gaU9TIDw9IDEyLiBJZiB0aGUga2V5Ym9hcmQgaXMgb3BlbiwgdGhlIHBvcHBlclxuICAvLyBjYW4gYmUgb2JzY3VyZWQgdW5kZXJuZWF0aCBpdC5cbiAgLy8gQWxzbywgYGh0bWwuY2xpZW50SGVpZ2h0YCBhZGRzIHRoZSBib3R0b20gYmFyIGhlaWdodCBpbiBTYWZhcmkgaU9TLCBldmVuXG4gIC8vIGlmIGl0IGlzbid0IG9wZW4sIHNvIGlmIHRoaXMgaXNuJ3QgYXZhaWxhYmxlLCB0aGUgcG9wcGVyIHdpbGwgYmUgZGV0ZWN0ZWRcbiAgLy8gdG8gb3ZlcmZsb3cgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuIHRvbyBlYXJseS5cblxuICBpZiAodmlzdWFsVmlld3BvcnQpIHtcbiAgICB3aWR0aCA9IHZpc3VhbFZpZXdwb3J0LndpZHRoO1xuICAgIGhlaWdodCA9IHZpc3VhbFZpZXdwb3J0LmhlaWdodDsgLy8gVXNlcyBMYXlvdXQgVmlld3BvcnQgKGxpa2UgQ2hyb21lOyBTYWZhcmkgZG9lcyBub3QgY3VycmVudGx5KVxuICAgIC8vIEluIENocm9tZSwgaXQgcmV0dXJucyBhIHZhbHVlIHZlcnkgY2xvc2UgdG8gMCAoKy8tKSBidXQgY29udGFpbnMgcm91bmRpbmdcbiAgICAvLyBlcnJvcnMgZHVlIHRvIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIHNvIHdlIG5lZWQgdG8gY2hlY2sgcHJlY2lzaW9uLlxuICAgIC8vIFNhZmFyaSByZXR1cm5zIGEgbnVtYmVyIDw9IDAsIHVzdWFsbHkgPCAtMSB3aGVuIHBpbmNoLXpvb21lZFxuICAgIC8vIEZlYXR1cmUgZGV0ZWN0aW9uIGZhaWxzIGluIG1vYmlsZSBlbXVsYXRpb24gbW9kZSBpbiBDaHJvbWUuXG4gICAgLy8gTWF0aC5hYnMod2luLmlubmVyV2lkdGggLyB2aXN1YWxWaWV3cG9ydC5zY2FsZSAtIHZpc3VhbFZpZXdwb3J0LndpZHRoKSA8XG4gICAgLy8gMC4wMDFcbiAgICAvLyBGYWxsYmFjayBoZXJlOiBcIk5vdCBTYWZhcmlcIiB1c2VyQWdlbnRcblxuICAgIGlmICghL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkge1xuICAgICAgeCA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQ7XG4gICAgICB5ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHg6IHggKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpLFxuICAgIHk6IHlcbiAgfTtcbn1cblxuLy8gb2YgdGhlIGA8aHRtbD5gIGFuZCBgPGJvZHk+YCByZWN0IGJvdW5kcyBpZiBob3Jpem9udGFsbHkgc2Nyb2xsYWJsZVxuXG5mdW5jdGlvbiBnZXREb2N1bWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgX2VsZW1lbnQkb3duZXJEb2N1bWVuO1xuXG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgd2luU2Nyb2xsID0gZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpO1xuICB2YXIgYm9keSA9IChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keTtcbiAgdmFyIHdpZHRoID0gbWF4KGh0bWwuc2Nyb2xsV2lkdGgsIGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LnNjcm9sbFdpZHRoIDogMCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKTtcbiAgdmFyIGhlaWdodCA9IG1heChodG1sLnNjcm9sbEhlaWdodCwgaHRtbC5jbGllbnRIZWlnaHQsIGJvZHkgPyBib2R5LnNjcm9sbEhlaWdodCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudEhlaWdodCA6IDApO1xuICB2YXIgeCA9IC13aW5TY3JvbGwuc2Nyb2xsTGVmdCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCk7XG4gIHZhciB5ID0gLXdpblNjcm9sbC5zY3JvbGxUb3A7XG5cbiAgaWYgKGdldENvbXB1dGVkU3R5bGUoYm9keSB8fCBodG1sKS5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgeCArPSBtYXgoaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKSAtIHdpZHRoO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgdmFyIHJvb3ROb2RlID0gY2hpbGQuZ2V0Um9vdE5vZGUgJiYgY2hpbGQuZ2V0Um9vdE5vZGUoKTsgLy8gRmlyc3QsIGF0dGVtcHQgd2l0aCBmYXN0ZXIgbmF0aXZlIG1ldGhvZFxuXG4gIGlmIChwYXJlbnQuY29udGFpbnMoY2hpbGQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gdGhlbiBmYWxsYmFjayB0byBjdXN0b20gaW1wbGVtZW50YXRpb24gd2l0aCBTaGFkb3cgRE9NIHN1cHBvcnRcbiAgZWxzZSBpZiAocm9vdE5vZGUgJiYgaXNTaGFkb3dSb290KHJvb3ROb2RlKSkge1xuICAgICAgdmFyIG5leHQgPSBjaGlsZDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAobmV4dCAmJiBwYXJlbnQuaXNTYW1lTm9kZShuZXh0KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXTogbmVlZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuLi5cblxuXG4gICAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgICAgfSB3aGlsZSAobmV4dCk7XG4gICAgfSAvLyBHaXZlIHVwLCB0aGUgcmVzdWx0IGlzIGZhbHNlXG5cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlY3RUb0NsaWVudFJlY3QocmVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcmVjdCwge1xuICAgIGxlZnQ6IHJlY3QueCxcbiAgICB0b3A6IHJlY3QueSxcbiAgICByaWdodDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBib3R0b206IHJlY3QueSArIHJlY3QuaGVpZ2h0XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpO1xuICByZWN0LnRvcCA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIHJlY3QubGVmdCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDtcbiAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnJpZ2h0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC53aWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3QuaGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QueCA9IHJlY3QubGVmdDtcbiAgcmVjdC55ID0gcmVjdC50b3A7XG4gIHJldHVybiByZWN0O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCkge1xuICByZXR1cm4gY2xpcHBpbmdQYXJlbnQgPT09IHZpZXdwb3J0ID8gcmVjdFRvQ2xpZW50UmVjdChnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCkpIDogaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSA/IGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGNsaXBwaW5nUGFyZW50KSA6IHJlY3RUb0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkpO1xufSAvLyBBIFwiY2xpcHBpbmcgcGFyZW50XCIgaXMgYW4gb3ZlcmZsb3dhYmxlIGNvbnRhaW5lciB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZlxuLy8gY2xpcHBpbmcgKG9yIGhpZGluZykgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2l0aCBhIHBvc2l0aW9uIGRpZmZlcmVudCBmcm9tXG4vLyBgaW5pdGlhbGBcblxuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkge1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gbGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG4gIHZhciBjYW5Fc2NhcGVDbGlwcGluZyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24pID49IDA7XG4gIHZhciBjbGlwcGVyRWxlbWVudCA9IGNhbkVzY2FwZUNsaXBwaW5nICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkgPyBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkgOiBlbGVtZW50O1xuXG4gIGlmICghaXNFbGVtZW50KGNsaXBwZXJFbGVtZW50KSkge1xuICAgIHJldHVybiBbXTtcbiAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMTQxNFxuXG5cbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50cy5maWx0ZXIoZnVuY3Rpb24gKGNsaXBwaW5nUGFyZW50KSB7XG4gICAgcmV0dXJuIGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgJiYgY29udGFpbnMoY2xpcHBpbmdQYXJlbnQsIGNsaXBwZXJFbGVtZW50KSAmJiBnZXROb2RlTmFtZShjbGlwcGluZ1BhcmVudCkgIT09ICdib2R5JyAmJiAoY2FuRXNjYXBlQ2xpcHBpbmcgPyBnZXRDb21wdXRlZFN0eWxlKGNsaXBwaW5nUGFyZW50KS5wb3NpdGlvbiAhPT0gJ3N0YXRpYycgOiB0cnVlKTtcbiAgfSk7XG59IC8vIEdldHMgdGhlIG1heGltdW0gYXJlYSB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gZHVlIHRvIGFueSBudW1iZXIgb2Zcbi8vIGNsaXBwaW5nIHBhcmVudHNcblxuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ1JlY3QoZWxlbWVudCwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSkge1xuICB2YXIgbWFpbkNsaXBwaW5nUGFyZW50cyA9IGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdQYXJlbnRzJyA/IGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSA6IFtdLmNvbmNhdChib3VuZGFyeSk7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBbXS5jb25jYXQobWFpbkNsaXBwaW5nUGFyZW50cywgW3Jvb3RCb3VuZGFyeV0pO1xuICB2YXIgZmlyc3RDbGlwcGluZ1BhcmVudCA9IGNsaXBwaW5nUGFyZW50c1swXTtcbiAgdmFyIGNsaXBwaW5nUmVjdCA9IGNsaXBwaW5nUGFyZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjY1JlY3QsIGNsaXBwaW5nUGFyZW50KSB7XG4gICAgdmFyIHJlY3QgPSBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCk7XG4gICAgYWNjUmVjdC50b3AgPSBtYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gbWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gbWluKHJlY3QuYm90dG9tLCBhY2NSZWN0LmJvdHRvbSk7XG4gICAgYWNjUmVjdC5sZWZ0ID0gbWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcbiAgICByZXR1cm4gYWNjUmVjdDtcbiAgfSwgZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgZmlyc3RDbGlwcGluZ1BhcmVudCkpO1xuICBjbGlwcGluZ1JlY3Qud2lkdGggPSBjbGlwcGluZ1JlY3QucmlnaHQgLSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LmhlaWdodCA9IGNsaXBwaW5nUmVjdC5ib3R0b20gLSBjbGlwcGluZ1JlY3QudG9wO1xuICBjbGlwcGluZ1JlY3QueCA9IGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QueSA9IGNsaXBwaW5nUmVjdC50b3A7XG4gIHJldHVybiBjbGlwcGluZ1JlY3Q7XG59XG5cbmZ1bmN0aW9uIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xufVxuXG5mdW5jdGlvbiBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBbJ3RvcCcsICdib3R0b20nXS5pbmRleE9mKHBsYWNlbWVudCkgPj0gMCA/ICd4JyA6ICd5Jztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU9mZnNldHMoX3JlZikge1xuICB2YXIgcmVmZXJlbmNlID0gX3JlZi5yZWZlcmVuY2UsXG4gICAgICBlbGVtZW50ID0gX3JlZi5lbGVtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZi5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50ID8gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIHZhcmlhdGlvbiA9IHBsYWNlbWVudCA/IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIGNvbW1vblggPSByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCAvIDIgLSBlbGVtZW50LndpZHRoIC8gMjtcbiAgdmFyIGNvbW1vblkgPSByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHQgLyAyIC0gZWxlbWVudC5oZWlnaHQgLyAyO1xuICB2YXIgb2Zmc2V0cztcblxuICBzd2l0Y2ggKGJhc2VQbGFjZW1lbnQpIHtcbiAgICBjYXNlIHRvcDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55IC0gZWxlbWVudC5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgYm90dG9tOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIHJpZ2h0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgbGVmdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54IC0gZWxlbWVudC53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54LFxuICAgICAgICB5OiByZWZlcmVuY2UueVxuICAgICAgfTtcbiAgfVxuXG4gIHZhciBtYWluQXhpcyA9IGJhc2VQbGFjZW1lbnQgPyBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCkgOiBudWxsO1xuXG4gIGlmIChtYWluQXhpcyAhPSBudWxsKSB7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICBzd2l0Y2ggKHZhcmlhdGlvbikge1xuICAgICAgY2FzZSBzdGFydDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPSBvZmZzZXRzW21haW5BeGlzXSAtIChyZWZlcmVuY2VbbGVuXSAvIDIgLSBlbGVtZW50W2xlbl0gLyAyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgZW5kOlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdICsgKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn1cblxuZnVuY3Rpb24gZ2V0RnJlc2hTaWRlT2JqZWN0KCkge1xuICByZXR1cm4ge1xuICAgIHRvcDogMCxcbiAgICByaWdodDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogMFxuICB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhZGRpbmdPYmplY3QocGFkZGluZ09iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ2V0RnJlc2hTaWRlT2JqZWN0KCksIHBhZGRpbmdPYmplY3QpO1xufVxuXG5mdW5jdGlvbiBleHBhbmRUb0hhc2hNYXAodmFsdWUsIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChoYXNoTWFwLCBrZXkpIHtcbiAgICBoYXNoTWFwW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gaGFzaE1hcDtcbiAgfSwge30pO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIF9vcHRpb25zJHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gc3RhdGUucGxhY2VtZW50IDogX29wdGlvbnMkcGxhY2VtZW50LFxuICAgICAgX29wdGlvbnMkYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMkYm91bmRhcnkgPT09IHZvaWQgMCA/IGNsaXBwaW5nUGFyZW50cyA6IF9vcHRpb25zJGJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyB2aWV3cG9ydCA6IF9vcHRpb25zJHJvb3RCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJGVsZW1lbnRDb250ZSA9IF9vcHRpb25zLmVsZW1lbnRDb250ZXh0LFxuICAgICAgZWxlbWVudENvbnRleHQgPSBfb3B0aW9ucyRlbGVtZW50Q29udGUgPT09IHZvaWQgMCA/IHBvcHBlciA6IF9vcHRpb25zJGVsZW1lbnRDb250ZSxcbiAgICAgIF9vcHRpb25zJGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IF9vcHRpb25zJGFsdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcGFkZGluZyA9IF9vcHRpb25zLnBhZGRpbmcsXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMkcGFkZGluZyA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHBhZGRpbmc7XG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKTtcbiAgdmFyIGFsdENvbnRleHQgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcmVmZXJlbmNlIDogcG9wcGVyO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1thbHRCb3VuZGFyeSA/IGFsdENvbnRleHQgOiBlbGVtZW50Q29udGV4dF07XG4gIHZhciBjbGlwcGluZ0NsaWVudFJlY3QgPSBnZXRDbGlwcGluZ1JlY3QoaXNFbGVtZW50KGVsZW1lbnQpID8gZWxlbWVudCA6IGVsZW1lbnQuY29udGV4dEVsZW1lbnQgfHwgZ2V0RG9jdW1lbnRFbGVtZW50KHN0YXRlLmVsZW1lbnRzLnBvcHBlciksIGJvdW5kYXJ5LCByb290Qm91bmRhcnkpO1xuICB2YXIgcmVmZXJlbmNlQ2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChzdGF0ZS5lbGVtZW50cy5yZWZlcmVuY2UpO1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUNsaWVudFJlY3QsXG4gICAgZWxlbWVudDogcG9wcGVyUmVjdCxcbiAgICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KTtcbiAgdmFyIHBvcHBlckNsaWVudFJlY3QgPSByZWN0VG9DbGllbnRSZWN0KE9iamVjdC5hc3NpZ24oe30sIHBvcHBlclJlY3QsIHBvcHBlck9mZnNldHMpKTtcbiAgdmFyIGVsZW1lbnRDbGllbnRSZWN0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHBvcHBlckNsaWVudFJlY3QgOiByZWZlcmVuY2VDbGllbnRSZWN0OyAvLyBwb3NpdGl2ZSA9IG92ZXJmbG93aW5nIHRoZSBjbGlwcGluZyByZWN0XG4gIC8vIDAgb3IgbmVnYXRpdmUgPSB3aXRoaW4gdGhlIGNsaXBwaW5nIHJlY3RcblxuICB2YXIgb3ZlcmZsb3dPZmZzZXRzID0ge1xuICAgIHRvcDogY2xpcHBpbmdDbGllbnRSZWN0LnRvcCAtIGVsZW1lbnRDbGllbnRSZWN0LnRvcCArIHBhZGRpbmdPYmplY3QudG9wLFxuICAgIGJvdHRvbTogZWxlbWVudENsaWVudFJlY3QuYm90dG9tIC0gY2xpcHBpbmdDbGllbnRSZWN0LmJvdHRvbSArIHBhZGRpbmdPYmplY3QuYm90dG9tLFxuICAgIGxlZnQ6IGNsaXBwaW5nQ2xpZW50UmVjdC5sZWZ0IC0gZWxlbWVudENsaWVudFJlY3QubGVmdCArIHBhZGRpbmdPYmplY3QubGVmdCxcbiAgICByaWdodDogZWxlbWVudENsaWVudFJlY3QucmlnaHQgLSBjbGlwcGluZ0NsaWVudFJlY3QucmlnaHQgKyBwYWRkaW5nT2JqZWN0LnJpZ2h0XG4gIH07XG4gIHZhciBvZmZzZXREYXRhID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQ7IC8vIE9mZnNldHMgY2FuIGJlIGFwcGxpZWQgb25seSB0byB0aGUgcG9wcGVyIGVsZW1lbnRcblxuICBpZiAoZWxlbWVudENvbnRleHQgPT09IHBvcHBlciAmJiBvZmZzZXREYXRhKSB7XG4gICAgdmFyIG9mZnNldCA9IG9mZnNldERhdGFbcGxhY2VtZW50XTtcbiAgICBPYmplY3Qua2V5cyhvdmVyZmxvd09mZnNldHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIG11bHRpcGx5ID0gW3JpZ2h0LCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gMSA6IC0xO1xuICAgICAgdmFyIGF4aXMgPSBbdG9wLCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gJ3knIDogJ3gnO1xuICAgICAgb3ZlcmZsb3dPZmZzZXRzW2tleV0gKz0gb2Zmc2V0W2F4aXNdICogbXVsdGlwbHk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gb3ZlcmZsb3dPZmZzZXRzO1xufVxuXG52YXIgSU5WQUxJRF9FTEVNRU5UX0VSUk9SID0gJ1BvcHBlcjogSW52YWxpZCByZWZlcmVuY2Ugb3IgcG9wcGVyIGFyZ3VtZW50IHByb3ZpZGVkLiBUaGV5IG11c3QgYmUgZWl0aGVyIGEgRE9NIGVsZW1lbnQgb3IgdmlydHVhbCBlbGVtZW50Lic7XG52YXIgSU5GSU5JVEVfTE9PUF9FUlJPUiA9ICdQb3BwZXI6IEFuIGluZmluaXRlIGxvb3AgaW4gdGhlIG1vZGlmaWVycyBjeWNsZSBoYXMgYmVlbiBkZXRlY3RlZCEgVGhlIGN5Y2xlIGhhcyBiZWVuIGludGVycnVwdGVkIHRvIHByZXZlbnQgYSBicm93c2VyIGNyYXNoLic7XG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICBtb2RpZmllcnM6IFtdLFxuICBzdHJhdGVneTogJ2Fic29sdXRlJ1xufTtcblxuZnVuY3Rpb24gYXJlVmFsaWRFbGVtZW50cygpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiAhYXJncy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgcmV0dXJuICEoZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPT09ICdmdW5jdGlvbicpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcG9wcGVyR2VuZXJhdG9yKGdlbmVyYXRvck9wdGlvbnMpIHtcbiAgaWYgKGdlbmVyYXRvck9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIGdlbmVyYXRvck9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfZ2VuZXJhdG9yT3B0aW9ucyA9IGdlbmVyYXRvck9wdGlvbnMsXG4gICAgICBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0TW9kaWZpZXJzLFxuICAgICAgZGVmYXVsdE1vZGlmaWVycyA9IF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9PT0gdm9pZCAwID8gW10gOiBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYsXG4gICAgICBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyID0gX2dlbmVyYXRvck9wdGlvbnMuZGVmYXVsdE9wdGlvbnMsXG4gICAgICBkZWZhdWx0T3B0aW9ucyA9IF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPT09IHZvaWQgMCA/IERFRkFVTFRfT1BUSU9OUyA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZjI7XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVQb3BwZXIocmVmZXJlbmNlLCBwb3BwZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0gZGVmYXVsdE9wdGlvbnM7XG4gICAgfVxuXG4gICAgdmFyIHN0YXRlID0ge1xuICAgICAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgICAgIG9yZGVyZWRNb2RpZmllcnM6IFtdLFxuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TLCBkZWZhdWx0T3B0aW9ucyksXG4gICAgICBtb2RpZmllcnNEYXRhOiB7fSxcbiAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlLFxuICAgICAgICBwb3BwZXI6IHBvcHBlclxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgc3R5bGVzOiB7fVxuICAgIH07XG4gICAgdmFyIGVmZmVjdENsZWFudXBGbnMgPSBbXTtcbiAgICB2YXIgaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB2YXIgaW5zdGFuY2UgPSB7XG4gICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICBzZXRPcHRpb25zOiBmdW5jdGlvbiBzZXRPcHRpb25zKHNldE9wdGlvbnNBY3Rpb24pIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygc2V0T3B0aW9uc0FjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IHNldE9wdGlvbnNBY3Rpb24oc3RhdGUub3B0aW9ucykgOiBzZXRPcHRpb25zQWN0aW9uO1xuICAgICAgICBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIHN0YXRlLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucywgc3RhdGUub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIHN0YXRlLnNjcm9sbFBhcmVudHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBpc0VsZW1lbnQocmVmZXJlbmNlKSA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZSkgOiByZWZlcmVuY2UuY29udGV4dEVsZW1lbnQgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UuY29udGV4dEVsZW1lbnQpIDogW10sXG4gICAgICAgICAgcG9wcGVyOiBsaXN0U2Nyb2xsUGFyZW50cyhwb3BwZXIpXG4gICAgICAgIH07IC8vIE9yZGVycyB0aGUgbW9kaWZpZXJzIGJhc2VkIG9uIHRoZWlyIGRlcGVuZGVuY2llcyBhbmQgYHBoYXNlYFxuICAgICAgICAvLyBwcm9wZXJ0aWVzXG5cbiAgICAgICAgdmFyIG9yZGVyZWRNb2RpZmllcnMgPSBvcmRlck1vZGlmaWVycyhtZXJnZUJ5TmFtZShbXS5jb25jYXQoZGVmYXVsdE1vZGlmaWVycywgc3RhdGUub3B0aW9ucy5tb2RpZmllcnMpKSk7IC8vIFN0cmlwIG91dCBkaXNhYmxlZCBtb2RpZmllcnNcblxuICAgICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzID0gb3JkZXJlZE1vZGlmaWVycy5maWx0ZXIoZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICByZXR1cm4gbS5lbmFibGVkO1xuICAgICAgICB9KTsgLy8gVmFsaWRhdGUgdGhlIHByb3ZpZGVkIG1vZGlmaWVycyBzbyB0aGF0IHRoZSBjb25zdW1lciB3aWxsIGdldCB3YXJuZWRcbiAgICAgICAgLy8gaWYgb25lIG9mIHRoZSBtb2RpZmllcnMgaXMgaW52YWxpZCBmb3IgYW55IHJlYXNvblxuXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICB2YXIgbW9kaWZpZXJzID0gdW5pcXVlQnkoW10uY29uY2F0KG9yZGVyZWRNb2RpZmllcnMsIHN0YXRlLm9wdGlvbnMubW9kaWZpZXJzKSwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gX3JlZi5uYW1lO1xuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFsaWRhdGVNb2RpZmllcnMobW9kaWZpZXJzKTtcblxuICAgICAgICAgIGlmIChnZXRCYXNlUGxhY2VtZW50KHN0YXRlLm9wdGlvbnMucGxhY2VtZW50KSA9PT0gYXV0bykge1xuICAgICAgICAgICAgdmFyIGZsaXBNb2RpZmllciA9IHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZmluZChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgICAgICAgdmFyIG5hbWUgPSBfcmVmMi5uYW1lO1xuICAgICAgICAgICAgICByZXR1cm4gbmFtZSA9PT0gJ2ZsaXAnO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghZmxpcE1vZGlmaWVyKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoWydQb3BwZXI6IFwiYXV0b1wiIHBsYWNlbWVudHMgcmVxdWlyZSB0aGUgXCJmbGlwXCIgbW9kaWZpZXIgYmUnLCAncHJlc2VudCBhbmQgZW5hYmxlZCB0byB3b3JrLiddLmpvaW4oJyAnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShwb3BwZXIpLFxuICAgICAgICAgICAgICBtYXJnaW5Ub3AgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5Ub3AsXG4gICAgICAgICAgICAgIG1hcmdpblJpZ2h0ID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luUmlnaHQsXG4gICAgICAgICAgICAgIG1hcmdpbkJvdHRvbSA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpbkJvdHRvbSxcbiAgICAgICAgICAgICAgbWFyZ2luTGVmdCA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpbkxlZnQ7IC8vIFdlIG5vIGxvbmdlciB0YWtlIGludG8gYWNjb3VudCBgbWFyZ2luc2Agb24gdGhlIHBvcHBlciwgYW5kIGl0IGNhblxuICAgICAgICAgIC8vIGNhdXNlIGJ1Z3Mgd2l0aCBwb3NpdGlvbmluZywgc28gd2UnbGwgd2FybiB0aGUgY29uc3VtZXJcblxuXG4gICAgICAgICAgaWYgKFttYXJnaW5Ub3AsIG1hcmdpblJpZ2h0LCBtYXJnaW5Cb3R0b20sIG1hcmdpbkxlZnRdLnNvbWUoZnVuY3Rpb24gKG1hcmdpbikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQobWFyZ2luKTtcbiAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFsnUG9wcGVyOiBDU1MgXCJtYXJnaW5cIiBzdHlsZXMgY2Fubm90IGJlIHVzZWQgdG8gYXBwbHkgcGFkZGluZycsICdiZXR3ZWVuIHRoZSBwb3BwZXIgYW5kIGl0cyByZWZlcmVuY2UgZWxlbWVudCBvciBib3VuZGFyeS4nLCAnVG8gcmVwbGljYXRlIG1hcmdpbiwgdXNlIHRoZSBgb2Zmc2V0YCBtb2RpZmllciwgYXMgd2VsbCBhcycsICd0aGUgYHBhZGRpbmdgIG9wdGlvbiBpbiB0aGUgYHByZXZlbnRPdmVyZmxvd2AgYW5kIGBmbGlwYCcsICdtb2RpZmllcnMuJ10uam9pbignICcpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBydW5Nb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIC8vIFN5bmMgdXBkYXRlIFx1MjAxMyBpdCB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZCwgZXZlbiBpZiBub3QgbmVjZXNzYXJ5LiBUaGlzXG4gICAgICAvLyBpcyB1c2VmdWwgZm9yIGxvdyBmcmVxdWVuY3kgdXBkYXRlcyB3aGVyZSBzeW5jIGJlaGF2aW9yIHNpbXBsaWZpZXMgdGhlXG4gICAgICAvLyBsb2dpYy5cbiAgICAgIC8vIEZvciBoaWdoIGZyZXF1ZW5jeSB1cGRhdGVzIChlLmcuIGByZXNpemVgIGFuZCBgc2Nyb2xsYCBldmVudHMpLCBhbHdheXNcbiAgICAgIC8vIHByZWZlciB0aGUgYXN5bmMgUG9wcGVyI3VwZGF0ZSBtZXRob2RcbiAgICAgIGZvcmNlVXBkYXRlOiBmdW5jdGlvbiBmb3JjZVVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKGlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9zdGF0ZSRlbGVtZW50cyA9IHN0YXRlLmVsZW1lbnRzLFxuICAgICAgICAgICAgcmVmZXJlbmNlID0gX3N0YXRlJGVsZW1lbnRzLnJlZmVyZW5jZSxcbiAgICAgICAgICAgIHBvcHBlciA9IF9zdGF0ZSRlbGVtZW50cy5wb3BwZXI7IC8vIERvbid0IHByb2NlZWQgaWYgYHJlZmVyZW5jZWAgb3IgYHBvcHBlcmAgYXJlIG5vdCB2YWxpZCBlbGVtZW50c1xuICAgICAgICAvLyBhbnltb3JlXG5cbiAgICAgICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoSU5WQUxJRF9FTEVNRU5UX0VSUk9SKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gU3RvcmUgdGhlIHJlZmVyZW5jZSBhbmQgcG9wcGVyIHJlY3RzIHRvIGJlIHJlYWQgYnkgbW9kaWZpZXJzXG5cblxuICAgICAgICBzdGF0ZS5yZWN0cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGdldENvbXBvc2l0ZVJlY3QocmVmZXJlbmNlLCBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKSwgc3RhdGUub3B0aW9ucy5zdHJhdGVneSA9PT0gJ2ZpeGVkJyksXG4gICAgICAgICAgcG9wcGVyOiBnZXRMYXlvdXRSZWN0KHBvcHBlcilcbiAgICAgICAgfTsgLy8gTW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gcmVzZXQgdGhlIGN1cnJlbnQgdXBkYXRlIGN5Y2xlLiBUaGVcbiAgICAgICAgLy8gbW9zdCBjb21tb24gdXNlIGNhc2UgZm9yIHRoaXMgaXMgdGhlIGBmbGlwYCBtb2RpZmllciBjaGFuZ2luZyB0aGVcbiAgICAgICAgLy8gcGxhY2VtZW50LCB3aGljaCB0aGVuIG5lZWRzIHRvIHJlLXJ1biBhbGwgdGhlIG1vZGlmaWVycywgYmVjYXVzZSB0aGVcbiAgICAgICAgLy8gbG9naWMgd2FzIHByZXZpb3VzbHkgcmFuIGZvciB0aGUgcHJldmlvdXMgcGxhY2VtZW50IGFuZCBpcyB0aGVyZWZvcmVcbiAgICAgICAgLy8gc3RhbGUvaW5jb3JyZWN0XG5cbiAgICAgICAgc3RhdGUucmVzZXQgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUucGxhY2VtZW50ID0gc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQ7IC8vIE9uIGVhY2ggdXBkYXRlIGN5Y2xlLCB0aGUgYG1vZGlmaWVyc0RhdGFgIHByb3BlcnR5IGZvciBlYWNoIG1vZGlmaWVyXG4gICAgICAgIC8vIGlzIGZpbGxlZCB3aXRoIHRoZSBpbml0aWFsIGRhdGEgc3BlY2lmaWVkIGJ5IHRoZSBtb2RpZmllci4gVGhpcyBtZWFuc1xuICAgICAgICAvLyBpdCBkb2Vzbid0IHBlcnNpc3QgYW5kIGlzIGZyZXNoIG9uIGVhY2ggdXBkYXRlLlxuICAgICAgICAvLyBUbyBlbnN1cmUgcGVyc2lzdGVudCBkYXRhLCB1c2UgYCR7bmFtZX0jcGVyc2lzdGVudGBcblxuICAgICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlLm1vZGlmaWVyc0RhdGFbbW9kaWZpZXIubmFtZV0gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RpZmllci5kYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBfX2RlYnVnX2xvb3BzX18gPSAwO1xuXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICAgIF9fZGVidWdfbG9vcHNfXyArPSAxO1xuXG4gICAgICAgICAgICBpZiAoX19kZWJ1Z19sb29wc19fID4gMTAwKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoSU5GSU5JVEVfTE9PUF9FUlJPUik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzdGF0ZS5yZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgc3RhdGUucmVzZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3N0YXRlJG9yZGVyZWRNb2RpZmllID0gc3RhdGUub3JkZXJlZE1vZGlmaWVyc1tpbmRleF0sXG4gICAgICAgICAgICAgIGZuID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLmZuLFxuICAgICAgICAgICAgICBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLm9wdGlvbnMsXG4gICAgICAgICAgICAgIF9vcHRpb25zID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9PT0gdm9pZCAwID8ge30gOiBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyLFxuICAgICAgICAgICAgICBuYW1lID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLm5hbWU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGZuKHtcbiAgICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgICBvcHRpb25zOiBfb3B0aW9ucyxcbiAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgICAgICAgICB9KSB8fCBzdGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBBc3luYyBhbmQgb3B0aW1pc3RpY2FsbHkgb3B0aW1pemVkIHVwZGF0ZSBcdTIwMTMgaXQgd2lsbCBub3QgYmUgZXhlY3V0ZWQgaWZcbiAgICAgIC8vIG5vdCBuZWNlc3NhcnkgKGRlYm91bmNlZCB0byBydW4gYXQgbW9zdCBvbmNlLXBlci10aWNrKVxuICAgICAgdXBkYXRlOiBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIGluc3RhbmNlLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgICAgcmVzb2x2ZShzdGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIGlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKElOVkFMSURfRUxFTUVOVF9FUlJPUik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zZXRPcHRpb25zKG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICBpZiAoIWlzRGVzdHJveWVkICYmIG9wdGlvbnMub25GaXJzdFVwZGF0ZSkge1xuICAgICAgICBvcHRpb25zLm9uRmlyc3RVcGRhdGUoc3RhdGUpO1xuICAgICAgfVxuICAgIH0pOyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byBleGVjdXRlIGFyYml0cmFyeSBjb2RlIGJlZm9yZSB0aGUgZmlyc3RcbiAgICAvLyB1cGRhdGUgY3ljbGUgcnVucy4gVGhleSB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSB1cGRhdGVcbiAgICAvLyBjeWNsZS4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIG1vZGlmaWVyIGFkZHMgc29tZSBwZXJzaXN0ZW50IGRhdGEgdGhhdFxuICAgIC8vIG90aGVyIG1vZGlmaWVycyBuZWVkIHRvIHVzZSwgYnV0IHRoZSBtb2RpZmllciBpcyBydW4gYWZ0ZXIgdGhlIGRlcGVuZGVudFxuICAgIC8vIG9uZS5cblxuICAgIGZ1bmN0aW9uIHJ1bk1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBfcmVmMy5uYW1lLFxuICAgICAgICAgICAgX3JlZjMkb3B0aW9ucyA9IF9yZWYzLm9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zID0gX3JlZjMkb3B0aW9ucyA9PT0gdm9pZCAwID8ge30gOiBfcmVmMyRvcHRpb25zLFxuICAgICAgICAgICAgZWZmZWN0ID0gX3JlZjMuZWZmZWN0O1xuXG4gICAgICAgIGlmICh0eXBlb2YgZWZmZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNsZWFudXBGbiA9IGVmZmVjdCh7XG4gICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdmFyIG5vb3BGbiA9IGZ1bmN0aW9uIG5vb3BGbigpIHt9O1xuXG4gICAgICAgICAgZWZmZWN0Q2xlYW51cEZucy5wdXNoKGNsZWFudXBGbiB8fCBub29wRm4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgZWZmZWN0Q2xlYW51cEZucy5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgIH0pO1xuICAgICAgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcbn1cblxudmFyIHBhc3NpdmUgPSB7XG4gIHBhc3NpdmU6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGVmZmVjdCQyKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRzY3JvbGwgPSBvcHRpb25zLnNjcm9sbCxcbiAgICAgIHNjcm9sbCA9IF9vcHRpb25zJHNjcm9sbCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHNjcm9sbCxcbiAgICAgIF9vcHRpb25zJHJlc2l6ZSA9IG9wdGlvbnMucmVzaXplLFxuICAgICAgcmVzaXplID0gX29wdGlvbnMkcmVzaXplID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcmVzaXplO1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KHN0YXRlLmVsZW1lbnRzLnBvcHBlcik7XG4gIHZhciBzY3JvbGxQYXJlbnRzID0gW10uY29uY2F0KHN0YXRlLnNjcm9sbFBhcmVudHMucmVmZXJlbmNlLCBzdGF0ZS5zY3JvbGxQYXJlbnRzLnBvcHBlcik7XG5cbiAgaWYgKHNjcm9sbCkge1xuICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICBzY3JvbGxQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChyZXNpemUpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNjcm9sbCkge1xuICAgICAgc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JvbGxQYXJlbnQpIHtcbiAgICAgICAgc2Nyb2xsUGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocmVzaXplKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG52YXIgZXZlbnRMaXN0ZW5lcnMgPSB7XG4gIG5hbWU6ICdldmVudExpc3RlbmVycycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogZnVuY3Rpb24gZm4oKSB7fSxcbiAgZWZmZWN0OiBlZmZlY3QkMixcbiAgZGF0YToge31cbn07XG5cbmZ1bmN0aW9uIHBvcHBlck9mZnNldHMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgLy8gT2Zmc2V0cyBhcmUgdGhlIGFjdHVhbCBwb3NpdGlvbiB0aGUgcG9wcGVyIG5lZWRzIHRvIGhhdmUgdG8gYmVcbiAgLy8gcHJvcGVybHkgcG9zaXRpb25lZCBuZWFyIGl0cyByZWZlcmVuY2UgZWxlbWVudFxuICAvLyBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIHBsYWNlbWVudCwgYW5kIHdpbGwgYmUgYWRqdXN0ZWQgYnlcbiAgLy8gdGhlIG1vZGlmaWVycyBpbiB0aGUgbmV4dCBzdGVwXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiBzdGF0ZS5yZWN0cy5yZWZlcmVuY2UsXG4gICAgZWxlbWVudDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxudmFyIHBvcHBlck9mZnNldHMkMSA9IHtcbiAgbmFtZTogJ3BvcHBlck9mZnNldHMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3JlYWQnLFxuICBmbjogcG9wcGVyT2Zmc2V0cyxcbiAgZGF0YToge31cbn07XG5cbnZhciB1bnNldFNpZGVzID0ge1xuICB0b3A6ICdhdXRvJyxcbiAgcmlnaHQ6ICdhdXRvJyxcbiAgYm90dG9tOiAnYXV0bycsXG4gIGxlZnQ6ICdhdXRvJ1xufTsgLy8gUm91bmQgdGhlIG9mZnNldHMgdG8gdGhlIG5lYXJlc3Qgc3VpdGFibGUgc3VicGl4ZWwgYmFzZWQgb24gdGhlIERQUi5cbi8vIFpvb21pbmcgY2FuIGNoYW5nZSB0aGUgRFBSLCBidXQgaXQgc2VlbXMgdG8gcmVwb3J0IGEgdmFsdWUgdGhhdCB3aWxsXG4vLyBjbGVhbmx5IGRpdmlkZSB0aGUgdmFsdWVzIGludG8gdGhlIGFwcHJvcHJpYXRlIHN1YnBpeGVscy5cblxuZnVuY3Rpb24gcm91bmRPZmZzZXRzQnlEUFIoX3JlZikge1xuICB2YXIgeCA9IF9yZWYueCxcbiAgICAgIHkgPSBfcmVmLnk7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG4gIHZhciBkcHIgPSB3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICByZXR1cm4ge1xuICAgIHg6IHJvdW5kKHggKiBkcHIpIC8gZHByIHx8IDAsXG4gICAgeTogcm91bmQoeSAqIGRwcikgLyBkcHIgfHwgMFxuICB9O1xufVxuXG5mdW5jdGlvbiBtYXBUb1N0eWxlcyhfcmVmMikge1xuICB2YXIgX09iamVjdCRhc3NpZ24yO1xuXG4gIHZhciBwb3BwZXIgPSBfcmVmMi5wb3BwZXIsXG4gICAgICBwb3BwZXJSZWN0ID0gX3JlZjIucG9wcGVyUmVjdCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYyLnBsYWNlbWVudCxcbiAgICAgIHZhcmlhdGlvbiA9IF9yZWYyLnZhcmlhdGlvbixcbiAgICAgIG9mZnNldHMgPSBfcmVmMi5vZmZzZXRzLFxuICAgICAgcG9zaXRpb24gPSBfcmVmMi5wb3NpdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9yZWYyLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGFkYXB0aXZlID0gX3JlZjIuYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHMgPSBfcmVmMi5yb3VuZE9mZnNldHMsXG4gICAgICBpc0ZpeGVkID0gX3JlZjIuaXNGaXhlZDtcblxuICB2YXIgX3JlZjMgPSByb3VuZE9mZnNldHMgPT09IHRydWUgPyByb3VuZE9mZnNldHNCeURQUihvZmZzZXRzKSA6IHR5cGVvZiByb3VuZE9mZnNldHMgPT09ICdmdW5jdGlvbicgPyByb3VuZE9mZnNldHMob2Zmc2V0cykgOiBvZmZzZXRzLFxuICAgICAgX3JlZjMkeCA9IF9yZWYzLngsXG4gICAgICB4ID0gX3JlZjMkeCA9PT0gdm9pZCAwID8gMCA6IF9yZWYzJHgsXG4gICAgICBfcmVmMyR5ID0gX3JlZjMueSxcbiAgICAgIHkgPSBfcmVmMyR5ID09PSB2b2lkIDAgPyAwIDogX3JlZjMkeTtcblxuICB2YXIgaGFzWCA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3gnKTtcbiAgdmFyIGhhc1kgPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd5Jyk7XG4gIHZhciBzaWRlWCA9IGxlZnQ7XG4gIHZhciBzaWRlWSA9IHRvcDtcbiAgdmFyIHdpbiA9IHdpbmRvdztcblxuICBpZiAoYWRhcHRpdmUpIHtcbiAgICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KHBvcHBlcik7XG4gICAgdmFyIGhlaWdodFByb3AgPSAnY2xpZW50SGVpZ2h0JztcbiAgICB2YXIgd2lkdGhQcm9wID0gJ2NsaWVudFdpZHRoJztcblxuICAgIGlmIChvZmZzZXRQYXJlbnQgPT09IGdldFdpbmRvdyhwb3BwZXIpKSB7XG4gICAgICBvZmZzZXRQYXJlbnQgPSBnZXREb2N1bWVudEVsZW1lbnQocG9wcGVyKTtcblxuICAgICAgaWYgKGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiAhPT0gJ3N0YXRpYycgJiYgcG9zaXRpb24gPT09ICdhYnNvbHV0ZScpIHtcbiAgICAgICAgaGVpZ2h0UHJvcCA9ICdzY3JvbGxIZWlnaHQnO1xuICAgICAgICB3aWR0aFByb3AgPSAnc2Nyb2xsV2lkdGgnO1xuICAgICAgfVxuICAgIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FzdF06IGZvcmNlIHR5cGUgcmVmaW5lbWVudCwgd2UgY29tcGFyZSBvZmZzZXRQYXJlbnQgd2l0aCB3aW5kb3cgYWJvdmUsIGJ1dCBGbG93IGRvZXNuJ3QgZGV0ZWN0IGl0XG5cblxuICAgIG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudDtcblxuICAgIGlmIChwbGFjZW1lbnQgPT09IHRvcCB8fCAocGxhY2VtZW50ID09PSBsZWZ0IHx8IHBsYWNlbWVudCA9PT0gcmlnaHQpICYmIHZhcmlhdGlvbiA9PT0gZW5kKSB7XG4gICAgICBzaWRlWSA9IGJvdHRvbTtcbiAgICAgIHZhciBvZmZzZXRZID0gaXNGaXhlZCAmJiB3aW4udmlzdWFsVmlld3BvcnQgPyB3aW4udmlzdWFsVmlld3BvcnQuaGVpZ2h0IDogLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgICBvZmZzZXRQYXJlbnRbaGVpZ2h0UHJvcF07XG4gICAgICB5IC09IG9mZnNldFkgLSBwb3BwZXJSZWN0LmhlaWdodDtcbiAgICAgIHkgKj0gZ3B1QWNjZWxlcmF0aW9uID8gMSA6IC0xO1xuICAgIH1cblxuICAgIGlmIChwbGFjZW1lbnQgPT09IGxlZnQgfHwgKHBsYWNlbWVudCA9PT0gdG9wIHx8IHBsYWNlbWVudCA9PT0gYm90dG9tKSAmJiB2YXJpYXRpb24gPT09IGVuZCkge1xuICAgICAgc2lkZVggPSByaWdodDtcbiAgICAgIHZhciBvZmZzZXRYID0gaXNGaXhlZCAmJiB3aW4udmlzdWFsVmlld3BvcnQgPyB3aW4udmlzdWFsVmlld3BvcnQud2lkdGggOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgIG9mZnNldFBhcmVudFt3aWR0aFByb3BdO1xuICAgICAgeCAtPSBvZmZzZXRYIC0gcG9wcGVyUmVjdC53aWR0aDtcbiAgICAgIHggKj0gZ3B1QWNjZWxlcmF0aW9uID8gMSA6IC0xO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb21tb25TdHlsZXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICBwb3NpdGlvbjogcG9zaXRpb25cbiAgfSwgYWRhcHRpdmUgJiYgdW5zZXRTaWRlcyk7XG5cbiAgaWYgKGdwdUFjY2VsZXJhdGlvbikge1xuICAgIHZhciBfT2JqZWN0JGFzc2lnbjtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbiA9IHt9LCBfT2JqZWN0JGFzc2lnbltzaWRlWV0gPSBoYXNZID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduW3NpZGVYXSA9IGhhc1ggPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ24udHJhbnNmb3JtID0gKHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpIDw9IDEgPyBcInRyYW5zbGF0ZShcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4KVwiIDogXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4LCAwKVwiLCBfT2JqZWN0JGFzc2lnbikpO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduMiA9IHt9LCBfT2JqZWN0JGFzc2lnbjJbc2lkZVldID0gaGFzWSA/IHkgKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yW3NpZGVYXSA9IGhhc1ggPyB4ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMi50cmFuc2Zvcm0gPSAnJywgX09iamVjdCRhc3NpZ24yKSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZXMoX3JlZjQpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjQuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjQub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9IG9wdGlvbnMuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgZ3B1QWNjZWxlcmF0aW9uID0gX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZ3B1QWNjZWxlcmF0LFxuICAgICAgX29wdGlvbnMkYWRhcHRpdmUgPSBvcHRpb25zLmFkYXB0aXZlLFxuICAgICAgYWRhcHRpdmUgPSBfb3B0aW9ucyRhZGFwdGl2ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGFkYXB0aXZlLFxuICAgICAgX29wdGlvbnMkcm91bmRPZmZzZXRzID0gb3B0aW9ucy5yb3VuZE9mZnNldHMsXG4gICAgICByb3VuZE9mZnNldHMgPSBfb3B0aW9ucyRyb3VuZE9mZnNldHMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRyb3VuZE9mZnNldHM7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHZhciB0cmFuc2l0aW9uUHJvcGVydHkgPSBnZXRDb21wdXRlZFN0eWxlKHN0YXRlLmVsZW1lbnRzLnBvcHBlcikudHJhbnNpdGlvblByb3BlcnR5IHx8ICcnO1xuXG4gICAgaWYgKGFkYXB0aXZlICYmIFsndHJhbnNmb3JtJywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLnNvbWUoZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICByZXR1cm4gdHJhbnNpdGlvblByb3BlcnR5LmluZGV4T2YocHJvcGVydHkpID49IDA7XG4gICAgfSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihbJ1BvcHBlcjogRGV0ZWN0ZWQgQ1NTIHRyYW5zaXRpb25zIG9uIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nJywgJ0NTUyBwcm9wZXJ0aWVzOiBcInRyYW5zZm9ybVwiLCBcInRvcFwiLCBcInJpZ2h0XCIsIFwiYm90dG9tXCIsIFwibGVmdFwiLicsICdcXG5cXG4nLCAnRGlzYWJsZSB0aGUgXCJjb21wdXRlU3R5bGVzXCIgbW9kaWZpZXJcXCdzIGBhZGFwdGl2ZWAgb3B0aW9uIHRvIGFsbG93JywgJ2ZvciBzbW9vdGggdHJhbnNpdGlvbnMsIG9yIHJlbW92ZSB0aGVzZSBwcm9wZXJ0aWVzIGZyb20gdGhlIENTUycsICd0cmFuc2l0aW9uIGRlY2xhcmF0aW9uIG9uIHRoZSBwb3BwZXIgZWxlbWVudCBpZiBvbmx5IHRyYW5zaXRpb25pbmcnLCAnb3BhY2l0eSBvciBiYWNrZ3JvdW5kLWNvbG9yIGZvciBleGFtcGxlLicsICdcXG5cXG4nLCAnV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBwb3BwZXIgZWxlbWVudCBhcyBhIHdyYXBwZXIgYXJvdW5kIGFuIGlubmVyJywgJ2VsZW1lbnQgdGhhdCBjYW4gaGF2ZSBhbnkgQ1NTIHByb3BlcnR5IHRyYW5zaXRpb25lZCBmb3IgYW5pbWF0aW9ucy4nXS5qb2luKCcgJykpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb21tb25TdHlsZXMgPSB7XG4gICAgcGxhY2VtZW50OiBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCksXG4gICAgdmFyaWF0aW9uOiBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KSxcbiAgICBwb3BwZXI6IHN0YXRlLmVsZW1lbnRzLnBvcHBlcixcbiAgICBwb3BwZXJSZWN0OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiBncHVBY2NlbGVyYXRpb24sXG4gICAgaXNGaXhlZDogc3RhdGUub3B0aW9ucy5zdHJhdGVneSA9PT0gJ2ZpeGVkJ1xuICB9O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMucG9wcGVyLCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgYWRhcHRpdmU6IGFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3cgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5hcnJvdyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5hcnJvdywgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93LFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBhZGFwdGl2ZTogZmFsc2UsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCc6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbnZhciBjb21wdXRlU3R5bGVzJDEgPSB7XG4gIG5hbWU6ICdjb21wdXRlU3R5bGVzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdiZWZvcmVXcml0ZScsXG4gIGZuOiBjb21wdXRlU3R5bGVzLFxuICBkYXRhOiB7fVxufTtcblxuLy8gYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUgSFRNTEVsZW1lbnRzIHN1Y2ggYXMgcG9wcGVyIGFuZCBhcnJvd1xuXG5mdW5jdGlvbiBhcHBseVN0eWxlcyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGU7XG4gIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIHN0eWxlID0gc3RhdGUuc3R5bGVzW25hbWVdIHx8IHt9O1xuICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdOyAvLyBhcnJvdyBpcyBvcHRpb25hbCArIHZpcnR1YWwgZWxlbWVudHNcblxuICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEZsb3cgZG9lc24ndCBzdXBwb3J0IHRvIGV4dGVuZCB0aGlzIHByb3BlcnR5LCBidXQgaXQncyB0aGUgbW9zdFxuICAgIC8vIGVmZmVjdGl2ZSB3YXkgdG8gYXBwbHkgc3R5bGVzIHRvIGFuIEhUTUxFbGVtZW50XG4gICAgLy8gJEZsb3dGaXhNZVtjYW5ub3Qtd3JpdGVdXG5cblxuICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSA9PT0gdHJ1ZSA/ICcnIDogdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0JDEoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGU7XG4gIHZhciBpbml0aWFsU3R5bGVzID0ge1xuICAgIHBvcHBlcjoge1xuICAgICAgcG9zaXRpb246IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBsZWZ0OiAnMCcsXG4gICAgICB0b3A6ICcwJyxcbiAgICAgIG1hcmdpbjogJzAnXG4gICAgfSxcbiAgICBhcnJvdzoge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICB9LFxuICAgIHJlZmVyZW5jZToge31cbiAgfTtcbiAgT2JqZWN0LmFzc2lnbihzdGF0ZS5lbGVtZW50cy5wb3BwZXIuc3R5bGUsIGluaXRpYWxTdHlsZXMucG9wcGVyKTtcbiAgc3RhdGUuc3R5bGVzID0gaW5pdGlhbFN0eWxlcztcblxuICBpZiAoc3RhdGUuZWxlbWVudHMuYXJyb3cpIHtcbiAgICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLmFycm93LnN0eWxlLCBpbml0aWFsU3R5bGVzLmFycm93KTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgT2JqZWN0LmtleXMoc3RhdGUuZWxlbWVudHMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbbmFtZV07XG4gICAgICB2YXIgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG4gICAgICB2YXIgc3R5bGVQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoc3RhdGUuc3R5bGVzLmhhc093blByb3BlcnR5KG5hbWUpID8gc3RhdGUuc3R5bGVzW25hbWVdIDogaW5pdGlhbFN0eWxlc1tuYW1lXSk7IC8vIFNldCBhbGwgdmFsdWVzIHRvIGFuIGVtcHR5IHN0cmluZyB0byB1bnNldCB0aGVtXG5cbiAgICAgIHZhciBzdHlsZSA9IHN0eWxlUHJvcGVydGllcy5yZWR1Y2UoZnVuY3Rpb24gKHN0eWxlLCBwcm9wZXJ0eSkge1xuICAgICAgICBzdHlsZVtwcm9wZXJ0eV0gPSAnJztcbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgfSwge30pOyAvLyBhcnJvdyBpcyBvcHRpb25hbCArIHZpcnR1YWwgZWxlbWVudHNcblxuICAgICAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8ICFnZXROb2RlTmFtZShlbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuICAgICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbnZhciBhcHBseVN0eWxlcyQxID0ge1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGFwcGx5U3R5bGVzLFxuICBlZmZlY3Q6IGVmZmVjdCQxLFxuICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ11cbn07XG5cbmZ1bmN0aW9uIGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgcmVjdHMsIG9mZnNldCkge1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgdmFyIGludmVydERpc3RhbmNlID0gW2xlZnQsIHRvcF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwID8gLTEgOiAxO1xuXG4gIHZhciBfcmVmID0gdHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IG9mZnNldChPYmplY3QuYXNzaWduKHt9LCByZWN0cywge1xuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pKSA6IG9mZnNldCxcbiAgICAgIHNraWRkaW5nID0gX3JlZlswXSxcbiAgICAgIGRpc3RhbmNlID0gX3JlZlsxXTtcblxuICBza2lkZGluZyA9IHNraWRkaW5nIHx8IDA7XG4gIGRpc3RhbmNlID0gKGRpc3RhbmNlIHx8IDApICogaW52ZXJ0RGlzdGFuY2U7XG4gIHJldHVybiBbbGVmdCwgcmlnaHRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IHtcbiAgICB4OiBkaXN0YW5jZSxcbiAgICB5OiBza2lkZGluZ1xuICB9IDoge1xuICAgIHg6IHNraWRkaW5nLFxuICAgIHk6IGRpc3RhbmNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIG9mZnNldChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYyLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRvZmZzZXQgPSBvcHRpb25zLm9mZnNldCxcbiAgICAgIG9mZnNldCA9IF9vcHRpb25zJG9mZnNldCA9PT0gdm9pZCAwID8gWzAsIDBdIDogX29wdGlvbnMkb2Zmc2V0O1xuICB2YXIgZGF0YSA9IHBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGlzdGFuY2VBbmRTa2lkZGluZ1RvWFkocGxhY2VtZW50LCBzdGF0ZS5yZWN0cywgb2Zmc2V0KTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHZhciBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQgPSBkYXRhW3N0YXRlLnBsYWNlbWVudF0sXG4gICAgICB4ID0gX2RhdGEkc3RhdGUkcGxhY2VtZW50LngsXG4gICAgICB5ID0gX2RhdGEkc3RhdGUkcGxhY2VtZW50Lnk7XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyAhPSBudWxsKSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnggKz0geDtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueSArPSB5O1xuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG52YXIgb2Zmc2V0JDEgPSB7XG4gIG5hbWU6ICdvZmZzZXQnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIGZuOiBvZmZzZXRcbn07XG5cbnZhciBoYXNoJDEgPSB7XG4gIGxlZnQ6ICdyaWdodCcsXG4gIHJpZ2h0OiAnbGVmdCcsXG4gIGJvdHRvbTogJ3RvcCcsXG4gIHRvcDogJ2JvdHRvbSdcbn07XG5mdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaCQxW21hdGNoZWRdO1xuICB9KTtcbn1cblxudmFyIGhhc2ggPSB7XG4gIHN0YXJ0OiAnZW5kJyxcbiAgZW5kOiAnc3RhcnQnXG59O1xuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvc3RhcnR8ZW5kL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPSBfb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPT09IHZvaWQgMCA/IHBsYWNlbWVudHMgOiBfb3B0aW9ucyRhbGxvd2VkQXV0b1A7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KTtcbiAgdmFyIHBsYWNlbWVudHMkMSA9IHZhcmlhdGlvbiA/IGZsaXBWYXJpYXRpb25zID8gdmFyaWF0aW9uUGxhY2VtZW50cyA6IHZhcmlhdGlvblBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHZhcmlhdGlvbjtcbiAgfSkgOiBiYXNlUGxhY2VtZW50cztcbiAgdmFyIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cyQxLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFsbG93ZWRBdXRvUGxhY2VtZW50cy5pbmRleE9mKHBsYWNlbWVudCkgPj0gMDtcbiAgfSk7XG5cbiAgaWYgKGFsbG93ZWRQbGFjZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cyQxO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogVGhlIGBhbGxvd2VkQXV0b1BsYWNlbWVudHNgIG9wdGlvbiBkaWQgbm90IGFsbG93IGFueScsICdwbGFjZW1lbnRzLiBFbnN1cmUgdGhlIGBwbGFjZW1lbnRgIG9wdGlvbiBtYXRjaGVzIHRoZSB2YXJpYXRpb24nLCAnb2YgdGhlIGFsbG93ZWQgcGxhY2VtZW50cy4nLCAnRm9yIGV4YW1wbGUsIFwiYXV0b1wiIGNhbm5vdCBiZSB1c2VkIHRvIGFsbG93IFwiYm90dG9tLXN0YXJ0XCIuJywgJ1VzZSBcImF1dG8tc3RhcnRcIiBpbnN0ZWFkLiddLmpvaW4oJyAnKSk7XG4gICAgfVxuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdOiBGbG93IHNlZW1zIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCB0d28gYXJyYXkgdW5pb25zLi4uXG5cblxuICB2YXIgb3ZlcmZsb3dzID0gYWxsb3dlZFBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSlbZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpXTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvdmVyZmxvd3MpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dzW2FdIC0gb3ZlcmZsb3dzW2JdO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocGxhY2VtZW50KSB7XG4gIGlmIChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgb3Bwb3NpdGVQbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICByZXR1cm4gW2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCksIG9wcG9zaXRlUGxhY2VtZW50LCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChvcHBvc2l0ZVBsYWNlbWVudCldO1xufVxuXG5mdW5jdGlvbiBmbGlwKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzID0gb3B0aW9ucy5mYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPSBvcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRmbGlwVmFyaWF0aW8sXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBvcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cztcbiAgdmFyIHByZWZlcnJlZFBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9IGJhc2VQbGFjZW1lbnQgPT09IHByZWZlcnJlZFBsYWNlbWVudDtcbiAgdmFyIGZhbGxiYWNrUGxhY2VtZW50cyA9IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fCAoaXNCYXNlUGxhY2VtZW50IHx8ICFmbGlwVmFyaWF0aW9ucyA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpXSA6IGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHByZWZlcnJlZFBsYWNlbWVudCkpO1xuICB2YXIgcGxhY2VtZW50cyA9IFtwcmVmZXJyZWRQbGFjZW1lbnRdLmNvbmNhdChmYWxsYmFja1BsYWNlbWVudHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8gPyBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9uczogZmxpcFZhcmlhdGlvbnMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IGFsbG93ZWRBdXRvUGxhY2VtZW50c1xuICAgIH0pIDogcGxhY2VtZW50KTtcbiAgfSwgW10pO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBjaGVja3NNYXAgPSBuZXcgTWFwKCk7XG4gIHZhciBtYWtlRmFsbGJhY2tDaGVja3MgPSB0cnVlO1xuICB2YXIgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50c1swXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWNlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGxhY2VtZW50ID0gcGxhY2VtZW50c1tpXTtcblxuICAgIHZhciBfYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICAgIHZhciBpc1N0YXJ0VmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHN0YXJ0O1xuICAgIHZhciBpc1ZlcnRpY2FsID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKF9iYXNlUGxhY2VtZW50KSA+PSAwO1xuICAgIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pO1xuICAgIHZhciBtYWluVmFyaWF0aW9uU2lkZSA9IGlzVmVydGljYWwgPyBpc1N0YXJ0VmFyaWF0aW9uID8gcmlnaHQgOiBsZWZ0IDogaXNTdGFydFZhcmlhdGlvbiA/IGJvdHRvbSA6IHRvcDtcblxuICAgIGlmIChyZWZlcmVuY2VSZWN0W2xlbl0gPiBwb3BwZXJSZWN0W2xlbl0pIHtcbiAgICAgIG1haW5WYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIH1cblxuICAgIHZhciBhbHRWYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIHZhciBjaGVja3MgPSBbXTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1tfYmFzZVBsYWNlbWVudF0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbbWFpblZhcmlhdGlvblNpZGVdIDw9IDAsIG92ZXJmbG93W2FsdFZhcmlhdGlvblNpZGVdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICByZXR1cm4gY2hlY2s7XG4gICAgfSkpIHtcbiAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgICAgIG1ha2VGYWxsYmFja0NoZWNrcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2hlY2tzTWFwLnNldChwbGFjZW1lbnQsIGNoZWNrcyk7XG4gIH1cblxuICBpZiAobWFrZUZhbGxiYWNrQ2hlY2tzKSB7XG4gICAgLy8gYDJgIG1heSBiZSBkZXNpcmVkIGluIHNvbWUgY2FzZXMgXHUyMDEzIHJlc2VhcmNoIGxhdGVyXG4gICAgdmFyIG51bWJlck9mQ2hlY2tzID0gZmxpcFZhcmlhdGlvbnMgPyAzIDogMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9pKSB7XG4gICAgICB2YXIgZml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHMuZmluZChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgICAgIHZhciBjaGVja3MgPSBjaGVja3NNYXAuZ2V0KHBsYWNlbWVudCk7XG5cbiAgICAgICAgaWYgKGNoZWNrcykge1xuICAgICAgICAgIHJldHVybiBjaGVja3Muc2xpY2UoMCwgX2kpLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gZml0dGluZ1BsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgX2kgPSBudW1iZXJPZkNoZWNrczsgX2kgPiAwOyBfaS0tKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKF9pKTtcblxuICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnBsYWNlbWVudCAhPT0gZmlyc3RGaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCA9IHRydWU7XG4gICAgc3RhdGUucGxhY2VtZW50ID0gZmlyc3RGaXR0aW5nUGxhY2VtZW50O1xuICAgIHN0YXRlLnJlc2V0ID0gdHJ1ZTtcbiAgfVxufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxudmFyIGZsaXAkMSA9IHtcbiAgbmFtZTogJ2ZsaXAnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogZmxpcCxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXSxcbiAgZGF0YToge1xuICAgIF9za2lwOiBmYWxzZVxuICB9XG59O1xuXG5mdW5jdGlvbiBnZXRBbHRBeGlzKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd4JyA/ICd5JyA6ICd4Jztcbn1cblxuZnVuY3Rpb24gd2l0aGluKG1pbiQxLCB2YWx1ZSwgbWF4JDEpIHtcbiAgcmV0dXJuIG1heChtaW4kMSwgbWluKHZhbHVlLCBtYXgkMSkpO1xufVxuZnVuY3Rpb24gd2l0aGluTWF4Q2xhbXAobWluLCB2YWx1ZSwgbWF4KSB7XG4gIHZhciB2ID0gd2l0aGluKG1pbiwgdmFsdWUsIG1heCk7XG4gIHJldHVybiB2ID4gbWF4ID8gbWF4IDogdjtcbn1cblxuZnVuY3Rpb24gcHJldmVudE92ZXJmbG93KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgX29wdGlvbnMkbWFpbkF4aXMgPSBvcHRpb25zLm1haW5BeGlzLFxuICAgICAgY2hlY2tNYWluQXhpcyA9IF9vcHRpb25zJG1haW5BeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkbWFpbkF4aXMsXG4gICAgICBfb3B0aW9ucyRhbHRBeGlzID0gb3B0aW9ucy5hbHRBeGlzLFxuICAgICAgY2hlY2tBbHRBeGlzID0gX29wdGlvbnMkYWx0QXhpcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgX29wdGlvbnMkdGV0aGVyID0gb3B0aW9ucy50ZXRoZXIsXG4gICAgICB0ZXRoZXIgPSBfb3B0aW9ucyR0ZXRoZXIgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyR0ZXRoZXIsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPSBvcHRpb25zLnRldGhlck9mZnNldCxcbiAgICAgIHRldGhlck9mZnNldCA9IF9vcHRpb25zJHRldGhlck9mZnNldCA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHRldGhlck9mZnNldDtcbiAgdmFyIG92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgcGFkZGluZzogcGFkZGluZyxcbiAgICBhbHRCb3VuZGFyeTogYWx0Qm91bmRhcnlcbiAgfSk7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSAhdmFyaWF0aW9uO1xuICB2YXIgbWFpbkF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBhbHRBeGlzID0gZ2V0QWx0QXhpcyhtYWluQXhpcyk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciB0ZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXQgPT09ICdmdW5jdGlvbicgPyB0ZXRoZXJPZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiB0ZXRoZXJPZmZzZXQ7XG4gIHZhciBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0VmFsdWUgPT09ICdudW1iZXInID8ge1xuICAgIG1haW5BeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZSxcbiAgICBhbHRBeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZVxuICB9IDogT2JqZWN0LmFzc2lnbih7XG4gICAgbWFpbkF4aXM6IDAsXG4gICAgYWx0QXhpczogMFxuICB9LCB0ZXRoZXJPZmZzZXRWYWx1ZSk7XG4gIHZhciBvZmZzZXRNb2RpZmllclN0YXRlID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQgPyBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtzdGF0ZS5wbGFjZW1lbnRdIDogbnVsbDtcbiAgdmFyIGRhdGEgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKCFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkO1xuXG4gICAgdmFyIG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgdmFyIGFsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuICAgIHZhciBtaW4kMSA9IG9mZnNldCArIG92ZXJmbG93W21haW5TaWRlXTtcbiAgICB2YXIgbWF4JDEgPSBvZmZzZXQgLSBvdmVyZmxvd1thbHRTaWRlXTtcbiAgICB2YXIgYWRkaXRpdmUgPSB0ZXRoZXIgPyAtcG9wcGVyUmVjdFtsZW5dIC8gMiA6IDA7XG4gICAgdmFyIG1pbkxlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gOiBwb3BwZXJSZWN0W2xlbl07XG4gICAgdmFyIG1heExlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyAtcG9wcGVyUmVjdFtsZW5dIDogLXJlZmVyZW5jZVJlY3RbbGVuXTsgLy8gV2UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcnJvdyBpbiB0aGUgY2FsY3VsYXRpb24gc28gdGhlIGFycm93IGRvZXNuJ3QgZ29cbiAgICAvLyBvdXRzaWRlIHRoZSByZWZlcmVuY2UgYm91bmRzXG5cbiAgICB2YXIgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3c7XG4gICAgdmFyIGFycm93UmVjdCA9IHRldGhlciAmJiBhcnJvd0VsZW1lbnQgPyBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCkgOiB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG4gICAgdmFyIGFycm93UGFkZGluZ09iamVjdCA9IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXSA/IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXS5wYWRkaW5nIDogZ2V0RnJlc2hTaWRlT2JqZWN0KCk7XG4gICAgdmFyIGFycm93UGFkZGluZ01pbiA9IGFycm93UGFkZGluZ09iamVjdFttYWluU2lkZV07XG4gICAgdmFyIGFycm93UGFkZGluZ01heCA9IGFycm93UGFkZGluZ09iamVjdFthbHRTaWRlXTsgLy8gSWYgdGhlIHJlZmVyZW5jZSBsZW5ndGggaXMgc21hbGxlciB0aGFuIHRoZSBhcnJvdyBsZW5ndGgsIHdlIGRvbid0IHdhbnRcbiAgICAvLyB0byBpbmNsdWRlIGl0cyBmdWxsIHNpemUgaW4gdGhlIGNhbGN1bGF0aW9uLiBJZiB0aGUgcmVmZXJlbmNlIGlzIHNtYWxsXG4gICAgLy8gYW5kIG5lYXIgdGhlIGVkZ2Ugb2YgYSBib3VuZGFyeSwgdGhlIHBvcHBlciBjYW4gb3ZlcmZsb3cgZXZlbiBpZiB0aGVcbiAgICAvLyByZWZlcmVuY2UgaXMgbm90IG92ZXJmbG93aW5nIGFzIHdlbGwgKGUuZy4gdmlydHVhbCBlbGVtZW50cyB3aXRoIG5vXG4gICAgLy8gd2lkdGggb3IgaGVpZ2h0KVxuXG4gICAgdmFyIGFycm93TGVuID0gd2l0aGluKDAsIHJlZmVyZW5jZVJlY3RbbGVuXSwgYXJyb3dSZWN0W2xlbl0pO1xuICAgIHZhciBtaW5PZmZzZXQgPSBpc0Jhc2VQbGFjZW1lbnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gLyAyIC0gYWRkaXRpdmUgLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcyA6IG1pbkxlbiAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIHZhciBtYXhPZmZzZXQgPSBpc0Jhc2VQbGFjZW1lbnQgPyAtcmVmZXJlbmNlUmVjdFtsZW5dIC8gMiArIGFkZGl0aXZlICsgYXJyb3dMZW4gKyBhcnJvd1BhZGRpbmdNYXggKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXMgOiBtYXhMZW4gKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcztcbiAgICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdyAmJiBnZXRPZmZzZXRQYXJlbnQoc3RhdGUuZWxlbWVudHMuYXJyb3cpO1xuICAgIHZhciBjbGllbnRPZmZzZXQgPSBhcnJvd09mZnNldFBhcmVudCA/IG1haW5BeGlzID09PSAneScgPyBhcnJvd09mZnNldFBhcmVudC5jbGllbnRUb3AgfHwgMCA6IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudExlZnQgfHwgMCA6IDA7XG4gICAgdmFyIG9mZnNldE1vZGlmaWVyVmFsdWUgPSAoX29mZnNldE1vZGlmaWVyU3RhdGUkID0gb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogb2Zmc2V0TW9kaWZpZXJTdGF0ZVttYWluQXhpc10pICE9IG51bGwgPyBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQgOiAwO1xuICAgIHZhciB0ZXRoZXJNaW4gPSBvZmZzZXQgKyBtaW5PZmZzZXQgLSBvZmZzZXRNb2RpZmllclZhbHVlIC0gY2xpZW50T2Zmc2V0O1xuICAgIHZhciB0ZXRoZXJNYXggPSBvZmZzZXQgKyBtYXhPZmZzZXQgLSBvZmZzZXRNb2RpZmllclZhbHVlO1xuICAgIHZhciBwcmV2ZW50ZWRPZmZzZXQgPSB3aXRoaW4odGV0aGVyID8gbWluKG1pbiQxLCB0ZXRoZXJNaW4pIDogbWluJDEsIG9mZnNldCwgdGV0aGVyID8gbWF4KG1heCQxLCB0ZXRoZXJNYXgpIDogbWF4JDEpO1xuICAgIHBvcHBlck9mZnNldHNbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0IC0gb2Zmc2V0O1xuICB9XG5cbiAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyO1xuXG4gICAgdmFyIF9tYWluU2lkZSA9IG1haW5BeGlzID09PSAneCcgPyB0b3AgOiBsZWZ0O1xuXG4gICAgdmFyIF9hbHRTaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IGJvdHRvbSA6IHJpZ2h0O1xuXG4gICAgdmFyIF9vZmZzZXQgPSBwb3BwZXJPZmZzZXRzW2FsdEF4aXNdO1xuXG4gICAgdmFyIF9sZW4gPSBhbHRBeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICB2YXIgX21pbiA9IF9vZmZzZXQgKyBvdmVyZmxvd1tfbWFpblNpZGVdO1xuXG4gICAgdmFyIF9tYXggPSBfb2Zmc2V0IC0gb3ZlcmZsb3dbX2FsdFNpZGVdO1xuXG4gICAgdmFyIGlzT3JpZ2luU2lkZSA9IFt0b3AsIGxlZnRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgIT09IC0xO1xuXG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclZhbHVlID0gKF9vZmZzZXRNb2RpZmllclN0YXRlJDIgPSBvZmZzZXRNb2RpZmllclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBvZmZzZXRNb2RpZmllclN0YXRlW2FsdEF4aXNdKSAhPSBudWxsID8gX29mZnNldE1vZGlmaWVyU3RhdGUkMiA6IDA7XG5cbiAgICB2YXIgX3RldGhlck1pbiA9IGlzT3JpZ2luU2lkZSA/IF9taW4gOiBfb2Zmc2V0IC0gcmVmZXJlbmNlUmVjdFtfbGVuXSAtIHBvcHBlclJlY3RbX2xlbl0gLSBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5hbHRBeGlzO1xuXG4gICAgdmFyIF90ZXRoZXJNYXggPSBpc09yaWdpblNpZGUgPyBfb2Zmc2V0ICsgcmVmZXJlbmNlUmVjdFtfbGVuXSArIHBvcHBlclJlY3RbX2xlbl0gLSBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5hbHRBeGlzIDogX21heDtcblxuICAgIHZhciBfcHJldmVudGVkT2Zmc2V0ID0gdGV0aGVyICYmIGlzT3JpZ2luU2lkZSA/IHdpdGhpbk1heENsYW1wKF90ZXRoZXJNaW4sIF9vZmZzZXQsIF90ZXRoZXJNYXgpIDogd2l0aGluKHRldGhlciA/IF90ZXRoZXJNaW4gOiBfbWluLCBfb2Zmc2V0LCB0ZXRoZXIgPyBfdGV0aGVyTWF4IDogX21heCk7XG5cbiAgICBwb3BwZXJPZmZzZXRzW2FsdEF4aXNdID0gX3ByZXZlbnRlZE9mZnNldDtcbiAgICBkYXRhW2FsdEF4aXNdID0gX3ByZXZlbnRlZE9mZnNldCAtIF9vZmZzZXQ7XG4gIH1cblxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gZGF0YTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbnZhciBwcmV2ZW50T3ZlcmZsb3ckMSA9IHtcbiAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBwcmV2ZW50T3ZlcmZsb3csXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsnb2Zmc2V0J11cbn07XG5cbnZhciB0b1BhZGRpbmdPYmplY3QgPSBmdW5jdGlvbiB0b1BhZGRpbmdPYmplY3QocGFkZGluZywgc3RhdGUpIHtcbiAgcGFkZGluZyA9IHR5cGVvZiBwYWRkaW5nID09PSAnZnVuY3Rpb24nID8gcGFkZGluZyhPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHBhZGRpbmc7XG4gIHJldHVybiBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xufTtcblxuZnVuY3Rpb24gYXJyb3coX3JlZikge1xuICB2YXIgX3N0YXRlJG1vZGlmaWVyc0RhdGEkO1xuXG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucztcbiAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBheGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgaXNWZXJ0aWNhbCA9IFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwO1xuICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICBpZiAoIWFycm93RWxlbWVudCB8fCAhcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gdG9QYWRkaW5nT2JqZWN0KG9wdGlvbnMucGFkZGluZywgc3RhdGUpO1xuICB2YXIgYXJyb3dSZWN0ID0gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpO1xuICB2YXIgbWluUHJvcCA9IGF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gIHZhciBtYXhQcm9wID0gYXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gIHZhciBlbmREaWZmID0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2xlbl0gKyBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc10gLSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucG9wcGVyW2xlbl07XG4gIHZhciBzdGFydERpZmYgPSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdO1xuICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoYXJyb3dFbGVtZW50KTtcbiAgdmFyIGNsaWVudFNpemUgPSBhcnJvd09mZnNldFBhcmVudCA/IGF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggfHwgMCA6IDA7XG4gIHZhciBjZW50ZXJUb1JlZmVyZW5jZSA9IGVuZERpZmYgLyAyIC0gc3RhcnREaWZmIC8gMjsgLy8gTWFrZSBzdXJlIHRoZSBhcnJvdyBkb2Vzbid0IG92ZXJmbG93IHRoZSBwb3BwZXIgaWYgdGhlIGNlbnRlciBwb2ludCBpc1xuICAvLyBvdXRzaWRlIG9mIHRoZSBwb3BwZXIgYm91bmRzXG5cbiAgdmFyIG1pbiA9IHBhZGRpbmdPYmplY3RbbWluUHJvcF07XG4gIHZhciBtYXggPSBjbGllbnRTaXplIC0gYXJyb3dSZWN0W2xlbl0gLSBwYWRkaW5nT2JqZWN0W21heFByb3BdO1xuICB2YXIgY2VudGVyID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd1JlY3RbbGVuXSAvIDIgKyBjZW50ZXJUb1JlZmVyZW5jZTtcbiAgdmFyIG9mZnNldCA9IHdpdGhpbihtaW4sIGNlbnRlciwgbWF4KTsgLy8gUHJldmVudHMgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy4uLlxuXG4gIHZhciBheGlzUHJvcCA9IGF4aXM7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSAoX3N0YXRlJG1vZGlmaWVyc0RhdGEkID0ge30sIF9zdGF0ZSRtb2RpZmllcnNEYXRhJFtheGlzUHJvcF0gPSBvZmZzZXQsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJC5jZW50ZXJPZmZzZXQgPSBvZmZzZXQgLSBjZW50ZXIsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJCk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudCxcbiAgICAgIGFycm93RWxlbWVudCA9IF9vcHRpb25zJGVsZW1lbnQgPT09IHZvaWQgMCA/ICdbZGF0YS1wb3BwZXItYXJyb3ddJyA6IF9vcHRpb25zJGVsZW1lbnQ7XG5cbiAgaWYgKGFycm93RWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIENTUyBzZWxlY3RvclxuXG5cbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmICghaXNIVE1MRWxlbWVudChhcnJvd0VsZW1lbnQpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBcImFycm93XCIgZWxlbWVudCBtdXN0IGJlIGFuIEhUTUxFbGVtZW50IChub3QgYW4gU1ZHRWxlbWVudCkuJywgJ1RvIHVzZSBhbiBTVkcgYXJyb3csIHdyYXAgaXQgaW4gYW4gSFRNTEVsZW1lbnQgdGhhdCB3aWxsIGJlIHVzZWQgYXMnLCAndGhlIGFycm93LiddLmpvaW4oJyAnKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb250YWlucyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIsIGFycm93RWxlbWVudCkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBcImFycm93XCIgbW9kaWZpZXJcXCdzIGBlbGVtZW50YCBtdXN0IGJlIGEgY2hpbGQgb2YgdGhlIHBvcHBlcicsICdlbGVtZW50LiddLmpvaW4oJyAnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3RhdGUuZWxlbWVudHMuYXJyb3cgPSBhcnJvd0VsZW1lbnQ7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG52YXIgYXJyb3ckMSA9IHtcbiAgbmFtZTogJ2Fycm93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IGFycm93LFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddXG59O1xuXG5mdW5jdGlvbiBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdCwgcHJldmVudGVkT2Zmc2V0cykge1xuICBpZiAocHJldmVudGVkT2Zmc2V0cyA9PT0gdm9pZCAwKSB7XG4gICAgcHJldmVudGVkT2Zmc2V0cyA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiBvdmVyZmxvdy50b3AgLSByZWN0LmhlaWdodCAtIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICByaWdodDogb3ZlcmZsb3cucmlnaHQgLSByZWN0LndpZHRoICsgcHJldmVudGVkT2Zmc2V0cy54LFxuICAgIGJvdHRvbTogb3ZlcmZsb3cuYm90dG9tIC0gcmVjdC5oZWlnaHQgKyBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgbGVmdDogb3ZlcmZsb3cubGVmdCAtIHJlY3Qud2lkdGggLSBwcmV2ZW50ZWRPZmZzZXRzLnhcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG92ZXJmbG93KSB7XG4gIHJldHVybiBbdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XS5zb21lKGZ1bmN0aW9uIChzaWRlKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93W3NpZGVdID49IDA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoaWRlKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHByZXZlbnRlZE9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnByZXZlbnRPdmVyZmxvdztcbiAgdmFyIHJlZmVyZW5jZU92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBlbGVtZW50Q29udGV4dDogJ3JlZmVyZW5jZSdcbiAgfSk7XG4gIHZhciBwb3BwZXJBbHRPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYWx0Qm91bmRhcnk6IHRydWVcbiAgfSk7XG4gIHZhciByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhyZWZlcmVuY2VPdmVyZmxvdywgcmVmZXJlbmNlUmVjdCk7XG4gIHZhciBwb3BwZXJFc2NhcGVPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocG9wcGVyQWx0T3ZlcmZsb3csIHBvcHBlclJlY3QsIHByZXZlbnRlZE9mZnNldHMpO1xuICB2YXIgaXNSZWZlcmVuY2VIaWRkZW4gPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzKTtcbiAgdmFyIGhhc1BvcHBlckVzY2FwZWQgPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocG9wcGVyRXNjYXBlT2Zmc2V0cyk7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSB7XG4gICAgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzOiByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMsXG4gICAgcG9wcGVyRXNjYXBlT2Zmc2V0czogcG9wcGVyRXNjYXBlT2Zmc2V0cyxcbiAgICBpc1JlZmVyZW5jZUhpZGRlbjogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgaGFzUG9wcGVyRXNjYXBlZDogaGFzUG9wcGVyRXNjYXBlZFxuICB9O1xuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXJlZmVyZW5jZS1oaWRkZW4nOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICAnZGF0YS1wb3BwZXItZXNjYXBlZCc6IGhhc1BvcHBlckVzY2FwZWRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG52YXIgaGlkZSQxID0ge1xuICBuYW1lOiAnaGlkZScsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J10sXG4gIGZuOiBoaWRlXG59O1xuXG52YXIgZGVmYXVsdE1vZGlmaWVycyQxID0gW2V2ZW50TGlzdGVuZXJzLCBwb3BwZXJPZmZzZXRzJDEsIGNvbXB1dGVTdHlsZXMkMSwgYXBwbHlTdHlsZXMkMV07XG52YXIgY3JlYXRlUG9wcGVyJDEgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKHtcbiAgZGVmYXVsdE1vZGlmaWVyczogZGVmYXVsdE1vZGlmaWVycyQxXG59KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgZGVmYXVsdE1vZGlmaWVycyA9IFtldmVudExpc3RlbmVycywgcG9wcGVyT2Zmc2V0cyQxLCBjb21wdXRlU3R5bGVzJDEsIGFwcGx5U3R5bGVzJDEsIG9mZnNldCQxLCBmbGlwJDEsIHByZXZlbnRPdmVyZmxvdyQxLCBhcnJvdyQxLCBoaWRlJDFdO1xudmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3Ioe1xuICBkZWZhdWx0TW9kaWZpZXJzOiBkZWZhdWx0TW9kaWZpZXJzXG59KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnRzLmFwcGx5U3R5bGVzID0gYXBwbHlTdHlsZXMkMTtcbmV4cG9ydHMuYXJyb3cgPSBhcnJvdyQxO1xuZXhwb3J0cy5jb21wdXRlU3R5bGVzID0gY29tcHV0ZVN0eWxlcyQxO1xuZXhwb3J0cy5jcmVhdGVQb3BwZXIgPSBjcmVhdGVQb3BwZXI7XG5leHBvcnRzLmNyZWF0ZVBvcHBlckxpdGUgPSBjcmVhdGVQb3BwZXIkMTtcbmV4cG9ydHMuZGVmYXVsdE1vZGlmaWVycyA9IGRlZmF1bHRNb2RpZmllcnM7XG5leHBvcnRzLmRldGVjdE92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3c7XG5leHBvcnRzLmV2ZW50TGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnM7XG5leHBvcnRzLmZsaXAgPSBmbGlwJDE7XG5leHBvcnRzLmhpZGUgPSBoaWRlJDE7XG5leHBvcnRzLm9mZnNldCA9IG9mZnNldCQxO1xuZXhwb3J0cy5wb3BwZXJHZW5lcmF0b3IgPSBwb3BwZXJHZW5lcmF0b3I7XG5leHBvcnRzLnBvcHBlck9mZnNldHMgPSBwb3BwZXJPZmZzZXRzJDE7XG5leHBvcnRzLnByZXZlbnRPdmVyZmxvdyA9IHByZXZlbnRPdmVyZmxvdyQxO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9wcGVyLmpzLm1hcFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkb20vZGF0YS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgZWxlbWVudE1hcCA9IG5ldyBNYXAoKVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNldChlbGVtZW50LCBrZXksIGluc3RhbmNlKSB7XG4gICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgZWxlbWVudE1hcC5zZXQoZWxlbWVudCwgbmV3IE1hcCgpKVxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlTWFwID0gZWxlbWVudE1hcC5nZXQoZWxlbWVudClcblxuICAgIC8vIG1ha2UgaXQgY2xlYXIgd2Ugb25seSB3YW50IG9uZSBpbnN0YW5jZSBwZXIgZWxlbWVudFxuICAgIC8vIGNhbiBiZSByZW1vdmVkIGxhdGVyIHdoZW4gbXVsdGlwbGUga2V5L2luc3RhbmNlcyBhcmUgZmluZSB0byBiZSB1c2VkXG4gICAgaWYgKCFpbnN0YW5jZU1hcC5oYXMoa2V5KSAmJiBpbnN0YW5jZU1hcC5zaXplICE9PSAwKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihgQm9vdHN0cmFwIGRvZXNuJ3QgYWxsb3cgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBwZXIgZWxlbWVudC4gQm91bmQgaW5zdGFuY2U6ICR7QXJyYXkuZnJvbShpbnN0YW5jZU1hcC5rZXlzKCkpWzBdfS5gKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaW5zdGFuY2VNYXAuc2V0KGtleSwgaW5zdGFuY2UpXG4gIH0sXG5cbiAgZ2V0KGVsZW1lbnQsIGtleSkge1xuICAgIGlmIChlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpLmdldChrZXkpIHx8IG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9LFxuXG4gIHJlbW92ZShlbGVtZW50LCBrZXkpIHtcbiAgICBpZiAoIWVsZW1lbnRNYXAuaGFzKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpXG5cbiAgICBpbnN0YW5jZU1hcC5kZWxldGUoa2V5KVxuXG4gICAgLy8gZnJlZSB1cCBlbGVtZW50IHJlZmVyZW5jZXMgaWYgdGhlcmUgYXJlIG5vIGluc3RhbmNlcyBsZWZ0IGZvciBhbiBlbGVtZW50XG4gICAgaWYgKGluc3RhbmNlTWFwLnNpemUgPT09IDApIHtcbiAgICAgIGVsZW1lbnRNYXAuZGVsZXRlKGVsZW1lbnQpXG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvaW5kZXguanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBNQVhfVUlEID0gMV8wMDBfMDAwXG5jb25zdCBNSUxMSVNFQ09ORFNfTVVMVElQTElFUiA9IDEwMDBcbmNvbnN0IFRSQU5TSVRJT05fRU5EID0gJ3RyYW5zaXRpb25lbmQnXG5cbi8qKlxuICogUHJvcGVybHkgZXNjYXBlIElEcyBzZWxlY3RvcnMgdG8gaGFuZGxlIHdlaXJkIElEc1xuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBwYXJzZVNlbGVjdG9yID0gc2VsZWN0b3IgPT4ge1xuICBpZiAoc2VsZWN0b3IgJiYgd2luZG93LkNTUyAmJiB3aW5kb3cuQ1NTLmVzY2FwZSkge1xuICAgIC8vIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgbmVlZHMgZXNjYXBpbmcgdG8gaGFuZGxlIElEcyAoaHRtbDUrKSBjb250YWluaW5nIGZvciBpbnN0YW5jZSAvXG4gICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKC8jKFteXFxzXCIjJ10rKS9nLCAobWF0Y2gsIGlkKSA9PiBgIyR7Q1NTLmVzY2FwZShpZCl9YClcbiAgfVxuXG4gIHJldHVybiBzZWxlY3RvclxufVxuXG4vLyBTaG91dC1vdXQgQW5ndXMgQ3JvbGwgKGh0dHBzOi8vZ29vLmdsL3B4d1FHcClcbmNvbnN0IHRvVHlwZSA9IG9iamVjdCA9PiB7XG4gIGlmIChvYmplY3QgPT09IG51bGwgfHwgb2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYCR7b2JqZWN0fWBcbiAgfVxuXG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KS5tYXRjaCgvXFxzKFthLXpdKykvaSlbMV0udG9Mb3dlckNhc2UoKVxufVxuXG4vKipcbiAqIFB1YmxpYyBVdGlsIEFQSVxuICovXG5cbmNvbnN0IGdldFVJRCA9IHByZWZpeCA9PiB7XG4gIGRvIHtcbiAgICBwcmVmaXggKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTUFYX1VJRClcbiAgfSB3aGlsZSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHJlZml4KSlcblxuICByZXR1cm4gcHJlZml4XG59XG5cbmNvbnN0IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50ID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICAvLyBHZXQgdHJhbnNpdGlvbi1kdXJhdGlvbiBvZiB0aGUgZWxlbWVudFxuICBsZXQgeyB0cmFuc2l0aW9uRHVyYXRpb24sIHRyYW5zaXRpb25EZWxheSB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcblxuICBjb25zdCBmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbilcbiAgY29uc3QgZmxvYXRUcmFuc2l0aW9uRGVsYXkgPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpXG5cbiAgLy8gUmV0dXJuIDAgaWYgZWxlbWVudCBvciB0cmFuc2l0aW9uIGR1cmF0aW9uIGlzIG5vdCBmb3VuZFxuICBpZiAoIWZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uICYmICFmbG9hdFRyYW5zaXRpb25EZWxheSkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICAvLyBJZiBtdWx0aXBsZSBkdXJhdGlvbnMgYXJlIGRlZmluZWQsIHRha2UgdGhlIGZpcnN0XG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IHRyYW5zaXRpb25EdXJhdGlvbi5zcGxpdCgnLCcpWzBdXG4gIHRyYW5zaXRpb25EZWxheSA9IHRyYW5zaXRpb25EZWxheS5zcGxpdCgnLCcpWzBdXG5cbiAgcmV0dXJuIChOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pICsgTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkRlbGF5KSkgKiBNSUxMSVNFQ09ORFNfTVVMVElQTElFUlxufVxuXG5jb25zdCB0cmlnZ2VyVHJhbnNpdGlvbkVuZCA9IGVsZW1lbnQgPT4ge1xuICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFRSQU5TSVRJT05fRU5EKSlcbn1cblxuY29uc3QgaXNFbGVtZW50ID0gb2JqZWN0ID0+IHtcbiAgaWYgKCFvYmplY3QgfHwgdHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqZWN0LmpxdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvYmplY3QgPSBvYmplY3RbMF1cbiAgfVxuXG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0Lm5vZGVUeXBlICE9PSAndW5kZWZpbmVkJ1xufVxuXG5jb25zdCBnZXRFbGVtZW50ID0gb2JqZWN0ID0+IHtcbiAgLy8gaXQncyBhIGpRdWVyeSBvYmplY3Qgb3IgYSBub2RlIGVsZW1lbnRcbiAgaWYgKGlzRWxlbWVudChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdC5qcXVlcnkgPyBvYmplY3RbMF0gOiBvYmplY3RcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnc3RyaW5nJyAmJiBvYmplY3QubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHBhcnNlU2VsZWN0b3Iob2JqZWN0KSlcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IGlzVmlzaWJsZSA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWlzRWxlbWVudChlbGVtZW50KSB8fCBlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBlbGVtZW50SXNWaXNpYmxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCd2aXNpYmlsaXR5JykgPT09ICd2aXNpYmxlJ1xuICAvLyBIYW5kbGUgYGRldGFpbHNgIGVsZW1lbnQgYXMgaXRzIGNvbnRlbnQgbWF5IGZhbHNpZSBhcHBlYXIgdmlzaWJsZSB3aGVuIGl0IGlzIGNsb3NlZFxuICBjb25zdCBjbG9zZWREZXRhaWxzID0gZWxlbWVudC5jbG9zZXN0KCdkZXRhaWxzOm5vdChbb3Blbl0pJylcblxuICBpZiAoIWNsb3NlZERldGFpbHMpIHtcbiAgICByZXR1cm4gZWxlbWVudElzVmlzaWJsZVxuICB9XG5cbiAgaWYgKGNsb3NlZERldGFpbHMgIT09IGVsZW1lbnQpIHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gZWxlbWVudC5jbG9zZXN0KCdzdW1tYXJ5JylcbiAgICBpZiAoc3VtbWFyeSAmJiBzdW1tYXJ5LnBhcmVudE5vZGUgIT09IGNsb3NlZERldGFpbHMpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChzdW1tYXJ5ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudElzVmlzaWJsZVxufVxuXG5jb25zdCBpc0Rpc2FibGVkID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCB8fCBlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiBlbGVtZW50LmRpc2FibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBlbGVtZW50LmRpc2FibGVkXG4gIH1cblxuICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgIT09ICdmYWxzZSdcbn1cblxuY29uc3QgZmluZFNoYWRvd1Jvb3QgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIENhbiBmaW5kIHRoZSBzaGFkb3cgcm9vdCBvdGhlcndpc2UgaXQnbGwgcmV0dXJuIHRoZSBkb2N1bWVudFxuICBpZiAodHlwZW9mIGVsZW1lbnQuZ2V0Um9vdE5vZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCByb290ID0gZWxlbWVudC5nZXRSb290Tm9kZSgpXG4gICAgcmV0dXJuIHJvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290ID8gcm9vdCA6IG51bGxcbiAgfVxuXG4gIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgIHJldHVybiBlbGVtZW50XG4gIH1cblxuICAvLyB3aGVuIHdlIGRvbid0IGZpbmQgYSBzaGFkb3cgcm9vdFxuICBpZiAoIWVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gZmluZFNoYWRvd1Jvb3QoZWxlbWVudC5wYXJlbnROb2RlKVxufVxuXG5jb25zdCBub29wID0gKCkgPT4ge31cblxuLyoqXG4gKiBUcmljayB0byByZXN0YXJ0IGFuIGVsZW1lbnQncyBhbmltYXRpb25cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJuIHZvaWRcbiAqXG4gKiBAc2VlIGh0dHBzOi8vd3d3LmNoYXJpc3RoZW8uaW8vYmxvZy8yMDIxLzAyL3Jlc3RhcnQtYS1jc3MtYW5pbWF0aW9uLXdpdGgtamF2YXNjcmlwdC8jcmVzdGFydGluZy1hLWNzcy1hbmltYXRpb25cbiAqL1xuY29uc3QgcmVmbG93ID0gZWxlbWVudCA9PiB7XG4gIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG59XG5cbmNvbnN0IGdldGpRdWVyeSA9ICgpID0+IHtcbiAgaWYgKHdpbmRvdy5qUXVlcnkgJiYgIWRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCdkYXRhLWJzLW5vLWpxdWVyeScpKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5qUXVlcnlcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IERPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MgPSBbXVxuXG5jb25zdCBvbkRPTUNvbnRlbnRMb2FkZWQgPSBjYWxsYmFjayA9PiB7XG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAvLyBhZGQgbGlzdGVuZXIgb24gdGhlIGZpcnN0IGNhbGwgd2hlbiB0aGUgZG9jdW1lbnQgaXMgaW4gbG9hZGluZyBzdGF0ZVxuICAgIGlmICghRE9NQ29udGVudExvYWRlZENhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcykge1xuICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spXG4gIH0gZWxzZSB7XG4gICAgY2FsbGJhY2soKVxuICB9XG59XG5cbmNvbnN0IGlzUlRMID0gKCkgPT4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRpciA9PT0gJ3J0bCdcblxuY29uc3QgZGVmaW5lSlF1ZXJ5UGx1Z2luID0gcGx1Z2luID0+IHtcbiAgb25ET01Db250ZW50TG9hZGVkKCgpID0+IHtcbiAgICBjb25zdCAkID0gZ2V0alF1ZXJ5KClcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoJCkge1xuICAgICAgY29uc3QgbmFtZSA9IHBsdWdpbi5OQU1FXG4gICAgICBjb25zdCBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkLmZuW25hbWVdXG4gICAgICAkLmZuW25hbWVdID0gcGx1Z2luLmpRdWVyeUludGVyZmFjZVxuICAgICAgJC5mbltuYW1lXS5Db25zdHJ1Y3RvciA9IHBsdWdpblxuICAgICAgJC5mbltuYW1lXS5ub0NvbmZsaWN0ID0gKCkgPT4ge1xuICAgICAgICAkLmZuW25hbWVdID0gSlFVRVJZX05PX0NPTkZMSUNUXG4gICAgICAgIHJldHVybiBwbHVnaW4ualF1ZXJ5SW50ZXJmYWNlXG4gICAgICB9XG4gICAgfVxuICB9KVxufVxuXG5jb25zdCBleGVjdXRlID0gKHBvc3NpYmxlQ2FsbGJhY2ssIGFyZ3MgPSBbXSwgZGVmYXVsdFZhbHVlID0gcG9zc2libGVDYWxsYmFjaykgPT4ge1xuICByZXR1cm4gdHlwZW9mIHBvc3NpYmxlQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBwb3NzaWJsZUNhbGxiYWNrKC4uLmFyZ3MpIDogZGVmYXVsdFZhbHVlXG59XG5cbmNvbnN0IGV4ZWN1dGVBZnRlclRyYW5zaXRpb24gPSAoY2FsbGJhY2ssIHRyYW5zaXRpb25FbGVtZW50LCB3YWl0Rm9yVHJhbnNpdGlvbiA9IHRydWUpID0+IHtcbiAgaWYgKCF3YWl0Rm9yVHJhbnNpdGlvbikge1xuICAgIGV4ZWN1dGUoY2FsbGJhY2spXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBkdXJhdGlvblBhZGRpbmcgPSA1XG4gIGNvbnN0IGVtdWxhdGVkRHVyYXRpb24gPSBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0cmFuc2l0aW9uRWxlbWVudCkgKyBkdXJhdGlvblBhZGRpbmdcblxuICBsZXQgY2FsbGVkID0gZmFsc2VcblxuICBjb25zdCBoYW5kbGVyID0gKHsgdGFyZ2V0IH0pID0+IHtcbiAgICBpZiAodGFyZ2V0ICE9PSB0cmFuc2l0aW9uRWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY2FsbGVkID0gdHJ1ZVxuICAgIHRyYW5zaXRpb25FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoVFJBTlNJVElPTl9FTkQsIGhhbmRsZXIpXG4gICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgfVxuXG4gIHRyYW5zaXRpb25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoVFJBTlNJVElPTl9FTkQsIGhhbmRsZXIpXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGlmICghY2FsbGVkKSB7XG4gICAgICB0cmlnZ2VyVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRWxlbWVudClcbiAgICB9XG4gIH0sIGVtdWxhdGVkRHVyYXRpb24pXG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwcmV2aW91cy9uZXh0IGVsZW1lbnQgb2YgYSBsaXN0LlxuICpcbiAqIEBwYXJhbSB7YXJyYXl9IGxpc3QgICAgVGhlIGxpc3Qgb2YgZWxlbWVudHNcbiAqIEBwYXJhbSBhY3RpdmVFbGVtZW50ICAgVGhlIGFjdGl2ZSBlbGVtZW50XG4gKiBAcGFyYW0gc2hvdWxkR2V0TmV4dCAgIENob29zZSB0byBnZXQgbmV4dCBvciBwcmV2aW91cyBlbGVtZW50XG4gKiBAcGFyYW0gaXNDeWNsZUFsbG93ZWRcbiAqIEByZXR1cm4ge0VsZW1lbnR8ZWxlbX0gVGhlIHByb3BlciBlbGVtZW50XG4gKi9cbmNvbnN0IGdldE5leHRBY3RpdmVFbGVtZW50ID0gKGxpc3QsIGFjdGl2ZUVsZW1lbnQsIHNob3VsZEdldE5leHQsIGlzQ3ljbGVBbGxvd2VkKSA9PiB7XG4gIGNvbnN0IGxpc3RMZW5ndGggPSBsaXN0Lmxlbmd0aFxuICBsZXQgaW5kZXggPSBsaXN0LmluZGV4T2YoYWN0aXZlRWxlbWVudClcblxuICAvLyBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbGlzdCByZXR1cm4gYW4gZWxlbWVudFxuICAvLyBkZXBlbmRpbmcgb24gdGhlIGRpcmVjdGlvbiBhbmQgaWYgY3ljbGUgaXMgYWxsb3dlZFxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuICFzaG91bGRHZXROZXh0ICYmIGlzQ3ljbGVBbGxvd2VkID8gbGlzdFtsaXN0TGVuZ3RoIC0gMV0gOiBsaXN0WzBdXG4gIH1cblxuICBpbmRleCArPSBzaG91bGRHZXROZXh0ID8gMSA6IC0xXG5cbiAgaWYgKGlzQ3ljbGVBbGxvd2VkKSB7XG4gICAgaW5kZXggPSAoaW5kZXggKyBsaXN0TGVuZ3RoKSAlIGxpc3RMZW5ndGhcbiAgfVxuXG4gIHJldHVybiBsaXN0W01hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCBsaXN0TGVuZ3RoIC0gMSkpXVxufVxuXG5leHBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGV4ZWN1dGUsXG4gIGV4ZWN1dGVBZnRlclRyYW5zaXRpb24sXG4gIGZpbmRTaGFkb3dSb290LFxuICBnZXRFbGVtZW50LFxuICBnZXRqUXVlcnksXG4gIGdldE5leHRBY3RpdmVFbGVtZW50LFxuICBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCxcbiAgZ2V0VUlELFxuICBpc0Rpc2FibGVkLFxuICBpc0VsZW1lbnQsXG4gIGlzUlRMLFxuICBpc1Zpc2libGUsXG4gIG5vb3AsXG4gIG9uRE9NQ29udGVudExvYWRlZCxcbiAgcGFyc2VTZWxlY3RvcixcbiAgcmVmbG93LFxuICB0cmlnZ2VyVHJhbnNpdGlvbkVuZCxcbiAgdG9UeXBlXG59XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRvbS9ldmVudC1oYW5kbGVyLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IHsgZ2V0alF1ZXJ5IH0gZnJvbSAnLi4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBuYW1lc3BhY2VSZWdleCA9IC9bXi5dKig/PVxcLi4qKVxcLnwuKi9cbmNvbnN0IHN0cmlwTmFtZVJlZ2V4ID0gL1xcLi4qL1xuY29uc3Qgc3RyaXBVaWRSZWdleCA9IC86OlxcZCskL1xuY29uc3QgZXZlbnRSZWdpc3RyeSA9IHt9IC8vIEV2ZW50cyBzdG9yYWdlXG5sZXQgdWlkRXZlbnQgPSAxXG5jb25zdCBjdXN0b21FdmVudHMgPSB7XG4gIG1vdXNlZW50ZXI6ICdtb3VzZW92ZXInLFxuICBtb3VzZWxlYXZlOiAnbW91c2VvdXQnXG59XG5cbmNvbnN0IG5hdGl2ZUV2ZW50cyA9IG5ldyBTZXQoW1xuICAnY2xpY2snLFxuICAnZGJsY2xpY2snLFxuICAnbW91c2V1cCcsXG4gICdtb3VzZWRvd24nLFxuICAnY29udGV4dG1lbnUnLFxuICAnbW91c2V3aGVlbCcsXG4gICdET01Nb3VzZVNjcm9sbCcsXG4gICdtb3VzZW92ZXInLFxuICAnbW91c2VvdXQnLFxuICAnbW91c2Vtb3ZlJyxcbiAgJ3NlbGVjdHN0YXJ0JyxcbiAgJ3NlbGVjdGVuZCcsXG4gICdrZXlkb3duJyxcbiAgJ2tleXByZXNzJyxcbiAgJ2tleXVwJyxcbiAgJ29yaWVudGF0aW9uY2hhbmdlJyxcbiAgJ3RvdWNoc3RhcnQnLFxuICAndG91Y2htb3ZlJyxcbiAgJ3RvdWNoZW5kJyxcbiAgJ3RvdWNoY2FuY2VsJyxcbiAgJ3BvaW50ZXJkb3duJyxcbiAgJ3BvaW50ZXJtb3ZlJyxcbiAgJ3BvaW50ZXJ1cCcsXG4gICdwb2ludGVybGVhdmUnLFxuICAncG9pbnRlcmNhbmNlbCcsXG4gICdnZXN0dXJlc3RhcnQnLFxuICAnZ2VzdHVyZWNoYW5nZScsXG4gICdnZXN0dXJlZW5kJyxcbiAgJ2ZvY3VzJyxcbiAgJ2JsdXInLFxuICAnY2hhbmdlJyxcbiAgJ3Jlc2V0JyxcbiAgJ3NlbGVjdCcsXG4gICdzdWJtaXQnLFxuICAnZm9jdXNpbicsXG4gICdmb2N1c291dCcsXG4gICdsb2FkJyxcbiAgJ3VubG9hZCcsXG4gICdiZWZvcmV1bmxvYWQnLFxuICAncmVzaXplJyxcbiAgJ21vdmUnLFxuICAnRE9NQ29udGVudExvYWRlZCcsXG4gICdyZWFkeXN0YXRlY2hhbmdlJyxcbiAgJ2Vycm9yJyxcbiAgJ2Fib3J0JyxcbiAgJ3Njcm9sbCdcbl0pXG5cbi8qKlxuICogUHJpdmF0ZSBtZXRob2RzXG4gKi9cblxuZnVuY3Rpb24gbWFrZUV2ZW50VWlkKGVsZW1lbnQsIHVpZCkge1xuICByZXR1cm4gKHVpZCAmJiBgJHt1aWR9Ojoke3VpZEV2ZW50Kyt9YCkgfHwgZWxlbWVudC51aWRFdmVudCB8fCB1aWRFdmVudCsrXG59XG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRFdmVudHMoZWxlbWVudCkge1xuICBjb25zdCB1aWQgPSBtYWtlRXZlbnRVaWQoZWxlbWVudClcblxuICBlbGVtZW50LnVpZEV2ZW50ID0gdWlkXG4gIGV2ZW50UmVnaXN0cnlbdWlkXSA9IGV2ZW50UmVnaXN0cnlbdWlkXSB8fCB7fVxuXG4gIHJldHVybiBldmVudFJlZ2lzdHJ5W3VpZF1cbn1cblxuZnVuY3Rpb24gYm9vdHN0cmFwSGFuZGxlcihlbGVtZW50LCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgIGh5ZHJhdGVPYmooZXZlbnQsIHsgZGVsZWdhdGVUYXJnZXQ6IGVsZW1lbnQgfSlcblxuICAgIGlmIChoYW5kbGVyLm9uZU9mZikge1xuICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCBldmVudC50eXBlLCBmbilcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uYXBwbHkoZWxlbWVudCwgW2V2ZW50XSlcbiAgfVxufVxuXG5mdW5jdGlvbiBib290c3RyYXBEZWxlZ2F0aW9uSGFuZGxlcihlbGVtZW50LCBzZWxlY3RvciwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICBjb25zdCBkb21FbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcblxuICAgIGZvciAobGV0IHsgdGFyZ2V0IH0gPSBldmVudDsgdGFyZ2V0ICYmIHRhcmdldCAhPT0gdGhpczsgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgIGZvciAoY29uc3QgZG9tRWxlbWVudCBvZiBkb21FbGVtZW50cykge1xuICAgICAgICBpZiAoZG9tRWxlbWVudCAhPT0gdGFyZ2V0KSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGh5ZHJhdGVPYmooZXZlbnQsIHsgZGVsZWdhdGVUYXJnZXQ6IHRhcmdldCB9KVxuXG4gICAgICAgIGlmIChoYW5kbGVyLm9uZU9mZikge1xuICAgICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgZXZlbnQudHlwZSwgc2VsZWN0b3IsIGZuKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRhcmdldCwgW2V2ZW50XSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEhhbmRsZXIoZXZlbnRzLCBjYWxsYWJsZSwgZGVsZWdhdGlvblNlbGVjdG9yID0gbnVsbCkge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhldmVudHMpXG4gICAgLmZpbmQoZXZlbnQgPT4gZXZlbnQuY2FsbGFibGUgPT09IGNhbGxhYmxlICYmIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvciA9PT0gZGVsZWdhdGlvblNlbGVjdG9yKVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgY29uc3QgaXNEZWxlZ2F0ZWQgPSB0eXBlb2YgaGFuZGxlciA9PT0gJ3N0cmluZydcbiAgLy8gVE9ETzogdG9vbHRpcCBwYXNzZXMgYGZhbHNlYCBpbnN0ZWFkIG9mIHNlbGVjdG9yLCBzbyB3ZSBuZWVkIHRvIGNoZWNrXG4gIGNvbnN0IGNhbGxhYmxlID0gaXNEZWxlZ2F0ZWQgPyBkZWxlZ2F0aW9uRnVuY3Rpb24gOiAoaGFuZGxlciB8fCBkZWxlZ2F0aW9uRnVuY3Rpb24pXG4gIGxldCB0eXBlRXZlbnQgPSBnZXRUeXBlRXZlbnQob3JpZ2luYWxUeXBlRXZlbnQpXG5cbiAgaWYgKCFuYXRpdmVFdmVudHMuaGFzKHR5cGVFdmVudCkpIHtcbiAgICB0eXBlRXZlbnQgPSBvcmlnaW5hbFR5cGVFdmVudFxuICB9XG5cbiAgcmV0dXJuIFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF1cbn1cblxuZnVuY3Rpb24gYWRkSGFuZGxlcihlbGVtZW50LCBvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uLCBvbmVPZmYpIHtcbiAgaWYgKHR5cGVvZiBvcmlnaW5hbFR5cGVFdmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGxldCBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdID0gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKVxuXG4gIC8vIGluIGNhc2Ugb2YgbW91c2VlbnRlciBvciBtb3VzZWxlYXZlIHdyYXAgdGhlIGhhbmRsZXIgd2l0aGluIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGl0cyBET00gcG9zaXRpb25cbiAgLy8gdGhpcyBwcmV2ZW50cyB0aGUgaGFuZGxlciBmcm9tIGJlaW5nIGRpc3BhdGNoZWQgdGhlIHNhbWUgd2F5IGFzIG1vdXNlb3ZlciBvciBtb3VzZW91dCBkb2VzXG4gIGlmIChvcmlnaW5hbFR5cGVFdmVudCBpbiBjdXN0b21FdmVudHMpIHtcbiAgICBjb25zdCB3cmFwRnVuY3Rpb24gPSBmbiA9PiB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmICghZXZlbnQucmVsYXRlZFRhcmdldCB8fCAoZXZlbnQucmVsYXRlZFRhcmdldCAhPT0gZXZlbnQuZGVsZWdhdGVUYXJnZXQgJiYgIWV2ZW50LmRlbGVnYXRlVGFyZ2V0LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSkge1xuICAgICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FsbGFibGUgPSB3cmFwRnVuY3Rpb24oY2FsbGFibGUpXG4gIH1cblxuICBjb25zdCBldmVudHMgPSBnZXRFbGVtZW50RXZlbnRzKGVsZW1lbnQpXG4gIGNvbnN0IGhhbmRsZXJzID0gZXZlbnRzW3R5cGVFdmVudF0gfHwgKGV2ZW50c1t0eXBlRXZlbnRdID0ge30pXG4gIGNvbnN0IHByZXZpb3VzRnVuY3Rpb24gPSBmaW5kSGFuZGxlcihoYW5kbGVycywgY2FsbGFibGUsIGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGwpXG5cbiAgaWYgKHByZXZpb3VzRnVuY3Rpb24pIHtcbiAgICBwcmV2aW91c0Z1bmN0aW9uLm9uZU9mZiA9IHByZXZpb3VzRnVuY3Rpb24ub25lT2ZmICYmIG9uZU9mZlxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB1aWQgPSBtYWtlRXZlbnRVaWQoY2FsbGFibGUsIG9yaWdpbmFsVHlwZUV2ZW50LnJlcGxhY2UobmFtZXNwYWNlUmVnZXgsICcnKSlcbiAgY29uc3QgZm4gPSBpc0RlbGVnYXRlZCA/XG4gICAgYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgY2FsbGFibGUpIDpcbiAgICBib290c3RyYXBIYW5kbGVyKGVsZW1lbnQsIGNhbGxhYmxlKVxuXG4gIGZuLmRlbGVnYXRpb25TZWxlY3RvciA9IGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGxcbiAgZm4uY2FsbGFibGUgPSBjYWxsYWJsZVxuICBmbi5vbmVPZmYgPSBvbmVPZmZcbiAgZm4udWlkRXZlbnQgPSB1aWRcbiAgaGFuZGxlcnNbdWlkXSA9IGZuXG5cbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIGlzRGVsZWdhdGVkKVxufVxuXG5mdW5jdGlvbiByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpIHtcbiAgY29uc3QgZm4gPSBmaW5kSGFuZGxlcihldmVudHNbdHlwZUV2ZW50XSwgaGFuZGxlciwgZGVsZWdhdGlvblNlbGVjdG9yKVxuXG4gIGlmICghZm4pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlRXZlbnQsIGZuLCBCb29sZWFuKGRlbGVnYXRpb25TZWxlY3RvcikpXG4gIGRlbGV0ZSBldmVudHNbdHlwZUV2ZW50XVtmbi51aWRFdmVudF1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlTmFtZXNwYWNlZEhhbmRsZXJzKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBuYW1lc3BhY2UpIHtcbiAgY29uc3Qgc3RvcmVFbGVtZW50RXZlbnQgPSBldmVudHNbdHlwZUV2ZW50XSB8fCB7fVxuXG4gIGZvciAoY29uc3QgW2hhbmRsZXJLZXksIGV2ZW50XSBvZiBPYmplY3QuZW50cmllcyhzdG9yZUVsZW1lbnRFdmVudCkpIHtcbiAgICBpZiAoaGFuZGxlcktleS5pbmNsdWRlcyhuYW1lc3BhY2UpKSB7XG4gICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUeXBlRXZlbnQoZXZlbnQpIHtcbiAgLy8gYWxsb3cgdG8gZ2V0IHRoZSBuYXRpdmUgZXZlbnRzIGZyb20gbmFtZXNwYWNlZCBldmVudHMgKCdjbGljay5icy5idXR0b24nIC0tPiAnY2xpY2snKVxuICBldmVudCA9IGV2ZW50LnJlcGxhY2Uoc3RyaXBOYW1lUmVnZXgsICcnKVxuICByZXR1cm4gY3VzdG9tRXZlbnRzW2V2ZW50XSB8fCBldmVudFxufVxuXG5jb25zdCBFdmVudEhhbmRsZXIgPSB7XG4gIG9uKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICBhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIGZhbHNlKVxuICB9LFxuXG4gIG9uZShlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgYWRkSGFuZGxlcihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uLCB0cnVlKVxuICB9LFxuXG4gIG9mZihlbGVtZW50LCBvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiBvcmlnaW5hbFR5cGVFdmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF0gPSBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pXG4gICAgY29uc3QgaW5OYW1lc3BhY2UgPSB0eXBlRXZlbnQgIT09IG9yaWdpbmFsVHlwZUV2ZW50XG4gICAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KVxuICAgIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge31cbiAgICBjb25zdCBpc05hbWVzcGFjZSA9IG9yaWdpbmFsVHlwZUV2ZW50LnN0YXJ0c1dpdGgoJy4nKVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYWJsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIFNpbXBsZXN0IGNhc2U6IGhhbmRsZXIgaXMgcGFzc2VkLCByZW1vdmUgdGhhdCBsaXN0ZW5lciBPTkxZLlxuICAgICAgaWYgKCFPYmplY3Qua2V5cyhzdG9yZUVsZW1lbnRFdmVudCkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBjYWxsYWJsZSwgaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpc05hbWVzcGFjZSkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50RXZlbnQgb2YgT2JqZWN0LmtleXMoZXZlbnRzKSkge1xuICAgICAgICByZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMoZWxlbWVudCwgZXZlbnRzLCBlbGVtZW50RXZlbnQsIG9yaWdpbmFsVHlwZUV2ZW50LnNsaWNlKDEpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleUhhbmRsZXJzLCBldmVudF0gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmVFbGVtZW50RXZlbnQpKSB7XG4gICAgICBjb25zdCBoYW5kbGVyS2V5ID0ga2V5SGFuZGxlcnMucmVwbGFjZShzdHJpcFVpZFJlZ2V4LCAnJylcblxuICAgICAgaWYgKCFpbk5hbWVzcGFjZSB8fCBvcmlnaW5hbFR5cGVFdmVudC5pbmNsdWRlcyhoYW5kbGVyS2V5KSkge1xuICAgICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB0cmlnZ2VyKGVsZW1lbnQsIGV2ZW50LCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgJCA9IGdldGpRdWVyeSgpXG4gICAgY29uc3QgdHlwZUV2ZW50ID0gZ2V0VHlwZUV2ZW50KGV2ZW50KVxuICAgIGNvbnN0IGluTmFtZXNwYWNlID0gZXZlbnQgIT09IHR5cGVFdmVudFxuXG4gICAgbGV0IGpRdWVyeUV2ZW50ID0gbnVsbFxuICAgIGxldCBidWJibGVzID0gdHJ1ZVxuICAgIGxldCBuYXRpdmVEaXNwYXRjaCA9IHRydWVcbiAgICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlXG5cbiAgICBpZiAoaW5OYW1lc3BhY2UgJiYgJCkge1xuICAgICAgalF1ZXJ5RXZlbnQgPSAkLkV2ZW50KGV2ZW50LCBhcmdzKVxuXG4gICAgICAkKGVsZW1lbnQpLnRyaWdnZXIoalF1ZXJ5RXZlbnQpXG4gICAgICBidWJibGVzID0gIWpRdWVyeUV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKClcbiAgICAgIG5hdGl2ZURpc3BhdGNoID0gIWpRdWVyeUV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKClcbiAgICAgIGRlZmF1bHRQcmV2ZW50ZWQgPSBqUXVlcnlFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKVxuICAgIH1cblxuICAgIGNvbnN0IGV2dCA9IGh5ZHJhdGVPYmoobmV3IEV2ZW50KGV2ZW50LCB7IGJ1YmJsZXMsIGNhbmNlbGFibGU6IHRydWUgfSksIGFyZ3MpXG5cbiAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KClcbiAgICB9XG5cbiAgICBpZiAobmF0aXZlRGlzcGF0Y2gpIHtcbiAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldnQpXG4gICAgfVxuXG4gICAgaWYgKGV2dC5kZWZhdWx0UHJldmVudGVkICYmIGpRdWVyeUV2ZW50KSB7XG4gICAgICBqUXVlcnlFdmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGV2dFxuICB9XG59XG5cbmZ1bmN0aW9uIGh5ZHJhdGVPYmoob2JqLCBtZXRhID0ge30pIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWV0YSkpIHtcbiAgICB0cnkge1xuICAgICAgb2JqW2tleV0gPSB2YWx1ZVxuICAgIH0gY2F0Y2gge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cblxuZXhwb3J0IGRlZmF1bHQgRXZlbnRIYW5kbGVyXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRvbS9tYW5pcHVsYXRvci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAodmFsdWUgPT09IE51bWJlcih2YWx1ZSkudG9TdHJpbmcoKSkge1xuICAgIHJldHVybiBOdW1iZXIodmFsdWUpXG4gIH1cblxuICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSAnbnVsbCcpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSlcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRGF0YUtleShrZXkpIHtcbiAgcmV0dXJuIGtleS5yZXBsYWNlKC9bQS1aXS9nLCBjaHIgPT4gYC0ke2Noci50b0xvd2VyQ2FzZSgpfWApXG59XG5cbmNvbnN0IE1hbmlwdWxhdG9yID0ge1xuICBzZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSwgdmFsdWUpIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gLCB2YWx1ZSlcbiAgfSxcblxuICByZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSkge1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWApXG4gIH0sXG5cbiAgZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHt9XG4gICAgY29uc3QgYnNLZXlzID0gT2JqZWN0LmtleXMoZWxlbWVudC5kYXRhc2V0KS5maWx0ZXIoa2V5ID0+IGtleS5zdGFydHNXaXRoKCdicycpICYmICFrZXkuc3RhcnRzV2l0aCgnYnNDb25maWcnKSlcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGJzS2V5cykge1xuICAgICAgbGV0IHB1cmVLZXkgPSBrZXkucmVwbGFjZSgvXmJzLywgJycpXG4gICAgICBwdXJlS2V5ID0gcHVyZUtleS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHB1cmVLZXkuc2xpY2UoMSwgcHVyZUtleS5sZW5ndGgpXG4gICAgICBhdHRyaWJ1dGVzW3B1cmVLZXldID0gbm9ybWFsaXplRGF0YShlbGVtZW50LmRhdGFzZXRba2V5XSlcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlc1xuICB9LFxuXG4gIGdldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5KSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZURhdGEoZWxlbWVudC5nZXRBdHRyaWJ1dGUoYGRhdGEtYnMtJHtub3JtYWxpemVEYXRhS2V5KGtleSl9YCkpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFuaXB1bGF0b3JcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9jb25maWcuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgTWFuaXB1bGF0b3IgZnJvbSAnLi4vZG9tL21hbmlwdWxhdG9yLmpzJ1xuaW1wb3J0IHsgaXNFbGVtZW50LCB0b1R5cGUgfSBmcm9tICcuL2luZGV4LmpzJ1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBDb25maWcge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIHN0YXRpYyBtZXRob2QgXCJOQU1FXCIsIGZvciBlYWNoIGNvbXBvbmVudCEnKVxuICB9XG5cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25maWcgPSB0aGlzLl9tZXJnZUNvbmZpZ09iaihjb25maWcpXG4gICAgY29uZmlnID0gdGhpcy5fY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpXG4gICAgdGhpcy5fdHlwZUNoZWNrQ29uZmlnKGNvbmZpZylcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfbWVyZ2VDb25maWdPYmooY29uZmlnLCBlbGVtZW50KSB7XG4gICAgY29uc3QganNvbkNvbmZpZyA9IGlzRWxlbWVudChlbGVtZW50KSA/IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgJ2NvbmZpZycpIDoge30gLy8gdHJ5IHRvIHBhcnNlXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LFxuICAgICAgLi4uKHR5cGVvZiBqc29uQ29uZmlnID09PSAnb2JqZWN0JyA/IGpzb25Db25maWcgOiB7fSksXG4gICAgICAuLi4oaXNFbGVtZW50KGVsZW1lbnQpID8gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkgOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgPyBjb25maWcgOiB7fSlcbiAgICB9XG4gIH1cblxuICBfdHlwZUNoZWNrQ29uZmlnKGNvbmZpZywgY29uZmlnVHlwZXMgPSB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKSB7XG4gICAgZm9yIChjb25zdCBbcHJvcGVydHksIGV4cGVjdGVkVHlwZXNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ1R5cGVzKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdbcHJvcGVydHldXG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSBpc0VsZW1lbnQodmFsdWUpID8gJ2VsZW1lbnQnIDogdG9UeXBlKHZhbHVlKVxuXG4gICAgICBpZiAoIW5ldyBSZWdFeHAoZXhwZWN0ZWRUeXBlcykudGVzdCh2YWx1ZVR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgYCR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FLnRvVXBwZXJDYXNlKCl9OiBPcHRpb24gXCIke3Byb3BlcnR5fVwiIHByb3ZpZGVkIHR5cGUgXCIke3ZhbHVlVHlwZX1cIiBidXQgZXhwZWN0ZWQgdHlwZSBcIiR7ZXhwZWN0ZWRUeXBlc31cIi5gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29uZmlnXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGJhc2UtY29tcG9uZW50LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IERhdGEgZnJvbSAnLi9kb20vZGF0YS5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBDb25maWcgZnJvbSAnLi91dGlsL2NvbmZpZy5qcydcbmltcG9ydCB7IGV4ZWN1dGVBZnRlclRyYW5zaXRpb24sIGdldEVsZW1lbnQgfSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgVkVSU0lPTiA9ICc1LjMuMydcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQmFzZUNvbXBvbmVudCBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKClcblxuICAgIGVsZW1lbnQgPSBnZXRFbGVtZW50KGVsZW1lbnQpXG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudFxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpXG5cbiAgICBEYXRhLnNldCh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZLCB0aGlzKVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGRpc3Bvc2UoKSB7XG4gICAgRGF0YS5yZW1vdmUodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSlcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuRVZFTlRfS0VZKVxuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHtcbiAgICAgIHRoaXNbcHJvcGVydHlOYW1lXSA9IG51bGxcbiAgICB9XG4gIH1cblxuICBfcXVldWVDYWxsYmFjayhjYWxsYmFjaywgZWxlbWVudCwgaXNBbmltYXRlZCA9IHRydWUpIHtcbiAgICBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkKVxuICB9XG5cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25maWcgPSB0aGlzLl9tZXJnZUNvbmZpZ09iaihjb25maWcsIHRoaXMuX2VsZW1lbnQpXG4gICAgY29uZmlnID0gdGhpcy5fY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpXG4gICAgdGhpcy5fdHlwZUNoZWNrQ29uZmlnKGNvbmZpZylcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGdldEluc3RhbmNlKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gRGF0YS5nZXQoZ2V0RWxlbWVudChlbGVtZW50KSwgdGhpcy5EQVRBX0tFWSlcbiAgfVxuXG4gIHN0YXRpYyBnZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIGNvbmZpZyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SW5zdGFuY2UoZWxlbWVudCkgfHwgbmV3IHRoaXMoZWxlbWVudCwgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgPyBjb25maWcgOiBudWxsKVxuICB9XG5cbiAgc3RhdGljIGdldCBWRVJTSU9OKCkge1xuICAgIHJldHVybiBWRVJTSU9OXG4gIH1cblxuICBzdGF0aWMgZ2V0IERBVEFfS0VZKCkge1xuICAgIHJldHVybiBgYnMuJHt0aGlzLk5BTUV9YFxuICB9XG5cbiAgc3RhdGljIGdldCBFVkVOVF9LRVkoKSB7XG4gICAgcmV0dXJuIGAuJHt0aGlzLkRBVEFfS0VZfWBcbiAgfVxuXG4gIHN0YXRpYyBldmVudE5hbWUobmFtZSkge1xuICAgIHJldHVybiBgJHtuYW1lfSR7dGhpcy5FVkVOVF9LRVl9YFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2VDb21wb25lbnRcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL3NlbGVjdG9yLWVuZ2luZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7IGlzRGlzYWJsZWQsIGlzVmlzaWJsZSwgcGFyc2VTZWxlY3RvciB9IGZyb20gJy4uL3V0aWwvaW5kZXguanMnXG5cbmNvbnN0IGdldFNlbGVjdG9yID0gZWxlbWVudCA9PiB7XG4gIGxldCBzZWxlY3RvciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLXRhcmdldCcpXG5cbiAgaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gJyMnKSB7XG4gICAgbGV0IGhyZWZBdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpXG5cbiAgICAvLyBUaGUgb25seSB2YWxpZCBjb250ZW50IHRoYXQgY291bGQgZG91YmxlIGFzIGEgc2VsZWN0b3IgYXJlIElEcyBvciBjbGFzc2VzLFxuICAgIC8vIHNvIGV2ZXJ5dGhpbmcgc3RhcnRpbmcgd2l0aCBgI2Agb3IgYC5gLiBJZiBhIFwicmVhbFwiIFVSTCBpcyB1c2VkIGFzIHRoZSBzZWxlY3RvcixcbiAgICAvLyBgZG9jdW1lbnQucXVlcnlTZWxlY3RvcmAgd2lsbCByaWdodGZ1bGx5IGNvbXBsYWluIGl0IGlzIGludmFsaWQuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMzIyNzNcbiAgICBpZiAoIWhyZWZBdHRyaWJ1dGUgfHwgKCFocmVmQXR0cmlidXRlLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyaWJ1dGUuc3RhcnRzV2l0aCgnLicpKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICAvLyBKdXN0IGluIGNhc2Ugc29tZSBDTVMgcHV0cyBvdXQgYSBmdWxsIFVSTCB3aXRoIHRoZSBhbmNob3IgYXBwZW5kZWRcbiAgICBpZiAoaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgaHJlZkF0dHJpYnV0ZSA9IGAjJHtocmVmQXR0cmlidXRlLnNwbGl0KCcjJylbMV19YFxuICAgIH1cblxuICAgIHNlbGVjdG9yID0gaHJlZkF0dHJpYnV0ZSAmJiBocmVmQXR0cmlidXRlICE9PSAnIycgPyBocmVmQXR0cmlidXRlLnRyaW0oKSA6IG51bGxcbiAgfVxuXG4gIHJldHVybiBzZWxlY3RvciA/IHNlbGVjdG9yLnNwbGl0KCcsJykubWFwKHNlbCA9PiBwYXJzZVNlbGVjdG9yKHNlbCkpLmpvaW4oJywnKSA6IG51bGxcbn1cblxuY29uc3QgU2VsZWN0b3JFbmdpbmUgPSB7XG4gIGZpbmQoc2VsZWN0b3IsIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KC4uLkVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwuY2FsbChlbGVtZW50LCBzZWxlY3RvcikpXG4gIH0sXG5cbiAgZmluZE9uZShzZWxlY3RvciwgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgIHJldHVybiBFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpXG4gIH0sXG5cbiAgY2hpbGRyZW4oZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KC4uLmVsZW1lbnQuY2hpbGRyZW4pLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5tYXRjaGVzKHNlbGVjdG9yKSlcbiAgfSxcblxuICBwYXJlbnRzKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgY29uc3QgcGFyZW50cyA9IFtdXG4gICAgbGV0IGFuY2VzdG9yID0gZWxlbWVudC5wYXJlbnROb2RlLmNsb3Nlc3Qoc2VsZWN0b3IpXG5cbiAgICB3aGlsZSAoYW5jZXN0b3IpIHtcbiAgICAgIHBhcmVudHMucHVzaChhbmNlc3RvcilcbiAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50Tm9kZS5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnRzXG4gIH0sXG5cbiAgcHJldihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGxldCBwcmV2aW91cyA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZ1xuXG4gICAgd2hpbGUgKHByZXZpb3VzKSB7XG4gICAgICBpZiAocHJldmlvdXMubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgcmV0dXJuIFtwcmV2aW91c11cbiAgICAgIH1cblxuICAgICAgcHJldmlvdXMgPSBwcmV2aW91cy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXG4gICAgfVxuXG4gICAgcmV0dXJuIFtdXG4gIH0sXG4gIC8vIFRPRE86IHRoaXMgaXMgbm93IHVudXNlZDsgcmVtb3ZlIGxhdGVyIGFsb25nIHdpdGggcHJldigpXG4gIG5leHQoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICBsZXQgbmV4dCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nXG5cbiAgICB3aGlsZSAobmV4dCkge1xuICAgICAgaWYgKG5leHQubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgcmV0dXJuIFtuZXh0XVxuICAgICAgfVxuXG4gICAgICBuZXh0ID0gbmV4dC5uZXh0RWxlbWVudFNpYmxpbmdcbiAgICB9XG5cbiAgICByZXR1cm4gW11cbiAgfSxcblxuICBmb2N1c2FibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgY29uc3QgZm9jdXNhYmxlcyA9IFtcbiAgICAgICdhJyxcbiAgICAgICdidXR0b24nLFxuICAgICAgJ2lucHV0JyxcbiAgICAgICd0ZXh0YXJlYScsXG4gICAgICAnc2VsZWN0JyxcbiAgICAgICdkZXRhaWxzJyxcbiAgICAgICdbdGFiaW5kZXhdJyxcbiAgICAgICdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSdcbiAgICBdLm1hcChzZWxlY3RvciA9PiBgJHtzZWxlY3Rvcn06bm90KFt0YWJpbmRleF49XCItXCJdKWApLmpvaW4oJywnKVxuXG4gICAgcmV0dXJuIHRoaXMuZmluZChmb2N1c2FibGVzLCBlbGVtZW50KS5maWx0ZXIoZWwgPT4gIWlzRGlzYWJsZWQoZWwpICYmIGlzVmlzaWJsZShlbCkpXG4gIH0sXG5cbiAgZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KVxuXG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvcikgPyBzZWxlY3RvciA6IG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9LFxuXG4gIGdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoZWxlbWVudClcblxuICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IpIDogbnVsbFxuICB9LFxuXG4gIGdldE11bHRpcGxlRWxlbWVudHNGcm9tU2VsZWN0b3IoZWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoZWxlbWVudClcblxuICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IpIDogW11cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTZWxlY3RvckVuZ2luZVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB0YWIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50LmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4vZG9tL3NlbGVjdG9yLWVuZ2luZS5qcydcbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiwgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQsIGlzRGlzYWJsZWQgfSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICd0YWInXG5jb25zdCBEQVRBX0tFWSA9ICdicy50YWInXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPVyA9IGBzaG93JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPV04gPSBgc2hvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0tFWURPV04gPSBga2V5ZG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZfWBcblxuY29uc3QgQVJST1dfTEVGVF9LRVkgPSAnQXJyb3dMZWZ0J1xuY29uc3QgQVJST1dfUklHSFRfS0VZID0gJ0Fycm93UmlnaHQnXG5jb25zdCBBUlJPV19VUF9LRVkgPSAnQXJyb3dVcCdcbmNvbnN0IEFSUk9XX0RPV05fS0VZID0gJ0Fycm93RG93bidcbmNvbnN0IEhPTUVfS0VZID0gJ0hvbWUnXG5jb25zdCBFTkRfS0VZID0gJ0VuZCdcblxuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IENMQVNTX0RST1BET1dOID0gJ2Ryb3Bkb3duJ1xuXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUgPSAnLmRyb3Bkb3duLXRvZ2dsZSdcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX01FTlUgPSAnLmRyb3Bkb3duLW1lbnUnXG5jb25zdCBOT1RfU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFID0gYDpub3QoJHtTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEV9KWBcblxuY29uc3QgU0VMRUNUT1JfVEFCX1BBTkVMID0gJy5saXN0LWdyb3VwLCAubmF2LCBbcm9sZT1cInRhYmxpc3RcIl0nXG5jb25zdCBTRUxFQ1RPUl9PVVRFUiA9ICcubmF2LWl0ZW0sIC5saXN0LWdyb3VwLWl0ZW0nXG5jb25zdCBTRUxFQ1RPUl9JTk5FUiA9IGAubmF2LWxpbmske05PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEV9LCAubGlzdC1ncm91cC1pdGVtJHtOT1RfU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfSwgW3JvbGU9XCJ0YWJcIl0ke05PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEV9YFxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwidGFiXCJdLCBbZGF0YS1icy10b2dnbGU9XCJwaWxsXCJdLCBbZGF0YS1icy10b2dnbGU9XCJsaXN0XCJdJyAvLyBUT0RPOiBjb3VsZCBvbmx5IGJlIGB0YWJgIGluIHY2XG5jb25zdCBTRUxFQ1RPUl9JTk5FUl9FTEVNID0gYCR7U0VMRUNUT1JfSU5ORVJ9LCAke1NFTEVDVE9SX0RBVEFfVE9HR0xFfWBcblxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEVfQUNUSVZFID0gYC4ke0NMQVNTX05BTUVfQUNUSVZFfVtkYXRhLWJzLXRvZ2dsZT1cInRhYlwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwicGlsbFwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwibGlzdFwiXWBcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVGFiIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICBzdXBlcihlbGVtZW50KVxuICAgIHRoaXMuX3BhcmVudCA9IHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9UQUJfUEFORUwpXG5cbiAgICBpZiAoIXRoaXMuX3BhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgICAvLyBUT0RPOiBzaG91bGQgdGhyb3cgZXhjZXB0aW9uIGluIHY2XG4gICAgICAvLyB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2VsZW1lbnQub3V0ZXJIVE1MfSBoYXMgbm90IGEgdmFsaWQgcGFyZW50ICR7U0VMRUNUT1JfSU5ORVJfRUxFTX1gKVxuICAgIH1cblxuICAgIC8vIFNldCB1cCBpbml0aWFsIGFyaWEgYXR0cmlidXRlc1xuICAgIHRoaXMuX3NldEluaXRpYWxBdHRyaWJ1dGVzKHRoaXMuX3BhcmVudCwgdGhpcy5fZ2V0Q2hpbGRyZW4oKSlcblxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOLCBldmVudCA9PiB0aGlzLl9rZXlkb3duKGV2ZW50KSlcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgc2hvdygpIHsgLy8gU2hvd3MgdGhpcyBlbGVtIGFuZCBkZWFjdGl2YXRlIHRoZSBhY3RpdmUgc2libGluZyBpZiBleGlzdHNcbiAgICBjb25zdCBpbm5lckVsZW0gPSB0aGlzLl9lbGVtZW50XG4gICAgaWYgKHRoaXMuX2VsZW1Jc0FjdGl2ZShpbm5lckVsZW0pKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggZm9yIGFjdGl2ZSB0YWIgb24gc2FtZSBwYXJlbnQgdG8gZGVhY3RpdmF0ZSBpdFxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2dldEFjdGl2ZUVsZW0oKVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gYWN0aXZlID9cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKGFjdGl2ZSwgRVZFTlRfSElERSwgeyByZWxhdGVkVGFyZ2V0OiBpbm5lckVsZW0gfSkgOlxuICAgICAgbnVsbFxuXG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIoaW5uZXJFbGVtLCBFVkVOVF9TSE9XLCB7IHJlbGF0ZWRUYXJnZXQ6IGFjdGl2ZSB9KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkIHx8IChoaWRlRXZlbnQgJiYgaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9kZWFjdGl2YXRlKGFjdGl2ZSwgaW5uZXJFbGVtKVxuICAgIHRoaXMuX2FjdGl2YXRlKGlubmVyRWxlbSwgYWN0aXZlKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfYWN0aXZhdGUoZWxlbWVudCwgcmVsYXRlZEVsZW0pIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSlcblxuICAgIHRoaXMuX2FjdGl2YXRlKFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCkpIC8vIFNlYXJjaCBhbmQgYWN0aXZhdGUvc2hvdyB0aGUgcHJvcGVyIHNlY3Rpb25cblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgIT09ICd0YWInKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKVxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCB0cnVlKVxuICAgICAgdGhpcy5fdG9nZ2xlRHJvcERvd24oZWxlbWVudCwgdHJ1ZSlcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKGVsZW1lbnQsIEVWRU5UX1NIT1dOLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRFbGVtXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIGVsZW1lbnQsIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSkpXG4gIH1cblxuICBfZGVhY3RpdmF0ZShlbGVtZW50LCByZWxhdGVkRWxlbSkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuICAgIGVsZW1lbnQuYmx1cigpXG5cbiAgICB0aGlzLl9kZWFjdGl2YXRlKFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCkpIC8vIFNlYXJjaCBhbmQgZGVhY3RpdmF0ZSB0aGUgc2hvd24gc2VjdGlvbiB0b29cblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgIT09ICd0YWInKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIGZhbHNlKVxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJylcbiAgICAgIHRoaXMuX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIGZhbHNlKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIoZWxlbWVudCwgRVZFTlRfSElEREVOLCB7IHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRFbGVtIH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgZWxlbWVudCwgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKSlcbiAgfVxuXG4gIF9rZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKCEoW0FSUk9XX0xFRlRfS0VZLCBBUlJPV19SSUdIVF9LRVksIEFSUk9XX1VQX0tFWSwgQVJST1dfRE9XTl9LRVksIEhPTUVfS0VZLCBFTkRfS0VZXS5pbmNsdWRlcyhldmVudC5rZXkpKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkvLyBzdG9wUHJvcGFnYXRpb24vcHJldmVudERlZmF1bHQgYm90aCBhZGRlZCB0byBzdXBwb3J0IHVwL2Rvd24ga2V5cyB3aXRob3V0IHNjcm9sbGluZyB0aGUgcGFnZVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Q2hpbGRyZW4oKS5maWx0ZXIoZWxlbWVudCA9PiAhaXNEaXNhYmxlZChlbGVtZW50KSlcbiAgICBsZXQgbmV4dEFjdGl2ZUVsZW1lbnRcblxuICAgIGlmIChbSE9NRV9LRVksIEVORF9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgIG5leHRBY3RpdmVFbGVtZW50ID0gY2hpbGRyZW5bZXZlbnQua2V5ID09PSBIT01FX0tFWSA/IDAgOiBjaGlsZHJlbi5sZW5ndGggLSAxXVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpc05leHQgPSBbQVJST1dfUklHSFRfS0VZLCBBUlJPV19ET1dOX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KVxuICAgICAgbmV4dEFjdGl2ZUVsZW1lbnQgPSBnZXROZXh0QWN0aXZlRWxlbWVudChjaGlsZHJlbiwgZXZlbnQudGFyZ2V0LCBpc05leHQsIHRydWUpXG4gICAgfVxuXG4gICAgaWYgKG5leHRBY3RpdmVFbGVtZW50KSB7XG4gICAgICBuZXh0QWN0aXZlRWxlbWVudC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSlcbiAgICAgIFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKG5leHRBY3RpdmVFbGVtZW50KS5zaG93KClcbiAgICB9XG4gIH1cblxuICBfZ2V0Q2hpbGRyZW4oKSB7IC8vIGNvbGxlY3Rpb24gb2YgaW5uZXIgZWxlbWVudHNcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9JTk5FUl9FTEVNLCB0aGlzLl9wYXJlbnQpXG4gIH1cblxuICBfZ2V0QWN0aXZlRWxlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2hpbGRyZW4oKS5maW5kKGNoaWxkID0+IHRoaXMuX2VsZW1Jc0FjdGl2ZShjaGlsZCkpIHx8IG51bGxcbiAgfVxuXG4gIF9zZXRJbml0aWFsQXR0cmlidXRlcyhwYXJlbnQsIGNoaWxkcmVuKSB7XG4gICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMocGFyZW50LCAncm9sZScsICd0YWJsaXN0JylcblxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIHRoaXMuX3NldEluaXRpYWxBdHRyaWJ1dGVzT25DaGlsZChjaGlsZClcbiAgICB9XG4gIH1cblxuICBfc2V0SW5pdGlhbEF0dHJpYnV0ZXNPbkNoaWxkKGNoaWxkKSB7XG4gICAgY2hpbGQgPSB0aGlzLl9nZXRJbm5lckVsZW1lbnQoY2hpbGQpXG4gICAgY29uc3QgaXNBY3RpdmUgPSB0aGlzLl9lbGVtSXNBY3RpdmUoY2hpbGQpXG4gICAgY29uc3Qgb3V0ZXJFbGVtID0gdGhpcy5fZ2V0T3V0ZXJFbGVtZW50KGNoaWxkKVxuICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIGlzQWN0aXZlKVxuXG4gICAgaWYgKG91dGVyRWxlbSAhPT0gY2hpbGQpIHtcbiAgICAgIHRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKG91dGVyRWxlbSwgJ3JvbGUnLCAncHJlc2VudGF0aW9uJylcbiAgICB9XG5cbiAgICBpZiAoIWlzQWN0aXZlKSB7XG4gICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJylcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhjaGlsZCwgJ3JvbGUnLCAndGFiJylcblxuICAgIC8vIHNldCBhdHRyaWJ1dGVzIHRvIHRoZSByZWxhdGVkIHBhbmVsIHRvb1xuICAgIHRoaXMuX3NldEluaXRpYWxBdHRyaWJ1dGVzT25UYXJnZXRQYW5lbChjaGlsZClcbiAgfVxuXG4gIF9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwoY2hpbGQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGNoaWxkKVxuXG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKHRhcmdldCwgJ3JvbGUnLCAndGFicGFuZWwnKVxuXG4gICAgaWYgKGNoaWxkLmlkKSB7XG4gICAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyh0YXJnZXQsICdhcmlhLWxhYmVsbGVkYnknLCBgJHtjaGlsZC5pZH1gKVxuICAgIH1cbiAgfVxuXG4gIF90b2dnbGVEcm9wRG93bihlbGVtZW50LCBvcGVuKSB7XG4gICAgY29uc3Qgb3V0ZXJFbGVtID0gdGhpcy5fZ2V0T3V0ZXJFbGVtZW50KGVsZW1lbnQpXG4gICAgaWYgKCFvdXRlckVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX0RST1BET1dOKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdG9nZ2xlID0gKHNlbGVjdG9yLCBjbGFzc05hbWUpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKHNlbGVjdG9yLCBvdXRlckVsZW0pXG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoY2xhc3NOYW1lLCBvcGVuKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRvZ2dsZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUsIENMQVNTX05BTUVfQUNUSVZFKVxuICAgIHRvZ2dsZShTRUxFQ1RPUl9EUk9QRE9XTl9NRU5VLCBDTEFTU19OQU1FX1NIT1cpXG4gICAgb3V0ZXJFbGVtLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIG9wZW4pXG4gIH1cblxuICBfc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSkge1xuICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSlcbiAgICB9XG4gIH1cblxuICBfZWxlbUlzQWN0aXZlKGVsZW0pIHtcbiAgICByZXR1cm4gZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gIH1cblxuICAvLyBUcnkgdG8gZ2V0IHRoZSBpbm5lciBlbGVtZW50ICh1c3VhbGx5IHRoZSAubmF2LWxpbmspXG4gIF9nZXRJbm5lckVsZW1lbnQoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLm1hdGNoZXMoU0VMRUNUT1JfSU5ORVJfRUxFTSkgPyBlbGVtIDogU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9JTk5FUl9FTEVNLCBlbGVtKVxuICB9XG5cbiAgLy8gVHJ5IHRvIGdldCB0aGUgb3V0ZXIgZWxlbWVudCAodXN1YWxseSB0aGUgLm5hdi1pdGVtKVxuICBfZ2V0T3V0ZXJFbGVtZW50KGVsZW0pIHtcbiAgICByZXR1cm4gZWxlbS5jbG9zZXN0KFNFTEVDVE9SX09VVEVSKSB8fCBlbGVtXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgaWYgKGlzRGlzYWJsZWQodGhpcykpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpLnNob3coKVxufSlcblxuLyoqXG4gKiBJbml0aWFsaXplIG9uIGZvY3VzXG4gKi9cbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEksICgpID0+IHtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9UT0dHTEVfQUNUSVZFKSkge1xuICAgIFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQpXG4gIH1cbn0pXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihUYWIpXG5cbmV4cG9ydCBkZWZhdWx0IFRhYlxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBjb2xsYXBzZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLFxuICBnZXRFbGVtZW50LFxuICByZWZsb3dcbn0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnY29sbGFwc2UnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5jb2xsYXBzZSdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNFID0gJ2NvbGxhcHNlJ1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTSU5HID0gJ2NvbGxhcHNpbmcnXG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNFRCA9ICdjb2xsYXBzZWQnXG5jb25zdCBDTEFTU19OQU1FX0RFRVBFUl9DSElMRFJFTiA9IGA6c2NvcGUgLiR7Q0xBU1NfTkFNRV9DT0xMQVBTRX0gLiR7Q0xBU1NfTkFNRV9DT0xMQVBTRX1gXG5jb25zdCBDTEFTU19OQU1FX0hPUklaT05UQUwgPSAnY29sbGFwc2UtaG9yaXpvbnRhbCdcblxuY29uc3QgV0lEVEggPSAnd2lkdGgnXG5jb25zdCBIRUlHSFQgPSAnaGVpZ2h0J1xuXG5jb25zdCBTRUxFQ1RPUl9BQ1RJVkVTID0gJy5jb2xsYXBzZS5zaG93LCAuY29sbGFwc2UuY29sbGFwc2luZydcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cImNvbGxhcHNlXCJdJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBwYXJlbnQ6IG51bGwsXG4gIHRvZ2dsZTogdHJ1ZVxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgcGFyZW50OiAnKG51bGx8ZWxlbWVudCknLFxuICB0b2dnbGU6ICdib29sZWFuJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBDb2xsYXBzZSBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuICAgIHRoaXMuX3RyaWdnZXJBcnJheSA9IFtdXG5cbiAgICBjb25zdCB0b2dnbGVMaXN0ID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRSlcblxuICAgIGZvciAoY29uc3QgZWxlbSBvZiB0b2dnbGVMaXN0KSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IFNlbGVjdG9yRW5naW5lLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbSlcbiAgICAgIGNvbnN0IGZpbHRlckVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yKVxuICAgICAgICAuZmlsdGVyKGZvdW5kRWxlbWVudCA9PiBmb3VuZEVsZW1lbnQgPT09IHRoaXMuX2VsZW1lbnQpXG5cbiAgICAgIGlmIChzZWxlY3RvciAhPT0gbnVsbCAmJiBmaWx0ZXJFbGVtZW50Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyQXJyYXkucHVzaChlbGVtKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2luaXRpYWxpemVDaGlsZHJlbigpXG5cbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLl90cmlnZ2VyQXJyYXksIHRoaXMuX2lzU2hvd24oKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnRvZ2dsZSkge1xuICAgICAgdGhpcy50b2dnbGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuaGlkZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvdygpXG4gICAgfVxuICB9XG5cbiAgc2hvdygpIHtcbiAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8IHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGV0IGFjdGl2ZUNoaWxkcmVuID0gW11cblxuICAgIC8vIGZpbmQgYWN0aXZlIGNoaWxkcmVuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgIGFjdGl2ZUNoaWxkcmVuID0gdGhpcy5fZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKFNFTEVDVE9SX0FDVElWRVMpXG4gICAgICAgIC5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KVxuICAgICAgICAubWFwKGVsZW1lbnQgPT4gQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCB7IHRvZ2dsZTogZmFsc2UgfSkpXG4gICAgfVxuXG4gICAgaWYgKGFjdGl2ZUNoaWxkcmVuLmxlbmd0aCAmJiBhY3RpdmVDaGlsZHJlblswXS5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzdGFydEV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVylcbiAgICBpZiAoc3RhcnRFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFjdGl2ZUluc3RhbmNlIG9mIGFjdGl2ZUNoaWxkcmVuKSB7XG4gICAgICBhY3RpdmVJbnN0YW5jZS5oaWRlKClcbiAgICB9XG5cbiAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0UpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0lORylcblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IDBcblxuICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLl90cmlnZ2VyQXJyYXksIHRydWUpXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0UsIENMQVNTX05BTUVfU0hPVylcblxuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gJydcblxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04pXG4gICAgfVxuXG4gICAgY29uc3QgY2FwaXRhbGl6ZWREaW1lbnNpb24gPSBkaW1lbnNpb25bMF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSgxKVxuICAgIGNvbnN0IHNjcm9sbFNpemUgPSBgc2Nyb2xsJHtjYXBpdGFsaXplZERpbWVuc2lvbn1gXG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLl9lbGVtZW50LCB0cnVlKVxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IGAke3RoaXMuX2VsZW1lbnRbc2Nyb2xsU2l6ZV19cHhgXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25pbmcgfHwgIXRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREUpXG4gICAgaWYgKHN0YXJ0RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5fZ2V0RGltZW5zaW9uKClcblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IGAke3RoaXMuX2VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZGltZW5zaW9uXX1weGBcblxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0lORylcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTRSwgQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRoaXMuX3RyaWdnZXJBcnJheSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodHJpZ2dlcilcblxuICAgICAgaWYgKGVsZW1lbnQgJiYgIXRoaXMuX2lzU2hvd24oZWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKFt0cmlnZ2VyXSwgZmFsc2UpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0lORylcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNFKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnXG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLl9lbGVtZW50LCB0cnVlKVxuICB9XG5cbiAgX2lzU2hvd24oZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICBjb25maWcudG9nZ2xlID0gQm9vbGVhbihjb25maWcudG9nZ2xlKSAvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlc1xuICAgIGNvbmZpZy5wYXJlbnQgPSBnZXRFbGVtZW50KGNvbmZpZy5wYXJlbnQpXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2dldERpbWVuc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9IT1JJWk9OVEFMKSA/IFdJRFRIIDogSEVJR0hUXG4gIH1cblxuICBfaW5pdGlhbGl6ZUNoaWxkcmVuKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLnBhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9nZXRGaXJzdExldmVsQ2hpbGRyZW4oU0VMRUNUT1JfREFUQV9UT0dHTEUpXG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KVxuXG4gICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKFtlbGVtZW50XSwgdGhpcy5faXNTaG93bihzZWxlY3RlZCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihzZWxlY3Rvcikge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gU2VsZWN0b3JFbmdpbmUuZmluZChDTEFTU19OQU1FX0RFRVBFUl9DSElMRFJFTiwgdGhpcy5fY29uZmlnLnBhcmVudClcbiAgICAvLyByZW1vdmUgY2hpbGRyZW4gaWYgZ3JlYXRlciBkZXB0aFxuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yLCB0aGlzLl9jb25maWcucGFyZW50KS5maWx0ZXIoZWxlbWVudCA9PiAhY2hpbGRyZW4uaW5jbHVkZXMoZWxlbWVudCkpXG4gIH1cblxuICBfYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRyaWdnZXJBcnJheSwgaXNPcGVuKSB7XG4gICAgaWYgKCF0cmlnZ2VyQXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdHJpZ2dlckFycmF5KSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoQ0xBU1NfTkFNRV9DT0xMQVBTRUQsICFpc09wZW4pXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGlzT3BlbilcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICBjb25zdCBfY29uZmlnID0ge31cbiAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycgJiYgL3Nob3d8aGlkZS8udGVzdChjb25maWcpKSB7XG4gICAgICBfY29uZmlnLnRvZ2dsZSA9IGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBfY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtjb25maWddKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIC8vIHByZXZlbnREZWZhdWx0IG9ubHkgZm9yIDxhPiBlbGVtZW50cyAod2hpY2ggY2hhbmdlIHRoZSBVUkwpIG5vdCBpbnNpZGUgdGhlIGNvbGxhcHNpYmxlIGVsZW1lbnRcbiAgaWYgKGV2ZW50LnRhcmdldC50YWdOYW1lID09PSAnQScgfHwgKGV2ZW50LmRlbGVnYXRlVGFyZ2V0ICYmIGV2ZW50LmRlbGVnYXRlVGFyZ2V0LnRhZ05hbWUgPT09ICdBJykpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgU2VsZWN0b3JFbmdpbmUuZ2V0TXVsdGlwbGVFbGVtZW50c0Zyb21TZWxlY3Rvcih0aGlzKSkge1xuICAgIENvbGxhcHNlLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgeyB0b2dnbGU6IGZhbHNlIH0pLnRvZ2dsZSgpXG4gIH1cbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKENvbGxhcHNlKVxuXG5leHBvcnQgZGVmYXVsdCBDb2xsYXBzZVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkcm9wZG93bi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCAqIGFzIFBvcHBlciBmcm9tICdAcG9wcGVyanMvY29yZSdcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgTWFuaXB1bGF0b3IgZnJvbSAnLi9kb20vbWFuaXB1bGF0b3IuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLFxuICBleGVjdXRlLFxuICBnZXRFbGVtZW50LFxuICBnZXROZXh0QWN0aXZlRWxlbWVudCxcbiAgaXNEaXNhYmxlZCxcbiAgaXNFbGVtZW50LFxuICBpc1JUTCxcbiAgaXNWaXNpYmxlLFxuICBub29wXG59IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2Ryb3Bkb3duJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMuZHJvcGRvd24nXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgRVNDQVBFX0tFWSA9ICdFc2NhcGUnXG5jb25zdCBUQUJfS0VZID0gJ1RhYidcbmNvbnN0IEFSUk9XX1VQX0tFWSA9ICdBcnJvd1VwJ1xuY29uc3QgQVJST1dfRE9XTl9LRVkgPSAnQXJyb3dEb3duJ1xuY29uc3QgUklHSFRfTU9VU0VfQlVUVE9OID0gMiAvLyBNb3VzZUV2ZW50LmJ1dHRvbiB2YWx1ZSBmb3IgdGhlIHNlY29uZGFyeSBidXR0b24sIHVzdWFsbHkgdGhlIHJpZ2h0IGJ1dHRvblxuXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPVyA9IGBzaG93JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPV04gPSBgc2hvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0tFWURPV05fREFUQV9BUEkgPSBga2V5ZG93biR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0tFWVVQX0RBVEFfQVBJID0gYGtleXVwJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IENMQVNTX05BTUVfRFJPUFVQID0gJ2Ryb3B1cCdcbmNvbnN0IENMQVNTX05BTUVfRFJPUEVORCA9ICdkcm9wZW5kJ1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QU1RBUlQgPSAnZHJvcHN0YXJ0J1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QVVBfQ0VOVEVSID0gJ2Ryb3B1cC1jZW50ZXInXG5jb25zdCBDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUiA9ICdkcm9wZG93bi1jZW50ZXInXG5cbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCJdOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpJ1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEVfU0hPV04gPSBgJHtTRUxFQ1RPUl9EQVRBX1RPR0dMRX0uJHtDTEFTU19OQU1FX1NIT1d9YFxuY29uc3QgU0VMRUNUT1JfTUVOVSA9ICcuZHJvcGRvd24tbWVudSdcbmNvbnN0IFNFTEVDVE9SX05BVkJBUiA9ICcubmF2YmFyJ1xuY29uc3QgU0VMRUNUT1JfTkFWQkFSX05BViA9ICcubmF2YmFyLW5hdidcbmNvbnN0IFNFTEVDVE9SX1ZJU0lCTEVfSVRFTVMgPSAnLmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLWl0ZW06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCknXG5cbmNvbnN0IFBMQUNFTUVOVF9UT1AgPSBpc1JUTCgpID8gJ3RvcC1lbmQnIDogJ3RvcC1zdGFydCdcbmNvbnN0IFBMQUNFTUVOVF9UT1BFTkQgPSBpc1JUTCgpID8gJ3RvcC1zdGFydCcgOiAndG9wLWVuZCdcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT00gPSBpc1JUTCgpID8gJ2JvdHRvbS1lbmQnIDogJ2JvdHRvbS1zdGFydCdcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT01FTkQgPSBpc1JUTCgpID8gJ2JvdHRvbS1zdGFydCcgOiAnYm90dG9tLWVuZCdcbmNvbnN0IFBMQUNFTUVOVF9SSUdIVCA9IGlzUlRMKCkgPyAnbGVmdC1zdGFydCcgOiAncmlnaHQtc3RhcnQnXG5jb25zdCBQTEFDRU1FTlRfTEVGVCA9IGlzUlRMKCkgPyAncmlnaHQtc3RhcnQnIDogJ2xlZnQtc3RhcnQnXG5jb25zdCBQTEFDRU1FTlRfVE9QQ0VOVEVSID0gJ3RvcCdcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT01DRU5URVIgPSAnYm90dG9tJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhdXRvQ2xvc2U6IHRydWUsXG4gIGJvdW5kYXJ5OiAnY2xpcHBpbmdQYXJlbnRzJyxcbiAgZGlzcGxheTogJ2R5bmFtaWMnLFxuICBvZmZzZXQ6IFswLCAyXSxcbiAgcG9wcGVyQ29uZmlnOiBudWxsLFxuICByZWZlcmVuY2U6ICd0b2dnbGUnXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBhdXRvQ2xvc2U6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgZGlzcGxheTogJ3N0cmluZycsXG4gIG9mZnNldDogJyhhcnJheXxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgcG9wcGVyQ29uZmlnOiAnKG51bGx8b2JqZWN0fGZ1bmN0aW9uKScsXG4gIHJlZmVyZW5jZTogJyhzdHJpbmd8ZWxlbWVudHxvYmplY3QpJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBEcm9wZG93biBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9wb3BwZXIgPSBudWxsXG4gICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlIC8vIGRyb3Bkb3duIHdyYXBwZXJcbiAgICAvLyBUT0RPOiB2NiByZXZlcnQgIzM3MDExICYgY2hhbmdlIG1hcmt1cCBodHRwczovL2dldGJvb3RzdHJhcC5jb20vZG9jcy81LjMvZm9ybXMvaW5wdXQtZ3JvdXAvXG4gICAgdGhpcy5fbWVudSA9IFNlbGVjdG9yRW5naW5lLm5leHQodGhpcy5fZWxlbWVudCwgU0VMRUNUT1JfTUVOVSlbMF0gfHxcbiAgICAgIFNlbGVjdG9yRW5naW5lLnByZXYodGhpcy5fZWxlbWVudCwgU0VMRUNUT1JfTUVOVSlbMF0gfHxcbiAgICAgIFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfTUVOVSwgdGhpcy5fcGFyZW50KVxuICAgIHRoaXMuX2luTmF2YmFyID0gdGhpcy5fZGV0ZWN0TmF2YmFyKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duKCkgPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdygpXG4gIH1cblxuICBzaG93KCkge1xuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMuX2VsZW1lbnQpIHx8IHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9XG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XLCByZWxhdGVkVGFyZ2V0KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jcmVhdGVQb3BwZXIoKVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmICF0aGlzLl9wYXJlbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVJfTkFWKSkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5mb2N1cygpXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKVxuXG4gICAgdGhpcy5fbWVudS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOLCByZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzLl9lbGVtZW50KSB8fCAhdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgIH1cblxuICAgIHRoaXMuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpXG4gICAgfVxuXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKVxuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci51cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSwgcmVsYXRlZFRhcmdldClcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSByZW1vdmUgdGhlIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKVxuICAgIH1cblxuICAgIHRoaXMuX21lbnUuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpXG4gICAgTWFuaXB1bGF0b3IucmVtb3ZlRGF0YUF0dHJpYnV0ZSh0aGlzLl9tZW51LCAncG9wcGVyJylcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4sIHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHN1cGVyLl9nZXRDb25maWcoY29uZmlnKVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmZXJlbmNlID09PSAnb2JqZWN0JyAmJiAhaXNFbGVtZW50KGNvbmZpZy5yZWZlcmVuY2UpICYmXG4gICAgICB0eXBlb2YgY29uZmlnLnJlZmVyZW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIC8vIFBvcHBlciB2aXJ0dWFsIGVsZW1lbnRzIHJlcXVpcmUgYSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgbWV0aG9kXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke05BTUUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcInJlZmVyZW5jZVwiIHByb3ZpZGVkIHR5cGUgXCJvYmplY3RcIiB3aXRob3V0IGEgcmVxdWlyZWQgXCJnZXRCb3VuZGluZ0NsaWVudFJlY3RcIiBtZXRob2QuYClcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfY3JlYXRlUG9wcGVyKCkge1xuICAgIGlmICh0eXBlb2YgUG9wcGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyBkcm9wZG93bnMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZyknKVxuICAgIH1cblxuICAgIGxldCByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fZWxlbWVudFxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UgPT09ICdwYXJlbnQnKSB7XG4gICAgICByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fcGFyZW50XG4gICAgfSBlbHNlIGlmIChpc0VsZW1lbnQodGhpcy5fY29uZmlnLnJlZmVyZW5jZSkpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSBnZXRFbGVtZW50KHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLnJlZmVyZW5jZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9jb25maWcucmVmZXJlbmNlXG4gICAgfVxuXG4gICAgY29uc3QgcG9wcGVyQ29uZmlnID0gdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKClcbiAgICB0aGlzLl9wb3BwZXIgPSBQb3BwZXIuY3JlYXRlUG9wcGVyKHJlZmVyZW5jZUVsZW1lbnQsIHRoaXMuX21lbnUsIHBvcHBlckNvbmZpZylcbiAgfVxuXG4gIF9pc1Nob3duKCkge1xuICAgIHJldHVybiB0aGlzLl9tZW51LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpXG4gIH1cblxuICBfZ2V0UGxhY2VtZW50KCkge1xuICAgIGNvbnN0IHBhcmVudERyb3Bkb3duID0gdGhpcy5fcGFyZW50XG5cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUEVORCkpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfUklHSFRcbiAgICB9XG5cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFNUQVJUKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9MRUZUXG4gICAgfVxuXG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BVUF9DRU5URVIpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX1RPUENFTlRFUlxuICAgIH1cblxuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRE9XTl9DRU5URVIpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX0JPVFRPTUNFTlRFUlxuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gdHJpbSB0aGUgdmFsdWUgYmVjYXVzZSBjdXN0b20gcHJvcGVydGllcyBjYW4gYWxzbyBpbmNsdWRlIHNwYWNlc1xuICAgIGNvbnN0IGlzRW5kID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9tZW51KS5nZXRQcm9wZXJ0eVZhbHVlKCctLWJzLXBvc2l0aW9uJykudHJpbSgpID09PSAnZW5kJ1xuXG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BVUCkpIHtcbiAgICAgIHJldHVybiBpc0VuZCA/IFBMQUNFTUVOVF9UT1BFTkQgOiBQTEFDRU1FTlRfVE9QXG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRW5kID8gUExBQ0VNRU5UX0JPVFRPTUVORCA6IFBMQUNFTUVOVF9CT1RUT01cbiAgfVxuXG4gIF9kZXRlY3ROYXZiYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVIpICE9PSBudWxsXG4gIH1cblxuICBfZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IHsgb2Zmc2V0IH0gPSB0aGlzLl9jb25maWdcblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG9mZnNldC5zcGxpdCgnLCcpLm1hcCh2YWx1ZSA9PiBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHBvcHBlckRhdGEgPT4gb2Zmc2V0KHBvcHBlckRhdGEsIHRoaXMuX2VsZW1lbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldFxuICB9XG5cbiAgX2dldFBvcHBlckNvbmZpZygpIHtcbiAgICBjb25zdCBkZWZhdWx0QnNQb3BwZXJDb25maWcgPSB7XG4gICAgICBwbGFjZW1lbnQ6IHRoaXMuX2dldFBsYWNlbWVudCgpLFxuICAgICAgbW9kaWZpZXJzOiBbe1xuICAgICAgICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGJvdW5kYXJ5OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSBQb3BwZXIgaWYgd2UgaGF2ZSBhIHN0YXRpYyBkaXNwbGF5IG9yIERyb3Bkb3duIGlzIGluIE5hdmJhclxuICAgIGlmICh0aGlzLl9pbk5hdmJhciB8fCB0aGlzLl9jb25maWcuZGlzcGxheSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIE1hbmlwdWxhdG9yLnNldERhdGFBdHRyaWJ1dGUodGhpcy5fbWVudSwgJ3BvcHBlcicsICdzdGF0aWMnKSAvLyBUT0RPOiB2NiByZW1vdmVcbiAgICAgIGRlZmF1bHRCc1BvcHBlckNvbmZpZy5tb2RpZmllcnMgPSBbe1xuICAgICAgICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgfV1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdEJzUG9wcGVyQ29uZmlnLFxuICAgICAgLi4uZXhlY3V0ZSh0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnLCBbZGVmYXVsdEJzUG9wcGVyQ29uZmlnXSlcbiAgICB9XG4gIH1cblxuICBfc2VsZWN0TWVudUl0ZW0oeyBrZXksIHRhcmdldCB9KSB7XG4gICAgY29uc3QgaXRlbXMgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX1ZJU0lCTEVfSVRFTVMsIHRoaXMuX21lbnUpLmZpbHRlcihlbGVtZW50ID0+IGlzVmlzaWJsZShlbGVtZW50KSlcblxuICAgIGlmICghaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBpZiB0YXJnZXQgaXNuJ3QgaW5jbHVkZWQgaW4gaXRlbXMgKGUuZy4gd2hlbiBleHBhbmRpbmcgdGhlIGRyb3Bkb3duKVxuICAgIC8vIGFsbG93IGN5Y2xpbmcgdG8gZ2V0IHRoZSBsYXN0IGl0ZW0gaW4gY2FzZSBrZXkgZXF1YWxzIEFSUk9XX1VQX0tFWVxuICAgIGdldE5leHRBY3RpdmVFbGVtZW50KGl0ZW1zLCB0YXJnZXQsIGtleSA9PT0gQVJST1dfRE9XTl9LRVksICFpdGVtcy5pbmNsdWRlcyh0YXJnZXQpKS5mb2N1cygpXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBEcm9wZG93bi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10oKVxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgY2xlYXJNZW51cyhldmVudCkge1xuICAgIGlmIChldmVudC5idXR0b24gPT09IFJJR0hUX01PVVNFX0JVVFRPTiB8fCAoZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC5rZXkgIT09IFRBQl9LRVkpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvcGVuVG9nZ2xlcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9UT0dHTEVfU0hPV04pXG5cbiAgICBmb3IgKGNvbnN0IHRvZ2dsZSBvZiBvcGVuVG9nZ2xlcykge1xuICAgICAgY29uc3QgY29udGV4dCA9IERyb3Bkb3duLmdldEluc3RhbmNlKHRvZ2dsZSlcbiAgICAgIGlmICghY29udGV4dCB8fCBjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wb3NlZFBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKVxuICAgICAgY29uc3QgaXNNZW51VGFyZ2V0ID0gY29tcG9zZWRQYXRoLmluY2x1ZGVzKGNvbnRleHQuX21lbnUpXG4gICAgICBpZiAoXG4gICAgICAgIGNvbXBvc2VkUGF0aC5pbmNsdWRlcyhjb250ZXh0Ll9lbGVtZW50KSB8fFxuICAgICAgICAoY29udGV4dC5fY29uZmlnLmF1dG9DbG9zZSA9PT0gJ2luc2lkZScgJiYgIWlzTWVudVRhcmdldCkgfHxcbiAgICAgICAgKGNvbnRleHQuX2NvbmZpZy5hdXRvQ2xvc2UgPT09ICdvdXRzaWRlJyAmJiBpc01lbnVUYXJnZXQpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gVGFiIG5hdmlnYXRpb24gdGhyb3VnaCB0aGUgZHJvcGRvd24gbWVudSBvciBldmVudHMgZnJvbSBjb250YWluZWQgaW5wdXRzIHNob3VsZG4ndCBjbG9zZSB0aGUgbWVudVxuICAgICAgaWYgKGNvbnRleHQuX21lbnUuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJiAoKGV2ZW50LnR5cGUgPT09ICdrZXl1cCcgJiYgZXZlbnQua2V5ID09PSBUQUJfS0VZKSB8fCAvaW5wdXR8c2VsZWN0fG9wdGlvbnx0ZXh0YXJlYXxmb3JtL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSB7IHJlbGF0ZWRUYXJnZXQ6IGNvbnRleHQuX2VsZW1lbnQgfVxuXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICByZWxhdGVkVGFyZ2V0LmNsaWNrRXZlbnQgPSBldmVudFxuICAgICAgfVxuXG4gICAgICBjb250ZXh0Ll9jb21wbGV0ZUhpZGUocmVsYXRlZFRhcmdldClcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZGF0YUFwaUtleWRvd25IYW5kbGVyKGV2ZW50KSB7XG4gICAgLy8gSWYgbm90IGFuIFVQIHwgRE9XTiB8IEVTQ0FQRSBrZXkgPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgIC8vIElmIGlucHV0L3RleHRhcmVhICYmIGlmIGtleSBpcyBvdGhlciB0aGFuIEVTQ0FQRSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG5cbiAgICBjb25zdCBpc0lucHV0ID0gL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSlcbiAgICBjb25zdCBpc0VzY2FwZUV2ZW50ID0gZXZlbnQua2V5ID09PSBFU0NBUEVfS0VZXG4gICAgY29uc3QgaXNVcE9yRG93bkV2ZW50ID0gW0FSUk9XX1VQX0tFWSwgQVJST1dfRE9XTl9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSlcblxuICAgIGlmICghaXNVcE9yRG93bkV2ZW50ICYmICFpc0VzY2FwZUV2ZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNJbnB1dCAmJiAhaXNFc2NhcGVFdmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgLy8gVE9ETzogdjYgcmV2ZXJ0ICMzNzAxMSAmIGNoYW5nZSBtYXJrdXAgaHR0cHM6Ly9nZXRib290c3RyYXAuY29tL2RvY3MvNS4zL2Zvcm1zL2lucHV0LWdyb3VwL1xuICAgIGNvbnN0IGdldFRvZ2dsZUJ1dHRvbiA9IHRoaXMubWF0Y2hlcyhTRUxFQ1RPUl9EQVRBX1RPR0dMRSkgP1xuICAgICAgdGhpcyA6XG4gICAgICAoU2VsZWN0b3JFbmdpbmUucHJldih0aGlzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSlbMF0gfHxcbiAgICAgICAgU2VsZWN0b3JFbmdpbmUubmV4dCh0aGlzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSlbMF0gfHxcbiAgICAgICAgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZXZlbnQuZGVsZWdhdGVUYXJnZXQucGFyZW50Tm9kZSkpXG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UoZ2V0VG9nZ2xlQnV0dG9uKVxuXG4gICAgaWYgKGlzVXBPckRvd25FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIGluc3RhbmNlLnNob3coKVxuICAgICAgaW5zdGFuY2UuX3NlbGVjdE1lbnVJdGVtKGV2ZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLl9pc1Nob3duKCkpIHsgLy8gZWxzZSBpcyBlc2NhcGUgYW5kIHdlIGNoZWNrIGlmIGl0IGlzIHNob3duXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgaW5zdGFuY2UuaGlkZSgpXG4gICAgICBnZXRUb2dnbGVCdXR0b24uZm9jdXMoKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgRHJvcGRvd24uZGF0YUFwaUtleWRvd25IYW5kbGVyKVxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJLCBTRUxFQ1RPUl9NRU5VLCBEcm9wZG93bi5kYXRhQXBpS2V5ZG93bkhhbmRsZXIpXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBEcm9wZG93bi5jbGVhck1lbnVzKVxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlVUF9EQVRBX0FQSSwgRHJvcGRvd24uY2xlYXJNZW51cylcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICBEcm9wZG93bi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpLnRvZ2dsZSgpXG59KVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihEcm9wZG93bilcblxuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgc2Nyb2xsc3B5LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sIGdldEVsZW1lbnQsIGlzRGlzYWJsZWQsIGlzVmlzaWJsZVxufSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdzY3JvbGxzcHknXG5jb25zdCBEQVRBX0tFWSA9ICdicy5zY3JvbGxzcHknXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgRVZFTlRfQUNUSVZBVEUgPSBgYWN0aXZhdGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDSyA9IGBjbGljayR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNID0gJ2Ryb3Bkb3duLWl0ZW0nXG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnXG5cbmNvbnN0IFNFTEVDVE9SX0RBVEFfU1BZID0gJ1tkYXRhLWJzLXNweT1cInNjcm9sbFwiXSdcbmNvbnN0IFNFTEVDVE9SX1RBUkdFVF9MSU5LUyA9ICdbaHJlZl0nXG5jb25zdCBTRUxFQ1RPUl9OQVZfTElTVF9HUk9VUCA9ICcubmF2LCAubGlzdC1ncm91cCdcbmNvbnN0IFNFTEVDVE9SX05BVl9MSU5LUyA9ICcubmF2LWxpbmsnXG5jb25zdCBTRUxFQ1RPUl9OQVZfSVRFTVMgPSAnLm5hdi1pdGVtJ1xuY29uc3QgU0VMRUNUT1JfTElTVF9JVEVNUyA9ICcubGlzdC1ncm91cC1pdGVtJ1xuY29uc3QgU0VMRUNUT1JfTElOS19JVEVNUyA9IGAke1NFTEVDVE9SX05BVl9MSU5LU30sICR7U0VMRUNUT1JfTkFWX0lURU1TfSA+ICR7U0VMRUNUT1JfTkFWX0xJTktTfSwgJHtTRUxFQ1RPUl9MSVNUX0lURU1TfWBcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOID0gJy5kcm9wZG93bidcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICcuZHJvcGRvd24tdG9nZ2xlJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBvZmZzZXQ6IG51bGwsIC8vIFRPRE86IHY2IEBkZXByZWNhdGVkLCBrZWVwIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zXG4gIHJvb3RNYXJnaW46ICcwcHggMHB4IC0yNSUnLFxuICBzbW9vdGhTY3JvbGw6IGZhbHNlLFxuICB0YXJnZXQ6IG51bGwsXG4gIHRocmVzaG9sZDogWzAuMSwgMC41LCAxXVxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgb2Zmc2V0OiAnKG51bWJlcnxudWxsKScsIC8vIFRPRE8gdjYgQGRlcHJlY2F0ZWQsIGtlZXAgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnNcbiAgcm9vdE1hcmdpbjogJ3N0cmluZycsXG4gIHNtb290aFNjcm9sbDogJ2Jvb2xlYW4nLFxuICB0YXJnZXQ6ICdlbGVtZW50JyxcbiAgdGhyZXNob2xkOiAnYXJyYXknXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFNjcm9sbFNweSBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICAvLyB0aGlzLl9lbGVtZW50IGlzIHRoZSBvYnNlcnZhYmxlc0NvbnRhaW5lciBhbmQgY29uZmlnLnRhcmdldCB0aGUgbWVudSBsaW5rcyB3cmFwcGVyXG4gICAgdGhpcy5fdGFyZ2V0TGlua3MgPSBuZXcgTWFwKClcbiAgICB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMgPSBuZXcgTWFwKClcbiAgICB0aGlzLl9yb290RWxlbWVudCA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5fZWxlbWVudCkub3ZlcmZsb3dZID09PSAndmlzaWJsZScgPyBudWxsIDogdGhpcy5fZWxlbWVudFxuICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IG51bGxcbiAgICB0aGlzLl9vYnNlcnZlciA9IG51bGxcbiAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEgPSB7XG4gICAgICB2aXNpYmxlRW50cnlUb3A6IDAsXG4gICAgICBwYXJlbnRTY3JvbGxUb3A6IDBcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoKCkgLy8gaW5pdGlhbGl6ZVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICByZWZyZXNoKCkge1xuICAgIHRoaXMuX2luaXRpYWxpemVUYXJnZXRzQW5kT2JzZXJ2YWJsZXMoKVxuICAgIHRoaXMuX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKClcblxuICAgIGlmICh0aGlzLl9vYnNlcnZlcikge1xuICAgICAgdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29ic2VydmVyID0gdGhpcy5fZ2V0TmV3T2JzZXJ2ZXIoKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUoc2VjdGlvbilcbiAgICB9XG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAvLyBUT0RPOiBvbiB2NiB0YXJnZXQgc2hvdWxkIGJlIGdpdmVuIGV4cGxpY2l0bHkgJiByZW1vdmUgdGhlIHt0YXJnZXQ6ICdzcy10YXJnZXQnfSBjYXNlXG4gICAgY29uZmlnLnRhcmdldCA9IGdldEVsZW1lbnQoY29uZmlnLnRhcmdldCkgfHwgZG9jdW1lbnQuYm9keVxuXG4gICAgLy8gVE9ETzogdjYgT25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gVXNlIHJvb3RNYXJnaW4gb25seVxuICAgIGNvbmZpZy5yb290TWFyZ2luID0gY29uZmlnLm9mZnNldCA/IGAke2NvbmZpZy5vZmZzZXR9cHggMHB4IC0zMCVgIDogY29uZmlnLnJvb3RNYXJnaW5cblxuICAgIGlmICh0eXBlb2YgY29uZmlnLnRocmVzaG9sZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZy50aHJlc2hvbGQgPSBjb25maWcudGhyZXNob2xkLnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUZsb2F0KHZhbHVlKSlcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfbWF5YmVFbmFibGVTbW9vdGhTY3JvbGwoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuc21vb3RoU2Nyb2xsKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyB1bnJlZ2lzdGVyIGFueSBwcmV2aW91cyBsaXN0ZW5lcnNcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2NvbmZpZy50YXJnZXQsIEVWRU5UX0NMSUNLKVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2NvbmZpZy50YXJnZXQsIEVWRU5UX0NMSUNLLCBTRUxFQ1RPUl9UQVJHRVRfTElOS1MsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IG9ic2VydmFibGVTZWN0aW9uID0gdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zLmdldChldmVudC50YXJnZXQuaGFzaClcbiAgICAgIGlmIChvYnNlcnZhYmxlU2VjdGlvbikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290RWxlbWVudCB8fCB3aW5kb3dcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gb2JzZXJ2YWJsZVNlY3Rpb24ub2Zmc2V0VG9wIC0gdGhpcy5fZWxlbWVudC5vZmZzZXRUb3BcbiAgICAgICAgaWYgKHJvb3Quc2Nyb2xsVG8pIHtcbiAgICAgICAgICByb290LnNjcm9sbFRvKHsgdG9wOiBoZWlnaHQsIGJlaGF2aW9yOiAnc21vb3RoJyB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hyb21lIDYwIGRvZXNuJ3Qgc3VwcG9ydCBgc2Nyb2xsVG9gXG4gICAgICAgIHJvb3Quc2Nyb2xsVG9wID0gaGVpZ2h0XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIF9nZXROZXdPYnNlcnZlcigpIHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgcm9vdDogdGhpcy5fcm9vdEVsZW1lbnQsXG4gICAgICB0aHJlc2hvbGQ6IHRoaXMuX2NvbmZpZy50aHJlc2hvbGQsXG4gICAgICByb290TWFyZ2luOiB0aGlzLl9jb25maWcucm9vdE1hcmdpblxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZW50cmllcyA9PiB0aGlzLl9vYnNlcnZlckNhbGxiYWNrKGVudHJpZXMpLCBvcHRpb25zKVxuICB9XG5cbiAgLy8gVGhlIGxvZ2ljIG9mIHNlbGVjdGlvblxuICBfb2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzKSB7XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IGVudHJ5ID0+IHRoaXMuX3RhcmdldExpbmtzLmdldChgIyR7ZW50cnkudGFyZ2V0LmlkfWApXG4gICAgY29uc3QgYWN0aXZhdGUgPSBlbnRyeSA9PiB7XG4gICAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEudmlzaWJsZUVudHJ5VG9wID0gZW50cnkudGFyZ2V0Lm9mZnNldFRvcFxuICAgICAgdGhpcy5fcHJvY2Vzcyh0YXJnZXRFbGVtZW50KGVudHJ5KSlcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRTY3JvbGxUb3AgPSAodGhpcy5fcm9vdEVsZW1lbnQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5zY3JvbGxUb3BcbiAgICBjb25zdCB1c2VyU2Nyb2xsc0Rvd24gPSBwYXJlbnRTY3JvbGxUb3AgPj0gdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnBhcmVudFNjcm9sbFRvcFxuICAgIHRoaXMuX3ByZXZpb3VzU2Nyb2xsRGF0YS5wYXJlbnRTY3JvbGxUb3AgPSBwYXJlbnRTY3JvbGxUb3BcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsXG4gICAgICAgIHRoaXMuX2NsZWFyQWN0aXZlQ2xhc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpXG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW50cnlJc0xvd2VyVGhhblByZXZpb3VzID0gZW50cnkudGFyZ2V0Lm9mZnNldFRvcCA+PSB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEudmlzaWJsZUVudHJ5VG9wXG4gICAgICAvLyBpZiB3ZSBhcmUgc2Nyb2xsaW5nIGRvd24sIHBpY2sgdGhlIGJpZ2dlciBvZmZzZXRUb3BcbiAgICAgIGlmICh1c2VyU2Nyb2xsc0Rvd24gJiYgZW50cnlJc0xvd2VyVGhhblByZXZpb3VzKSB7XG4gICAgICAgIGFjdGl2YXRlKGVudHJ5KVxuICAgICAgICAvLyBpZiBwYXJlbnQgaXNuJ3Qgc2Nyb2xsZWQsIGxldCdzIGtlZXAgdGhlIGZpcnN0IHZpc2libGUgaXRlbSwgYnJlYWtpbmcgdGhlIGl0ZXJhdGlvblxuICAgICAgICBpZiAoIXBhcmVudFNjcm9sbFRvcCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgYXJlIHNjcm9sbGluZyB1cCwgcGljayB0aGUgc21hbGxlc3Qgb2Zmc2V0VG9wXG4gICAgICBpZiAoIXVzZXJTY3JvbGxzRG93biAmJiAhZW50cnlJc0xvd2VyVGhhblByZXZpb3VzKSB7XG4gICAgICAgIGFjdGl2YXRlKGVudHJ5KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9pbml0aWFsaXplVGFyZ2V0c0FuZE9ic2VydmFibGVzKCkge1xuICAgIHRoaXMuX3RhcmdldExpbmtzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zID0gbmV3IE1hcCgpXG5cbiAgICBjb25zdCB0YXJnZXRMaW5rcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfVEFSR0VUX0xJTktTLCB0aGlzLl9jb25maWcudGFyZ2V0KVxuXG4gICAgZm9yIChjb25zdCBhbmNob3Igb2YgdGFyZ2V0TGlua3MpIHtcbiAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBhbmNob3IgaGFzIGFuIGlkIGFuZCBpcyBub3QgZGlzYWJsZWRcbiAgICAgIGlmICghYW5jaG9yLmhhc2ggfHwgaXNEaXNhYmxlZChhbmNob3IpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9ic2VydmFibGVTZWN0aW9uID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCB0aGlzLl9lbGVtZW50KVxuXG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgb2JzZXJ2YWJsZVNlY3Rpb24gZXhpc3RzICYgaXMgdmlzaWJsZVxuICAgICAgaWYgKGlzVmlzaWJsZShvYnNlcnZhYmxlU2VjdGlvbikpIHtcbiAgICAgICAgdGhpcy5fdGFyZ2V0TGlua3Muc2V0KGRlY29kZVVSSShhbmNob3IuaGFzaCksIGFuY2hvcilcbiAgICAgICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zLnNldChhbmNob3IuaGFzaCwgb2JzZXJ2YWJsZVNlY3Rpb24pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3Byb2Nlc3ModGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZVRhcmdldCA9PT0gdGFyZ2V0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jbGVhckFjdGl2ZUNsYXNzKHRoaXMuX2NvbmZpZy50YXJnZXQpXG4gICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gdGFyZ2V0XG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgdGhpcy5fYWN0aXZhdGVQYXJlbnRzKHRhcmdldClcblxuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0FDVElWQVRFLCB7IHJlbGF0ZWRUYXJnZXQ6IHRhcmdldCB9KVxuICB9XG5cbiAgX2FjdGl2YXRlUGFyZW50cyh0YXJnZXQpIHtcbiAgICAvLyBBY3RpdmF0ZSBkcm9wZG93biBwYXJlbnRzXG4gICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNKSkge1xuICAgICAgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUsIHRhcmdldC5jbG9zZXN0KFNFTEVDVE9SX0RST1BET1dOKSlcbiAgICAgICAgLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxpc3RHcm91cCBvZiBTZWxlY3RvckVuZ2luZS5wYXJlbnRzKHRhcmdldCwgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVApKSB7XG4gICAgICAvLyBTZXQgdHJpZ2dlcmVkIGxpbmtzIHBhcmVudHMgYXMgYWN0aXZlXG4gICAgICAvLyBXaXRoIGJvdGggPHVsPiBhbmQgPG5hdj4gbWFya3VwIGEgcGFyZW50IGlzIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIGFueSBuYXYgYW5jZXN0b3JcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBTZWxlY3RvckVuZ2luZS5wcmV2KGxpc3RHcm91cCwgU0VMRUNUT1JfTElOS19JVEVNUykpIHtcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jbGVhckFjdGl2ZUNsYXNzKHBhcmVudCkge1xuICAgIHBhcmVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuXG4gICAgY29uc3QgYWN0aXZlTm9kZXMgPSBTZWxlY3RvckVuZ2luZS5maW5kKGAke1NFTEVDVE9SX1RBUkdFVF9MSU5LU30uJHtDTEFTU19OQU1FX0FDVElWRX1gLCBwYXJlbnQpXG4gICAgZm9yIChjb25zdCBub2RlIG9mIGFjdGl2ZU5vZGVzKSB7XG4gICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgfVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gU2Nyb2xsU3B5LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBmb3IgKGNvbnN0IHNweSBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfU1BZKSkge1xuICAgIFNjcm9sbFNweS5nZXRPckNyZWF0ZUluc3RhbmNlKHNweSlcbiAgfVxufSlcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oU2Nyb2xsU3B5KVxuXG5leHBvcnQgZGVmYXVsdCBTY3JvbGxTcHlcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdG9vbHRpcC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCAqIGFzIFBvcHBlciBmcm9tICdAcG9wcGVyanMvY29yZSdcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgTWFuaXB1bGF0b3IgZnJvbSAnLi9kb20vbWFuaXB1bGF0b3IuanMnXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sIGV4ZWN1dGUsIGZpbmRTaGFkb3dSb290LCBnZXRFbGVtZW50LCBnZXRVSUQsIGlzUlRMLCBub29wXG59IGZyb20gJy4vdXRpbC9pbmRleC5qcydcbmltcG9ydCB7IERlZmF1bHRBbGxvd2xpc3QgfSBmcm9tICcuL3V0aWwvc2FuaXRpemVyLmpzJ1xuaW1wb3J0IFRlbXBsYXRlRmFjdG9yeSBmcm9tICcuL3V0aWwvdGVtcGxhdGUtZmFjdG9yeS5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ3Rvb2x0aXAnXG5jb25zdCBESVNBTExPV0VEX0FUVFJJQlVURVMgPSBuZXcgU2V0KFsnc2FuaXRpemUnLCAnYWxsb3dMaXN0JywgJ3Nhbml0aXplRm4nXSlcblxuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnXG5jb25zdCBDTEFTU19OQU1FX01PREFMID0gJ21vZGFsJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5cbmNvbnN0IFNFTEVDVE9SX1RPT0xUSVBfSU5ORVIgPSAnLnRvb2x0aXAtaW5uZXInXG5jb25zdCBTRUxFQ1RPUl9NT0RBTCA9IGAuJHtDTEFTU19OQU1FX01PREFMfWBcblxuY29uc3QgRVZFTlRfTU9EQUxfSElERSA9ICdoaWRlLmJzLm1vZGFsJ1xuXG5jb25zdCBUUklHR0VSX0hPVkVSID0gJ2hvdmVyJ1xuY29uc3QgVFJJR0dFUl9GT0NVUyA9ICdmb2N1cydcbmNvbnN0IFRSSUdHRVJfQ0xJQ0sgPSAnY2xpY2snXG5jb25zdCBUUklHR0VSX01BTlVBTCA9ICdtYW51YWwnXG5cbmNvbnN0IEVWRU5UX0hJREUgPSAnaGlkZSdcbmNvbnN0IEVWRU5UX0hJRERFTiA9ICdoaWRkZW4nXG5jb25zdCBFVkVOVF9TSE9XID0gJ3Nob3cnXG5jb25zdCBFVkVOVF9TSE9XTiA9ICdzaG93bidcbmNvbnN0IEVWRU5UX0lOU0VSVEVEID0gJ2luc2VydGVkJ1xuY29uc3QgRVZFTlRfQ0xJQ0sgPSAnY2xpY2snXG5jb25zdCBFVkVOVF9GT0NVU0lOID0gJ2ZvY3VzaW4nXG5jb25zdCBFVkVOVF9GT0NVU09VVCA9ICdmb2N1c291dCdcbmNvbnN0IEVWRU5UX01PVVNFRU5URVIgPSAnbW91c2VlbnRlcidcbmNvbnN0IEVWRU5UX01PVVNFTEVBVkUgPSAnbW91c2VsZWF2ZSdcblxuY29uc3QgQXR0YWNobWVudE1hcCA9IHtcbiAgQVVUTzogJ2F1dG8nLFxuICBUT1A6ICd0b3AnLFxuICBSSUdIVDogaXNSVEwoKSA/ICdsZWZ0JyA6ICdyaWdodCcsXG4gIEJPVFRPTTogJ2JvdHRvbScsXG4gIExFRlQ6IGlzUlRMKCkgPyAncmlnaHQnIDogJ2xlZnQnXG59XG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGFsbG93TGlzdDogRGVmYXVsdEFsbG93bGlzdCxcbiAgYW5pbWF0aW9uOiB0cnVlLFxuICBib3VuZGFyeTogJ2NsaXBwaW5nUGFyZW50cycsXG4gIGNvbnRhaW5lcjogZmFsc2UsXG4gIGN1c3RvbUNsYXNzOiAnJyxcbiAgZGVsYXk6IDAsXG4gIGZhbGxiYWNrUGxhY2VtZW50czogWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXSxcbiAgaHRtbDogZmFsc2UsXG4gIG9mZnNldDogWzAsIDZdLFxuICBwbGFjZW1lbnQ6ICd0b3AnLFxuICBwb3BwZXJDb25maWc6IG51bGwsXG4gIHNhbml0aXplOiB0cnVlLFxuICBzYW5pdGl6ZUZuOiBudWxsLFxuICBzZWxlY3RvcjogZmFsc2UsXG4gIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ0b29sdGlwLWFycm93XCI+PC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInRvb2x0aXAtaW5uZXJcIj48L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nLFxuICB0aXRsZTogJycsXG4gIHRyaWdnZXI6ICdob3ZlciBmb2N1cydcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGFsbG93TGlzdDogJ29iamVjdCcsXG4gIGFuaW1hdGlvbjogJ2Jvb2xlYW4nLFxuICBib3VuZGFyeTogJyhzdHJpbmd8ZWxlbWVudCknLFxuICBjb250YWluZXI6ICcoc3RyaW5nfGVsZW1lbnR8Ym9vbGVhbiknLFxuICBjdXN0b21DbGFzczogJyhzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgZGVsYXk6ICcobnVtYmVyfG9iamVjdCknLFxuICBmYWxsYmFja1BsYWNlbWVudHM6ICdhcnJheScsXG4gIGh0bWw6ICdib29sZWFuJyxcbiAgb2Zmc2V0OiAnKGFycmF5fHN0cmluZ3xmdW5jdGlvbiknLFxuICBwbGFjZW1lbnQ6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gIHBvcHBlckNvbmZpZzogJyhudWxsfG9iamVjdHxmdW5jdGlvbiknLFxuICBzYW5pdGl6ZTogJ2Jvb2xlYW4nLFxuICBzYW5pdGl6ZUZuOiAnKG51bGx8ZnVuY3Rpb24pJyxcbiAgc2VsZWN0b3I6ICcoc3RyaW5nfGJvb2xlYW4pJyxcbiAgdGVtcGxhdGU6ICdzdHJpbmcnLFxuICB0aXRsZTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknLFxuICB0cmlnZ2VyOiAnc3RyaW5nJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBUb29sdGlwIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIGlmICh0eXBlb2YgUG9wcGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyB0b29sdGlwcyByZXF1aXJlIFBvcHBlciAoaHR0cHM6Ly9wb3BwZXIuanMub3JnKScpXG4gICAgfVxuXG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWVcbiAgICB0aGlzLl90aW1lb3V0ID0gMFxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IG51bGxcbiAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyID0ge31cbiAgICB0aGlzLl9wb3BwZXIgPSBudWxsXG4gICAgdGhpcy5fdGVtcGxhdGVGYWN0b3J5ID0gbnVsbFxuICAgIHRoaXMuX25ld0NvbnRlbnQgPSBudWxsXG5cbiAgICAvLyBQcm90ZWN0ZWRcbiAgICB0aGlzLnRpcCA9IG51bGxcblxuICAgIHRoaXMuX3NldExpc3RlbmVycygpXG5cbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zZWxlY3Rvcikge1xuICAgICAgdGhpcy5fZml4VGl0bGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZW5hYmxlKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWVcbiAgfVxuXG4gIGRpc2FibGUoKSB7XG4gICAgdGhpcy5faXNFbmFibGVkID0gZmFsc2VcbiAgfVxuXG4gIHRvZ2dsZUVuYWJsZWQoKSB7XG4gICAgdGhpcy5faXNFbmFibGVkID0gIXRoaXMuX2lzRW5hYmxlZFxuICB9XG5cbiAgdG9nZ2xlKCkge1xuICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyLmNsaWNrID0gIXRoaXMuX2FjdGl2ZVRyaWdnZXIuY2xpY2tcbiAgICBpZiAodGhpcy5faXNTaG93bigpKSB7XG4gICAgICB0aGlzLl9sZWF2ZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9lbnRlcigpXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KVxuXG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9lbGVtZW50LmNsb3Nlc3QoU0VMRUNUT1JfTU9EQUwpLCBFVkVOVF9NT0RBTF9ISURFLCB0aGlzLl9oaWRlTW9kYWxIYW5kbGVyKVxuXG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJykpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJykpXG4gICAgfVxuXG4gICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICBzaG93KCkge1xuICAgIGlmICh0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgdXNlIHNob3cgb24gdmlzaWJsZSBlbGVtZW50cycpXG4gICAgfVxuXG4gICAgaWYgKCEodGhpcy5faXNXaXRoQ29udGVudCgpICYmIHRoaXMuX2lzRW5hYmxlZCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX1NIT1cpKVxuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBmaW5kU2hhZG93Um9vdCh0aGlzLl9lbGVtZW50KVxuICAgIGNvbnN0IGlzSW5UaGVEb20gPSAoc2hhZG93Um9vdCB8fCB0aGlzLl9lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5jb250YWlucyh0aGlzLl9lbGVtZW50KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICFpc0luVGhlRG9tKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBUT0RPOiB2NiByZW1vdmUgdGhpcyBvciBtYWtlIGl0IG9wdGlvbmFsXG4gICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpXG5cbiAgICBjb25zdCB0aXAgPSB0aGlzLl9nZXRUaXBFbGVtZW50KClcblxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JywgdGlwLmdldEF0dHJpYnV0ZSgnaWQnKSlcblxuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSB0aGlzLl9jb25maWdcblxuICAgIGlmICghdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyh0aGlzLnRpcCkpIHtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmQodGlwKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfSU5TRVJURUQpKVxuICAgIH1cblxuICAgIHRoaXMuX3BvcHBlciA9IHRoaXMuX2NyZWF0ZVBvcHBlcih0aXApXG5cbiAgICB0aXAuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgYWRkIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB0byB0aGUgYm9keSdzIGltbWVkaWF0ZSBjaGlsZHJlbjtcbiAgICAvLyBvbmx5IG5lZWRlZCBiZWNhdXNlIG9mIGJyb2tlbiBldmVudCBkZWxlZ2F0aW9uIG9uIGlPU1xuICAgIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxNC8wMi9tb3VzZV9ldmVudF9idWIuaHRtbFxuICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBbXS5jb25jYXQoLi4uZG9jdW1lbnQuYm9keS5jaGlsZHJlbikpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9uKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfU0hPV04pKVxuXG4gICAgICBpZiAodGhpcy5faXNIb3ZlcmVkID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9sZWF2ZSgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzSG92ZXJlZCA9IGZhbHNlXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy50aXAsIHRoaXMuX2lzQW5pbWF0ZWQoKSlcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0hJREUpKVxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdGlwID0gdGhpcy5fZ2V0VGlwRWxlbWVudCgpXG4gICAgdGlwLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIHJlbW92ZSB0aGUgZXh0cmFcbiAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHdlIGFkZGVkIGZvciBpT1Mgc3VwcG9ydFxuICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBbXS5jb25jYXQoLi4uZG9jdW1lbnQuYm9keS5jaGlsZHJlbikpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCAnbW91c2VvdmVyJywgbm9vcClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfQ0xJQ0tdID0gZmFsc2VcbiAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfRk9DVVNdID0gZmFsc2VcbiAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfSE9WRVJdID0gZmFsc2VcbiAgICB0aGlzLl9pc0hvdmVyZWQgPSBudWxsIC8vIGl0IGlzIGEgdHJpY2sgdG8gc3VwcG9ydCBtYW51YWwgdHJpZ2dlcmluZ1xuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX2lzSG92ZXJlZCkge1xuICAgICAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfSElEREVOKSlcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLnRpcCwgdGhpcy5faXNBbmltYXRlZCgpKVxuICB9XG5cbiAgdXBkYXRlKCkge1xuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci51cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByb3RlY3RlZFxuICBfaXNXaXRoQ29udGVudCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9nZXRUaXRsZSgpKVxuICB9XG5cbiAgX2dldFRpcEVsZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLnRpcCkge1xuICAgICAgdGhpcy50aXAgPSB0aGlzLl9jcmVhdGVUaXBFbGVtZW50KHRoaXMuX25ld0NvbnRlbnQgfHwgdGhpcy5fZ2V0Q29udGVudEZvclRlbXBsYXRlKCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudGlwXG4gIH1cblxuICBfY3JlYXRlVGlwRWxlbWVudChjb250ZW50KSB7XG4gICAgY29uc3QgdGlwID0gdGhpcy5fZ2V0VGVtcGxhdGVGYWN0b3J5KGNvbnRlbnQpLnRvSHRtbCgpXG5cbiAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBjaGVjayBpbiB2NlxuICAgIGlmICghdGlwKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHRpcC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfRkFERSwgQ0xBU1NfTkFNRV9TSE9XKVxuICAgIC8vIFRPRE86IHY2IHRoZSBmb2xsb3dpbmcgY2FuIGJlIGFjaGlldmVkIHdpdGggQ1NTIG9ubHlcbiAgICB0aXAuY2xhc3NMaXN0LmFkZChgYnMtJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9LWF1dG9gKVxuXG4gICAgY29uc3QgdGlwSWQgPSBnZXRVSUQodGhpcy5jb25zdHJ1Y3Rvci5OQU1FKS50b1N0cmluZygpXG5cbiAgICB0aXAuc2V0QXR0cmlidXRlKCdpZCcsIHRpcElkKVxuXG4gICAgaWYgKHRoaXMuX2lzQW5pbWF0ZWQoKSkge1xuICAgICAgdGlwLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9GQURFKVxuICAgIH1cblxuICAgIHJldHVybiB0aXBcbiAgfVxuXG4gIHNldENvbnRlbnQoY29udGVudCkge1xuICAgIHRoaXMuX25ld0NvbnRlbnQgPSBjb250ZW50XG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpXG4gICAgICB0aGlzLnNob3coKVxuICAgIH1cbiAgfVxuXG4gIF9nZXRUZW1wbGF0ZUZhY3RvcnkoY29udGVudCkge1xuICAgIGlmICh0aGlzLl90ZW1wbGF0ZUZhY3RvcnkpIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlRmFjdG9yeS5jaGFuZ2VDb250ZW50KGNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlRmFjdG9yeSA9IG5ldyBUZW1wbGF0ZUZhY3Rvcnkoe1xuICAgICAgICAuLi50aGlzLl9jb25maWcsXG4gICAgICAgIC8vIHRoZSBgY29udGVudGAgdmFyIGhhcyB0byBiZSBhZnRlciBgdGhpcy5fY29uZmlnYFxuICAgICAgICAvLyB0byBvdmVycmlkZSBjb25maWcuY29udGVudCBpbiBjYXNlIG9mIHBvcG92ZXJcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgZXh0cmFDbGFzczogdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGhpcy5fY29uZmlnLmN1c3RvbUNsYXNzKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVGYWN0b3J5XG4gIH1cblxuICBfZ2V0Q29udGVudEZvclRlbXBsYXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBbU0VMRUNUT1JfVE9PTFRJUF9JTk5FUl06IHRoaXMuX2dldFRpdGxlKClcbiAgICB9XG4gIH1cblxuICBfZ2V0VGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy50aXRsZSkgfHwgdGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtb3JpZ2luYWwtdGl0bGUnKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuZ2V0T3JDcmVhdGVJbnN0YW5jZShldmVudC5kZWxlZ2F0ZVRhcmdldCwgdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSlcbiAgfVxuXG4gIF9pc0FuaW1hdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25maWcuYW5pbWF0aW9uIHx8ICh0aGlzLnRpcCAmJiB0aGlzLnRpcC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKSlcbiAgfVxuXG4gIF9pc1Nob3duKCkge1xuICAgIHJldHVybiB0aGlzLnRpcCAmJiB0aGlzLnRpcC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKVxuICB9XG5cbiAgX2NyZWF0ZVBvcHBlcih0aXApIHtcbiAgICBjb25zdCBwbGFjZW1lbnQgPSBleGVjdXRlKHRoaXMuX2NvbmZpZy5wbGFjZW1lbnQsIFt0aGlzLCB0aXAsIHRoaXMuX2VsZW1lbnRdKVxuICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBBdHRhY2htZW50TWFwW3BsYWNlbWVudC50b1VwcGVyQ2FzZSgpXVxuICAgIHJldHVybiBQb3BwZXIuY3JlYXRlUG9wcGVyKHRoaXMuX2VsZW1lbnQsIHRpcCwgdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKGF0dGFjaG1lbnQpKVxuICB9XG5cbiAgX2dldE9mZnNldCgpIHtcbiAgICBjb25zdCB7IG9mZnNldCB9ID0gdGhpcy5fY29uZmlnXG5cbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBvZmZzZXQuc3BsaXQoJywnKS5tYXAodmFsdWUgPT4gTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCkpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBwb3BwZXJEYXRhID0+IG9mZnNldChwb3BwZXJEYXRhLCB0aGlzLl9lbGVtZW50KVxuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXRcbiAgfVxuXG4gIF9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZXhlY3V0ZShhcmcsIFt0aGlzLl9lbGVtZW50XSlcbiAgfVxuXG4gIF9nZXRQb3BwZXJDb25maWcoYXR0YWNobWVudCkge1xuICAgIGNvbnN0IGRlZmF1bHRCc1BvcHBlckNvbmZpZyA9IHtcbiAgICAgIHBsYWNlbWVudDogYXR0YWNobWVudCxcbiAgICAgIG1vZGlmaWVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2ZsaXAnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGZhbGxiYWNrUGxhY2VtZW50czogdGhpcy5fY29uZmlnLmZhbGxiYWNrUGxhY2VtZW50c1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdvZmZzZXQnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIG9mZnNldDogdGhpcy5fZ2V0T2Zmc2V0KClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBib3VuZGFyeTogdGhpcy5fY29uZmlnLmJvdW5kYXJ5XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2Fycm93JyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBlbGVtZW50OiBgLiR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FfS1hcnJvd2BcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAncHJlU2V0UGxhY2VtZW50JyxcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIHBoYXNlOiAnYmVmb3JlTWFpbicsXG4gICAgICAgICAgZm46IGRhdGEgPT4ge1xuICAgICAgICAgICAgLy8gUHJlLXNldCBQb3BwZXIncyBwbGFjZW1lbnQgYXR0cmlidXRlIGluIG9yZGVyIHRvIHJlYWQgdGhlIGFycm93IHNpemVzIHByb3Blcmx5LlxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBQb3BwZXIgbWl4ZXMgdXAgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZGltZW5zaW9ucyBzaW5jZSB0aGUgaW5pdGlhbCBhcnJvdyBzdHlsZSBpcyBmb3IgdG9wIHBsYWNlbWVudFxuICAgICAgICAgICAgdGhpcy5fZ2V0VGlwRWxlbWVudCgpLnNldEF0dHJpYnV0ZSgnZGF0YS1wb3BwZXItcGxhY2VtZW50JywgZGF0YS5zdGF0ZS5wbGFjZW1lbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZmF1bHRCc1BvcHBlckNvbmZpZyxcbiAgICAgIC4uLmV4ZWN1dGUodGhpcy5fY29uZmlnLnBvcHBlckNvbmZpZywgW2RlZmF1bHRCc1BvcHBlckNvbmZpZ10pXG4gICAgfVxuICB9XG5cbiAgX3NldExpc3RlbmVycygpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IHRoaXMuX2NvbmZpZy50cmlnZ2VyLnNwbGl0KCcgJylcblxuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2Vycykge1xuICAgICAgaWYgKHRyaWdnZXIgPT09ICdjbGljaycpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0NMSUNLKSwgdGhpcy5fY29uZmlnLnNlbGVjdG9yLCBldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudClcbiAgICAgICAgICBjb250ZXh0LnRvZ2dsZSgpXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKHRyaWdnZXIgIT09IFRSSUdHRVJfTUFOVUFMKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50SW4gPSB0cmlnZ2VyID09PSBUUklHR0VSX0hPVkVSID9cbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9NT1VTRUVOVEVSKSA6XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfRk9DVVNJTilcbiAgICAgICAgY29uc3QgZXZlbnRPdXQgPSB0cmlnZ2VyID09PSBUUklHR0VSX0hPVkVSID9cbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9NT1VTRUxFQVZFKSA6XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfRk9DVVNPVVQpXG5cbiAgICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIGV2ZW50SW4sIHRoaXMuX2NvbmZpZy5zZWxlY3RvciwgZXZlbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpXG4gICAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltldmVudC50eXBlID09PSAnZm9jdXNpbicgPyBUUklHR0VSX0ZPQ1VTIDogVFJJR0dFUl9IT1ZFUl0gPSB0cnVlXG4gICAgICAgICAgY29udGV4dC5fZW50ZXIoKVxuICAgICAgICB9KVxuICAgICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgZXZlbnRPdXQsIHRoaXMuX2NvbmZpZy5zZWxlY3RvciwgZXZlbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpXG4gICAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltldmVudC50eXBlID09PSAnZm9jdXNvdXQnID8gVFJJR0dFUl9GT0NVUyA6IFRSSUdHRVJfSE9WRVJdID1cbiAgICAgICAgICAgIGNvbnRleHQuX2VsZW1lbnQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldClcblxuICAgICAgICAgIGNvbnRleHQuX2xlYXZlKClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9oaWRlTW9kYWxIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX01PREFMKSwgRVZFTlRfTU9EQUxfSElERSwgdGhpcy5faGlkZU1vZGFsSGFuZGxlcilcbiAgfVxuXG4gIF9maXhUaXRsZSgpIHtcbiAgICBjb25zdCB0aXRsZSA9IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpXG5cbiAgICBpZiAoIXRpdGxlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJykgJiYgIXRoaXMuX2VsZW1lbnQudGV4dENvbnRlbnQudHJpbSgpKSB7XG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHRpdGxlKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJywgdGl0bGUpIC8vIERPIE5PVCBVU0UgSVQuIElzIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RpdGxlJylcbiAgfVxuXG4gIF9lbnRlcigpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bigpIHx8IHRoaXMuX2lzSG92ZXJlZCkge1xuICAgICAgdGhpcy5faXNIb3ZlcmVkID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNIb3ZlcmVkID0gdHJ1ZVxuXG4gICAgdGhpcy5fc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNIb3ZlcmVkKSB7XG4gICAgICAgIHRoaXMuc2hvdygpXG4gICAgICB9XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5LnNob3cpXG4gIH1cblxuICBfbGVhdmUoKSB7XG4gICAgaWYgKHRoaXMuX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNIb3ZlcmVkID0gZmFsc2VcblxuICAgIHRoaXMuX3NldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICAgIH1cbiAgICB9LCB0aGlzLl9jb25maWcuZGVsYXkuaGlkZSlcbiAgfVxuXG4gIF9zZXRUaW1lb3V0KGhhbmRsZXIsIHRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dClcbiAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dChoYW5kbGVyLCB0aW1lb3V0KVxuICB9XG5cbiAgX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fYWN0aXZlVHJpZ2dlcikuaW5jbHVkZXModHJ1ZSlcbiAgfVxuXG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uc3QgZGF0YUF0dHJpYnV0ZXMgPSBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlcyh0aGlzLl9lbGVtZW50KVxuXG4gICAgZm9yIChjb25zdCBkYXRhQXR0cmlidXRlIG9mIE9iamVjdC5rZXlzKGRhdGFBdHRyaWJ1dGVzKSkge1xuICAgICAgaWYgKERJU0FMTE9XRURfQVRUUklCVVRFUy5oYXMoZGF0YUF0dHJpYnV0ZSkpIHtcbiAgICAgICAgZGVsZXRlIGRhdGFBdHRyaWJ1dGVzW2RhdGFBdHRyaWJ1dGVdXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uZmlnID0ge1xuICAgICAgLi4uZGF0YUF0dHJpYnV0ZXMsXG4gICAgICAuLi4odHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pXG4gICAgfVxuICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZylcbiAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZylcbiAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIGNvbmZpZy5jb250YWluZXIgPSBjb25maWcuY29udGFpbmVyID09PSBmYWxzZSA/IGRvY3VtZW50LmJvZHkgOiBnZXRFbGVtZW50KGNvbmZpZy5jb250YWluZXIpXG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5kZWxheSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbmZpZy5kZWxheSA9IHtcbiAgICAgICAgc2hvdzogY29uZmlnLmRlbGF5LFxuICAgICAgICBoaWRlOiBjb25maWcuZGVsYXlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy50aXRsZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbmZpZy50aXRsZSA9IGNvbmZpZy50aXRsZS50b1N0cmluZygpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcuY29udGVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbmZpZy5jb250ZW50ID0gY29uZmlnLmNvbnRlbnQudG9TdHJpbmcoKVxuICAgIH1cblxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9nZXREZWxlZ2F0ZUNvbmZpZygpIHtcbiAgICBjb25zdCBjb25maWcgPSB7fVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fY29uZmlnKSkge1xuICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtrZXldICE9PSB2YWx1ZSkge1xuICAgICAgICBjb25maWdba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uZmlnLnNlbGVjdG9yID0gZmFsc2VcbiAgICBjb25maWcudHJpZ2dlciA9ICdtYW51YWwnXG5cbiAgICAvLyBJbiB0aGUgZnV0dXJlIGNhbiBiZSByZXBsYWNlZCB3aXRoOlxuICAgIC8vIGNvbnN0IGtleXNXaXRoRGlmZmVyZW50VmFsdWVzID0gT2JqZWN0LmVudHJpZXModGhpcy5fY29uZmlnKS5maWx0ZXIoZW50cnkgPT4gdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0W2VudHJ5WzBdXSAhPT0gdGhpcy5fY29uZmlnW2VudHJ5WzBdXSlcbiAgICAvLyBgT2JqZWN0LmZyb21FbnRyaWVzKGtleXNXaXRoRGlmZmVyZW50VmFsdWVzKWBcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfZGlzcG9zZVBvcHBlcigpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpXG4gICAgICB0aGlzLl9wb3BwZXIgPSBudWxsXG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGlwKSB7XG4gICAgICB0aGlzLnRpcC5yZW1vdmUoKVxuICAgICAgdGhpcy50aXAgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gVG9vbHRpcC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10oKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oVG9vbHRpcClcblxuZXhwb3J0IGRlZmF1bHQgVG9vbHRpcFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL3Nhbml0aXplci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbi8vIGpzLWRvY3Mtc3RhcnQgYWxsb3ctbGlzdFxuY29uc3QgQVJJQV9BVFRSSUJVVEVfUEFUVEVSTiA9IC9eYXJpYS1bXFx3LV0qJC9pXG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0QWxsb3dsaXN0ID0ge1xuICAvLyBHbG9iYWwgYXR0cmlidXRlcyBhbGxvd2VkIG9uIGFueSBzdXBwbGllZCBlbGVtZW50IGJlbG93LlxuICAnKic6IFsnY2xhc3MnLCAnZGlyJywgJ2lkJywgJ2xhbmcnLCAncm9sZScsIEFSSUFfQVRUUklCVVRFX1BBVFRFUk5dLFxuICBhOiBbJ3RhcmdldCcsICdocmVmJywgJ3RpdGxlJywgJ3JlbCddLFxuICBhcmVhOiBbXSxcbiAgYjogW10sXG4gIGJyOiBbXSxcbiAgY29sOiBbXSxcbiAgY29kZTogW10sXG4gIGRkOiBbXSxcbiAgZGl2OiBbXSxcbiAgZGw6IFtdLFxuICBkdDogW10sXG4gIGVtOiBbXSxcbiAgaHI6IFtdLFxuICBoMTogW10sXG4gIGgyOiBbXSxcbiAgaDM6IFtdLFxuICBoNDogW10sXG4gIGg1OiBbXSxcbiAgaDY6IFtdLFxuICBpOiBbXSxcbiAgaW1nOiBbJ3NyYycsICdzcmNzZXQnLCAnYWx0JywgJ3RpdGxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICBsaTogW10sXG4gIG9sOiBbXSxcbiAgcDogW10sXG4gIHByZTogW10sXG4gIHM6IFtdLFxuICBzbWFsbDogW10sXG4gIHNwYW46IFtdLFxuICBzdWI6IFtdLFxuICBzdXA6IFtdLFxuICBzdHJvbmc6IFtdLFxuICB1OiBbXSxcbiAgdWw6IFtdXG59XG4vLyBqcy1kb2NzLWVuZCBhbGxvdy1saXN0XG5cbmNvbnN0IHVyaUF0dHJpYnV0ZXMgPSBuZXcgU2V0KFtcbiAgJ2JhY2tncm91bmQnLFxuICAnY2l0ZScsXG4gICdocmVmJyxcbiAgJ2l0ZW10eXBlJyxcbiAgJ2xvbmdkZXNjJyxcbiAgJ3Bvc3RlcicsXG4gICdzcmMnLFxuICAneGxpbms6aHJlZidcbl0pXG5cbi8qKlxuICogQSBwYXR0ZXJuIHRoYXQgcmVjb2duaXplcyBVUkxzIHRoYXQgYXJlIHNhZmUgd3J0LiBYU1MgaW4gVVJMIG5hdmlnYXRpb25cbiAqIGNvbnRleHRzLlxuICpcbiAqIFNob3V0LW91dCB0byBBbmd1bGFyIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi8xNS4yLjgvcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3VybF9zYW5pdGl6ZXIudHMjTDM4XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2JldHRlci1yZWdleFxuY29uc3QgU0FGRV9VUkxfUEFUVEVSTiA9IC9eKD8hamF2YXNjcmlwdDopKD86W2EtejAtOSsuLV0rOnxbXiY6Lz8jXSooPzpbLz8jXXwkKSkvaVxuXG5jb25zdCBhbGxvd2VkQXR0cmlidXRlID0gKGF0dHJpYnV0ZSwgYWxsb3dlZEF0dHJpYnV0ZUxpc3QpID0+IHtcbiAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgaWYgKGFsbG93ZWRBdHRyaWJ1dGVMaXN0LmluY2x1ZGVzKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgaWYgKHVyaUF0dHJpYnV0ZXMuaGFzKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICByZXR1cm4gQm9vbGVhbihTQUZFX1VSTF9QQVRURVJOLnRlc3QoYXR0cmlidXRlLm5vZGVWYWx1ZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGEgcmVndWxhciBleHByZXNzaW9uIHZhbGlkYXRlcyB0aGUgYXR0cmlidXRlLlxuICByZXR1cm4gYWxsb3dlZEF0dHJpYnV0ZUxpc3QuZmlsdGVyKGF0dHJpYnV0ZVJlZ2V4ID0+IGF0dHJpYnV0ZVJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwKVxuICAgIC5zb21lKHJlZ2V4ID0+IHJlZ2V4LnRlc3QoYXR0cmlidXRlTmFtZSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUh0bWwodW5zYWZlSHRtbCwgYWxsb3dMaXN0LCBzYW5pdGl6ZUZ1bmN0aW9uKSB7XG4gIGlmICghdW5zYWZlSHRtbC5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5zYWZlSHRtbFxuICB9XG5cbiAgaWYgKHNhbml0aXplRnVuY3Rpb24gJiYgdHlwZW9mIHNhbml0aXplRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2FuaXRpemVGdW5jdGlvbih1bnNhZmVIdG1sKVxuICB9XG5cbiAgY29uc3QgZG9tUGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKVxuICBjb25zdCBjcmVhdGVkRG9jdW1lbnQgPSBkb21QYXJzZXIucGFyc2VGcm9tU3RyaW5nKHVuc2FmZUh0bWwsICd0ZXh0L2h0bWwnKVxuICBjb25zdCBlbGVtZW50cyA9IFtdLmNvbmNhdCguLi5jcmVhdGVkRG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpXG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIGlmICghT2JqZWN0LmtleXMoYWxsb3dMaXN0KS5pbmNsdWRlcyhlbGVtZW50TmFtZSkpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlKClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlTGlzdCA9IFtdLmNvbmNhdCguLi5lbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgY29uc3QgYWxsb3dlZEF0dHJpYnV0ZXMgPSBbXS5jb25jYXQoYWxsb3dMaXN0WycqJ10gfHwgW10sIGFsbG93TGlzdFtlbGVtZW50TmFtZV0gfHwgW10pXG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVMaXN0KSB7XG4gICAgICBpZiAoIWFsbG93ZWRBdHRyaWJ1dGUoYXR0cmlidXRlLCBhbGxvd2VkQXR0cmlidXRlcykpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlLm5vZGVOYW1lKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjcmVhdGVkRG9jdW1lbnQuYm9keS5pbm5lckhUTUxcbn1cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC90ZW1wbGF0ZS1mYWN0b3J5LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4uL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQgQ29uZmlnIGZyb20gJy4vY29uZmlnLmpzJ1xuaW1wb3J0IHsgRGVmYXVsdEFsbG93bGlzdCwgc2FuaXRpemVIdG1sIH0gZnJvbSAnLi9zYW5pdGl6ZXIuanMnXG5pbXBvcnQgeyBleGVjdXRlLCBnZXRFbGVtZW50LCBpc0VsZW1lbnQgfSBmcm9tICcuL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnVGVtcGxhdGVGYWN0b3J5J1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhbGxvd0xpc3Q6IERlZmF1bHRBbGxvd2xpc3QsXG4gIGNvbnRlbnQ6IHt9LCAvLyB7IHNlbGVjdG9yIDogdGV4dCAsICBzZWxlY3RvcjIgOiB0ZXh0MiAsIH1cbiAgZXh0cmFDbGFzczogJycsXG4gIGh0bWw6IGZhbHNlLFxuICBzYW5pdGl6ZTogdHJ1ZSxcbiAgc2FuaXRpemVGbjogbnVsbCxcbiAgdGVtcGxhdGU6ICc8ZGl2PjwvZGl2Pidcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGFsbG93TGlzdDogJ29iamVjdCcsXG4gIGNvbnRlbnQ6ICdvYmplY3QnLFxuICBleHRyYUNsYXNzOiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICBodG1sOiAnYm9vbGVhbicsXG4gIHNhbml0aXplOiAnYm9vbGVhbicsXG4gIHNhbml0aXplRm46ICcobnVsbHxmdW5jdGlvbiknLFxuICB0ZW1wbGF0ZTogJ3N0cmluZydcbn1cblxuY29uc3QgRGVmYXVsdENvbnRlbnRUeXBlID0ge1xuICBlbnRyeTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbnxudWxsKScsXG4gIHNlbGVjdG9yOiAnKHN0cmluZ3xlbGVtZW50KSdcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVGVtcGxhdGVGYWN0b3J5IGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGdldENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fY29uZmlnLmNvbnRlbnQpXG4gICAgICAubWFwKGNvbmZpZyA9PiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihjb25maWcpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICB9XG5cbiAgaGFzQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb250ZW50KCkubGVuZ3RoID4gMFxuICB9XG5cbiAgY2hhbmdlQ29udGVudChjb250ZW50KSB7XG4gICAgdGhpcy5fY2hlY2tDb250ZW50KGNvbnRlbnQpXG4gICAgdGhpcy5fY29uZmlnLmNvbnRlbnQgPSB7IC4uLnRoaXMuX2NvbmZpZy5jb250ZW50LCAuLi5jb250ZW50IH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgdG9IdG1sKCkge1xuICAgIGNvbnN0IHRlbXBsYXRlV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgdGVtcGxhdGVXcmFwcGVyLmlubmVySFRNTCA9IHRoaXMuX21heWJlU2FuaXRpemUodGhpcy5fY29uZmlnLnRlbXBsYXRlKVxuXG4gICAgZm9yIChjb25zdCBbc2VsZWN0b3IsIHRleHRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZy5jb250ZW50KSkge1xuICAgICAgdGhpcy5fc2V0Q29udGVudCh0ZW1wbGF0ZVdyYXBwZXIsIHRleHQsIHNlbGVjdG9yKVxuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlID0gdGVtcGxhdGVXcmFwcGVyLmNoaWxkcmVuWzBdXG4gICAgY29uc3QgZXh0cmFDbGFzcyA9IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5leHRyYUNsYXNzKVxuXG4gICAgaWYgKGV4dHJhQ2xhc3MpIHtcbiAgICAgIHRlbXBsYXRlLmNsYXNzTGlzdC5hZGQoLi4uZXh0cmFDbGFzcy5zcGxpdCgnICcpKVxuICAgIH1cblxuICAgIHJldHVybiB0ZW1wbGF0ZVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfdHlwZUNoZWNrQ29uZmlnKGNvbmZpZykge1xuICAgIHN1cGVyLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2NoZWNrQ29udGVudChjb25maWcuY29udGVudClcbiAgfVxuXG4gIF9jaGVja0NvbnRlbnQoYXJnKSB7XG4gICAgZm9yIChjb25zdCBbc2VsZWN0b3IsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGFyZykpIHtcbiAgICAgIHN1cGVyLl90eXBlQ2hlY2tDb25maWcoeyBzZWxlY3RvciwgZW50cnk6IGNvbnRlbnQgfSwgRGVmYXVsdENvbnRlbnRUeXBlKVxuICAgIH1cbiAgfVxuXG4gIF9zZXRDb250ZW50KHRlbXBsYXRlLCBjb250ZW50LCBzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRlbXBsYXRlRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IsIHRlbXBsYXRlKVxuXG4gICAgaWYgKCF0ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnRlbnQgPSB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihjb250ZW50KVxuXG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQucmVtb3ZlKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpc0VsZW1lbnQoY29udGVudCkpIHtcbiAgICAgIHRoaXMuX3B1dEVsZW1lbnRJblRlbXBsYXRlKGdldEVsZW1lbnQoY29udGVudCksIHRlbXBsYXRlRWxlbWVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcuaHRtbCkge1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMuX21heWJlU2FuaXRpemUoY29udGVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRlbXBsYXRlRWxlbWVudC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgfVxuXG4gIF9tYXliZVNhbml0aXplKGFyZykge1xuICAgIHJldHVybiB0aGlzLl9jb25maWcuc2FuaXRpemUgPyBzYW5pdGl6ZUh0bWwoYXJnLCB0aGlzLl9jb25maWcuYWxsb3dMaXN0LCB0aGlzLl9jb25maWcuc2FuaXRpemVGbikgOiBhcmdcbiAgfVxuXG4gIF9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZXhlY3V0ZShhcmcsIFt0aGlzXSlcbiAgfVxuXG4gIF9wdXRFbGVtZW50SW5UZW1wbGF0ZShlbGVtZW50LCB0ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmh0bWwpIHtcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5pbm5lckhUTUwgPSAnJ1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmFwcGVuZChlbGVtZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGVtcGxhdGVFbGVtZW50LnRleHRDb250ZW50ID0gZWxlbWVudC50ZXh0Q29udGVudFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRlbXBsYXRlRmFjdG9yeVxuIiwgIi8vIEltcG9ydCB0aGUgQm9vdHN0cmFwIGNvbXBvbmVudHMgd2Ugd2FudCB0byB1c2UuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9qcy9pbmRleC51bWQuanNcbmltcG9ydCBUYWIgZnJvbSBcIi9qcy9ib290c3RyYXAvc3JjL3RhYlwiO1xuaW1wb3J0IENvbGxhcHNlIGZyb20gXCIvanMvYm9vdHN0cmFwL3NyYy9jb2xsYXBzZVwiO1xuaW1wb3J0IERyb3Bkb3duIGZyb20gXCIvanMvYm9vdHN0cmFwL3NyYy9kcm9wZG93blwiO1xuaW1wb3J0IFNjcm9sbFNweSBmcm9tIFwianMvYm9vdHN0cmFwL3NyYy9zY3JvbGxzcHlcIjtcbmltcG9ydCBUb29sdGlwIGZyb20gXCJqcy9ib290c3RyYXAvc3JjL3Rvb2x0aXBcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIFRhYixcbiAgICBDb2xsYXBzZSxcbiAgICBEcm9wZG93bixcbiAgICBTY3JvbGxTcHksXG4gICAgVG9vbHRpcFxufVxuXG53aW5kb3cuQ29sbGFwc2UgPSBDb2xsYXBzZTtcbndpbmRvdy5Ub29sdGlwID0gVG9vbHRpcDsiXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7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S0FBSyxPQUFPLEdBQUc7QUFDdkQsWUFBSSxLQUFLLFlBQVksUUFBUSxHQUFHLE1BQU0sT0FBTztBQUMzQyxpQkFBTyxHQUFHLElBQUk7QUFBQSxRQUNoQjtBQUFBLE1BQ0Y7QUFFQSxhQUFPLFdBQVc7QUFDbEIsYUFBTyxVQUFVO0FBS2pCLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxpQkFBaUI7QUFDZixVQUFJLEtBQUssU0FBUztBQUNoQixhQUFLLFFBQVEsUUFBUTtBQUNyQixhQUFLLFVBQVU7QUFBQSxNQUNqQjtBQUVBLFVBQUksS0FBSyxLQUFLO0FBQ1osYUFBSyxJQUFJLE9BQU87QUFDaEIsYUFBSyxNQUFNO0FBQUEsTUFDYjtBQUFBLElBQ0Y7QUFBQTtBQUFBLElBR0EsT0FBTyxnQkFBZ0IsUUFBUTtBQUM3QixhQUFPLEtBQUssS0FBSyxXQUFZO0FBQzNCLGNBQU0sT0FBTyxTQUFRLG9CQUFvQixNQUFNLE1BQU07QUFFckQsWUFBSSxPQUFPLFdBQVcsVUFBVTtBQUM5QjtBQUFBLFFBQ0Y7QUFFQSxZQUFJLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYTtBQUN2QyxnQkFBTSxJQUFJLFVBQVUsb0JBQW9CLE1BQU0sR0FBRztBQUFBLFFBQ25EO0FBRUEsYUFBSyxNQUFNLEVBQUU7QUFBQSxNQUNmLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQU1BLHFCQUFtQixPQUFPO0FBRTFCLE1BQU8sa0JBQVE7OztBR2huQmYsTUFBTyxnQkFBUTtBQUFBLElBQ1g7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDSjtBQUVBLFNBQU8sV0FBVztBQUNsQixTQUFPLFVBQVU7IiwKICAibmFtZXMiOiBbImlzRWxlbWVudCIsICJnZXRDb21wdXRlZFN0eWxlIiwgIndpbmRvdyIsICJtZXJnZWQiLCAiY2xpcHBpbmdQYXJlbnRzIiwgInJlZmVyZW5jZSIsICJwb3BwZXJPZmZzZXRzIiwgIm9mZnNldCIsICJkZWZhdWx0TW9kaWZpZXJzIiwgImNyZWF0ZVBvcHBlciIsICJwb3BwZXIiLCAib3B0aW9ucyIsICJzdGF0ZSIsICJlZmZlY3QiLCAibm9vcEZuIiwgIm5hbWUiLCAic3R5bGUiLCAicGxhY2VtZW50IiwgInBsYWNlbWVudHMiLCAiX2xvb3AiLCAiX2kiLCAiY2hlY2tzIiwgIm1pbiIsICJtYXgiLCAidG9QYWRkaW5nT2JqZWN0IiwgImNhbGxiYWNrIiwgImZuIiwgImVsZW1lbnQiLCAiTkFNRSIsICJEQVRBX0tFWSIsICJFVkVOVF9LRVkiLCAiRVZFTlRfU0hPVyIsICJFVkVOVF9TSE9XTiIsICJFVkVOVF9ISURFIiwgIkVWRU5UX0hJRERFTiIsICJFVkVOVF9DTElDS19EQVRBX0FQSSIsICJDTEFTU19OQU1FX1NIT1ciLCAiU0VMRUNUT1JfREFUQV9UT0dHTEUiLCAiTkFNRSIsICJEQVRBX0tFWSIsICJFVkVOVF9LRVkiLCAiREFUQV9BUElfS0VZIiwgIkFSUk9XX1VQX0tFWSIsICJBUlJPV19ET1dOX0tFWSIsICJFVkVOVF9ISURFIiwgIkVWRU5UX0hJRERFTiIsICJFVkVOVF9TSE9XIiwgIkVWRU5UX1NIT1dOIiwgIkVWRU5UX0NMSUNLX0RBVEFfQVBJIiwgIkNMQVNTX05BTUVfU0hPVyIsICJTRUxFQ1RPUl9EQVRBX1RPR0dMRSIsICJEZWZhdWx0IiwgIkRlZmF1bHRUeXBlIiwgIk5BTUUiLCAiREFUQV9LRVkiLCAiRVZFTlRfS0VZIiwgIkRBVEFfQVBJX0tFWSIsICJFVkVOVF9MT0FEX0RBVEFfQVBJIiwgIkNMQVNTX05BTUVfQUNUSVZFIiwgIlNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSIsICJEZWZhdWx0IiwgIkRlZmF1bHRUeXBlIiwgIlBvcHBlciIsICJOQU1FIiwgIkRlZmF1bHQiLCAiRGVmYXVsdFR5cGUiLCAiTkFNRSIsICJDTEFTU19OQU1FX0ZBREUiLCAiQ0xBU1NfTkFNRV9TSE9XIiwgIkVWRU5UX0hJREUiLCAiRVZFTlRfSElEREVOIiwgIkVWRU5UX1NIT1ciLCAiRVZFTlRfU0hPV04iLCAiRVZFTlRfQ0xJQ0siLCAiRGVmYXVsdCIsICJEZWZhdWx0VHlwZSIsICJQb3BwZXIiXQp9Cg== diff --git a/public/docs/js/bundle.js b/public/docs/js/bundle.js deleted file mode 100644 index 37a723f..0000000 --- a/public/docs/js/bundle.js +++ /dev/null @@ -1,3142 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){"use strict";var t=1e3,e=6e4,n=36e5,r="millisecond",i="second",s="minute",u="hour",a="day",o="week",f="month",h="quarter",c="year",d="date",l="Invalid Date",$=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var e=["th","st","nd","rd"],n=t%100;return"["+t+(e[(n-20)%10]||e[n]||e[0])+"]"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:""+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?"+":"-")+m(r,2,"0")+":"+m(i,2,"0")},m:function t(e,n){if(e.date()1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},w=function(t,e){if(p(t))return t.clone();var n="object"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},O=v;O.l=S,O.i=p,O.w=function(t,e){return w(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=S(t.locale,null,!0),this.parse(t)}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(O.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||"0").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.$x=t.x||{},this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return O},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=w(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return w(t)= 0 && matches.item(i) !== this) { } - return i > -1; - }; - } - - // Get the closest matching element - for (; elem && elem !== document; elem = elem.parentNode) { - if (elem.matches(selector)) return elem; - } - return null; - -}; - -function activateMenu() { - var menuItems = document.getElementsByClassName("sub-menu-item"); - if (menuItems) { - - var matchingMenuItem = null; - for (var idx = 0; idx < menuItems.length; idx++) { - if (menuItems[idx].href === window.location.href) { - matchingMenuItem = menuItems[idx]; - } - } - - if (matchingMenuItem) { - matchingMenuItem.classList.add('active'); - var immediateParent = getClosest(matchingMenuItem, 'li'); - if (immediateParent) { - immediateParent.classList.add('active'); - } - - var parent = getClosest(matchingMenuItem, '.parent-menu-item'); - if (parent) { - parent.classList.add('active'); - var parentMenuitem = parent.querySelector('.menu-item'); - if (parentMenuitem) { - parentMenuitem.classList.add('active'); - } - var parentOfParent = getClosest(parent, '.parent-parent-menu-item'); - if (parentOfParent) { - parentOfParent.classList.add('active'); - } - } else { - var parentOfParent = getClosest(matchingMenuItem, '.parent-parent-menu-item'); - if (parentOfParent) { - parentOfParent.classList.add('active'); - } - } - } - } -} - - -// Sidebar Menu -function activateSidebarMenu() { - var current = location.pathname.substring(location.pathname.lastIndexOf('/') + 1); - if (current !== "" && document.getElementById("sidebar")) { - var menuItems = document.querySelectorAll('#sidebar button'); - for (var i = 0, len = menuItems.length; i < len; i++) { - if (menuItems[i].getAttribute("href").indexOf(current) !== -1) { - menuItems[i].parentElement.className += " active"; - if (menuItems[i].closest(".sidebar-submenu")) { - menuItems[i].closest(".sidebar-submenu").classList.add("d-block"); - } - if (menuItems[i].closest(".sidebar-dropdown")) { - menuItems[i].closest(".sidebar-dropdown").classList.add("active"); - } - } - } - } -} - -if (document.getElementById("close-sidebar")) { - document.getElementById("close-sidebar").addEventListener("click", function () { - document.getElementsByClassName("page-wrapper")[0].classList.toggle("toggled"); - }); -} - -// Close Sidebar (mobile) -if (!window.matchMedia('(min-width: 1024px)').matches) { - if (document.getElementById("close-sidebar")) { - const closeSidebar = document.getElementById("close-sidebar"); - const sidebar = document.getElementById("sidebar"); - const sidebarMenuLinks = Array.from(document.querySelectorAll(".sidebar-root-link,.sidebar-nested-link")); - // Close sidebar by clicking outside - document.addEventListener('click', function(elem) { - if (!closeSidebar.contains(elem.target) && !sidebar.contains(elem.target)) - document.getElementsByClassName("page-wrapper")[0].classList.add("toggled"); - }); - // Close sidebar immediately when clicking sidebar menu item - sidebarMenuLinks.forEach(menuLink => { - menuLink.addEventListener("click", function () { - document.getElementsByClassName("page-wrapper")[0].classList.add("toggled"); - }); - }); - } -} - -// Clickable Menu -if (document.getElementById("navigation")) { - var elements = document.getElementById("navigation").getElementsByTagName("a"); - for (var i = 0, len = elements.length; i < len; i++) { - elements[i].onclick = function (elem) { - if (elem.target.getAttribute("href") === "javascript:void(0)") { - var submenu = elem.target.nextElementSibling.nextElementSibling; - submenu.classList.toggle('open'); - } - } - } -} - -if (document.getElementById("sidebar")) { - var elements = document.getElementById("sidebar").getElementsByTagName("button"); - for (var i = 0, len = elements.length; i < len; i++) { - elements[i].onclick = function (elem) { - // if(elem.target !== document.querySelectorAll("li.sidebar-dropdown.active > a")[0]){ - // document.querySelectorAll("li.sidebar-dropdown.active")[0]?.classList?.toggle("active"); - // document.querySelectorAll("div.sidebar-submenu.d-block")[0]?.classList?.toggle("d-block"); - // } - // if(elem.target.getAttribute("href") === "javascript:void(0)") { - elem.target.parentElement.classList.toggle("active"); - elem.target.nextElementSibling.classList.toggle("d-block"); - // } - } - } -} - -// Menu sticky -function windowScroll() { - var navbar = document.getElementById("topnav"); - if (navbar === null) { - - } else if (document.body.scrollTop >= 50 || - document.documentElement.scrollTop >= 50) { - navbar.classList.add("nav-sticky"); - } else { - navbar.classList.remove("nav-sticky"); - } -} - -window.addEventListener('scroll', (ev) => { - ev.preventDefault(); - windowScroll(); -}) - -// back-to-top -var mybutton = document.getElementById("back-to-top"); -window.onscroll = function () { - scrollFunction(); -}; - -function scrollFunction() { - if (mybutton != null) { - if (document.body.scrollTop > 500 || document.documentElement.scrollTop > 500) { - mybutton.style.display = "block"; - } else { - mybutton.style.display = "none"; - } - } -} - -function topFunction() { - document.body.scrollTop = 0; - document.documentElement.scrollTop = 0; -} - -// dd-menu -if (document.getElementsByClassName("dd-menu")) { - var ddmenu = document.getElementsByClassName("dd-menu"); - for (var i = 0, len = ddmenu.length; i < len; i++) { - ddmenu[i].onclick = function (elem) { - elem.stopPropagation(); - } - } -} - -// Active Sidebar -(function () { - var current = location.pathname.substring(location.pathname.lastIndexOf('/') + 1); - if (current === "") return; - var menuItems = document.querySelectorAll('.sidebar-nav a'); - for (var i = 0, len = menuItems.length; i < len; i++) { - if (menuItems[i].getAttribute("href").indexOf(current) !== -1) { - menuItems[i].parentElement.className += " active"; - } - } -})(); - -// Last Modified Date of current page (relative time format) -if (document.getElementById("relativetime")) { - dayjs.extend(window.dayjs_plugin_relativeTime); - const modId = document.getElementById('relativetime'); - let modAgo = dayjs(modId.getAttribute('data-authdate')).fromNow(); - document.getElementById("relativetime").innerHTML = modAgo; -}; - -// Initialize Bootstrap Tooltips -const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]') -const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new Tooltip(tooltipTriggerEl)) - -/** - * Sanitize and encode all HTML in a user-submitted string - * https://portswigger.net/web-security/cross-site-scripting/preventing - * @param {String} str The user-submitted string - * @return {String} str The sanitized string - */ -var sanitizeHTML = function (str) { - return str.replace(/[^\w. ]/gi, function (c) { - return '&#' + c.charCodeAt(0) + ';'; - }); -}; -; -!function(t,o){"object"==typeof exports&&"object"==typeof module?module.exports=o():"function"==typeof define&&define.amd?define([],o):"object"==typeof exports?exports.scrollSpy=o():t.scrollSpy=o()}(self,(()=>(()=>{var t={138:(t,o,e)=>{t.exports=(t,o={})=>{const{ScrollSpy:s}=e(218),i=new s(t,o);return window.onload=i.onScroll(),window.addEventListener("scroll",(()=>i.onScroll())),i}},218:(t,o,e)=>{"use strict";e.r(o),e.d(o,{ScrollSpy:()=>s});class s{constructor(t,o={}){if(!t)throw new Error("First argument is query selector to your navigation.");if("object"!=typeof o)throw new Error("Second argument must be instance of Object.");o.smoothScroll=!0===o.smoothScroll&&{}||o.smoothScroll,this.menuList=t instanceof HTMLElement?t:document.querySelector(t),this.options=Object.assign({},{sectionClass:".scrollspy",menuActiveTarget:"li > a",offset:0,hrefAttribute:"href",activeClass:"active",scrollContainer:"",smoothScroll:{}},o),this.options.scrollContainer?this.scroller=this.options.scrollContainer instanceof HTMLElement?this.options.scrollContainer:document.querySelector(this.options.scrollContainer):this.scroller=window,this.sections=document.querySelectorAll(this.options.sectionClass),this.attachEventListeners()}attachEventListeners(){if(this.scroller&&(this.scroller.addEventListener("scroll",(()=>this.onScroll())),this.options.smoothScroll)){this.menuList.querySelectorAll(this.options.menuActiveTarget).forEach((t=>t.addEventListener("click",this.onClick.bind(this))))}}onClick(t){const o=t.target.getAttribute(this.options.hrefAttribute),e=document.querySelector(o);e&&this.options.smoothScroll&&(t.preventDefault(),this.scrollTo(e))}onScroll(){const t=this.getSectionInView(),o=this.getMenuItemBySection(t);o&&(this.removeCurrentActive({ignore:o}),this.setActive(o))}scrollTo(t){const o="function"==typeof this.options.smoothScrollBehavior&&this.options.smoothScrollBehavior;o?o(t,this.options.smoothScroll):t.scrollIntoView({...this.options.smoothScroll,behavior:"smooth"})}getMenuItemBySection(t){if(!t)return;const o=t.getAttribute("id");return this.menuList.querySelector(`[${this.options.hrefAttribute}="#${o}"]`)}getSectionInView(){for(let t=0;to&&s<=e)return this.sections[t]}}setActive(t){t.classList.contains(this.options.activeClass)||t.classList.add(this.options.activeClass)}removeCurrentActive({ignore:t}){const{hrefAttribute:o,menuActiveTarget:e,activeClass:s}=this.options,i=`${e}.${s}:not([${o}="${t.getAttribute(o)}"])`;this.menuList.querySelectorAll(i).forEach((t=>t.classList.remove(this.options.activeClass)))}}}},o={};function e(s){var i=o[s];if(void 0!==i)return i.exports;var r=o[s]={exports:{}};return t[s](r,r.exports,e),r.exports}return e.d=(t,o)=>{for(var s in o)e.o(o,s)&&!e.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:o[s]})},e.o=(t,o)=>Object.prototype.hasOwnProperty.call(t,o),e.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e(138)})())); -; -(() => { - // - window.onload = function() { - scrollSpy("toc", { - sectionClass: "h1,h2,h3,h4", - // menuActiveTarget: 'href', - offset: 100 - // scrollContainer: null, - // smooth scroll - // smoothScroll: true, - // smoothScrollBehavior: function(element) { - // console.log('run "smoothScrollBehavior"...', element) - // element.scrollIntoView({ behavior: 'smooth' }) - // } - }); - }; -})(); - -; -// ToC Mobile Menu (Bootstrap 5 Dropdown with ScrollSpy) -const scrollArea = document.getElementById('content'); -const tocBtn = document.getElementById('toc-dropdown-btn'); -scrollArea.addEventListener("activate.bs.scrollspy", function(){ - var currentItem = document.querySelector('.dropdown-menu li > a.active').innerHTML; - tocBtn.innerHTML = currentItem; -}) - -tocBtn.addEventListener('shown.bs.dropdown', event => { - tocBtn.style.borderBottom = 'none' - tocBtn.style.borderRadius = '4px 4px 0 0' - // console.log("dropdown opened"); -}) -tocBtn.addEventListener('hidden.bs.dropdown', event => { - tocBtn.style.borderBottom = '1px solid var(--alert-border-color)' - tocBtn.style.borderRadius = '4px' - // console.log("dropdown closed"); -}); -; -(() => { - var __getOwnPropNames = Object.getOwnPropertyNames; - var __esm = (fn, res) => function __init() { - return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; - }; - var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; - }; - - // ns-hugo-params: - var stdin_default; - var init_stdin = __esm({ - "ns-hugo-params:"() { - stdin_default = { langPath: "http://localhost:1313/docs/js/components/" }; - } - }); - - // - var require_stdin = __commonJS({ - ""(exports, module) { - init_stdin(); - var _self = typeof window !== "undefined" ? window : typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope ? self : {}; - var Prism = function(_self2) { - var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i; - var uniqueId = 0; - var plainTextGrammar = {}; - var _ = { - /** - * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the - * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load - * additional languages or plugins yourself. - * - * By setting this value to `true`, Prism will not automatically highlight all code elements on the page. - * - * You obviously have to change this value before the automatic highlighting started. To do this, you can add an - * empty Prism object into the global scope before loading the Prism script like this: - * - * ```js - * window.Prism = window.Prism || {}; - * Prism.manual = true; - * // add a new + Overview | Federated Computer Enterprise - @@ -25,20 +24,20 @@ - - - - - - + + + + + + - + - + @@ -50,8 +49,9 @@ Federated Core Platform linkFederated Core Platform delivers offerings and servi - - + + + @@ -72,7 +72,8 @@ Federated Core Platform linkFederated Core Platform delivers offerings and servi - + + @@ -95,7 +96,7 @@ Federated Core Platform linkFederated Core Platform delivers offerings and servi
  • - + article Overview @@ -115,7 +116,7 @@ Federated Core Platform linkFederated Core Platform delivers offerings and servi -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -130,47 +131,47 @@ Federated Core Platform linkFederated Core Platform delivers offerings and servi -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -190,17 +191,17 @@ Federated Core Platform linkFederated Core Platform delivers offerings and servi -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -220,22 +221,22 @@ Federated Core Platform linkFederated Core Platform delivers offerings and servi -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -255,7 +256,7 @@ Federated Core Platform linkFederated Core Platform delivers offerings and servi -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -275,12 +276,12 @@ Federated Core Platform linkFederated Core Platform delivers offerings and servi -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -305,22 +306,22 @@ Federated Core Platform linkFederated Core Platform delivers offerings and servi -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -340,22 +341,22 @@ Federated Core Platform linkFederated Core Platform delivers offerings and servi -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -375,12 +376,12 @@ Federated Core Platform linkFederated Core Platform delivers offerings and servi -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -685,10 +686,12 @@ Federated Core Platform linkFederated Core Platform delivers offerings and servi - + + + - + diff --git a/public/docs/partners/index.html b/public/docs/partners/index.html index 0ce802a..8fdb08a 100644 --- a/public/docs/partners/index.html +++ b/public/docs/partners/index.html @@ -14,10 +14,9 @@ - + Partners | Federated Computer Enterprise - @@ -25,17 +24,17 @@ - - - - - - + + + + + + - - + + @@ -46,8 +45,9 @@ - - + + + @@ -68,7 +68,8 @@ - + + @@ -91,7 +92,7 @@
  • - + article Overview @@ -111,7 +112,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -126,52 +127,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • - - - - -
  • Why Open Source Projects Work With Federated
  • +
  • Core Desktop
  • @@ -184,24 +180,24 @@
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • + + + + +
  • Whitelabel
  • @@ -251,7 +252,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -271,12 +272,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -301,22 +302,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -336,22 +337,22 @@ -
  • Operators Networks Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -371,7 +372,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -554,7 +560,7 @@
    - +
    article @@ -562,7 +568,7 @@
    -

    Operators Networks Platforms

    +

    Operators, Networks, Platforms

    @@ -571,7 +577,7 @@
    - +
    article @@ -588,7 +594,7 @@
    - +
    article @@ -605,7 +611,7 @@
    - +
    article @@ -674,10 +680,12 @@ - + + + - + @@ -1057,6 +1065,13 @@ + + + + + + + @@ -1112,8 +1127,8 @@ id: 4 , href: "\/docs\/federated-core-platform\/provisioning\/provisioner\/", title: "Provisioner", - description: "", - content: "" + description: "The “Provisioner” is responsible for setting up, updating/upgrading, and tearing down Cores. It does this in an entirely stateless way communicating with either the aacount management and billing system or the management system. Naturally, there are command-line utilities and an API available to accomplish all functions.\nOrder linkWhen and order comes through the account management and billing system, a manifest is created asking for a Core to be create with the required SaaS titles. This manifest is sent to the Provisioner which then requests a virtual machine (or machines, if the manifest includes load balancing or other extended Core services), then begins to build the Core software from the manifest. You can read more about the minimal build at ", + content: "The “Provisioner” is responsible for setting up, updating/upgrading, and tearing down Cores. It does this in an entirely stateless way communicating with either the aacount management and billing system or the management system. Naturally, there are command-line utilities and an API available to accomplish all functions.\nOrder linkWhen and order comes through the account management and billing system, a manifest is created asking for a Core to be create with the required SaaS titles. This manifest is sent to the Provisioner which then requests a virtual machine (or machines, if the manifest includes load balancing or other extended Core services), then begins to build the Core software from the manifest. You can read more about the minimal build at " } ); index.add( @@ -1121,8 +1136,8 @@ id: 5 , href: "\/docs\/federated-core-platform\/provisioning\/core-server\/", title: "Core Server", - description: "", - content: "" + description: "Federated maintains its own Linux distribution for the specific purpose of control of the types and versions of software used in virtual machine. This descrease the surface area for attacks, increased maintainability for the Cores built on top, and assures our systems work on X64 and Arm (example: Ampere) systems as well as fully supporting IPv4 and IPv6 for cloud deployment.\nCore Server is based on OpenMandriva a Linux distribution lead by Federated Computer’s chief systems engineer. OpenMandriva is base on Fedora, in part.\n", + content: "Federated maintains its own Linux distribution for the specific purpose of control of the types and versions of software used in virtual machine. This descrease the surface area for attacks, increased maintainability for the Cores built on top, and assures our systems work on X64 and Arm (example: Ampere) systems as well as fully supporting IPv4 and IPv6 for cloud deployment.\nCore Server is based on OpenMandriva a Linux distribution lead by Federated Computer’s chief systems engineer. OpenMandriva is base on Fedora, in part.\n" } ); index.add( @@ -1130,8 +1145,8 @@ id: 6 , href: "\/docs\/federated-core-platform\/provisioning\/core-mini\/", title: "Core Mini", - description: "", - content: "" + description: "Core Mini is the minimal install of software on a Core before adding additional SaaS and any scaling services (e.g. load balancing). These are the fundamental services used by ever other SaaS application.\nTraefik linkFirewall and network management.\nPowerDNS linkDomain name service.\nAuthelia linkOIDC authentication provider.\nMail Services linkSMTP and IMAP services.\nPostgresql linkDatabase engine for SaaS services requiring Postgresql.\nMariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely be obsolete in the coming months.\n", + content: "Core Mini is the minimal install of software on a Core before adding additional SaaS and any scaling services (e.g. load balancing). These are the fundamental services used by ever other SaaS application.\nTraefik linkFirewall and network management.\nPowerDNS linkDomain name service.\nAuthelia linkOIDC authentication provider.\nMail Services linkSMTP and IMAP services.\nPostgresql linkDatabase engine for SaaS services requiring Postgresql.\nMariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely be obsolete in the coming months.\nAutodiscovery linkService for providing autodiscovery for SaaS service that use autodiscovery services. Example: email and calendar client configuration.\nFederated Monitors linkSoftare for communicating with Federated management systems.\n" } ); index.add( @@ -1139,8 +1154,8 @@ id: 7 , href: "\/docs\/federated-core-platform\/provisioning\/unified-storage\/", title: "Unified Storage", - description: "", - content: "" + description: "Every SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage\nEvery SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage.\n", + content: "Every SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage\nEvery SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage.\n" } ); index.add( @@ -1148,8 +1163,8 @@ id: 8 , href: "\/docs\/federated-core-platform\/provisioning\/unified-messaging\/", title: "Unified Messaging", - description: "", - content: "" + description: "Federated Core includes three systems for messaging.\nEmail linkThere is a full-featured IMAP/SMTP service available for any needed notifications to users.\nContainer-to-Container linkThere is a service for container-to-container communication allowing for complete workflow creation between SaaS applications when the native APIs are not enough.\nOptional: Matrix linkIf the Matrix service is loaded, you can use it like a message-bus for application notification to users.\n", + content: "Federated Core includes three systems for messaging.\nEmail linkThere is a full-featured IMAP/SMTP service available for any needed notifications to users.\nContainer-to-Container linkThere is a service for container-to-container communication allowing for complete workflow creation between SaaS applications when the native APIs are not enough.\nOptional: Matrix linkIf the Matrix service is loaded, you can use it like a message-bus for application notification to users.\n" } ); index.add( @@ -1157,8 +1172,8 @@ id: 9 , href: "\/docs\/federated-core-platform\/provisioning\/authentication\/", title: "Authentication", - description: "", - content: "" + description: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\n", + content: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\nLDAP services can be exposed to network outside of Core to be used by other systems that use LDAP. And example would be a collection of Windows, MacOS, Linux desktop computers where you want users to log in to this machines using their Core credentials from LDAP. You could also use Core LDAP for other software systems where you want to use a central user repository for access control such as virtual desktop environments.\nCore LDAP support users and groups. For example, you can delegate administrative access controls to certain users in Nextcloud using LDAP.\nLDAP is managed through the Federated Core app “Panel”.\nOIDC linkSingle-sign on is provided in Federated Core Platform by Authelia. This allows, for example, a customer to log in to one open source SaaS application in a browser and to automatically log in to other Core applications in the same browser. It also allows the user to log out of all applications, in the same way.\nFederated Core applications default to OIDC authentication when the application supports it. Most do. Some applications only support OIDC with a premium upgrade (also supported), but a few don’t (yet) support OIDC or only support authentication using OIDC providers such as Google, etc. Federated plans to provide work arounds for all applications to use OIDC and have done this successfully for some (eg. cal.com).\n" } ); index.add( @@ -1166,8 +1181,8 @@ id: 10 , href: "\/docs\/federated-core-platform\/provisioning\/dashboard\/", title: "Dashboard", - description: "", - content: "" + description: "Federated Dashboard is a simple launcher for users. It shows the applications available, a link to helpful documentation, and a note about user management. There are significant improvements planned for Dashboard in the coming months as it transitions to Federated ", + content: "Federated Dashboard is a simple launcher for users. It shows the applications available, a link to helpful documentation, and a note about user management. There are significant improvements planned for Dashboard in the coming months as it transitions to Federated " } ); index.add( @@ -1175,15 +1190,15 @@ id: 11 , href: "\/docs\/federated-core-platform\/provisioning\/computer\/", title: "Computer", - description: "", - content: "" + description: "Federated “Computer” is a new application coming in Fall, 2025 delivering a fully customizable front-end experience for Core users. It is a bookmarking application extended to support reminders, folders for watching applications, documents, events, the ability to pick up AI workloads and customizations, and more. Federated “Computer” is intended to be fully open-sourced, will work with other SaaS applications that support URLs, and will work natively on desktops, tablets, and mobile devices.\n", + content: "Federated “Computer” is a new application coming in Fall, 2025 delivering a fully customizable front-end experience for Core users. It is a bookmarking application extended to support reminders, folders for watching applications, documents, events, the ability to pick up AI workloads and customizations, and more. Federated “Computer” is intended to be fully open-sourced, will work with other SaaS applications that support URLs, and will work natively on desktops, tablets, and mobile devices.\n" } ); index.add( { id: 12 , - href: "\/docs\/federated-core-platform\/maintenance\/", - title: "Maintenance", + href: "\/docs\/federated-core-platform\/management\/", + title: "Management", description: "", content: "" } @@ -1191,28 +1206,28 @@ index.add( { id: 13 , - href: "\/docs\/federated-core-platform\/maintenance\/core-scanner\/", + href: "\/docs\/federated-core-platform\/management\/core-scanner\/", title: "Core Scanner", - description: "", - content: "" + description: "Core Scanner is a utility to examine and manage each Core on a given installation of Federated Core Platform. It allows a customer service person to examine the Core, look at all the configuration files, see any anomalies in the files, track usage of resources (CPU, RAM, storage, network), and perform tightly managed actions on the Core to take remedial steps as needed.\nEach installation of Core Scanner includes user and group priveleges so that the owner of the Federated Core Platform can look at all Cores running, but also partners can examine and manage the Cores of their customers. For example, a managed service provider may have a number of Cores for which they will want to be able to provide monitor and fix service3. Core Scanner allows them to see those Cores, only.\n", + content: "Core Scanner is a utility to examine and manage each Core on a given installation of Federated Core Platform. It allows a customer service person to examine the Core, look at all the configuration files, see any anomalies in the files, track usage of resources (CPU, RAM, storage, network), and perform tightly managed actions on the Core to take remedial steps as needed.\nEach installation of Core Scanner includes user and group priveleges so that the owner of the Federated Core Platform can look at all Cores running, but also partners can examine and manage the Cores of their customers. For example, a managed service provider may have a number of Cores for which they will want to be able to provide monitor and fix service3. Core Scanner allows them to see those Cores, only.\nCore Scanner provides the ability to “take action” on a Core with a large library of pre-defined “actions” for each Core depending on the applications installed and the reality of the Core at the time of inspection. If a Core needs more storage, for example, “actions” are brought forward suggesting remedial action to the support person. There are also actions available to compare a given Core to normative Cores.\nCore Scanner is supported by the “machine learning” functions in the " } ); index.add( { id: 14 , - href: "\/docs\/federated-core-platform\/maintenance\/update-and-upgrade\/", + href: "\/docs\/federated-core-platform\/management\/update-and-upgrade\/", title: "Update and Upgrade", - description: "", - content: "" + description: "Each Federated Core Platform installation has a Gitea respository where the software (OS, utilities, platform, open source SaaS) for the entire system is tracked. The operator of each installation is able to package those updates into regular upgrades pushed out to some/all Cores on the system, push them out individually for testing to some Cores, or schedule updates for a given list of Cores.\nSince the nature of the Federated Core Platform is delivering open source SaaS to customers, there needs to be a testing protocol set up to ensure updates are in fact needed/wanted. Federated Computer does this centrally, so operators using Federated Core Platform can know the software will “work”. However, there may be additional concerns with respect to security, other customizations that need to be tested, etc.\n", + content: "Each Federated Core Platform installation has a Gitea respository where the software (OS, utilities, platform, open source SaaS) for the entire system is tracked. The operator of each installation is able to package those updates into regular upgrades pushed out to some/all Cores on the system, push them out individually for testing to some Cores, or schedule updates for a given list of Cores.\nSince the nature of the Federated Core Platform is delivering open source SaaS to customers, there needs to be a testing protocol set up to ensure updates are in fact needed/wanted. Federated Computer does this centrally, so operators using Federated Core Platform can know the software will “work”. However, there may be additional concerns with respect to security, other customizations that need to be tested, etc.\nWhile Federated Core Platform draws much of the software from DockerHub, there are container images maintained by Federated Computer and, over time, more of the container images will come from Federated Computer rather than DockerHub. The principle reason for this is to add an additional step for quality and security.\n" } ); index.add( { id: 15 , - href: "\/docs\/federated-core-platform\/maintenance\/monitor-and-fix\/", + href: "\/docs\/federated-core-platform\/management\/monitor-and-fix\/", title: "Monitor and Fix", - description: "", - content: "" + description: "Every Core running on an installation of Federated Core Platform, every application running on every Core, and every service not an application running on every Core, is monitored in real time to ensure it runs, has the system resources needed, and provides customers with the best experience. If there are anomalies detected, alerts are created and can be sent to the local Matrix server, and Federated Monitor and Fix system attempts to solve the problem using patterns and the service definitions in place.\n", + content: "Every Core running on an installation of Federated Core Platform, every application running on every Core, and every service not an application running on every Core, is monitored in real time to ensure it runs, has the system resources needed, and provides customers with the best experience. If there are anomalies detected, alerts are created and can be sent to the local Matrix server, and Federated Monitor and Fix system attempts to solve the problem using patterns and the service definitions in place.\nFor example, if a customer with a 500GB storage limit for their Files service decides to upload 3TB of files, the File service will fail, and Monitor and Fix will attempt to fix the problem by adding for block storage (if that service is available AND the service definition allows that to happen without customer “approval”).\nThe Monitor and Fix system continues to get better and better as we see more patterns and improve the paths to successful amelioration of problems.\n" } ); index.add( @@ -1229,8 +1244,8 @@ id: 17 , href: "\/docs\/federated-core-platform\/customization\/core-workflow-intelligence\/", title: "Core Workflow Intelligence", - description: "", - content: "" + description: "Federated will be delivering in early 2026 an “on premise” solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.\n", + content: "Federated will be delivering in early 2026 an “on premise” solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.\nWe believe these sorts of “software intelligence” are very important for the overall success of customers using Federated Core and are central to the idea that open source is the best means to achieve maximum flexibility and business differentiation from software. Further, we believe AI is uniquely situated to provide real progress in connecting software to software for custom workflows. It need not work in “real time” but in enough time to deliver the right solution to customers reliably.\n" } ); index.add( @@ -1238,8 +1253,8 @@ id: 18 , href: "\/docs\/federated-core-platform\/customization\/adding-software-to-federated-core\/", title: "Adding Software to Federated Core", - description: "", - content: "" + description: "It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\n", + content: "It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\nIn the near future, we plan to provide a portal for projects to package and submit software for inclusion on Federated Core Platform.\n" } ); index.add( @@ -1247,13 +1262,22 @@ id: 19 , href: "\/docs\/federated-core-platform\/customization\/why-open-source-projects-work-with-federated\/", title: "Why Open Source Projects Work With Federated", - description: "", - content: "" + description: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\n", + content: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\nYou can think of an open source SaaS developer as an extension of your Federated Core Platform continually adding value to your overall go-to-market. These developers think in the same way. While their principle concern is the success and completeness of their software, they recognize the value for customers when their software is integrated into a total solution with great user management, unified storage and messaging, and the many other conveniences and services offered by Federated Core Platform.\nAll pricing for software is done outside of Federated Core Platform giving each installation the flexibility to build use cases and go-to-market solutions apart from the technology offerings.\n" } ); index.add( { id: 20 , + href: "\/docs\/federated-core-platform\/customization\/whitelabel\/", + title: "Whitelabel", + description: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n", + content: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n" + } + ); + index.add( + { + id: 21 , href: "\/docs\/federated-core-platform\/billing\/", title: "Billing", description: "", @@ -1262,16 +1286,16 @@ ); index.add( { - id: 21 , + id: 22 , href: "\/docs\/federated-core-platform\/billing\/account-management-and-billing\/", title: "Account Management and Billing", - description: "", - content: "" + description: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n", + content: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n" } ); index.add( { - id: 22 , + id: 23 , href: "\/docs\/federated-core-platform\/services\/", title: "Services", description: "", @@ -1280,38 +1304,29 @@ ); index.add( { - id: 23 , + id: 24 , href: "\/docs\/federated-core-platform\/services\/federated-management\/", title: "Federated Management", - description: "", - content: "" - } - ); - index.add( - { - id: 24 , - href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", - title: "Customer Service and Support", - description: "", - content: "" + description: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\n", + content: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\nManagement to Train linkWe can also, depending on the level of competency of your current team, work to run the Federated Core Platform for you while training your team to take over at a date certain in the future. We have found this to be the most successl approach to training rather that working on the particulars of how to run Federated Core Platform in the abstract.\n" } ); index.add( { id: 25 , - href: "\/docs\/federated-core-platform\/provisioning\/core-desktop\/", - title: "Core Desktop", - description: "", - content: "" + href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", + title: "Customer Service and Support", + description: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\n", + content: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\nChannel Partners (Managed Service Providers) linkWe can also support your channel partners. In our experience, channel partners such as managed service providers are great ways to sell software and services but each requires significant support and explanation to best support their own customers. Federated Computer has extensive operation experience providing this service to partners and we can bring our experience, content, processes to your installation of Federated Core Platform.\nOther Operators linkIt isn’t unusual for Federated Core Platform to be sold to other “operators” who don’t want their own installation. We have done this for fiber companies, universities, and other large enterprises. Federated Computer can support your own go-to-market plans with support, content, and programs designed to find and close big opportunities such as other operators.\n" } ); index.add( { id: 26 , - href: "\/docs\/federated-core-platform\/provisioning\/why-open-source-projects-work-with-federated\/", - title: "Why Open Source Projects Work With Federated", - description: "", - content: "" + href: "\/docs\/federated-core-platform\/provisioning\/core-desktop\/", + title: "Core Desktop", + description: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\n", + content: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\nCore Desktop can also be installed on laptops and other mobile computers so that on-the-go team members can get a computer that “just works” without the requirements for network access.\n" } ); index.add( @@ -1372,9 +1387,9 @@ { id: 33 , href: "\/docs\/partners\/operators-networks-platforms\/", - title: "Operators Networks Platforms", - description: "Text\n", - content: "Text\n" + title: "Operators, Networks, Platforms", + description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( @@ -1382,8 +1397,8 @@ id: 34 , href: "\/docs\/partners\/managed-service-providers\/", title: "Managed Service Provider", - description: "", - content: "" + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( @@ -1391,8 +1406,8 @@ id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1400,8 +1415,8 @@ id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1418,13 +1433,22 @@ id: 38 , href: "\/docs\/about-federated-computer\/federated-company-backgrounder\/", title: "Federated Company Backgrounder", - description: "", - content: "" + description: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\n", + content: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\nOpen Source linkThere’s no reason to use expensive, proprietary, privacy-destroying SaaS software. But in the past, running open-source software required lots of technical knowledge. Federated Computer makes it easy for any business to adopt open-source.\nWe are great stewards of the benefits of open-source. Our company actively contributes both financially and with code to a number of open-source projects offered in Federated Core and Federated Plus including Castopod, Bookstack, Headscale, Matrix, and OpenMandriva. We do all the work for you to ensure open-source projects are integrated, work well together, and provide you with the right value.\nDavid Young linkOur CEO and founder, David Young, has a long history working with impactful startups including Joyent. At Joyent he was responsible for leading the team that invented and patented cloud computing, containers-as-a-service, cloud operating system, infrastructure-as-a-service, node.js, native-web-apps as desktop/mobile apps (what became Electron) and many more fundamental cloud innovations.\nDavid’s companies have been backed by the biggest investors including Dell, Intel; and he has brought ground-breaking solutions to cloud pioneers such as Dell, Telefonica, Singtel, working for important early cloud adopters such as Twitter, Facebook Developer Platform, Linkedin, and many, many others.\n" } ); index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/partners/index.xml b/public/docs/partners/index.xml index 8f7e3bf..32782a0 100644 --- a/public/docs/partners/index.xml +++ b/public/docs/partners/index.xml @@ -2,39 +2,39 @@ Partners on Federated Computer Enterprise - http://localhost:1313/docs/partners/ + http://enterprise.federated.computer/docs/partners/ Recent content in Partners on Federated Computer Enterprise Hugo en-us Tue, 26 Aug 2025 11:12:45 -0600 - + - Operators Networks Platforms - http://localhost:1313/docs/partners/operators-networks-platforms/ + Operators, Networks, Platforms + http://enterprise.federated.computer/docs/partners/operators-networks-platforms/ Mon, 25 Aug 2025 12:38:19 -0600 - http://localhost:1313/docs/partners/operators-networks-platforms/ - <p>Text</p> + http://enterprise.federated.computer/docs/partners/operators-networks-platforms/ + <p>Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.</p> Managed Service Provider - http://localhost:1313/docs/partners/managed-service-providers/ + http://enterprise.federated.computer/docs/partners/managed-service-providers/ Mon, 25 Aug 2025 12:37:54 -0600 - http://localhost:1313/docs/partners/managed-service-providers/ - + http://enterprise.federated.computer/docs/partners/managed-service-providers/ + <p>Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.</p> <p>This leaves MORE money on the table for the managed service provider to provide high-value services.</p> <h3 id="solutions">Solutions <a href="#solutions" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>Federated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.</p> Pro Customers - http://localhost:1313/docs/partners/pro-customers/ + http://enterprise.federated.computer/docs/partners/pro-customers/ Tue, 26 Aug 2025 11:12:45 -0600 - http://localhost:1313/docs/partners/pro-customers/ - + http://enterprise.federated.computer/docs/partners/pro-customers/ + <p>Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are <a href="content/docs/software-catalog/federated-commerce.md">Commerce</a> and <a href="content/docs/software-catalog/federated-omnimedia.md">Omnimedia</a>.</p> <p>It is possible to address &ldquo;pro&rdquo; customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.</p> <p>However, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don&rsquo;t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.</p> On Line Affiliates - http://localhost:1313/docs/partners/on-line-affiliates/ + http://enterprise.federated.computer/docs/partners/on-line-affiliates/ Mon, 25 Aug 2025 12:38:06 -0600 - http://localhost:1313/docs/partners/on-line-affiliates/ - + http://enterprise.federated.computer/docs/partners/on-line-affiliates/ + <p>Outlets with significant communities can use Federated&rsquo;s affilaite programs to earn up to 30% (the number is really dependent on your own installation&rsquo;s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.</p> <p>We have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate&rsquo;s community is sterling.</p> diff --git a/public/docs/partners/managed-service-provider/index.html b/public/docs/partners/managed-service-provider/index.html deleted file mode 100644 index 154aa6c..0000000 --- a/public/docs/partners/managed-service-provider/index.html +++ /dev/null @@ -1,1253 +0,0 @@ - - - - - - - - - - - - - - - - - - - Managed Service Provider | Federated Computer Enterprise - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - -
    - -
    -
    -
    - -
    - - - -
    -
    - - - -
    -
    - - - - - - -
    - -
    - - - -
    -
    - - -
    -
    -
    -
  • - - - to navigate -
  • -
  • - - to select -
  • -
  • - - to close -
  • -
    -
    -
    - - -
    -
    -
    -
    -
    - - - -
    - - -
    -
    - -
    - -
    - -
    -
    On this page
    - -
    - - -
    - -
    -
    -
    - - article - -

    - Managed Service Provider - - DRAFT - -

    -
    - -

    - -
    - - -
    - -
    - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - - © 2025 Federated Computer, Inc. -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/docs/partners/managed-service-providers/index.html b/public/docs/partners/managed-service-providers/index.html index 52da91a..e7e57c1 100644 --- a/public/docs/partners/managed-service-providers/index.html +++ b/public/docs/partners/managed-service-providers/index.html @@ -14,10 +14,9 @@ - + Managed Service Provider | Federated Computer Enterprise - @@ -25,21 +24,21 @@ - - - - - - + + + + + + - + - + - + + + @@ -74,7 +74,8 @@ Solutions linkFederated solutions include Core Scanner for active monitoring and - + + @@ -97,7 +98,7 @@ Solutions linkFederated solutions include Core Scanner for active monitoring and
  • - + article Overview @@ -117,7 +118,7 @@ Solutions linkFederated solutions include Core Scanner for active monitoring and -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -132,47 +133,47 @@ Solutions linkFederated solutions include Core Scanner for active monitoring and -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -192,17 +193,17 @@ Solutions linkFederated solutions include Core Scanner for active monitoring and -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -222,22 +223,22 @@ Solutions linkFederated solutions include Core Scanner for active monitoring and -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -257,7 +258,7 @@ Solutions linkFederated solutions include Core Scanner for active monitoring and -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -277,12 +278,12 @@ Solutions linkFederated solutions include Core Scanner for active monitoring and -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -307,22 +308,22 @@ Solutions linkFederated solutions include Core Scanner for active monitoring and -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -342,22 +343,22 @@ Solutions linkFederated solutions include Core Scanner for active monitoring and -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -377,12 +378,12 @@ Solutions linkFederated solutions include Core Scanner for active monitoring and -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -681,10 +682,12 @@ Solutions linkFederated solutions include Core Scanner for active monitoring and - + + + - + diff --git a/public/docs/partners/on-line-affiliates/index.html b/public/docs/partners/on-line-affiliates/index.html index 6bbdede..dc8372a 100644 --- a/public/docs/partners/on-line-affiliates/index.html +++ b/public/docs/partners/on-line-affiliates/index.html @@ -14,10 +14,9 @@ - + On Line Affiliates | Federated Computer Enterprise - @@ -25,20 +24,20 @@ - - - - - - + + + + + + - + - + @@ -50,8 +49,9 @@ We have found the best affiliates are those that use Federated Core products. Wh - - + + + @@ -72,7 +72,8 @@ We have found the best affiliates are those that use Federated Core products. Wh - + + @@ -95,7 +96,7 @@ We have found the best affiliates are those that use Federated Core products. Wh
  • - + article Overview @@ -115,7 +116,7 @@ We have found the best affiliates are those that use Federated Core products. Wh -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -130,47 +131,47 @@ We have found the best affiliates are those that use Federated Core products. Wh -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -190,17 +191,17 @@ We have found the best affiliates are those that use Federated Core products. Wh -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -220,22 +221,22 @@ We have found the best affiliates are those that use Federated Core products. Wh -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -255,7 +256,7 @@ We have found the best affiliates are those that use Federated Core products. Wh -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -275,12 +276,12 @@ We have found the best affiliates are those that use Federated Core products. Wh -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -305,22 +306,22 @@ We have found the best affiliates are those that use Federated Core products. Wh -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -340,22 +341,22 @@ We have found the best affiliates are those that use Federated Core products. Wh -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -375,12 +376,12 @@ We have found the best affiliates are those that use Federated Core products. Wh -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -654,10 +655,12 @@ We have found the best affiliates are those that use Federated Core products. Wh - + + + - + diff --git a/public/docs/partners/operators-networks-platforms/index.html b/public/docs/partners/operators-networks-platforms/index.html index 7c9375c..05c2066 100644 --- a/public/docs/partners/operators-networks-platforms/index.html +++ b/public/docs/partners/operators-networks-platforms/index.html @@ -14,10 +14,9 @@ - + Operators, Networks, Platforms | Federated Computer Enterprise - @@ -25,19 +24,19 @@ - - - - - - + + + + + + - + - + @@ -48,8 +47,9 @@ - - + + + @@ -70,7 +70,8 @@ - + + @@ -93,7 +94,7 @@
  • - + article Overview @@ -113,7 +114,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -128,47 +129,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -188,17 +189,17 @@ -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -218,22 +219,22 @@ -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -253,7 +254,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -273,12 +274,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -303,22 +304,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -338,22 +339,22 @@ -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -373,7 +374,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -648,10 +654,12 @@ - + + + - + @@ -1031,6 +1039,13 @@ + + + + + + + @@ -1365,8 +1380,8 @@ id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1374,8 +1389,8 @@ id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1399,6 +1414,15 @@ index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/partners/pro-customers/index.html b/public/docs/partners/pro-customers/index.html index a364a12..6e14f5d 100644 --- a/public/docs/partners/pro-customers/index.html +++ b/public/docs/partners/pro-customers/index.html @@ -14,10 +14,9 @@ - + Pro Customers | Federated Computer Enterprise - @@ -25,21 +24,21 @@ - - - - - - + + + + + + - + - + - + + + @@ -74,7 +74,8 @@ However, there will be many opportunities to build out additional collections/bu - + + @@ -97,7 +98,7 @@ However, there will be many opportunities to build out additional collections/bu
  • - + article Overview @@ -117,7 +118,7 @@ However, there will be many opportunities to build out additional collections/bu -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -132,47 +133,47 @@ However, there will be many opportunities to build out additional collections/bu -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -192,17 +193,17 @@ However, there will be many opportunities to build out additional collections/bu -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -222,22 +223,22 @@ However, there will be many opportunities to build out additional collections/bu -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -257,7 +258,7 @@ However, there will be many opportunities to build out additional collections/bu -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -277,12 +278,12 @@ However, there will be many opportunities to build out additional collections/bu -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -307,22 +308,22 @@ However, there will be many opportunities to build out additional collections/bu -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -342,22 +343,22 @@ However, there will be many opportunities to build out additional collections/bu -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -377,12 +378,12 @@ However, there will be many opportunities to build out additional collections/bu -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -657,10 +658,12 @@ However, there will be many opportunities to build out additional collections/bu - + + + - + diff --git a/public/docs/scss/style.css b/public/docs/scss/style.css deleted file mode 100644 index 85aaf67..0000000 --- a/public/docs/scss/style.css +++ /dev/null @@ -1,12049 +0,0 @@ -@charset "UTF-8"; -/* Template Name: Lotus Docs - Author: Colin Wilson - E-mail: colin@aigis.uk - Created: October 2022 - Version: 1.2.0 - File Description: Main CSS file for Lotus Docs -*/ -@font-face { - font-family: 'Material Symbols Outlined'; - font-weight: 400 700; - font-display: block; - font-style: normal; - src: local("Material Symbols Outlined"), local("Material Icons"), local("MaterialIcons-Outlined"), url("../fonts/material-symbols-outlined.woff2") format("woff2"); } - -:root { - --primary: var(--blue); - --primary-50: var(--blue-50); - --primary-100: var(--blue-100); - --primary-200: var(--blue-200); - --primary-300: var(--blue-300); - --primary-400: var(--blue-400); - --primary-800: var(--blue-800); - --primary-hsl: var(--blue-500-hsl); - --primary-50-hsl: var(--blue-50-hsl); - --primary-100-hsl: var(--blue-100-hsl); - --primary-200-hsl: var(--blue-200-hsl); - --primary-300-hsl: var(--blue-300-hsl); - --primary-800-hsl: var(--blue-800-hsl); } - -/*! - * Bootstrap v5.3.3 (https://getbootstrap.com/) - * Copyright 2011-2024 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -:root, -[data-bs-theme="light"] { - --bs-blue: #0d6efd; - --bs-indigo: #6610f2; - --bs-purple: #6f42c1; - --bs-pink: #d63384; - --bs-red: #dc3545; - --bs-orange: #fd7e14; - --bs-yellow: #ffc107; - --bs-green: #198754; - --bs-teal: #20c997; - --bs-cyan: #0dcaf0; - --bs-black: #000; - --bs-white: #fff; - --bs-gray: #6c757d; - --bs-gray-dark: #343a40; - --bs-gray-100: #f8f9fa; - --bs-gray-200: #e9ecef; - --bs-gray-300: #dee2e6; - --bs-gray-400: #ced4da; - --bs-gray-500: #adb5bd; - --bs-gray-600: #6c757d; - --bs-gray-700: #495057; - --bs-gray-800: #343a40; - --bs-gray-900: #212529; - --bs-primary: #0d6efd; - --bs-secondary: #6c757d; - --bs-success: #198754; - --bs-info: #0dcaf0; - --bs-warning: #ffc107; - --bs-danger: #dc3545; - --bs-light: #f8f9fa; - --bs-dark: #212529; - --bs-primary-rgb: 13, 110, 253; - --bs-secondary-rgb: 108, 117, 125; - --bs-success-rgb: 25, 135, 84; - --bs-info-rgb: 13, 202, 240; - --bs-warning-rgb: 255, 193, 7; - --bs-danger-rgb: 220, 53, 69; - --bs-light-rgb: 248, 249, 250; - --bs-dark-rgb: 33, 37, 41; - --bs-primary-text-emphasis: #052c65; - --bs-secondary-text-emphasis: #2b2f32; - --bs-success-text-emphasis: #0a3622; - --bs-info-text-emphasis: #055160; - --bs-warning-text-emphasis: #664d03; - --bs-danger-text-emphasis: #58151c; - --bs-light-text-emphasis: #495057; - --bs-dark-text-emphasis: #495057; - --bs-primary-bg-subtle: #cfe2ff; - --bs-secondary-bg-subtle: #e2e3e5; - --bs-success-bg-subtle: #d1e7dd; - --bs-info-bg-subtle: #cff4fc; - --bs-warning-bg-subtle: #fff3cd; - --bs-danger-bg-subtle: #f8d7da; - --bs-light-bg-subtle: #fcfcfd; - --bs-dark-bg-subtle: #ced4da; - --bs-primary-border-subtle: #9ec5fe; - --bs-secondary-border-subtle: #c4c8cb; - --bs-success-border-subtle: #a3cfbb; - --bs-info-border-subtle: #9eeaf9; - --bs-warning-border-subtle: #ffe69c; - --bs-danger-border-subtle: #f1aeb5; - --bs-light-border-subtle: #e9ecef; - --bs-dark-border-subtle: #adb5bd; - --bs-white-rgb: 255, 255, 255; - --bs-black-rgb: 0, 0, 0; - --bs-font-sans-serif: Inter; - --bs-font-monospace: Fira Code; - --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); - --bs-body-font-family: var(--bs-font-sans-serif); - --bs-body-font-size: 1rem; - --bs-body-font-weight: 400; - --bs-body-line-height: 1.5; - --bs-body-color: #212529; - --bs-body-color-rgb: 33, 37, 41; - --bs-body-bg: #fff; - --bs-body-bg-rgb: 255, 255, 255; - --bs-emphasis-color: #000; - --bs-emphasis-color-rgb: 0, 0, 0; - --bs-secondary-color: rgba(33, 37, 41, 0.75); - --bs-secondary-color-rgb: 33, 37, 41; - --bs-secondary-bg: #e9ecef; - --bs-secondary-bg-rgb: 233, 236, 239; - --bs-tertiary-color: rgba(33, 37, 41, 0.5); - --bs-tertiary-color-rgb: 33, 37, 41; - --bs-tertiary-bg: #f8f9fa; - --bs-tertiary-bg-rgb: 248, 249, 250; - --bs-heading-color: inherit; - --bs-link-color: #0d6efd; - --bs-link-color-rgb: 13, 110, 253; - --bs-link-decoration: underline; - --bs-link-hover-color: #0a58ca; - --bs-link-hover-color-rgb: 10, 88, 202; - --bs-code-color: #d63384; - --bs-highlight-color: #212529; - --bs-highlight-bg: #fff3cd; - --bs-border-width: 1px; - --bs-border-style: solid; - --bs-border-color: #dee2e6; - --bs-border-color-translucent: rgba(0, 0, 0, 0.175); - --bs-border-radius: 0.375rem; - --bs-border-radius-sm: 0.25rem; - --bs-border-radius-lg: 0.5rem; - --bs-border-radius-xl: 1rem; - --bs-border-radius-xxl: 2rem; - --bs-border-radius-2xl: var(--bs-border-radius-xxl); - --bs-border-radius-pill: 50rem; - --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); - --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); - --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); - --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); - --bs-focus-ring-width: 0.25rem; - --bs-focus-ring-opacity: 0.25; - --bs-focus-ring-color: rgba(13, 110, 253, 0.25); - --bs-form-valid-color: #198754; - --bs-form-valid-border-color: #198754; - --bs-form-invalid-color: #dc3545; - --bs-form-invalid-border-color: #dc3545; } - -[data-bs-theme="dark"] { - color-scheme: dark; - --bs-body-color: #dee2e6; - --bs-body-color-rgb: 222, 226, 230; - --bs-body-bg: #212529; - --bs-body-bg-rgb: 33, 37, 41; - --bs-emphasis-color: #fff; - --bs-emphasis-color-rgb: 255, 255, 255; - --bs-secondary-color: rgba(222, 226, 230, 0.75); - --bs-secondary-color-rgb: 222, 226, 230; - --bs-secondary-bg: #343a40; - --bs-secondary-bg-rgb: 52, 58, 64; - --bs-tertiary-color: rgba(222, 226, 230, 0.5); - --bs-tertiary-color-rgb: 222, 226, 230; - --bs-tertiary-bg: #2b3035; - --bs-tertiary-bg-rgb: 43, 48, 53; - --bs-primary-text-emphasis: #6ea8fe; - --bs-secondary-text-emphasis: #a7acb1; - --bs-success-text-emphasis: #75b798; - --bs-info-text-emphasis: #6edff6; - --bs-warning-text-emphasis: #ffda6a; - --bs-danger-text-emphasis: #ea868f; - --bs-light-text-emphasis: #f8f9fa; - --bs-dark-text-emphasis: #dee2e6; - --bs-primary-bg-subtle: #031633; - --bs-secondary-bg-subtle: #161719; - --bs-success-bg-subtle: #051b11; - --bs-info-bg-subtle: #032830; - --bs-warning-bg-subtle: #332701; - --bs-danger-bg-subtle: #2c0b0e; - --bs-light-bg-subtle: #343a40; - --bs-dark-bg-subtle: #1a1d20; - --bs-primary-border-subtle: #084298; - --bs-secondary-border-subtle: #41464b; - --bs-success-border-subtle: #0f5132; - --bs-info-border-subtle: #087990; - --bs-warning-border-subtle: #997404; - --bs-danger-border-subtle: #842029; - --bs-light-border-subtle: #495057; - --bs-dark-border-subtle: #343a40; - --bs-heading-color: inherit; - --bs-link-color: #6ea8fe; - --bs-link-hover-color: #8bb9fe; - --bs-link-color-rgb: 110, 168, 254; - --bs-link-hover-color-rgb: 139, 185, 254; - --bs-code-color: #e685b5; - --bs-highlight-color: #dee2e6; - --bs-highlight-bg: #664d03; - --bs-border-color: #495057; - --bs-border-color-translucent: rgba(255, 255, 255, 0.15); - --bs-form-valid-color: #75b798; - --bs-form-valid-border-color: #75b798; - --bs-form-invalid-color: #ea868f; - --bs-form-invalid-border-color: #ea868f; } - -*, -*::before, -*::after { - box-sizing: border-box; } - -@media (prefers-reduced-motion: no-preference) { - :root { - scroll-behavior: smooth; } } - -body { - margin: 0; - font-family: var(--bs-body-font-family); - font-size: var(--bs-body-font-size); - font-weight: var(--bs-body-font-weight); - line-height: var(--bs-body-line-height); - color: var(--bs-body-color); - text-align: var(--bs-body-text-align); - background-color: var(--bs-body-bg); - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } - -hr { - margin: 1rem 0; - color: inherit; - border: 0; - border-top: var(--bs-border-width) solid; - opacity: 0.25; } - -h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 { - margin-top: 0; - margin-bottom: 0.5rem; - font-weight: 500; - line-height: 1.2; - color: var(--bs-heading-color); } - -h1, .h1 { - font-size: calc(1.375rem + 1.5vw); } - @media (min-width: 1200px) { - h1, .h1 { - font-size: 2.5rem; } } -h2, .h2 { - font-size: calc(1.325rem + 0.9vw); } - @media (min-width: 1200px) { - h2, .h2 { - font-size: 2rem; } } -h3, .h3 { - font-size: calc(1.3rem + 0.6vw); } - @media (min-width: 1200px) { - h3, .h3 { - font-size: 1.75rem; } } -h4, .h4 { - font-size: calc(1.275rem + 0.3vw); } - @media (min-width: 1200px) { - h4, .h4 { - font-size: 1.5rem; } } -h5, .h5 { - font-size: 1.25rem; } - -h6, .h6 { - font-size: 1rem; } - -p { - margin-top: 0; - margin-bottom: 1rem; } - -abbr[title] { - text-decoration: underline dotted; - cursor: help; - text-decoration-skip-ink: none; } - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; } - -ol, -ul { - padding-left: 2rem; } - -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1rem; } - -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; } - -dt { - font-weight: 700; } - -dd { - margin-bottom: .5rem; - margin-left: 0; } - -blockquote { - margin: 0 0 1rem; } - -b, -strong { - font-weight: bolder; } - -small, .small { - font-size: 0.875em; } - -mark, .mark { - padding: 0.1875em; - color: var(--bs-highlight-color); - background-color: var(--bs-highlight-bg); } - -sub, -sup { - position: relative; - font-size: 0.75em; - line-height: 0; - vertical-align: baseline; } - -sub { - bottom: -.25em; } - -sup { - top: -.5em; } - -a { - color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); - text-decoration: underline; } - a:hover { - --bs-link-color-rgb: var(--bs-link-hover-color-rgb); } - -a:not([href]):not([class]), a:not([href]):not([class]):hover { - color: inherit; - text-decoration: none; } - -pre, -code, -kbd, -samp { - font-family: var(--bs-font-monospace); - font-size: 1em; } - -pre { - display: block; - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; - font-size: 0.875em; } - pre code { - font-size: inherit; - color: inherit; - word-break: normal; } - -code { - font-size: 0.875em; - color: var(--bs-code-color); - word-wrap: break-word; } - a > code { - color: inherit; } - -kbd { - padding: 0.1875rem 0.375rem; - font-size: 0.875em; - color: var(--bs-body-bg); - background-color: var(--bs-body-color); - border-radius: 0.25rem; } - kbd kbd { - padding: 0; - font-size: 1em; } - -figure { - margin: 0 0 1rem; } - -img, -svg { - vertical-align: middle; } - -table { - caption-side: bottom; - border-collapse: collapse; } - -caption { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - color: var(--bs-secondary-color); - text-align: left; } - -th { - text-align: inherit; - text-align: -webkit-match-parent; } - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; } - -label { - display: inline-block; } - -button { - border-radius: 0; } - -button:focus:not(:focus-visible) { - outline: 0; } - -input, -button, -select, -optgroup, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; } - -button, -select { - text-transform: none; } - -[role="button"] { - cursor: pointer; } - -select { - word-wrap: normal; } - select:disabled { - opacity: 1; } - -[list]:not([type="date"]):not([type="datetime-local"]):not([type="month"]):not([type="week"]):not([type="time"])::-webkit-calendar-picker-indicator { - display: none !important; } - -button, -[type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; } - button:not(:disabled), - [type="button"]:not(:disabled), - [type="reset"]:not(:disabled), - [type="submit"]:not(:disabled) { - cursor: pointer; } - -::-moz-focus-inner { - padding: 0; - border-style: none; } - -textarea { - resize: vertical; } - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; } - -legend { - float: left; - width: 100%; - padding: 0; - margin-bottom: 0.5rem; - font-size: calc(1.275rem + 0.3vw); - line-height: inherit; } - @media (min-width: 1200px) { - legend { - font-size: 1.5rem; } } - legend + * { - clear: left; } - -::-webkit-datetime-edit-fields-wrapper, -::-webkit-datetime-edit-text, -::-webkit-datetime-edit-minute, -::-webkit-datetime-edit-hour-field, -::-webkit-datetime-edit-day-field, -::-webkit-datetime-edit-month-field, -::-webkit-datetime-edit-year-field { - padding: 0; } - -::-webkit-inner-spin-button { - height: auto; } - -[type="search"] { - -webkit-appearance: textfield; - outline-offset: -2px; } - -/* rtl:raw: -[type="tel"], -[type="url"], -[type="email"], -[type="number"] { - direction: ltr; -} -*/ -::-webkit-search-decoration { - -webkit-appearance: none; } - -::-webkit-color-swatch-wrapper { - padding: 0; } - -::file-selector-button { - font: inherit; - -webkit-appearance: button; } - -output { - display: inline-block; } - -iframe { - border: 0; } - -summary { - display: list-item; - cursor: pointer; } - -progress { - vertical-align: baseline; } - -[hidden] { - display: none !important; } - -.lead { - font-size: 1.25rem; - font-weight: 300; } - -.display-1 { - font-size: calc(1.625rem + 4.5vw); - font-weight: 300; - line-height: 1.2; } - @media (min-width: 1200px) { - .display-1 { - font-size: 5rem; } } -.display-2 { - font-size: calc(1.575rem + 3.9vw); - font-weight: 300; - line-height: 1.2; } - @media (min-width: 1200px) { - .display-2 { - font-size: 4.5rem; } } -.display-3 { - font-size: calc(1.525rem + 3.3vw); - font-weight: 300; - line-height: 1.2; } - @media (min-width: 1200px) { - .display-3 { - font-size: 4rem; } } -.display-4 { - font-size: calc(1.475rem + 2.7vw); - font-weight: 300; - line-height: 1.2; } - @media (min-width: 1200px) { - .display-4 { - font-size: 3.5rem; } } -.display-5 { - font-size: calc(1.425rem + 2.1vw); - font-weight: 300; - line-height: 1.2; } - @media (min-width: 1200px) { - .display-5 { - font-size: 3rem; } } -.display-6 { - font-size: calc(1.375rem + 1.5vw); - font-weight: 300; - line-height: 1.2; } - @media (min-width: 1200px) { - .display-6 { - font-size: 2.5rem; } } -.list-unstyled { - padding-left: 0; - list-style: none; } - -.list-inline { - padding-left: 0; - list-style: none; } - -.list-inline-item { - display: inline-block; } - .list-inline-item:not(:last-child) { - margin-right: 0.5rem; } - -.initialism { - font-size: 0.875em; - text-transform: uppercase; } - -.blockquote { - margin-bottom: 1rem; - font-size: 1.25rem; } - .blockquote > :last-child { - margin-bottom: 0; } - -.blockquote-footer { - margin-top: -1rem; - margin-bottom: 1rem; - font-size: 0.875em; - color: #6c757d; } - .blockquote-footer::before { - content: "\2014\00A0"; } - -.img-fluid { - max-width: 100%; - height: auto; } - -.img-thumbnail { - padding: 0.25rem; - background-color: var(--bs-body-bg); - border: var(--bs-border-width) solid var(--bs-border-color); - border-radius: var(--bs-border-radius); - max-width: 100%; - height: auto; } - -.figure { - display: inline-block; } - -.figure-img { - margin-bottom: 0.5rem; - line-height: 1; } - -.figure-caption { - font-size: 0.875em; - color: var(--bs-secondary-color); } - -.container, -.container-fluid, -.container-xxl, -.container-xl, -.container-lg, -.container-md, -.container-sm { - --bs-gutter-x: 1.5rem; - --bs-gutter-y: 0; - width: 100%; - padding-right: calc(var(--bs-gutter-x) * .5); - padding-left: calc(var(--bs-gutter-x) * .5); - margin-right: auto; - margin-left: auto; } - -@media (min-width: 576px) { - .container-sm, .container { - max-width: 540px; } } - -@media (min-width: 768px) { - .container-md, .container-sm, .container { - max-width: 720px; } } - -@media (min-width: 992px) { - .container-lg, .container-md, .container-sm, .container { - max-width: 960px; } } - -@media (min-width: 1200px) { - .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1140px; } } - -@media (min-width: 1400px) { - .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1320px; } } - -:root { - --bs-breakpoint-xs: 0; - --bs-breakpoint-sm: 576px; - --bs-breakpoint-md: 768px; - --bs-breakpoint-lg: 992px; - --bs-breakpoint-xl: 1200px; - --bs-breakpoint-xxl: 1400px; } - -.row { - --bs-gutter-x: 1.5rem; - --bs-gutter-y: 0; - display: flex; - flex-wrap: wrap; - margin-top: calc(-1 * var(--bs-gutter-y)); - margin-right: calc(-.5 * var(--bs-gutter-x)); - margin-left: calc(-.5 * var(--bs-gutter-x)); } - .row > * { - flex-shrink: 0; - width: 100%; - max-width: 100%; - padding-right: calc(var(--bs-gutter-x) * .5); - padding-left: calc(var(--bs-gutter-x) * .5); - margin-top: var(--bs-gutter-y); } - -.col { - flex: 1 0 0%; } - -.row-cols-auto > * { - flex: 0 0 auto; - width: auto; } - -.row-cols-1 > * { - flex: 0 0 auto; - width: 100%; } - -.row-cols-2 > * { - flex: 0 0 auto; - width: 50%; } - -.row-cols-3 > * { - flex: 0 0 auto; - width: 33.33333333%; } - -.row-cols-4 > * { - flex: 0 0 auto; - width: 25%; } - -.row-cols-5 > * { - flex: 0 0 auto; - width: 20%; } - -.row-cols-6 > * { - flex: 0 0 auto; - width: 16.66666667%; } - -.col-auto { - flex: 0 0 auto; - width: auto; } - -.col-1 { - flex: 0 0 auto; - width: 8.33333333%; } - -.col-2 { - flex: 0 0 auto; - width: 16.66666667%; } - -.col-3 { - flex: 0 0 auto; - width: 25%; } - -.col-4 { - flex: 0 0 auto; - width: 33.33333333%; } - -.col-5 { - flex: 0 0 auto; - width: 41.66666667%; } - -.col-6 { - flex: 0 0 auto; - width: 50%; } - -.col-7 { - flex: 0 0 auto; - width: 58.33333333%; } - -.col-8 { - flex: 0 0 auto; - width: 66.66666667%; } - -.col-9 { - flex: 0 0 auto; - width: 75%; } - -.col-10 { - flex: 0 0 auto; - width: 83.33333333%; } - -.col-11 { - flex: 0 0 auto; - width: 91.66666667%; } - -.col-12 { - flex: 0 0 auto; - width: 100%; } - -.offset-1 { - margin-left: 8.33333333%; } - -.offset-2 { - margin-left: 16.66666667%; } - -.offset-3 { - margin-left: 25%; } - -.offset-4 { - margin-left: 33.33333333%; } - -.offset-5 { - margin-left: 41.66666667%; } - -.offset-6 { - margin-left: 50%; } - -.offset-7 { - margin-left: 58.33333333%; } - -.offset-8 { - margin-left: 66.66666667%; } - -.offset-9 { - margin-left: 75%; } - -.offset-10 { - margin-left: 83.33333333%; } - -.offset-11 { - margin-left: 91.66666667%; } - -.g-0, -.gx-0 { - --bs-gutter-x: 0; } - -.g-0, -.gy-0 { - --bs-gutter-y: 0; } - -.g-1, -.gx-1 { - --bs-gutter-x: 0.25rem; } - -.g-1, -.gy-1 { - --bs-gutter-y: 0.25rem; } - -.g-2, -.gx-2 { - --bs-gutter-x: 0.5rem; } - -.g-2, -.gy-2 { - --bs-gutter-y: 0.5rem; } - -.g-3, -.gx-3 { - --bs-gutter-x: 1rem; } - -.g-3, -.gy-3 { - --bs-gutter-y: 1rem; } - -.g-4, -.gx-4 { - --bs-gutter-x: 1.5rem; } - -.g-4, -.gy-4 { - --bs-gutter-y: 1.5rem; } - -.g-5, -.gx-5 { - --bs-gutter-x: 3rem; } - -.g-5, -.gy-5 { - --bs-gutter-y: 3rem; } - -@media (min-width: 576px) { - .col-sm { - flex: 1 0 0%; } - .row-cols-sm-auto > * { - flex: 0 0 auto; - width: auto; } - .row-cols-sm-1 > * { - flex: 0 0 auto; - width: 100%; } - .row-cols-sm-2 > * { - flex: 0 0 auto; - width: 50%; } - .row-cols-sm-3 > * { - flex: 0 0 auto; - width: 33.33333333%; } - .row-cols-sm-4 > * { - flex: 0 0 auto; - width: 25%; } - .row-cols-sm-5 > * { - flex: 0 0 auto; - width: 20%; } - .row-cols-sm-6 > * { - flex: 0 0 auto; - width: 16.66666667%; } - .col-sm-auto { - flex: 0 0 auto; - width: auto; } - .col-sm-1 { - flex: 0 0 auto; - width: 8.33333333%; } - .col-sm-2 { - flex: 0 0 auto; - width: 16.66666667%; } - .col-sm-3 { - flex: 0 0 auto; - width: 25%; } - .col-sm-4 { - flex: 0 0 auto; - width: 33.33333333%; } - .col-sm-5 { - flex: 0 0 auto; - width: 41.66666667%; } - .col-sm-6 { - flex: 0 0 auto; - width: 50%; } - .col-sm-7 { - flex: 0 0 auto; - width: 58.33333333%; } - .col-sm-8 { - flex: 0 0 auto; - width: 66.66666667%; } - .col-sm-9 { - flex: 0 0 auto; - width: 75%; } - .col-sm-10 { - flex: 0 0 auto; - width: 83.33333333%; } - .col-sm-11 { - flex: 0 0 auto; - width: 91.66666667%; } - .col-sm-12 { - flex: 0 0 auto; - width: 100%; } - .offset-sm-0 { - margin-left: 0; } - .offset-sm-1 { - margin-left: 8.33333333%; } - .offset-sm-2 { - margin-left: 16.66666667%; } - .offset-sm-3 { - margin-left: 25%; } - .offset-sm-4 { - margin-left: 33.33333333%; } - .offset-sm-5 { - margin-left: 41.66666667%; } - .offset-sm-6 { - margin-left: 50%; } - .offset-sm-7 { - margin-left: 58.33333333%; } - .offset-sm-8 { - margin-left: 66.66666667%; } - .offset-sm-9 { - margin-left: 75%; } - .offset-sm-10 { - margin-left: 83.33333333%; } - .offset-sm-11 { - margin-left: 91.66666667%; } - .g-sm-0, - .gx-sm-0 { - --bs-gutter-x: 0; } - .g-sm-0, - .gy-sm-0 { - --bs-gutter-y: 0; } - .g-sm-1, - .gx-sm-1 { - --bs-gutter-x: 0.25rem; } - .g-sm-1, - .gy-sm-1 { - --bs-gutter-y: 0.25rem; } - .g-sm-2, - .gx-sm-2 { - --bs-gutter-x: 0.5rem; } - .g-sm-2, - .gy-sm-2 { - --bs-gutter-y: 0.5rem; } - .g-sm-3, - .gx-sm-3 { - --bs-gutter-x: 1rem; } - .g-sm-3, - .gy-sm-3 { - --bs-gutter-y: 1rem; } - .g-sm-4, - .gx-sm-4 { - --bs-gutter-x: 1.5rem; } - .g-sm-4, - .gy-sm-4 { - --bs-gutter-y: 1.5rem; } - .g-sm-5, - .gx-sm-5 { - --bs-gutter-x: 3rem; } - .g-sm-5, - .gy-sm-5 { - --bs-gutter-y: 3rem; } } - -@media (min-width: 768px) { - .col-md { - flex: 1 0 0%; } - .row-cols-md-auto > * { - flex: 0 0 auto; - width: auto; } - .row-cols-md-1 > * { - flex: 0 0 auto; - width: 100%; } - .row-cols-md-2 > * { - flex: 0 0 auto; - width: 50%; } - .row-cols-md-3 > * { - flex: 0 0 auto; - width: 33.33333333%; } - .row-cols-md-4 > * { - flex: 0 0 auto; - width: 25%; } - .row-cols-md-5 > * { - flex: 0 0 auto; - width: 20%; } - .row-cols-md-6 > * { - flex: 0 0 auto; - width: 16.66666667%; } - .col-md-auto { - flex: 0 0 auto; - width: auto; } - .col-md-1 { - flex: 0 0 auto; - width: 8.33333333%; } - .col-md-2 { - flex: 0 0 auto; - width: 16.66666667%; } - .col-md-3 { - flex: 0 0 auto; - width: 25%; } - .col-md-4 { - flex: 0 0 auto; - width: 33.33333333%; } - .col-md-5 { - flex: 0 0 auto; - width: 41.66666667%; } - .col-md-6 { - flex: 0 0 auto; - width: 50%; } - .col-md-7 { - flex: 0 0 auto; - width: 58.33333333%; } - .col-md-8 { - flex: 0 0 auto; - width: 66.66666667%; } - .col-md-9 { - flex: 0 0 auto; - width: 75%; } - .col-md-10 { - flex: 0 0 auto; - width: 83.33333333%; } - .col-md-11 { - flex: 0 0 auto; - width: 91.66666667%; } - .col-md-12 { - flex: 0 0 auto; - width: 100%; } - .offset-md-0 { - margin-left: 0; } - .offset-md-1 { - margin-left: 8.33333333%; } - .offset-md-2 { - margin-left: 16.66666667%; } - .offset-md-3 { - margin-left: 25%; } - .offset-md-4 { - margin-left: 33.33333333%; } - .offset-md-5 { - margin-left: 41.66666667%; } - .offset-md-6 { - margin-left: 50%; } - .offset-md-7 { - margin-left: 58.33333333%; } - .offset-md-8 { - margin-left: 66.66666667%; } - .offset-md-9 { - margin-left: 75%; } - .offset-md-10 { - margin-left: 83.33333333%; } - .offset-md-11 { - margin-left: 91.66666667%; } - .g-md-0, - .gx-md-0 { - --bs-gutter-x: 0; } - .g-md-0, - .gy-md-0 { - --bs-gutter-y: 0; } - .g-md-1, - .gx-md-1 { - --bs-gutter-x: 0.25rem; } - .g-md-1, - .gy-md-1 { - --bs-gutter-y: 0.25rem; } - .g-md-2, - .gx-md-2 { - --bs-gutter-x: 0.5rem; } - .g-md-2, - .gy-md-2 { - --bs-gutter-y: 0.5rem; } - .g-md-3, - .gx-md-3 { - --bs-gutter-x: 1rem; } - .g-md-3, - .gy-md-3 { - --bs-gutter-y: 1rem; } - .g-md-4, - .gx-md-4 { - --bs-gutter-x: 1.5rem; } - .g-md-4, - .gy-md-4 { - --bs-gutter-y: 1.5rem; } - .g-md-5, - .gx-md-5 { - --bs-gutter-x: 3rem; } - .g-md-5, - .gy-md-5 { - --bs-gutter-y: 3rem; } } - -@media (min-width: 992px) { - .col-lg { - flex: 1 0 0%; } - .row-cols-lg-auto > * { - flex: 0 0 auto; - width: auto; } - .row-cols-lg-1 > * { - flex: 0 0 auto; - width: 100%; } - .row-cols-lg-2 > * { - flex: 0 0 auto; - width: 50%; } - .row-cols-lg-3 > * { - flex: 0 0 auto; - width: 33.33333333%; } - .row-cols-lg-4 > * { - flex: 0 0 auto; - width: 25%; } - .row-cols-lg-5 > * { - flex: 0 0 auto; - width: 20%; } - .row-cols-lg-6 > * { - flex: 0 0 auto; - width: 16.66666667%; } - .col-lg-auto { - flex: 0 0 auto; - width: auto; } - .col-lg-1 { - flex: 0 0 auto; - width: 8.33333333%; } - .col-lg-2 { - flex: 0 0 auto; - width: 16.66666667%; } - .col-lg-3 { - flex: 0 0 auto; - width: 25%; } - .col-lg-4 { - flex: 0 0 auto; - width: 33.33333333%; } - .col-lg-5 { - flex: 0 0 auto; - width: 41.66666667%; } - .col-lg-6 { - flex: 0 0 auto; - width: 50%; } - .col-lg-7 { - flex: 0 0 auto; - width: 58.33333333%; } - .col-lg-8 { - flex: 0 0 auto; - width: 66.66666667%; } - .col-lg-9 { - flex: 0 0 auto; - width: 75%; } - .col-lg-10 { - flex: 0 0 auto; - width: 83.33333333%; } - .col-lg-11 { - flex: 0 0 auto; - width: 91.66666667%; } - .col-lg-12 { - flex: 0 0 auto; - width: 100%; } - .offset-lg-0 { - margin-left: 0; } - .offset-lg-1 { - margin-left: 8.33333333%; } - .offset-lg-2 { - margin-left: 16.66666667%; } - .offset-lg-3 { - margin-left: 25%; } - .offset-lg-4 { - margin-left: 33.33333333%; } - .offset-lg-5 { - margin-left: 41.66666667%; } - .offset-lg-6 { - margin-left: 50%; } - .offset-lg-7 { - margin-left: 58.33333333%; } - .offset-lg-8 { - margin-left: 66.66666667%; } - .offset-lg-9 { - margin-left: 75%; } - .offset-lg-10 { - margin-left: 83.33333333%; } - .offset-lg-11 { - margin-left: 91.66666667%; } - .g-lg-0, - .gx-lg-0 { - --bs-gutter-x: 0; } - .g-lg-0, - .gy-lg-0 { - --bs-gutter-y: 0; } - .g-lg-1, - .gx-lg-1 { - --bs-gutter-x: 0.25rem; } - .g-lg-1, - .gy-lg-1 { - --bs-gutter-y: 0.25rem; } - .g-lg-2, - .gx-lg-2 { - --bs-gutter-x: 0.5rem; } - .g-lg-2, - .gy-lg-2 { - --bs-gutter-y: 0.5rem; } - .g-lg-3, - .gx-lg-3 { - --bs-gutter-x: 1rem; } - .g-lg-3, - .gy-lg-3 { - --bs-gutter-y: 1rem; } - .g-lg-4, - .gx-lg-4 { - --bs-gutter-x: 1.5rem; } - .g-lg-4, - .gy-lg-4 { - --bs-gutter-y: 1.5rem; } - .g-lg-5, - .gx-lg-5 { - --bs-gutter-x: 3rem; } - .g-lg-5, - .gy-lg-5 { - --bs-gutter-y: 3rem; } } - -@media (min-width: 1200px) { - .col-xl { - flex: 1 0 0%; } - .row-cols-xl-auto > * { - flex: 0 0 auto; - width: auto; } - .row-cols-xl-1 > * { - flex: 0 0 auto; - width: 100%; } - .row-cols-xl-2 > * { - flex: 0 0 auto; - width: 50%; } - .row-cols-xl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; } - .row-cols-xl-4 > * { - flex: 0 0 auto; - width: 25%; } - .row-cols-xl-5 > * { - flex: 0 0 auto; - width: 20%; } - .row-cols-xl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; } - .col-xl-auto { - flex: 0 0 auto; - width: auto; } - .col-xl-1 { - flex: 0 0 auto; - width: 8.33333333%; } - .col-xl-2 { - flex: 0 0 auto; - width: 16.66666667%; } - .col-xl-3 { - flex: 0 0 auto; - width: 25%; } - .col-xl-4 { - flex: 0 0 auto; - width: 33.33333333%; } - .col-xl-5 { - flex: 0 0 auto; - width: 41.66666667%; } - .col-xl-6 { - flex: 0 0 auto; - width: 50%; } - .col-xl-7 { - flex: 0 0 auto; - width: 58.33333333%; } - .col-xl-8 { - flex: 0 0 auto; - width: 66.66666667%; } - .col-xl-9 { - flex: 0 0 auto; - width: 75%; } - .col-xl-10 { - flex: 0 0 auto; - width: 83.33333333%; } - .col-xl-11 { - flex: 0 0 auto; - width: 91.66666667%; } - .col-xl-12 { - flex: 0 0 auto; - width: 100%; } - .offset-xl-0 { - margin-left: 0; } - .offset-xl-1 { - margin-left: 8.33333333%; } - .offset-xl-2 { - margin-left: 16.66666667%; } - .offset-xl-3 { - margin-left: 25%; } - .offset-xl-4 { - margin-left: 33.33333333%; } - .offset-xl-5 { - margin-left: 41.66666667%; } - .offset-xl-6 { - margin-left: 50%; } - .offset-xl-7 { - margin-left: 58.33333333%; } - .offset-xl-8 { - margin-left: 66.66666667%; } - .offset-xl-9 { - margin-left: 75%; } - .offset-xl-10 { - margin-left: 83.33333333%; } - .offset-xl-11 { - margin-left: 91.66666667%; } - .g-xl-0, - .gx-xl-0 { - --bs-gutter-x: 0; } - .g-xl-0, - .gy-xl-0 { - --bs-gutter-y: 0; } - .g-xl-1, - .gx-xl-1 { - --bs-gutter-x: 0.25rem; } - .g-xl-1, - .gy-xl-1 { - --bs-gutter-y: 0.25rem; } - .g-xl-2, - .gx-xl-2 { - --bs-gutter-x: 0.5rem; } - .g-xl-2, - .gy-xl-2 { - --bs-gutter-y: 0.5rem; } - .g-xl-3, - .gx-xl-3 { - --bs-gutter-x: 1rem; } - .g-xl-3, - .gy-xl-3 { - --bs-gutter-y: 1rem; } - .g-xl-4, - .gx-xl-4 { - --bs-gutter-x: 1.5rem; } - .g-xl-4, - .gy-xl-4 { - --bs-gutter-y: 1.5rem; } - .g-xl-5, - .gx-xl-5 { - --bs-gutter-x: 3rem; } - .g-xl-5, - .gy-xl-5 { - --bs-gutter-y: 3rem; } } - -@media (min-width: 1400px) { - .col-xxl { - flex: 1 0 0%; } - .row-cols-xxl-auto > * { - flex: 0 0 auto; - width: auto; } - .row-cols-xxl-1 > * { - flex: 0 0 auto; - width: 100%; } - .row-cols-xxl-2 > * { - flex: 0 0 auto; - width: 50%; } - .row-cols-xxl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; } - .row-cols-xxl-4 > * { - flex: 0 0 auto; - width: 25%; } - .row-cols-xxl-5 > * { - flex: 0 0 auto; - width: 20%; } - .row-cols-xxl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; } - .col-xxl-auto { - flex: 0 0 auto; - width: auto; } - .col-xxl-1 { - flex: 0 0 auto; - width: 8.33333333%; } - .col-xxl-2 { - flex: 0 0 auto; - width: 16.66666667%; } - .col-xxl-3 { - flex: 0 0 auto; - width: 25%; } - .col-xxl-4 { - flex: 0 0 auto; - width: 33.33333333%; } - .col-xxl-5 { - flex: 0 0 auto; - width: 41.66666667%; } - .col-xxl-6 { - flex: 0 0 auto; - width: 50%; } - .col-xxl-7 { - flex: 0 0 auto; - width: 58.33333333%; } - .col-xxl-8 { - flex: 0 0 auto; - width: 66.66666667%; } - .col-xxl-9 { - flex: 0 0 auto; - width: 75%; } - .col-xxl-10 { - flex: 0 0 auto; - width: 83.33333333%; } - .col-xxl-11 { - flex: 0 0 auto; - width: 91.66666667%; } - .col-xxl-12 { - flex: 0 0 auto; - width: 100%; } - .offset-xxl-0 { - margin-left: 0; } - .offset-xxl-1 { - margin-left: 8.33333333%; } - .offset-xxl-2 { - margin-left: 16.66666667%; } - .offset-xxl-3 { - margin-left: 25%; } - .offset-xxl-4 { - margin-left: 33.33333333%; } - .offset-xxl-5 { - margin-left: 41.66666667%; } - .offset-xxl-6 { - margin-left: 50%; } - .offset-xxl-7 { - margin-left: 58.33333333%; } - .offset-xxl-8 { - margin-left: 66.66666667%; } - .offset-xxl-9 { - margin-left: 75%; } - .offset-xxl-10 { - margin-left: 83.33333333%; } - .offset-xxl-11 { - margin-left: 91.66666667%; } - .g-xxl-0, - .gx-xxl-0 { - --bs-gutter-x: 0; } - .g-xxl-0, - .gy-xxl-0 { - --bs-gutter-y: 0; } - .g-xxl-1, - .gx-xxl-1 { - --bs-gutter-x: 0.25rem; } - .g-xxl-1, - .gy-xxl-1 { - --bs-gutter-y: 0.25rem; } - .g-xxl-2, - .gx-xxl-2 { - --bs-gutter-x: 0.5rem; } - .g-xxl-2, - .gy-xxl-2 { - --bs-gutter-y: 0.5rem; } - .g-xxl-3, - .gx-xxl-3 { - --bs-gutter-x: 1rem; } - .g-xxl-3, - .gy-xxl-3 { - --bs-gutter-y: 1rem; } - .g-xxl-4, - .gx-xxl-4 { - --bs-gutter-x: 1.5rem; } - .g-xxl-4, - .gy-xxl-4 { - --bs-gutter-y: 1.5rem; } - .g-xxl-5, - .gx-xxl-5 { - --bs-gutter-x: 3rem; } - .g-xxl-5, - .gy-xxl-5 { - --bs-gutter-y: 3rem; } } - -.table { - --bs-table-color-type: initial; - --bs-table-bg-type: initial; - --bs-table-color-state: initial; - --bs-table-bg-state: initial; - --bs-table-color: var(--bs-emphasis-color); - --bs-table-bg: var(--bs-body-bg); - --bs-table-border-color: var(--bs-border-color); - --bs-table-accent-bg: transparent; - --bs-table-striped-color: var(--bs-emphasis-color); - --bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05); - --bs-table-active-color: var(--bs-emphasis-color); - --bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1); - --bs-table-hover-color: var(--bs-emphasis-color); - --bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075); - width: 100%; - margin-bottom: 1rem; - vertical-align: top; - border-color: var(--bs-table-border-color); } - .table > :not(caption) > * > * { - padding: 0.5rem 0.5rem; - color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color))); - background-color: var(--bs-table-bg); - border-bottom-width: var(--bs-border-width); - box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg))); } - .table > tbody { - vertical-align: inherit; } - .table > thead { - vertical-align: bottom; } - -.table-group-divider { - border-top: calc(var(--bs-border-width) * 2) solid currentcolor; } - -.caption-top { - caption-side: top; } - -.table-sm > :not(caption) > * > * { - padding: 0.25rem 0.25rem; } - -.table-bordered > :not(caption) > * { - border-width: var(--bs-border-width) 0; } - .table-bordered > :not(caption) > * > * { - border-width: 0 var(--bs-border-width); } - -.table-borderless > :not(caption) > * > * { - border-bottom-width: 0; } - -.table-borderless > :not(:first-child) { - border-top-width: 0; } - -.table-striped > tbody > tr:nth-of-type(odd) > * { - --bs-table-color-type: var(--bs-table-striped-color); - --bs-table-bg-type: var(--bs-table-striped-bg); } - -.table-striped-columns > :not(caption) > tr > :nth-child(even) { - --bs-table-color-type: var(--bs-table-striped-color); - --bs-table-bg-type: var(--bs-table-striped-bg); } - -.table-active { - --bs-table-color-state: var(--bs-table-active-color); - --bs-table-bg-state: var(--bs-table-active-bg); } - -.table-hover > tbody > tr:hover > * { - --bs-table-color-state: var(--bs-table-hover-color); - --bs-table-bg-state: var(--bs-table-hover-bg); } - -.table-primary { - --bs-table-color: #000; - --bs-table-bg: #cfe2ff; - --bs-table-border-color: #a6b5cc; - --bs-table-striped-bg: #c5d7f2; - --bs-table-striped-color: #000; - --bs-table-active-bg: #bacbe6; - --bs-table-active-color: #000; - --bs-table-hover-bg: #bfd1ec; - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-secondary { - --bs-table-color: #000; - --bs-table-bg: #e2e3e5; - --bs-table-border-color: #b5b6b7; - --bs-table-striped-bg: #d7d8da; - --bs-table-striped-color: #000; - --bs-table-active-bg: #cbccce; - --bs-table-active-color: #000; - --bs-table-hover-bg: #d1d2d4; - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-success { - --bs-table-color: #000; - --bs-table-bg: #d1e7dd; - --bs-table-border-color: #a7b9b1; - --bs-table-striped-bg: #c7dbd2; - --bs-table-striped-color: #000; - --bs-table-active-bg: #bcd0c7; - --bs-table-active-color: #000; - --bs-table-hover-bg: #c1d6cc; - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-info { - --bs-table-color: #000; - --bs-table-bg: #cff4fc; - --bs-table-border-color: #a6c3ca; - --bs-table-striped-bg: #c5e8ef; - --bs-table-striped-color: #000; - --bs-table-active-bg: #badce3; - --bs-table-active-color: #000; - --bs-table-hover-bg: #bfe2e9; - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-warning { - --bs-table-color: #000; - --bs-table-bg: #fff3cd; - --bs-table-border-color: #ccc2a4; - --bs-table-striped-bg: #f2e7c3; - --bs-table-striped-color: #000; - --bs-table-active-bg: #e6dbb9; - --bs-table-active-color: #000; - --bs-table-hover-bg: #ece1be; - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-danger { - --bs-table-color: #000; - --bs-table-bg: #f8d7da; - --bs-table-border-color: #c6acae; - --bs-table-striped-bg: #eccccf; - --bs-table-striped-color: #000; - --bs-table-active-bg: #dfc2c4; - --bs-table-active-color: #000; - --bs-table-hover-bg: #e5c7ca; - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-light { - --bs-table-color: #000; - --bs-table-bg: #f8f9fa; - --bs-table-border-color: #c6c7c8; - --bs-table-striped-bg: #ecedee; - --bs-table-striped-color: #000; - --bs-table-active-bg: #dfe0e1; - --bs-table-active-color: #000; - --bs-table-hover-bg: #e5e6e7; - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-dark { - --bs-table-color: #fff; - --bs-table-bg: #212529; - --bs-table-border-color: #4d5154; - --bs-table-striped-bg: #2c3034; - --bs-table-striped-color: #fff; - --bs-table-active-bg: #373b3e; - --bs-table-active-color: #fff; - --bs-table-hover-bg: #323539; - --bs-table-hover-color: #fff; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); } - -.table-responsive { - overflow-x: auto; - -webkit-overflow-scrolling: touch; } - -@media (max-width: 575.98px) { - .table-responsive-sm { - overflow-x: auto; - -webkit-overflow-scrolling: touch; } } - -@media (max-width: 767.98px) { - .table-responsive-md { - overflow-x: auto; - -webkit-overflow-scrolling: touch; } } - -@media (max-width: 991.98px) { - .table-responsive-lg { - overflow-x: auto; - -webkit-overflow-scrolling: touch; } } - -@media (max-width: 1199.98px) { - .table-responsive-xl { - overflow-x: auto; - -webkit-overflow-scrolling: touch; } } - -@media (max-width: 1399.98px) { - .table-responsive-xxl { - overflow-x: auto; - -webkit-overflow-scrolling: touch; } } - -.form-label { - margin-bottom: 0.5rem; } - -.col-form-label { - padding-top: calc(0.375rem + var(--bs-border-width)); - padding-bottom: calc(0.375rem + var(--bs-border-width)); - margin-bottom: 0; - font-size: inherit; - line-height: 1.5; } - -.col-form-label-lg { - padding-top: calc(0.5rem + var(--bs-border-width)); - padding-bottom: calc(0.5rem + var(--bs-border-width)); - font-size: 1.25rem; } - -.col-form-label-sm { - padding-top: calc(0.25rem + var(--bs-border-width)); - padding-bottom: calc(0.25rem + var(--bs-border-width)); - font-size: 0.875rem; } - -.form-text { - margin-top: 0.25rem; - font-size: 0.875em; - color: var(--bs-secondary-color); } - -.form-control { - display: block; - width: 100%; - padding: 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: var(--bs-body-color); - appearance: none; - background-color: var(--bs-body-bg); - background-clip: padding-box; - border: var(--bs-border-width) solid var(--bs-border-color); - border-radius: var(--bs-border-radius); - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .form-control { - transition: none; } } - .form-control[type="file"] { - overflow: hidden; } - .form-control[type="file"]:not(:disabled):not([readonly]) { - cursor: pointer; } - .form-control:focus { - color: var(--bs-body-color); - background-color: var(--bs-body-bg); - border-color: #86b7fe; - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } - .form-control::-webkit-date-and-time-value { - min-width: 85px; - height: 1.5em; - margin: 0; } - .form-control::-webkit-datetime-edit { - display: block; - padding: 0; } - .form-control::placeholder { - color: var(--bs-secondary-color); - opacity: 1; } - .form-control:disabled { - background-color: var(--bs-secondary-bg); - opacity: 1; } - .form-control::file-selector-button { - padding: 0.375rem 0.75rem; - margin: -0.375rem -0.75rem; - margin-inline-end: 0.75rem; - color: var(--bs-body-color); - background-color: var(--bs-tertiary-bg); - pointer-events: none; - border-color: inherit; - border-style: solid; - border-width: 0; - border-inline-end-width: var(--bs-border-width); - border-radius: 0; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .form-control::file-selector-button { - transition: none; } } - .form-control:hover:not(:disabled):not([readonly])::file-selector-button { - background-color: var(--bs-secondary-bg); } - -.form-control-plaintext { - display: block; - width: 100%; - padding: 0.375rem 0; - margin-bottom: 0; - line-height: 1.5; - color: var(--bs-body-color); - background-color: transparent; - border: solid transparent; - border-width: var(--bs-border-width) 0; } - .form-control-plaintext:focus { - outline: 0; } - .form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { - padding-right: 0; - padding-left: 0; } - -.form-control-sm { - min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - border-radius: var(--bs-border-radius-sm); } - .form-control-sm::file-selector-button { - padding: 0.25rem 0.5rem; - margin: -0.25rem -0.5rem; - margin-inline-end: 0.5rem; } - -.form-control-lg { - min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); - padding: 0.5rem 1rem; - font-size: 1.25rem; - border-radius: var(--bs-border-radius-lg); } - .form-control-lg::file-selector-button { - padding: 0.5rem 1rem; - margin: -0.5rem -1rem; - margin-inline-end: 1rem; } - -textarea.form-control { - min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); } - -textarea.form-control-sm { - min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); } - -textarea.form-control-lg { - min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); } - -.form-control-color { - width: 3rem; - height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); - padding: 0.375rem; } - .form-control-color:not(:disabled):not([readonly]) { - cursor: pointer; } - .form-control-color::-moz-color-swatch { - border: 0 !important; - border-radius: var(--bs-border-radius); } - .form-control-color::-webkit-color-swatch { - border: 0 !important; - border-radius: var(--bs-border-radius); } - .form-control-color.form-control-sm { - height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); } - .form-control-color.form-control-lg { - height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); } - -.form-select { - --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); - display: block; - width: 100%; - padding: 0.375rem 2.25rem 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: var(--bs-body-color); - appearance: none; - background-color: var(--bs-body-bg); - background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none); - background-repeat: no-repeat; - background-position: right 0.75rem center; - background-size: 16px 12px; - border: var(--bs-border-width) solid var(--bs-border-color); - border-radius: var(--bs-border-radius); - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .form-select { - transition: none; } } - .form-select:focus { - border-color: #86b7fe; - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } - .form-select[multiple], .form-select[size]:not([size="1"]) { - padding-right: 0.75rem; - background-image: none; } - .form-select:disabled { - background-color: var(--bs-secondary-bg); } - .form-select:-moz-focusring { - color: transparent; - text-shadow: 0 0 0 var(--bs-body-color); } - -.form-select-sm { - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.5rem; - font-size: 0.875rem; - border-radius: var(--bs-border-radius-sm); } - -.form-select-lg { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - font-size: 1.25rem; - border-radius: var(--bs-border-radius-lg); } - -[data-bs-theme="dark"] .form-select { - --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); } - -.form-check { - display: block; - min-height: 1.5rem; - padding-left: 1.5em; - margin-bottom: 0.125rem; } - .form-check .form-check-input { - float: left; - margin-left: -1.5em; } - -.form-check-reverse { - padding-right: 1.5em; - padding-left: 0; - text-align: right; } - .form-check-reverse .form-check-input { - float: right; - margin-right: -1.5em; - margin-left: 0; } - -.form-check-input { - --bs-form-check-bg: var(--bs-body-bg); - flex-shrink: 0; - width: 1em; - height: 1em; - margin-top: 0.25em; - vertical-align: top; - appearance: none; - background-color: var(--bs-form-check-bg); - background-image: var(--bs-form-check-bg-image); - background-repeat: no-repeat; - background-position: center; - background-size: contain; - border: var(--bs-border-width) solid var(--bs-border-color); - print-color-adjust: exact; } - .form-check-input[type="checkbox"] { - border-radius: 0.25em; } - .form-check-input[type="radio"] { - border-radius: 50%; } - .form-check-input:active { - filter: brightness(90%); } - .form-check-input:focus { - border-color: #86b7fe; - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } - .form-check-input:checked { - background-color: #0d6efd; - border-color: #0d6efd; } - .form-check-input:checked[type="checkbox"] { - --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); } - .form-check-input:checked[type="radio"] { - --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); } - .form-check-input[type="checkbox"]:indeterminate { - background-color: #0d6efd; - border-color: #0d6efd; - --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); } - .form-check-input:disabled { - pointer-events: none; - filter: none; - opacity: 0.5; } - .form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { - cursor: default; - opacity: 0.5; } - -.form-switch { - padding-left: 2.5em; } - .form-switch .form-check-input { - --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); - width: 2em; - margin-left: -2.5em; - background-image: var(--bs-form-switch-bg); - background-position: left center; - border-radius: 2em; - transition: background-position 0.15s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .form-switch .form-check-input { - transition: none; } } - .form-switch .form-check-input:focus { - --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e"); } - .form-switch .form-check-input:checked { - background-position: right center; - --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); } - .form-switch.form-check-reverse { - padding-right: 2.5em; - padding-left: 0; } - .form-switch.form-check-reverse .form-check-input { - margin-right: -2.5em; - margin-left: 0; } - -.form-check-inline { - display: inline-block; - margin-right: 1rem; } - -.btn-check { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; } - .btn-check[disabled] + .btn, .btn-check:disabled + .btn { - pointer-events: none; - filter: none; - opacity: 0.65; } - -[data-bs-theme="dark"] .form-switch .form-check-input:not(:checked):not(:focus) { - --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e"); } - -.form-range { - width: 100%; - height: 1.5rem; - padding: 0; - appearance: none; - background-color: transparent; } - .form-range:focus { - outline: 0; } - .form-range:focus::-webkit-slider-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } - .form-range:focus::-moz-range-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } - .form-range::-moz-focus-outer { - border: 0; } - .form-range::-webkit-slider-thumb { - width: 1rem; - height: 1rem; - margin-top: -0.25rem; - appearance: none; - background-color: #0d6efd; - border: 0; - border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .form-range::-webkit-slider-thumb { - transition: none; } } - .form-range::-webkit-slider-thumb:active { - background-color: #b6d4fe; } - .form-range::-webkit-slider-runnable-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: var(--bs-secondary-bg); - border-color: transparent; - border-radius: 1rem; } - .form-range::-moz-range-thumb { - width: 1rem; - height: 1rem; - appearance: none; - background-color: #0d6efd; - border: 0; - border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .form-range::-moz-range-thumb { - transition: none; } } - .form-range::-moz-range-thumb:active { - background-color: #b6d4fe; } - .form-range::-moz-range-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: var(--bs-secondary-bg); - border-color: transparent; - border-radius: 1rem; } - .form-range:disabled { - pointer-events: none; } - .form-range:disabled::-webkit-slider-thumb { - background-color: var(--bs-secondary-color); } - .form-range:disabled::-moz-range-thumb { - background-color: var(--bs-secondary-color); } - -.form-floating { - position: relative; } - .form-floating > .form-control, - .form-floating > .form-control-plaintext, - .form-floating > .form-select { - height: calc(3.5rem + calc(var(--bs-border-width) * 2)); - min-height: calc(3.5rem + calc(var(--bs-border-width) * 2)); - line-height: 1.25; } - .form-floating > label { - position: absolute; - top: 0; - left: 0; - z-index: 2; - height: 100%; - padding: 1rem 0.75rem; - overflow: hidden; - text-align: start; - text-overflow: ellipsis; - white-space: nowrap; - pointer-events: none; - border: var(--bs-border-width) solid transparent; - transform-origin: 0 0; - transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .form-floating > label { - transition: none; } } - .form-floating > .form-control, - .form-floating > .form-control-plaintext { - padding: 1rem 0.75rem; } - .form-floating > .form-control::placeholder, - .form-floating > .form-control-plaintext::placeholder { - color: transparent; } - .form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown), - .form-floating > .form-control-plaintext:focus, - .form-floating > .form-control-plaintext:not(:placeholder-shown) { - padding-top: 1.625rem; - padding-bottom: 0.625rem; } - .form-floating > .form-control:-webkit-autofill, - .form-floating > .form-control-plaintext:-webkit-autofill { - padding-top: 1.625rem; - padding-bottom: 0.625rem; } - .form-floating > .form-select { - padding-top: 1.625rem; - padding-bottom: 0.625rem; } - .form-floating > .form-control:focus ~ label, - .form-floating > .form-control:not(:placeholder-shown) ~ label, - .form-floating > .form-control-plaintext ~ label, - .form-floating > .form-select ~ label { - color: rgba(var(--bs-body-color-rgb), 0.65); - transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); } - .form-floating > .form-control:focus ~ label::after, - .form-floating > .form-control:not(:placeholder-shown) ~ label::after, - .form-floating > .form-control-plaintext ~ label::after, - .form-floating > .form-select ~ label::after { - position: absolute; - inset: 1rem 0.375rem; - z-index: -1; - height: 1.5em; - content: ""; - background-color: var(--bs-body-bg); - border-radius: var(--bs-border-radius); } - .form-floating > .form-control:-webkit-autofill ~ label { - color: rgba(var(--bs-body-color-rgb), 0.65); - transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); } - .form-floating > .form-control-plaintext ~ label { - border-width: var(--bs-border-width) 0; } - .form-floating > :disabled ~ label, - .form-floating > .form-control:disabled ~ label { - color: #6c757d; } - .form-floating > :disabled ~ label::after, - .form-floating > .form-control:disabled ~ label::after { - background-color: var(--bs-secondary-bg); } - -.input-group { - position: relative; - display: flex; - flex-wrap: wrap; - align-items: stretch; - width: 100%; } - .input-group > .form-control, - .input-group > .form-select, - .input-group > .form-floating { - position: relative; - flex: 1 1 auto; - width: 1%; - min-width: 0; } - .input-group > .form-control:focus, - .input-group > .form-select:focus, - .input-group > .form-floating:focus-within { - z-index: 5; } - .input-group .btn { - position: relative; - z-index: 2; } - .input-group .btn:focus { - z-index: 5; } - -.input-group-text { - display: flex; - align-items: center; - padding: 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: var(--bs-body-color); - text-align: center; - white-space: nowrap; - background-color: var(--bs-tertiary-bg); - border: var(--bs-border-width) solid var(--bs-border-color); - border-radius: var(--bs-border-radius); } - -.input-group-lg > .form-control, -.input-group-lg > .form-select, -.input-group-lg > .input-group-text, -.input-group-lg > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - border-radius: var(--bs-border-radius-lg); } - -.input-group-sm > .form-control, -.input-group-sm > .form-select, -.input-group-sm > .input-group-text, -.input-group-sm > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - border-radius: var(--bs-border-radius-sm); } - -.input-group-lg > .form-select, -.input-group-sm > .form-select { - padding-right: 3rem; } - -.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), -.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n + 3), -.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control, -.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select { - border-top-right-radius: 0; - border-bottom-right-radius: 0; } - -.input-group.has-validation > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), -.input-group.has-validation > .dropdown-toggle:nth-last-child(n + 4), -.input-group.has-validation > .form-floating:nth-last-child(n + 3) > .form-control, -.input-group.has-validation > .form-floating:nth-last-child(n + 3) > .form-select { - border-top-right-radius: 0; - border-bottom-right-radius: 0; } - -.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { - margin-left: calc(var(--bs-border-width) * -1); - border-top-left-radius: 0; - border-bottom-left-radius: 0; } - -.input-group > .form-floating:not(:first-child) > .form-control, -.input-group > .form-floating:not(:first-child) > .form-select { - border-top-left-radius: 0; - border-bottom-left-radius: 0; } - -.valid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 0.875em; - color: var(--bs-form-valid-color); } - -.valid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: .1rem; - font-size: 0.875rem; - color: #fff; - background-color: var(--bs-success); - border-radius: var(--bs-border-radius); } - -.was-validated :valid ~ .valid-feedback, -.was-validated :valid ~ .valid-tooltip, -.is-valid ~ .valid-feedback, -.is-valid ~ .valid-tooltip { - display: block; } - -.was-validated .form-control:valid, .form-control.is-valid { - border-color: var(--bs-form-valid-border-color); - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } - .was-validated .form-control:valid:focus, .form-control.is-valid:focus { - border-color: var(--bs-form-valid-border-color); - box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); } - -.was-validated textarea.form-control:valid, textarea.form-control.is-valid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } - -.was-validated .form-select:valid, .form-select.is-valid { - border-color: var(--bs-form-valid-border-color); } - .was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] { - --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); - padding-right: 4.125rem; - background-position: right 0.75rem center, center right 2.25rem; - background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } - .was-validated .form-select:valid:focus, .form-select.is-valid:focus { - border-color: var(--bs-form-valid-border-color); - box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); } - -.was-validated .form-control-color:valid, .form-control-color.is-valid { - width: calc(3rem + calc(1.5em + 0.75rem)); } - -.was-validated .form-check-input:valid, .form-check-input.is-valid { - border-color: var(--bs-form-valid-border-color); } - .was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { - background-color: var(--bs-form-valid-color); } - .was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { - box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); } - .was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { - color: var(--bs-form-valid-color); } - -.form-check-inline .form-check-input ~ .valid-feedback { - margin-left: .5em; } - -.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid, .was-validated .input-group > .form-select:not(:focus):valid, -.input-group > .form-select:not(:focus).is-valid, .was-validated .input-group > .form-floating:not(:focus-within):valid, -.input-group > .form-floating:not(:focus-within).is-valid { - z-index: 3; } - -.invalid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 0.875em; - color: var(--bs-form-invalid-color); } - -.invalid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: .1rem; - font-size: 0.875rem; - color: #fff; - background-color: var(--bs-danger); - border-radius: var(--bs-border-radius); } - -.was-validated :invalid ~ .invalid-feedback, -.was-validated :invalid ~ .invalid-tooltip, -.is-invalid ~ .invalid-feedback, -.is-invalid ~ .invalid-tooltip { - display: block; } - -.was-validated .form-control:invalid, .form-control.is-invalid { - border-color: var(--bs-form-invalid-border-color); - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } - .was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { - border-color: var(--bs-form-invalid-border-color); - box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); } - -.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } - -.was-validated .form-select:invalid, .form-select.is-invalid { - border-color: var(--bs-form-invalid-border-color); } - .was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] { - --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); - padding-right: 4.125rem; - background-position: right 0.75rem center, center right 2.25rem; - background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } - .was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { - border-color: var(--bs-form-invalid-border-color); - box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); } - -.was-validated .form-control-color:invalid, .form-control-color.is-invalid { - width: calc(3rem + calc(1.5em + 0.75rem)); } - -.was-validated .form-check-input:invalid, .form-check-input.is-invalid { - border-color: var(--bs-form-invalid-border-color); } - .was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { - background-color: var(--bs-form-invalid-color); } - .was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { - box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); } - .was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { - color: var(--bs-form-invalid-color); } - -.form-check-inline .form-check-input ~ .invalid-feedback { - margin-left: .5em; } - -.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid, .was-validated .input-group > .form-select:not(:focus):invalid, -.input-group > .form-select:not(:focus).is-invalid, .was-validated .input-group > .form-floating:not(:focus-within):invalid, -.input-group > .form-floating:not(:focus-within).is-invalid { - z-index: 4; } - -.btn { - --bs-btn-padding-x: 0.75rem; - --bs-btn-padding-y: 0.375rem; - --bs-btn-font-family: ; - --bs-btn-font-size: 1rem; - --bs-btn-font-weight: 400; - --bs-btn-line-height: 1.5; - --bs-btn-color: var(--bs-body-color); - --bs-btn-bg: transparent; - --bs-btn-border-width: var(--bs-border-width); - --bs-btn-border-color: transparent; - --bs-btn-border-radius: var(--bs-border-radius); - --bs-btn-hover-border-color: transparent; - --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); - --bs-btn-disabled-opacity: 0.65; - --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5); - display: inline-block; - padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); - font-family: var(--bs-btn-font-family); - font-size: var(--bs-btn-font-size); - font-weight: var(--bs-btn-font-weight); - line-height: var(--bs-btn-line-height); - color: var(--bs-btn-color); - text-align: center; - text-decoration: none; - vertical-align: middle; - cursor: pointer; - user-select: none; - border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); - border-radius: var(--bs-btn-border-radius); - background-color: var(--bs-btn-bg); - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .btn { - transition: none; } } - .btn:hover { - color: var(--bs-btn-hover-color); - background-color: var(--bs-btn-hover-bg); - border-color: var(--bs-btn-hover-border-color); } - .btn-check + .btn:hover { - color: var(--bs-btn-color); - background-color: var(--bs-btn-bg); - border-color: var(--bs-btn-border-color); } - .btn:focus-visible { - color: var(--bs-btn-hover-color); - background-color: var(--bs-btn-hover-bg); - border-color: var(--bs-btn-hover-border-color); - outline: 0; - box-shadow: var(--bs-btn-focus-box-shadow); } - .btn-check:focus-visible + .btn { - border-color: var(--bs-btn-hover-border-color); - outline: 0; - box-shadow: var(--bs-btn-focus-box-shadow); } - .btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show { - color: var(--bs-btn-active-color); - background-color: var(--bs-btn-active-bg); - border-color: var(--bs-btn-active-border-color); } - .btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible { - box-shadow: var(--bs-btn-focus-box-shadow); } - .btn-check:checked:focus-visible + .btn { - box-shadow: var(--bs-btn-focus-box-shadow); } - .btn:disabled, .btn.disabled, fieldset:disabled .btn { - color: var(--bs-btn-disabled-color); - pointer-events: none; - background-color: var(--bs-btn-disabled-bg); - border-color: var(--bs-btn-disabled-border-color); - opacity: var(--bs-btn-disabled-opacity); } - -.btn-primary { - --bs-btn-color: #fff; - --bs-btn-bg: #0d6efd; - --bs-btn-border-color: #0d6efd; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #0b5ed7; - --bs-btn-hover-border-color: #0a58ca; - --bs-btn-focus-shadow-rgb: 49, 132, 253; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #0a58ca; - --bs-btn-active-border-color: #0a53be; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #0d6efd; - --bs-btn-disabled-border-color: #0d6efd; } - -.btn-secondary { - --bs-btn-color: #fff; - --bs-btn-bg: #6c757d; - --bs-btn-border-color: #6c757d; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #5c636a; - --bs-btn-hover-border-color: #565e64; - --bs-btn-focus-shadow-rgb: 130, 138, 145; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #565e64; - --bs-btn-active-border-color: #51585e; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #6c757d; - --bs-btn-disabled-border-color: #6c757d; } - -.btn-success { - --bs-btn-color: #fff; - --bs-btn-bg: #198754; - --bs-btn-border-color: #198754; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #157347; - --bs-btn-hover-border-color: #146c43; - --bs-btn-focus-shadow-rgb: 60, 153, 110; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #146c43; - --bs-btn-active-border-color: #13653f; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #198754; - --bs-btn-disabled-border-color: #198754; } - -.btn-info { - --bs-btn-color: #000; - --bs-btn-bg: #0dcaf0; - --bs-btn-border-color: #0dcaf0; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: #31d2f2; - --bs-btn-hover-border-color: #25cff2; - --bs-btn-focus-shadow-rgb: 11, 172, 204; - --bs-btn-active-color: #000; - --bs-btn-active-bg: #3dd5f3; - --bs-btn-active-border-color: #25cff2; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #000; - --bs-btn-disabled-bg: #0dcaf0; - --bs-btn-disabled-border-color: #0dcaf0; } - -.btn-warning { - --bs-btn-color: #000; - --bs-btn-bg: #ffc107; - --bs-btn-border-color: #ffc107; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: #ffca2c; - --bs-btn-hover-border-color: #ffc720; - --bs-btn-focus-shadow-rgb: 217, 164, 6; - --bs-btn-active-color: #000; - --bs-btn-active-bg: #ffcd39; - --bs-btn-active-border-color: #ffc720; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #000; - --bs-btn-disabled-bg: #ffc107; - --bs-btn-disabled-border-color: #ffc107; } - -.btn-danger { - --bs-btn-color: #fff; - --bs-btn-bg: #dc3545; - --bs-btn-border-color: #dc3545; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #bb2d3b; - --bs-btn-hover-border-color: #b02a37; - --bs-btn-focus-shadow-rgb: 225, 83, 97; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #b02a37; - --bs-btn-active-border-color: #a52834; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #dc3545; - --bs-btn-disabled-border-color: #dc3545; } - -.btn-light { - --bs-btn-color: #000; - --bs-btn-bg: #f8f9fa; - --bs-btn-border-color: #f8f9fa; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: #d3d4d5; - --bs-btn-hover-border-color: #c6c7c8; - --bs-btn-focus-shadow-rgb: 211, 212, 213; - --bs-btn-active-color: #000; - --bs-btn-active-bg: #c6c7c8; - --bs-btn-active-border-color: #babbbc; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #000; - --bs-btn-disabled-bg: #f8f9fa; - --bs-btn-disabled-border-color: #f8f9fa; } - -.btn-dark { - --bs-btn-color: #fff; - --bs-btn-bg: #212529; - --bs-btn-border-color: #212529; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #424649; - --bs-btn-hover-border-color: #373b3e; - --bs-btn-focus-shadow-rgb: 66, 70, 73; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #4d5154; - --bs-btn-active-border-color: #373b3e; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #212529; - --bs-btn-disabled-border-color: #212529; } - -.btn-outline-primary { - --bs-btn-color: #0d6efd; - --bs-btn-border-color: #0d6efd; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #0d6efd; - --bs-btn-hover-border-color: #0d6efd; - --bs-btn-focus-shadow-rgb: 13, 110, 253; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #0d6efd; - --bs-btn-active-border-color: #0d6efd; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #0d6efd; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #0d6efd; - --bs-gradient: none; } - -.btn-outline-secondary { - --bs-btn-color: #6c757d; - --bs-btn-border-color: #6c757d; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #6c757d; - --bs-btn-hover-border-color: #6c757d; - --bs-btn-focus-shadow-rgb: 108, 117, 125; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #6c757d; - --bs-btn-active-border-color: #6c757d; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #6c757d; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #6c757d; - --bs-gradient: none; } - -.btn-outline-success { - --bs-btn-color: #198754; - --bs-btn-border-color: #198754; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #198754; - --bs-btn-hover-border-color: #198754; - --bs-btn-focus-shadow-rgb: 25, 135, 84; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #198754; - --bs-btn-active-border-color: #198754; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #198754; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #198754; - --bs-gradient: none; } - -.btn-outline-info { - --bs-btn-color: #0dcaf0; - --bs-btn-border-color: #0dcaf0; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: #0dcaf0; - --bs-btn-hover-border-color: #0dcaf0; - --bs-btn-focus-shadow-rgb: 13, 202, 240; - --bs-btn-active-color: #000; - --bs-btn-active-bg: #0dcaf0; - --bs-btn-active-border-color: #0dcaf0; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #0dcaf0; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #0dcaf0; - --bs-gradient: none; } - -.btn-outline-warning { - --bs-btn-color: #ffc107; - --bs-btn-border-color: #ffc107; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: #ffc107; - --bs-btn-hover-border-color: #ffc107; - --bs-btn-focus-shadow-rgb: 255, 193, 7; - --bs-btn-active-color: #000; - --bs-btn-active-bg: #ffc107; - --bs-btn-active-border-color: #ffc107; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #ffc107; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #ffc107; - --bs-gradient: none; } - -.btn-outline-danger { - --bs-btn-color: #dc3545; - --bs-btn-border-color: #dc3545; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #dc3545; - --bs-btn-hover-border-color: #dc3545; - --bs-btn-focus-shadow-rgb: 220, 53, 69; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #dc3545; - --bs-btn-active-border-color: #dc3545; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #dc3545; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #dc3545; - --bs-gradient: none; } - -.btn-outline-light { - --bs-btn-color: #f8f9fa; - --bs-btn-border-color: #f8f9fa; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: #f8f9fa; - --bs-btn-hover-border-color: #f8f9fa; - --bs-btn-focus-shadow-rgb: 248, 249, 250; - --bs-btn-active-color: #000; - --bs-btn-active-bg: #f8f9fa; - --bs-btn-active-border-color: #f8f9fa; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #f8f9fa; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #f8f9fa; - --bs-gradient: none; } - -.btn-outline-dark { - --bs-btn-color: #212529; - --bs-btn-border-color: #212529; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #212529; - --bs-btn-hover-border-color: #212529; - --bs-btn-focus-shadow-rgb: 33, 37, 41; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #212529; - --bs-btn-active-border-color: #212529; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #212529; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #212529; - --bs-gradient: none; } - -.btn-link { - --bs-btn-font-weight: 400; - --bs-btn-color: var(--bs-link-color); - --bs-btn-bg: transparent; - --bs-btn-border-color: transparent; - --bs-btn-hover-color: var(--bs-link-hover-color); - --bs-btn-hover-border-color: transparent; - --bs-btn-active-color: var(--bs-link-hover-color); - --bs-btn-active-border-color: transparent; - --bs-btn-disabled-color: #6c757d; - --bs-btn-disabled-border-color: transparent; - --bs-btn-box-shadow: 0 0 0 #000; - --bs-btn-focus-shadow-rgb: 49, 132, 253; - text-decoration: underline; } - .btn-link:focus-visible { - color: var(--bs-btn-color); } - .btn-link:hover { - color: var(--bs-btn-hover-color); } - -.btn-lg, .btn-group-lg > .btn { - --bs-btn-padding-y: 0.5rem; - --bs-btn-padding-x: 1rem; - --bs-btn-font-size: 1.25rem; - --bs-btn-border-radius: var(--bs-border-radius-lg); } - -.btn-sm, .btn-group-sm > .btn { - --bs-btn-padding-y: 0.25rem; - --bs-btn-padding-x: 0.5rem; - --bs-btn-font-size: 0.875rem; - --bs-btn-border-radius: var(--bs-border-radius-sm); } - -.fade { - transition: opacity 0.15s linear; } - @media (prefers-reduced-motion: reduce) { - .fade { - transition: none; } } - .fade:not(.show) { - opacity: 0; } - -.collapse:not(.show) { - display: none; } - -.collapsing { - height: 0; - overflow: hidden; - transition: height 0.35s ease; } - @media (prefers-reduced-motion: reduce) { - .collapsing { - transition: none; } } - .collapsing.collapse-horizontal { - width: 0; - height: auto; - transition: width 0.35s ease; } - @media (prefers-reduced-motion: reduce) { - .collapsing.collapse-horizontal { - transition: none; } } -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; } - -.dropdown-toggle { - white-space: nowrap; } - .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent; } - .dropdown-toggle:empty::after { - margin-left: 0; } - -.dropdown-menu { - --bs-dropdown-zindex: 1000; - --bs-dropdown-min-width: 10rem; - --bs-dropdown-padding-x: 0; - --bs-dropdown-padding-y: 0.5rem; - --bs-dropdown-spacer: 0.125rem; - --bs-dropdown-font-size: 1rem; - --bs-dropdown-color: var(--bs-body-color); - --bs-dropdown-bg: var(--bs-body-bg); - --bs-dropdown-border-color: var(--bs-border-color-translucent); - --bs-dropdown-border-radius: var(--bs-border-radius); - --bs-dropdown-border-width: var(--bs-border-width); - --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width)); - --bs-dropdown-divider-bg: var(--bs-border-color-translucent); - --bs-dropdown-divider-margin-y: 0.5rem; - --bs-dropdown-box-shadow: var(--bs-box-shadow); - --bs-dropdown-link-color: var(--bs-body-color); - --bs-dropdown-link-hover-color: var(--bs-body-color); - --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg); - --bs-dropdown-link-active-color: #fff; - --bs-dropdown-link-active-bg: #0d6efd; - --bs-dropdown-link-disabled-color: var(--bs-tertiary-color); - --bs-dropdown-item-padding-x: 1rem; - --bs-dropdown-item-padding-y: 0.25rem; - --bs-dropdown-header-color: #6c757d; - --bs-dropdown-header-padding-x: 1rem; - --bs-dropdown-header-padding-y: 0.5rem; - position: absolute; - z-index: var(--bs-dropdown-zindex); - display: none; - min-width: var(--bs-dropdown-min-width); - padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); - margin: 0; - font-size: var(--bs-dropdown-font-size); - color: var(--bs-dropdown-color); - text-align: left; - list-style: none; - background-color: var(--bs-dropdown-bg); - background-clip: padding-box; - border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color); - border-radius: var(--bs-dropdown-border-radius); } - .dropdown-menu[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--bs-dropdown-spacer); } - -.dropdown-menu-start { - --bs-position: start; } - .dropdown-menu-start[data-bs-popper] { - right: auto; - left: 0; } - -.dropdown-menu-end { - --bs-position: end; } - .dropdown-menu-end[data-bs-popper] { - right: 0; - left: auto; } - -@media (min-width: 576px) { - .dropdown-menu-sm-start { - --bs-position: start; } - .dropdown-menu-sm-start[data-bs-popper] { - right: auto; - left: 0; } - .dropdown-menu-sm-end { - --bs-position: end; } - .dropdown-menu-sm-end[data-bs-popper] { - right: 0; - left: auto; } } - -@media (min-width: 768px) { - .dropdown-menu-md-start { - --bs-position: start; } - .dropdown-menu-md-start[data-bs-popper] { - right: auto; - left: 0; } - .dropdown-menu-md-end { - --bs-position: end; } - .dropdown-menu-md-end[data-bs-popper] { - right: 0; - left: auto; } } - -@media (min-width: 992px) { - .dropdown-menu-lg-start { - --bs-position: start; } - .dropdown-menu-lg-start[data-bs-popper] { - right: auto; - left: 0; } - .dropdown-menu-lg-end { - --bs-position: end; } - .dropdown-menu-lg-end[data-bs-popper] { - right: 0; - left: auto; } } - -@media (min-width: 1200px) { - .dropdown-menu-xl-start { - --bs-position: start; } - .dropdown-menu-xl-start[data-bs-popper] { - right: auto; - left: 0; } - .dropdown-menu-xl-end { - --bs-position: end; } - .dropdown-menu-xl-end[data-bs-popper] { - right: 0; - left: auto; } } - -@media (min-width: 1400px) { - .dropdown-menu-xxl-start { - --bs-position: start; } - .dropdown-menu-xxl-start[data-bs-popper] { - right: auto; - left: 0; } - .dropdown-menu-xxl-end { - --bs-position: end; } - .dropdown-menu-xxl-end[data-bs-popper] { - right: 0; - left: auto; } } - -.dropup .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--bs-dropdown-spacer); } - -.dropup .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0; - border-right: 0.3em solid transparent; - border-bottom: 0.3em solid; - border-left: 0.3em solid transparent; } - -.dropup .dropdown-toggle:empty::after { - margin-left: 0; } - -.dropend .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--bs-dropdown-spacer); } - -.dropend .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0; - border-bottom: 0.3em solid transparent; - border-left: 0.3em solid; } - -.dropend .dropdown-toggle:empty::after { - margin-left: 0; } - -.dropend .dropdown-toggle::after { - vertical-align: 0; } - -.dropstart .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--bs-dropdown-spacer); } - -.dropstart .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; } - -.dropstart .dropdown-toggle::after { - display: none; } - -.dropstart .dropdown-toggle::before { - display: inline-block; - margin-right: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0.3em solid; - border-bottom: 0.3em solid transparent; } - -.dropstart .dropdown-toggle:empty::after { - margin-left: 0; } - -.dropstart .dropdown-toggle::before { - vertical-align: 0; } - -.dropdown-divider { - height: 0; - margin: var(--bs-dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--bs-dropdown-divider-bg); - opacity: 1; } - -.dropdown-item { - display: block; - width: 100%; - padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); - clear: both; - font-weight: 400; - color: var(--bs-dropdown-link-color); - text-align: inherit; - text-decoration: none; - white-space: nowrap; - background-color: transparent; - border: 0; - border-radius: var(--bs-dropdown-item-border-radius, 0); } - .dropdown-item:hover, .dropdown-item:focus { - color: var(--bs-dropdown-link-hover-color); - background-color: var(--bs-dropdown-link-hover-bg); } - .dropdown-item.active, .dropdown-item:active { - color: var(--bs-dropdown-link-active-color); - text-decoration: none; - background-color: var(--bs-dropdown-link-active-bg); } - .dropdown-item.disabled, .dropdown-item:disabled { - color: var(--bs-dropdown-link-disabled-color); - pointer-events: none; - background-color: transparent; } - -.dropdown-menu.show { - display: block; } - -.dropdown-header { - display: block; - padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x); - margin-bottom: 0; - font-size: 0.875rem; - color: var(--bs-dropdown-header-color); - white-space: nowrap; } - -.dropdown-item-text { - display: block; - padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); - color: var(--bs-dropdown-link-color); } - -.dropdown-menu-dark { - --bs-dropdown-color: #dee2e6; - --bs-dropdown-bg: #343a40; - --bs-dropdown-border-color: var(--bs-border-color-translucent); - --bs-dropdown-box-shadow: ; - --bs-dropdown-link-color: #dee2e6; - --bs-dropdown-link-hover-color: #fff; - --bs-dropdown-divider-bg: var(--bs-border-color-translucent); - --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15); - --bs-dropdown-link-active-color: #fff; - --bs-dropdown-link-active-bg: #0d6efd; - --bs-dropdown-link-disabled-color: #adb5bd; - --bs-dropdown-header-color: #adb5bd; } - -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; } - .btn-group > .btn, - .btn-group-vertical > .btn { - position: relative; - flex: 1 1 auto; } - .btn-group > .btn-check:checked + .btn, - .btn-group > .btn-check:focus + .btn, - .btn-group > .btn:hover, - .btn-group > .btn:focus, - .btn-group > .btn:active, - .btn-group > .btn.active, - .btn-group-vertical > .btn-check:checked + .btn, - .btn-group-vertical > .btn-check:focus + .btn, - .btn-group-vertical > .btn:hover, - .btn-group-vertical > .btn:focus, - .btn-group-vertical > .btn:active, - .btn-group-vertical > .btn.active { - z-index: 1; } - -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - .btn-toolbar .input-group { - width: auto; } - -.btn-group { - border-radius: var(--bs-border-radius); } - .btn-group > :not(.btn-check:first-child) + .btn, - .btn-group > .btn-group:not(:first-child) { - margin-left: calc(var(--bs-border-width) * -1); } - .btn-group > .btn:not(:last-child):not(.dropdown-toggle), - .btn-group > .btn.dropdown-toggle-split:first-child, - .btn-group > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; } - .btn-group > .btn:nth-child(n + 3), - .btn-group > :not(.btn-check) + .btn, - .btn-group > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; } - -.dropdown-toggle-split { - padding-right: 0.5625rem; - padding-left: 0.5625rem; } - .dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after { - margin-left: 0; } - .dropstart .dropdown-toggle-split::before { - margin-right: 0; } - -.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { - padding-right: 0.375rem; - padding-left: 0.375rem; } - -.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { - padding-right: 0.75rem; - padding-left: 0.75rem; } - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; } - .btn-group-vertical > .btn, - .btn-group-vertical > .btn-group { - width: 100%; } - .btn-group-vertical > .btn:not(:first-child), - .btn-group-vertical > .btn-group:not(:first-child) { - margin-top: calc(var(--bs-border-width) * -1); } - .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), - .btn-group-vertical > .btn-group:not(:last-child) > .btn { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; } - .btn-group-vertical > .btn ~ .btn, - .btn-group-vertical > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.nav { - --bs-nav-link-padding-x: 1rem; - --bs-nav-link-padding-y: 0.5rem; - --bs-nav-link-font-weight: ; - --bs-nav-link-color: var(--bs-link-color); - --bs-nav-link-hover-color: var(--bs-link-hover-color); - --bs-nav-link-disabled-color: var(--bs-secondary-color); - display: flex; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; } - -.nav-link { - display: block; - padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); - font-size: var(--bs-nav-link-font-size); - font-weight: var(--bs-nav-link-font-weight); - color: var(--bs-nav-link-color); - text-decoration: none; - background: none; - border: 0; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .nav-link { - transition: none; } } - .nav-link:hover, .nav-link:focus { - color: var(--bs-nav-link-hover-color); } - .nav-link:focus-visible { - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); } - .nav-link.disabled, .nav-link:disabled { - color: var(--bs-nav-link-disabled-color); - pointer-events: none; - cursor: default; } - -.nav-tabs { - --bs-nav-tabs-border-width: var(--bs-border-width); - --bs-nav-tabs-border-color: var(--bs-border-color); - --bs-nav-tabs-border-radius: var(--bs-border-radius); - --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color); - --bs-nav-tabs-link-active-color: var(--bs-emphasis-color); - --bs-nav-tabs-link-active-bg: var(--bs-body-bg); - --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg); - border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color); } - .nav-tabs .nav-link { - margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); - border: var(--bs-nav-tabs-border-width) solid transparent; - border-top-left-radius: var(--bs-nav-tabs-border-radius); - border-top-right-radius: var(--bs-nav-tabs-border-radius); } - .nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { - isolation: isolate; - border-color: var(--bs-nav-tabs-link-hover-border-color); } - .nav-tabs .nav-link.active, - .nav-tabs .nav-item.show .nav-link { - color: var(--bs-nav-tabs-link-active-color); - background-color: var(--bs-nav-tabs-link-active-bg); - border-color: var(--bs-nav-tabs-link-active-border-color); } - .nav-tabs .dropdown-menu { - margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.nav-pills { - --bs-nav-pills-border-radius: var(--bs-border-radius); - --bs-nav-pills-link-active-color: #fff; - --bs-nav-pills-link-active-bg: #0d6efd; } - .nav-pills .nav-link { - border-radius: var(--bs-nav-pills-border-radius); } - .nav-pills .nav-link.active, - .nav-pills .show > .nav-link { - color: var(--bs-nav-pills-link-active-color); - background-color: var(--bs-nav-pills-link-active-bg); } - -.nav-underline { - --bs-nav-underline-gap: 1rem; - --bs-nav-underline-border-width: 0.125rem; - --bs-nav-underline-link-active-color: var(--bs-emphasis-color); - gap: var(--bs-nav-underline-gap); } - .nav-underline .nav-link { - padding-right: 0; - padding-left: 0; - border-bottom: var(--bs-nav-underline-border-width) solid transparent; } - .nav-underline .nav-link:hover, .nav-underline .nav-link:focus { - border-bottom-color: currentcolor; } - .nav-underline .nav-link.active, - .nav-underline .show > .nav-link { - font-weight: 700; - color: var(--bs-nav-underline-link-active-color); - border-bottom-color: currentcolor; } - -.nav-fill > .nav-link, -.nav-fill .nav-item { - flex: 1 1 auto; - text-align: center; } - -.nav-justified > .nav-link, -.nav-justified .nav-item { - flex-basis: 0; - flex-grow: 1; - text-align: center; } - -.nav-fill .nav-item .nav-link, -.nav-justified .nav-item .nav-link { - width: 100%; } - -.tab-content > .tab-pane { - display: none; } - -.tab-content > .active { - display: block; } - -.navbar { - --bs-navbar-padding-x: 0; - --bs-navbar-padding-y: 0.5rem; - --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65); - --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8); - --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3); - --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1); - --bs-navbar-brand-padding-y: 0.3125rem; - --bs-navbar-brand-margin-end: 1rem; - --bs-navbar-brand-font-size: 1.25rem; - --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1); - --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1); - --bs-navbar-nav-link-padding-x: 0.5rem; - --bs-navbar-toggler-padding-y: 0.25rem; - --bs-navbar-toggler-padding-x: 0.75rem; - --bs-navbar-toggler-font-size: 1.25rem; - --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); - --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15); - --bs-navbar-toggler-border-radius: var(--bs-border-radius); - --bs-navbar-toggler-focus-width: 0.25rem; - --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; - position: relative; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); } - .navbar > .container, - .navbar > .container-fluid, - .navbar > .container-sm, - .navbar > .container-md, - .navbar > .container-lg, - .navbar > .container-xl, - .navbar > .container-xxl { - display: flex; - flex-wrap: inherit; - align-items: center; - justify-content: space-between; } - -.navbar-brand { - padding-top: var(--bs-navbar-brand-padding-y); - padding-bottom: var(--bs-navbar-brand-padding-y); - margin-right: var(--bs-navbar-brand-margin-end); - font-size: var(--bs-navbar-brand-font-size); - color: var(--bs-navbar-brand-color); - text-decoration: none; - white-space: nowrap; } - .navbar-brand:hover, .navbar-brand:focus { - color: var(--bs-navbar-brand-hover-color); } - -.navbar-nav { - --bs-nav-link-padding-x: 0; - --bs-nav-link-padding-y: 0.5rem; - --bs-nav-link-font-weight: ; - --bs-nav-link-color: var(--bs-navbar-color); - --bs-nav-link-hover-color: var(--bs-navbar-hover-color); - --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none; } - .navbar-nav .nav-link.active, .navbar-nav .nav-link.show { - color: var(--bs-navbar-active-color); } - .navbar-nav .dropdown-menu { - position: static; } - -.navbar-text { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - color: var(--bs-navbar-color); } - .navbar-text a, - .navbar-text a:hover, - .navbar-text a:focus { - color: var(--bs-navbar-active-color); } - -.navbar-collapse { - flex-basis: 100%; - flex-grow: 1; - align-items: center; } - -.navbar-toggler { - padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x); - font-size: var(--bs-navbar-toggler-font-size); - line-height: 1; - color: var(--bs-navbar-color); - background-color: transparent; - border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); - border-radius: var(--bs-navbar-toggler-border-radius); - transition: var(--bs-navbar-toggler-transition); } - @media (prefers-reduced-motion: reduce) { - .navbar-toggler { - transition: none; } } - .navbar-toggler:hover { - text-decoration: none; } - .navbar-toggler:focus { - text-decoration: none; - outline: 0; - box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width); } - -.navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - background-image: var(--bs-navbar-toggler-icon-bg); - background-repeat: no-repeat; - background-position: center; - background-size: 100%; } - -.navbar-nav-scroll { - max-height: var(--bs-scroll-height, 75vh); - overflow-y: auto; } - -@media (min-width: 576px) { - .navbar-expand-sm { - flex-wrap: nowrap; - justify-content: flex-start; } - .navbar-expand-sm .navbar-nav { - flex-direction: row; } - .navbar-expand-sm .navbar-nav .dropdown-menu { - position: absolute; } - .navbar-expand-sm .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); } - .navbar-expand-sm .navbar-nav-scroll { - overflow: visible; } - .navbar-expand-sm .navbar-collapse { - display: flex !important; - flex-basis: auto; } - .navbar-expand-sm .navbar-toggler { - display: none; } - .navbar-expand-sm .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; } - .navbar-expand-sm .offcanvas .offcanvas-header { - display: none; } - .navbar-expand-sm .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; } } - -@media (min-width: 768px) { - .navbar-expand-md { - flex-wrap: nowrap; - justify-content: flex-start; } - .navbar-expand-md .navbar-nav { - flex-direction: row; } - .navbar-expand-md .navbar-nav .dropdown-menu { - position: absolute; } - .navbar-expand-md .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); } - .navbar-expand-md .navbar-nav-scroll { - overflow: visible; } - .navbar-expand-md .navbar-collapse { - display: flex !important; - flex-basis: auto; } - .navbar-expand-md .navbar-toggler { - display: none; } - .navbar-expand-md .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; } - .navbar-expand-md .offcanvas .offcanvas-header { - display: none; } - .navbar-expand-md .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; } } - -@media (min-width: 992px) { - .navbar-expand-lg { - flex-wrap: nowrap; - justify-content: flex-start; } - .navbar-expand-lg .navbar-nav { - flex-direction: row; } - .navbar-expand-lg .navbar-nav .dropdown-menu { - position: absolute; } - .navbar-expand-lg .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); } - .navbar-expand-lg .navbar-nav-scroll { - overflow: visible; } - .navbar-expand-lg .navbar-collapse { - display: flex !important; - flex-basis: auto; } - .navbar-expand-lg .navbar-toggler { - display: none; } - .navbar-expand-lg .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; } - .navbar-expand-lg .offcanvas .offcanvas-header { - display: none; } - .navbar-expand-lg .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; } } - -@media (min-width: 1200px) { - .navbar-expand-xl { - flex-wrap: nowrap; - justify-content: flex-start; } - .navbar-expand-xl .navbar-nav { - flex-direction: row; } - .navbar-expand-xl .navbar-nav .dropdown-menu { - position: absolute; } - .navbar-expand-xl .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); } - .navbar-expand-xl .navbar-nav-scroll { - overflow: visible; } - .navbar-expand-xl .navbar-collapse { - display: flex !important; - flex-basis: auto; } - .navbar-expand-xl .navbar-toggler { - display: none; } - .navbar-expand-xl .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; } - .navbar-expand-xl .offcanvas .offcanvas-header { - display: none; } - .navbar-expand-xl .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; } } - -@media (min-width: 1400px) { - .navbar-expand-xxl { - flex-wrap: nowrap; - justify-content: flex-start; } - .navbar-expand-xxl .navbar-nav { - flex-direction: row; } - .navbar-expand-xxl .navbar-nav .dropdown-menu { - position: absolute; } - .navbar-expand-xxl .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); } - .navbar-expand-xxl .navbar-nav-scroll { - overflow: visible; } - .navbar-expand-xxl .navbar-collapse { - display: flex !important; - flex-basis: auto; } - .navbar-expand-xxl .navbar-toggler { - display: none; } - .navbar-expand-xxl .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; } - .navbar-expand-xxl .offcanvas .offcanvas-header { - display: none; } - .navbar-expand-xxl .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; } } - -.navbar-expand { - flex-wrap: nowrap; - justify-content: flex-start; } - .navbar-expand .navbar-nav { - flex-direction: row; } - .navbar-expand .navbar-nav .dropdown-menu { - position: absolute; } - .navbar-expand .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); } - .navbar-expand .navbar-nav-scroll { - overflow: visible; } - .navbar-expand .navbar-collapse { - display: flex !important; - flex-basis: auto; } - .navbar-expand .navbar-toggler { - display: none; } - .navbar-expand .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; } - .navbar-expand .offcanvas .offcanvas-header { - display: none; } - .navbar-expand .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; } - -.navbar-dark, -.navbar[data-bs-theme="dark"] { - --bs-navbar-color: rgba(255, 255, 255, 0.55); - --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); - --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); - --bs-navbar-active-color: #fff; - --bs-navbar-brand-color: #fff; - --bs-navbar-brand-hover-color: #fff; - --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); - --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } - -[data-bs-theme="dark"] .navbar-toggler-icon { - --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } - -.card { - --bs-card-spacer-y: 1rem; - --bs-card-spacer-x: 1rem; - --bs-card-title-spacer-y: 0.5rem; - --bs-card-title-color: ; - --bs-card-subtitle-color: ; - --bs-card-border-width: var(--bs-border-width); - --bs-card-border-color: var(--bs-border-color-translucent); - --bs-card-border-radius: var(--bs-border-radius); - --bs-card-box-shadow: ; - --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); - --bs-card-cap-padding-y: 0.5rem; - --bs-card-cap-padding-x: 1rem; - --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03); - --bs-card-cap-color: ; - --bs-card-height: ; - --bs-card-color: ; - --bs-card-bg: var(--bs-body-bg); - --bs-card-img-overlay-padding: 1rem; - --bs-card-group-margin: 0.75rem; - position: relative; - display: flex; - flex-direction: column; - min-width: 0; - height: var(--bs-card-height); - color: var(--bs-body-color); - word-wrap: break-word; - background-color: var(--bs-card-bg); - background-clip: border-box; - border: var(--bs-card-border-width) solid var(--bs-card-border-color); - border-radius: var(--bs-card-border-radius); } - .card > hr { - margin-right: 0; - margin-left: 0; } - .card > .list-group { - border-top: inherit; - border-bottom: inherit; } - .card > .list-group:first-child { - border-top-width: 0; - border-top-left-radius: var(--bs-card-inner-border-radius); - border-top-right-radius: var(--bs-card-inner-border-radius); } - .card > .list-group:last-child { - border-bottom-width: 0; - border-bottom-right-radius: var(--bs-card-inner-border-radius); - border-bottom-left-radius: var(--bs-card-inner-border-radius); } - .card > .card-header + .list-group, - .card > .list-group + .card-footer { - border-top: 0; } - -.card-body { - flex: 1 1 auto; - padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x); - color: var(--bs-card-color); } - -.card-title { - margin-bottom: var(--bs-card-title-spacer-y); - color: var(--bs-card-title-color); } - -.card-subtitle { - margin-top: calc(-.5 * var(--bs-card-title-spacer-y)); - margin-bottom: 0; - color: var(--bs-card-subtitle-color); } - -.card-text:last-child { - margin-bottom: 0; } - -.card-link + .card-link { - margin-left: var(--bs-card-spacer-x); } - -.card-header { - padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); - margin-bottom: 0; - color: var(--bs-card-cap-color); - background-color: var(--bs-card-cap-bg); - border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); } - .card-header:first-child { - border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0; } - -.card-footer { - padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); - color: var(--bs-card-cap-color); - background-color: var(--bs-card-cap-bg); - border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); } - .card-footer:last-child { - border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius); } - -.card-header-tabs { - margin-right: calc(-.5 * var(--bs-card-cap-padding-x)); - margin-bottom: calc(-1 * var(--bs-card-cap-padding-y)); - margin-left: calc(-.5 * var(--bs-card-cap-padding-x)); - border-bottom: 0; } - .card-header-tabs .nav-link.active { - background-color: var(--bs-card-bg); - border-bottom-color: var(--bs-card-bg); } - -.card-header-pills { - margin-right: calc(-.5 * var(--bs-card-cap-padding-x)); - margin-left: calc(-.5 * var(--bs-card-cap-padding-x)); } - -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--bs-card-img-overlay-padding); - border-radius: var(--bs-card-inner-border-radius); } - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; } - -.card-img, -.card-img-top { - border-top-left-radius: var(--bs-card-inner-border-radius); - border-top-right-radius: var(--bs-card-inner-border-radius); } - -.card-img, -.card-img-bottom { - border-bottom-right-radius: var(--bs-card-inner-border-radius); - border-bottom-left-radius: var(--bs-card-inner-border-radius); } - -.card-group > .card { - margin-bottom: var(--bs-card-group-margin); } - -@media (min-width: 576px) { - .card-group { - display: flex; - flex-flow: row wrap; } - .card-group > .card { - flex: 1 0 0%; - margin-bottom: 0; } - .card-group > .card + .card { - margin-left: 0; - border-left: 0; } - .card-group > .card:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; } - .card-group > .card:not(:last-child) .card-img-top, - .card-group > .card:not(:last-child) .card-header { - border-top-right-radius: 0; } - .card-group > .card:not(:last-child) .card-img-bottom, - .card-group > .card:not(:last-child) .card-footer { - border-bottom-right-radius: 0; } - .card-group > .card:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; } - .card-group > .card:not(:first-child) .card-img-top, - .card-group > .card:not(:first-child) .card-header { - border-top-left-radius: 0; } - .card-group > .card:not(:first-child) .card-img-bottom, - .card-group > .card:not(:first-child) .card-footer { - border-bottom-left-radius: 0; } } - -.accordion { - --bs-accordion-color: var(--bs-body-color); - --bs-accordion-bg: var(--bs-body-bg); - --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; - --bs-accordion-border-color: var(--bs-border-color); - --bs-accordion-border-width: var(--bs-border-width); - --bs-accordion-border-radius: var(--bs-border-radius); - --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); - --bs-accordion-btn-padding-x: 1.25rem; - --bs-accordion-btn-padding-y: 1rem; - --bs-accordion-btn-color: var(--bs-body-color); - --bs-accordion-btn-bg: var(--bs-accordion-bg); - --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e"); - --bs-accordion-btn-icon-width: 1.25rem; - --bs-accordion-btn-icon-transform: rotate(-180deg); - --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; - --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e"); - --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); - --bs-accordion-body-padding-x: 1.25rem; - --bs-accordion-body-padding-y: 1rem; - --bs-accordion-active-color: var(--bs-primary-text-emphasis); - --bs-accordion-active-bg: var(--bs-primary-bg-subtle); } - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); - font-size: 1rem; - color: var(--bs-accordion-btn-color); - text-align: left; - background-color: var(--bs-accordion-btn-bg); - border: 0; - border-radius: 0; - overflow-anchor: none; - transition: var(--bs-accordion-transition); } - @media (prefers-reduced-motion: reduce) { - .accordion-button { - transition: none; } } - .accordion-button:not(.collapsed) { - color: var(--bs-accordion-active-color); - background-color: var(--bs-accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color); } - .accordion-button:not(.collapsed)::after { - background-image: var(--bs-accordion-btn-active-icon); - transform: var(--bs-accordion-btn-icon-transform); } - .accordion-button::after { - flex-shrink: 0; - width: var(--bs-accordion-btn-icon-width); - height: var(--bs-accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--bs-accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--bs-accordion-btn-icon-width); - transition: var(--bs-accordion-btn-icon-transition); } - @media (prefers-reduced-motion: reduce) { - .accordion-button::after { - transition: none; } } - .accordion-button:hover { - z-index: 2; } - .accordion-button:focus { - z-index: 3; - outline: 0; - box-shadow: var(--bs-accordion-btn-focus-box-shadow); } - -.accordion-header { - margin-bottom: 0; } - -.accordion-item { - color: var(--bs-accordion-color); - background-color: var(--bs-accordion-bg); - border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color); } - .accordion-item:first-of-type { - border-top-left-radius: var(--bs-accordion-border-radius); - border-top-right-radius: var(--bs-accordion-border-radius); } - .accordion-item:first-of-type > .accordion-header .accordion-button { - border-top-left-radius: var(--bs-accordion-inner-border-radius); - border-top-right-radius: var(--bs-accordion-inner-border-radius); } - .accordion-item:not(:first-of-type) { - border-top: 0; } - .accordion-item:last-of-type { - border-bottom-right-radius: var(--bs-accordion-border-radius); - border-bottom-left-radius: var(--bs-accordion-border-radius); } - .accordion-item:last-of-type > .accordion-header .accordion-button.collapsed { - border-bottom-right-radius: var(--bs-accordion-inner-border-radius); - border-bottom-left-radius: var(--bs-accordion-inner-border-radius); } - .accordion-item:last-of-type > .accordion-collapse { - border-bottom-right-radius: var(--bs-accordion-border-radius); - border-bottom-left-radius: var(--bs-accordion-border-radius); } - -.accordion-body { - padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x); } - -.accordion-flush > .accordion-item { - border-right: 0; - border-left: 0; - border-radius: 0; } - .accordion-flush > .accordion-item:first-child { - border-top: 0; } - .accordion-flush > .accordion-item:last-child { - border-bottom: 0; } - .accordion-flush > .accordion-item > .accordion-header .accordion-button, .accordion-flush > .accordion-item > .accordion-header .accordion-button.collapsed { - border-radius: 0; } - .accordion-flush > .accordion-item > .accordion-collapse { - border-radius: 0; } - -[data-bs-theme="dark"] .accordion-button::after { - --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); - --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); } - -.breadcrumb { - --bs-breadcrumb-padding-x: 0; - --bs-breadcrumb-padding-y: 0; - --bs-breadcrumb-margin-bottom: 1rem; - --bs-breadcrumb-bg: ; - --bs-breadcrumb-border-radius: ; - --bs-breadcrumb-divider-color: var(--bs-secondary-color); - --bs-breadcrumb-item-padding-x: 0.5rem; - --bs-breadcrumb-item-active-color: var(--bs-secondary-color); - display: flex; - flex-wrap: wrap; - padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); - margin-bottom: var(--bs-breadcrumb-margin-bottom); - font-size: var(--bs-breadcrumb-font-size); - list-style: none; - background-color: var(--bs-breadcrumb-bg); - border-radius: var(--bs-breadcrumb-border-radius); } - -.breadcrumb-item + .breadcrumb-item { - padding-left: var(--bs-breadcrumb-item-padding-x); } - .breadcrumb-item + .breadcrumb-item::before { - float: left; - padding-right: var(--bs-breadcrumb-item-padding-x); - color: var(--bs-breadcrumb-divider-color); - content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */; } - -.breadcrumb-item.active { - color: var(--bs-breadcrumb-item-active-color); } - -.pagination { - --bs-pagination-padding-x: 0.75rem; - --bs-pagination-padding-y: 0.375rem; - --bs-pagination-font-size: 1rem; - --bs-pagination-color: var(--bs-link-color); - --bs-pagination-bg: var(--bs-body-bg); - --bs-pagination-border-width: var(--bs-border-width); - --bs-pagination-border-color: var(--bs-border-color); - --bs-pagination-border-radius: var(--bs-border-radius); - --bs-pagination-hover-color: var(--bs-link-hover-color); - --bs-pagination-hover-bg: var(--bs-tertiary-bg); - --bs-pagination-hover-border-color: var(--bs-border-color); - --bs-pagination-focus-color: var(--bs-link-hover-color); - --bs-pagination-focus-bg: var(--bs-secondary-bg); - --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); - --bs-pagination-active-color: #fff; - --bs-pagination-active-bg: #0d6efd; - --bs-pagination-active-border-color: #0d6efd; - --bs-pagination-disabled-color: var(--bs-secondary-color); - --bs-pagination-disabled-bg: var(--bs-secondary-bg); - --bs-pagination-disabled-border-color: var(--bs-border-color); - display: flex; - padding-left: 0; - list-style: none; } - -.page-link { - position: relative; - display: block; - padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); - font-size: var(--bs-pagination-font-size); - color: var(--bs-pagination-color); - text-decoration: none; - background-color: var(--bs-pagination-bg); - border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color); - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .page-link { - transition: none; } } - .page-link:hover { - z-index: 2; - color: var(--bs-pagination-hover-color); - background-color: var(--bs-pagination-hover-bg); - border-color: var(--bs-pagination-hover-border-color); } - .page-link:focus { - z-index: 3; - color: var(--bs-pagination-focus-color); - background-color: var(--bs-pagination-focus-bg); - outline: 0; - box-shadow: var(--bs-pagination-focus-box-shadow); } - .page-link.active, .active > .page-link { - z-index: 3; - color: var(--bs-pagination-active-color); - background-color: var(--bs-pagination-active-bg); - border-color: var(--bs-pagination-active-border-color); } - .page-link.disabled, .disabled > .page-link { - color: var(--bs-pagination-disabled-color); - pointer-events: none; - background-color: var(--bs-pagination-disabled-bg); - border-color: var(--bs-pagination-disabled-border-color); } - -.page-item:not(:first-child) .page-link { - margin-left: calc(var(--bs-border-width) * -1); } - -.page-item:first-child .page-link { - border-top-left-radius: var(--bs-pagination-border-radius); - border-bottom-left-radius: var(--bs-pagination-border-radius); } - -.page-item:last-child .page-link { - border-top-right-radius: var(--bs-pagination-border-radius); - border-bottom-right-radius: var(--bs-pagination-border-radius); } - -.pagination-lg { - --bs-pagination-padding-x: 1.5rem; - --bs-pagination-padding-y: 0.75rem; - --bs-pagination-font-size: 1.25rem; - --bs-pagination-border-radius: var(--bs-border-radius-lg); } - -.pagination-sm { - --bs-pagination-padding-x: 0.5rem; - --bs-pagination-padding-y: 0.25rem; - --bs-pagination-font-size: 0.875rem; - --bs-pagination-border-radius: var(--bs-border-radius-sm); } - -.badge { - --bs-badge-padding-x: 0.65em; - --bs-badge-padding-y: 0.35em; - --bs-badge-font-size: 0.75em; - --bs-badge-font-weight: 700; - --bs-badge-color: #fff; - --bs-badge-border-radius: var(--bs-border-radius); - display: inline-block; - padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); - font-size: var(--bs-badge-font-size); - font-weight: var(--bs-badge-font-weight); - line-height: 1; - color: var(--bs-badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: var(--bs-badge-border-radius); } - .badge:empty { - display: none; } - -.btn .badge { - position: relative; - top: -1px; } - -.alert { - --bs-alert-bg: transparent; - --bs-alert-padding-x: 1rem; - --bs-alert-padding-y: 1rem; - --bs-alert-margin-bottom: 1rem; - --bs-alert-color: inherit; - --bs-alert-border-color: transparent; - --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color); - --bs-alert-border-radius: var(--bs-border-radius); - --bs-alert-link-color: inherit; - position: relative; - padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); - margin-bottom: var(--bs-alert-margin-bottom); - color: var(--bs-alert-color); - background-color: var(--bs-alert-bg); - border: var(--bs-alert-border); - border-radius: var(--bs-alert-border-radius); } - -.alert-heading { - color: inherit; } - -.alert-link { - font-weight: 700; - color: var(--bs-alert-link-color); } - -.alert-dismissible { - padding-right: 3rem; } - .alert-dismissible .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: 2; - padding: 1.25rem 1rem; } - -.alert-primary { - --bs-alert-color: var(--bs-primary-text-emphasis); - --bs-alert-bg: var(--bs-primary-bg-subtle); - --bs-alert-border-color: var(--bs-primary-border-subtle); - --bs-alert-link-color: var(--bs-primary-text-emphasis); } - -.alert-secondary { - --bs-alert-color: var(--bs-secondary-text-emphasis); - --bs-alert-bg: var(--bs-secondary-bg-subtle); - --bs-alert-border-color: var(--bs-secondary-border-subtle); - --bs-alert-link-color: var(--bs-secondary-text-emphasis); } - -.alert-success { - --bs-alert-color: var(--bs-success-text-emphasis); - --bs-alert-bg: var(--bs-success-bg-subtle); - --bs-alert-border-color: var(--bs-success-border-subtle); - --bs-alert-link-color: var(--bs-success-text-emphasis); } - -.alert-info { - --bs-alert-color: var(--bs-info-text-emphasis); - --bs-alert-bg: var(--bs-info-bg-subtle); - --bs-alert-border-color: var(--bs-info-border-subtle); - --bs-alert-link-color: var(--bs-info-text-emphasis); } - -.alert-warning { - --bs-alert-color: var(--bs-warning-text-emphasis); - --bs-alert-bg: var(--bs-warning-bg-subtle); - --bs-alert-border-color: var(--bs-warning-border-subtle); - --bs-alert-link-color: var(--bs-warning-text-emphasis); } - -.alert-danger { - --bs-alert-color: var(--bs-danger-text-emphasis); - --bs-alert-bg: var(--bs-danger-bg-subtle); - --bs-alert-border-color: var(--bs-danger-border-subtle); - --bs-alert-link-color: var(--bs-danger-text-emphasis); } - -.alert-light { - --bs-alert-color: var(--bs-light-text-emphasis); - --bs-alert-bg: var(--bs-light-bg-subtle); - --bs-alert-border-color: var(--bs-light-border-subtle); - --bs-alert-link-color: var(--bs-light-text-emphasis); } - -.alert-dark { - --bs-alert-color: var(--bs-dark-text-emphasis); - --bs-alert-bg: var(--bs-dark-bg-subtle); - --bs-alert-border-color: var(--bs-dark-border-subtle); - --bs-alert-link-color: var(--bs-dark-text-emphasis); } - -@keyframes progress-bar-stripes { - 0% { - background-position-x: 1rem; } } - -.progress, -.progress-stacked { - --bs-progress-height: 1rem; - --bs-progress-font-size: 0.75rem; - --bs-progress-bg: var(--bs-secondary-bg); - --bs-progress-border-radius: var(--bs-border-radius); - --bs-progress-box-shadow: var(--bs-box-shadow-inset); - --bs-progress-bar-color: #fff; - --bs-progress-bar-bg: #0d6efd; - --bs-progress-bar-transition: width 0.6s ease; - display: flex; - height: var(--bs-progress-height); - overflow: hidden; - font-size: var(--bs-progress-font-size); - background-color: var(--bs-progress-bg); - border-radius: var(--bs-progress-border-radius); } - -.progress-bar { - display: flex; - flex-direction: column; - justify-content: center; - overflow: hidden; - color: var(--bs-progress-bar-color); - text-align: center; - white-space: nowrap; - background-color: var(--bs-progress-bar-bg); - transition: var(--bs-progress-bar-transition); } - @media (prefers-reduced-motion: reduce) { - .progress-bar { - transition: none; } } -.progress-bar-striped { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: var(--bs-progress-height) var(--bs-progress-height); } - -.progress-stacked > .progress { - overflow: visible; } - -.progress-stacked > .progress > .progress-bar { - width: 100%; } - -.progress-bar-animated { - animation: 1s linear infinite progress-bar-stripes; } - @media (prefers-reduced-motion: reduce) { - .progress-bar-animated { - animation: none; } } -.list-group { - --bs-list-group-color: var(--bs-body-color); - --bs-list-group-bg: var(--bs-body-bg); - --bs-list-group-border-color: var(--bs-border-color); - --bs-list-group-border-width: var(--bs-border-width); - --bs-list-group-border-radius: var(--bs-border-radius); - --bs-list-group-item-padding-x: 1rem; - --bs-list-group-item-padding-y: 0.5rem; - --bs-list-group-action-color: var(--bs-secondary-color); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-tertiary-bg); - --bs-list-group-action-active-color: var(--bs-body-color); - --bs-list-group-action-active-bg: var(--bs-secondary-bg); - --bs-list-group-disabled-color: var(--bs-secondary-color); - --bs-list-group-disabled-bg: var(--bs-body-bg); - --bs-list-group-active-color: #fff; - --bs-list-group-active-bg: #0d6efd; - --bs-list-group-active-border-color: #0d6efd; - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - border-radius: var(--bs-list-group-border-radius); } - -.list-group-numbered { - list-style-type: none; - counter-reset: section; } - .list-group-numbered > .list-group-item::before { - content: counters(section, ".") ". "; - counter-increment: section; } - -.list-group-item-action { - width: 100%; - color: var(--bs-list-group-action-color); - text-align: inherit; } - .list-group-item-action:hover, .list-group-item-action:focus { - z-index: 1; - color: var(--bs-list-group-action-hover-color); - text-decoration: none; - background-color: var(--bs-list-group-action-hover-bg); } - .list-group-item-action:active { - color: var(--bs-list-group-action-active-color); - background-color: var(--bs-list-group-action-active-bg); } - -.list-group-item { - position: relative; - display: block; - padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x); - color: var(--bs-list-group-color); - text-decoration: none; - background-color: var(--bs-list-group-bg); - border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color); } - .list-group-item:first-child { - border-top-left-radius: inherit; - border-top-right-radius: inherit; } - .list-group-item:last-child { - border-bottom-right-radius: inherit; - border-bottom-left-radius: inherit; } - .list-group-item.disabled, .list-group-item:disabled { - color: var(--bs-list-group-disabled-color); - pointer-events: none; - background-color: var(--bs-list-group-disabled-bg); } - .list-group-item.active { - z-index: 2; - color: var(--bs-list-group-active-color); - background-color: var(--bs-list-group-active-bg); - border-color: var(--bs-list-group-active-border-color); } - .list-group-item + .list-group-item { - border-top-width: 0; } - .list-group-item + .list-group-item.active { - margin-top: calc(-1 * var(--bs-list-group-border-width)); - border-top-width: var(--bs-list-group-border-width); } - -.list-group-horizontal { - flex-direction: row; } - .list-group-horizontal > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; } - .list-group-horizontal > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; } - .list-group-horizontal > .list-group-item.active { - margin-top: 0; } - .list-group-horizontal > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; } - .list-group-horizontal > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); } - -@media (min-width: 576px) { - .list-group-horizontal-sm { - flex-direction: row; } - .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; } - .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; } - .list-group-horizontal-sm > .list-group-item.active { - margin-top: 0; } - .list-group-horizontal-sm > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; } - .list-group-horizontal-sm > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); } } - -@media (min-width: 768px) { - .list-group-horizontal-md { - flex-direction: row; } - .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; } - .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; } - .list-group-horizontal-md > .list-group-item.active { - margin-top: 0; } - .list-group-horizontal-md > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; } - .list-group-horizontal-md > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); } } - -@media (min-width: 992px) { - .list-group-horizontal-lg { - flex-direction: row; } - .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; } - .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; } - .list-group-horizontal-lg > .list-group-item.active { - margin-top: 0; } - .list-group-horizontal-lg > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; } - .list-group-horizontal-lg > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); } } - -@media (min-width: 1200px) { - .list-group-horizontal-xl { - flex-direction: row; } - .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; } - .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; } - .list-group-horizontal-xl > .list-group-item.active { - margin-top: 0; } - .list-group-horizontal-xl > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; } - .list-group-horizontal-xl > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); } } - -@media (min-width: 1400px) { - .list-group-horizontal-xxl { - flex-direction: row; } - .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; } - .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; } - .list-group-horizontal-xxl > .list-group-item.active { - margin-top: 0; } - .list-group-horizontal-xxl > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; } - .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); } } - -.list-group-flush { - border-radius: 0; } - .list-group-flush > .list-group-item { - border-width: 0 0 var(--bs-list-group-border-width); } - .list-group-flush > .list-group-item:last-child { - border-bottom-width: 0; } - -.list-group-item-primary { - --bs-list-group-color: var(--bs-primary-text-emphasis); - --bs-list-group-bg: var(--bs-primary-bg-subtle); - --bs-list-group-border-color: var(--bs-primary-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-primary-border-subtle); - --bs-list-group-active-color: var(--bs-primary-bg-subtle); - --bs-list-group-active-bg: var(--bs-primary-text-emphasis); - --bs-list-group-active-border-color: var(--bs-primary-text-emphasis); } - -.list-group-item-secondary { - --bs-list-group-color: var(--bs-secondary-text-emphasis); - --bs-list-group-bg: var(--bs-secondary-bg-subtle); - --bs-list-group-border-color: var(--bs-secondary-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle); - --bs-list-group-active-color: var(--bs-secondary-bg-subtle); - --bs-list-group-active-bg: var(--bs-secondary-text-emphasis); - --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis); } - -.list-group-item-success { - --bs-list-group-color: var(--bs-success-text-emphasis); - --bs-list-group-bg: var(--bs-success-bg-subtle); - --bs-list-group-border-color: var(--bs-success-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-success-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-success-border-subtle); - --bs-list-group-active-color: var(--bs-success-bg-subtle); - --bs-list-group-active-bg: var(--bs-success-text-emphasis); - --bs-list-group-active-border-color: var(--bs-success-text-emphasis); } - -.list-group-item-info { - --bs-list-group-color: var(--bs-info-text-emphasis); - --bs-list-group-bg: var(--bs-info-bg-subtle); - --bs-list-group-border-color: var(--bs-info-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-info-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-info-border-subtle); - --bs-list-group-active-color: var(--bs-info-bg-subtle); - --bs-list-group-active-bg: var(--bs-info-text-emphasis); - --bs-list-group-active-border-color: var(--bs-info-text-emphasis); } - -.list-group-item-warning { - --bs-list-group-color: var(--bs-warning-text-emphasis); - --bs-list-group-bg: var(--bs-warning-bg-subtle); - --bs-list-group-border-color: var(--bs-warning-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-warning-border-subtle); - --bs-list-group-active-color: var(--bs-warning-bg-subtle); - --bs-list-group-active-bg: var(--bs-warning-text-emphasis); - --bs-list-group-active-border-color: var(--bs-warning-text-emphasis); } - -.list-group-item-danger { - --bs-list-group-color: var(--bs-danger-text-emphasis); - --bs-list-group-bg: var(--bs-danger-bg-subtle); - --bs-list-group-border-color: var(--bs-danger-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-danger-border-subtle); - --bs-list-group-active-color: var(--bs-danger-bg-subtle); - --bs-list-group-active-bg: var(--bs-danger-text-emphasis); - --bs-list-group-active-border-color: var(--bs-danger-text-emphasis); } - -.list-group-item-light { - --bs-list-group-color: var(--bs-light-text-emphasis); - --bs-list-group-bg: var(--bs-light-bg-subtle); - --bs-list-group-border-color: var(--bs-light-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-light-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-light-border-subtle); - --bs-list-group-active-color: var(--bs-light-bg-subtle); - --bs-list-group-active-bg: var(--bs-light-text-emphasis); - --bs-list-group-active-border-color: var(--bs-light-text-emphasis); } - -.list-group-item-dark { - --bs-list-group-color: var(--bs-dark-text-emphasis); - --bs-list-group-bg: var(--bs-dark-bg-subtle); - --bs-list-group-border-color: var(--bs-dark-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-dark-border-subtle); - --bs-list-group-active-color: var(--bs-dark-bg-subtle); - --bs-list-group-active-bg: var(--bs-dark-text-emphasis); - --bs-list-group-active-border-color: var(--bs-dark-text-emphasis); } - -.btn-close { - --bs-btn-close-color: #000; - --bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e"); - --bs-btn-close-opacity: 0.5; - --bs-btn-close-hover-opacity: 0.75; - --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); - --bs-btn-close-focus-opacity: 1; - --bs-btn-close-disabled-opacity: 0.25; - --bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%); - box-sizing: content-box; - width: 1em; - height: 1em; - padding: 0.25em 0.25em; - color: var(--bs-btn-close-color); - background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat; - border: 0; - border-radius: 0.375rem; - opacity: var(--bs-btn-close-opacity); } - .btn-close:hover { - color: var(--bs-btn-close-color); - text-decoration: none; - opacity: var(--bs-btn-close-hover-opacity); } - .btn-close:focus { - outline: 0; - box-shadow: var(--bs-btn-close-focus-shadow); - opacity: var(--bs-btn-close-focus-opacity); } - .btn-close:disabled, .btn-close.disabled { - pointer-events: none; - user-select: none; - opacity: var(--bs-btn-close-disabled-opacity); } - -.btn-close-white { - filter: var(--bs-btn-close-white-filter); } - -[data-bs-theme="dark"] .btn-close { - filter: var(--bs-btn-close-white-filter); } - -.toast { - --bs-toast-zindex: 1090; - --bs-toast-padding-x: 0.75rem; - --bs-toast-padding-y: 0.5rem; - --bs-toast-spacing: 1.5rem; - --bs-toast-max-width: 350px; - --bs-toast-font-size: 0.875rem; - --bs-toast-color: ; - --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85); - --bs-toast-border-width: var(--bs-border-width); - --bs-toast-border-color: var(--bs-border-color-translucent); - --bs-toast-border-radius: var(--bs-border-radius); - --bs-toast-box-shadow: var(--bs-box-shadow); - --bs-toast-header-color: var(--bs-secondary-color); - --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85); - --bs-toast-header-border-color: var(--bs-border-color-translucent); - width: var(--bs-toast-max-width); - max-width: 100%; - font-size: var(--bs-toast-font-size); - color: var(--bs-toast-color); - pointer-events: auto; - background-color: var(--bs-toast-bg); - background-clip: padding-box; - border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); - box-shadow: var(--bs-toast-box-shadow); - border-radius: var(--bs-toast-border-radius); } - .toast.showing { - opacity: 0; } - .toast:not(.show) { - display: none; } - -.toast-container { - --bs-toast-zindex: 1090; - position: absolute; - z-index: var(--bs-toast-zindex); - width: max-content; - max-width: 100%; - pointer-events: none; } - .toast-container > :not(:last-child) { - margin-bottom: var(--bs-toast-spacing); } - -.toast-header { - display: flex; - align-items: center; - padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); - color: var(--bs-toast-header-color); - background-color: var(--bs-toast-header-bg); - background-clip: padding-box; - border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color); - border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); - border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); } - .toast-header .btn-close { - margin-right: calc(-.5 * var(--bs-toast-padding-x)); - margin-left: var(--bs-toast-padding-x); } - -.toast-body { - padding: var(--bs-toast-padding-x); - word-wrap: break-word; } - -.modal { - --bs-modal-zindex: 1055; - --bs-modal-width: 500px; - --bs-modal-padding: 1rem; - --bs-modal-margin: 0.5rem; - --bs-modal-color: ; - --bs-modal-bg: var(--bs-body-bg); - --bs-modal-border-color: var(--bs-border-color-translucent); - --bs-modal-border-width: var(--bs-border-width); - --bs-modal-border-radius: var(--bs-border-radius-lg); - --bs-modal-box-shadow: var(--bs-box-shadow-sm); - --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width))); - --bs-modal-header-padding-x: 1rem; - --bs-modal-header-padding-y: 1rem; - --bs-modal-header-padding: 1rem 1rem; - --bs-modal-header-border-color: var(--bs-border-color); - --bs-modal-header-border-width: var(--bs-border-width); - --bs-modal-title-line-height: 1.5; - --bs-modal-footer-gap: 0.5rem; - --bs-modal-footer-bg: ; - --bs-modal-footer-border-color: var(--bs-border-color); - --bs-modal-footer-border-width: var(--bs-border-width); - position: fixed; - top: 0; - left: 0; - z-index: var(--bs-modal-zindex); - display: none; - width: 100%; - height: 100%; - overflow-x: hidden; - overflow-y: auto; - outline: 0; } - -.modal-dialog { - position: relative; - width: auto; - margin: var(--bs-modal-margin); - pointer-events: none; } - .modal.fade .modal-dialog { - transition: transform 0.3s ease-out; - transform: translate(0, -50px); } - @media (prefers-reduced-motion: reduce) { - .modal.fade .modal-dialog { - transition: none; } } - .modal.show .modal-dialog { - transform: none; } - .modal.modal-static .modal-dialog { - transform: scale(1.02); } - -.modal-dialog-scrollable { - height: calc(100% - var(--bs-modal-margin) * 2); } - .modal-dialog-scrollable .modal-content { - max-height: 100%; - overflow: hidden; } - .modal-dialog-scrollable .modal-body { - overflow-y: auto; } - -.modal-dialog-centered { - display: flex; - align-items: center; - min-height: calc(100% - var(--bs-modal-margin) * 2); } - -.modal-content { - position: relative; - display: flex; - flex-direction: column; - width: 100%; - color: var(--bs-modal-color); - pointer-events: auto; - background-color: var(--bs-modal-bg); - background-clip: padding-box; - border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); - border-radius: var(--bs-modal-border-radius); - outline: 0; } - -.modal-backdrop { - --bs-backdrop-zindex: 1050; - --bs-backdrop-bg: #000; - --bs-backdrop-opacity: 0.5; - position: fixed; - top: 0; - left: 0; - z-index: var(--bs-backdrop-zindex); - width: 100vw; - height: 100vh; - background-color: var(--bs-backdrop-bg); } - .modal-backdrop.fade { - opacity: 0; } - .modal-backdrop.show { - opacity: var(--bs-backdrop-opacity); } - -.modal-header { - display: flex; - flex-shrink: 0; - align-items: center; - padding: var(--bs-modal-header-padding); - border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color); - border-top-left-radius: var(--bs-modal-inner-border-radius); - border-top-right-radius: var(--bs-modal-inner-border-radius); } - .modal-header .btn-close { - padding: calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5); - margin: calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto; } - -.modal-title { - margin-bottom: 0; - line-height: var(--bs-modal-title-line-height); } - -.modal-body { - position: relative; - flex: 1 1 auto; - padding: var(--bs-modal-padding); } - -.modal-footer { - display: flex; - flex-shrink: 0; - flex-wrap: wrap; - align-items: center; - justify-content: flex-end; - padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5); - background-color: var(--bs-modal-footer-bg); - border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color); - border-bottom-right-radius: var(--bs-modal-inner-border-radius); - border-bottom-left-radius: var(--bs-modal-inner-border-radius); } - .modal-footer > * { - margin: calc(var(--bs-modal-footer-gap) * .5); } - -@media (min-width: 576px) { - .modal { - --bs-modal-margin: 1.75rem; - --bs-modal-box-shadow: var(--bs-box-shadow); } - .modal-dialog { - max-width: var(--bs-modal-width); - margin-right: auto; - margin-left: auto; } - .modal-sm { - --bs-modal-width: 300px; } } - -@media (min-width: 992px) { - .modal-lg, - .modal-xl { - --bs-modal-width: 800px; } } - -@media (min-width: 1200px) { - .modal-xl { - --bs-modal-width: 1140px; } } - -.modal-fullscreen { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; } - .modal-fullscreen .modal-content { - height: 100%; - border: 0; - border-radius: 0; } - .modal-fullscreen .modal-header, - .modal-fullscreen .modal-footer { - border-radius: 0; } - .modal-fullscreen .modal-body { - overflow-y: auto; } - -@media (max-width: 575.98px) { - .modal-fullscreen-sm-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; } - .modal-fullscreen-sm-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; } - .modal-fullscreen-sm-down .modal-header, - .modal-fullscreen-sm-down .modal-footer { - border-radius: 0; } - .modal-fullscreen-sm-down .modal-body { - overflow-y: auto; } } - -@media (max-width: 767.98px) { - .modal-fullscreen-md-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; } - .modal-fullscreen-md-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; } - .modal-fullscreen-md-down .modal-header, - .modal-fullscreen-md-down .modal-footer { - border-radius: 0; } - .modal-fullscreen-md-down .modal-body { - overflow-y: auto; } } - -@media (max-width: 991.98px) { - .modal-fullscreen-lg-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; } - .modal-fullscreen-lg-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; } - .modal-fullscreen-lg-down .modal-header, - .modal-fullscreen-lg-down .modal-footer { - border-radius: 0; } - .modal-fullscreen-lg-down .modal-body { - overflow-y: auto; } } - -@media (max-width: 1199.98px) { - .modal-fullscreen-xl-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; } - .modal-fullscreen-xl-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; } - .modal-fullscreen-xl-down .modal-header, - .modal-fullscreen-xl-down .modal-footer { - border-radius: 0; } - .modal-fullscreen-xl-down .modal-body { - overflow-y: auto; } } - -@media (max-width: 1399.98px) { - .modal-fullscreen-xxl-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; } - .modal-fullscreen-xxl-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; } - .modal-fullscreen-xxl-down .modal-header, - .modal-fullscreen-xxl-down .modal-footer { - border-radius: 0; } - .modal-fullscreen-xxl-down .modal-body { - overflow-y: auto; } } - -.tooltip { - --bs-tooltip-zindex: 1080; - --bs-tooltip-max-width: 200px; - --bs-tooltip-padding-x: 0.5rem; - --bs-tooltip-padding-y: 0.25rem; - --bs-tooltip-margin: ; - --bs-tooltip-font-size: 0.875rem; - --bs-tooltip-color: var(--bs-body-bg); - --bs-tooltip-bg: var(--bs-emphasis-color); - --bs-tooltip-border-radius: var(--bs-border-radius); - --bs-tooltip-opacity: 0.9; - --bs-tooltip-arrow-width: 0.8rem; - --bs-tooltip-arrow-height: 0.4rem; - z-index: var(--bs-tooltip-zindex); - display: block; - margin: var(--bs-tooltip-margin); - font-family: var(--bs-font-sans-serif); - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - white-space: normal; - word-spacing: normal; - line-break: auto; - font-size: var(--bs-tooltip-font-size); - word-wrap: break-word; - opacity: 0; } - .tooltip.show { - opacity: var(--bs-tooltip-opacity); } - .tooltip .tooltip-arrow { - display: block; - width: var(--bs-tooltip-arrow-width); - height: var(--bs-tooltip-arrow-height); } - .tooltip .tooltip-arrow::before { - position: absolute; - content: ""; - border-color: transparent; - border-style: solid; } - -.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow { - bottom: calc(-1 * var(--bs-tooltip-arrow-height)); } - .bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before { - top: -1px; - border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0; - border-top-color: var(--bs-tooltip-bg); } - -/* rtl:begin:ignore */ -.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow { - left: calc(-1 * var(--bs-tooltip-arrow-height)); - width: var(--bs-tooltip-arrow-height); - height: var(--bs-tooltip-arrow-width); } - .bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before { - right: -1px; - border-width: calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0; - border-right-color: var(--bs-tooltip-bg); } - -/* rtl:end:ignore */ -.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow { - top: calc(-1 * var(--bs-tooltip-arrow-height)); } - .bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before { - bottom: -1px; - border-width: 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height); - border-bottom-color: var(--bs-tooltip-bg); } - -/* rtl:begin:ignore */ -.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow { - right: calc(-1 * var(--bs-tooltip-arrow-height)); - width: var(--bs-tooltip-arrow-height); - height: var(--bs-tooltip-arrow-width); } - .bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before { - left: -1px; - border-width: calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height); - border-left-color: var(--bs-tooltip-bg); } - -/* rtl:end:ignore */ -.tooltip-inner { - max-width: var(--bs-tooltip-max-width); - padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); - color: var(--bs-tooltip-color); - text-align: center; - background-color: var(--bs-tooltip-bg); - border-radius: var(--bs-tooltip-border-radius); } - -.popover { - --bs-popover-zindex: 1070; - --bs-popover-max-width: 276px; - --bs-popover-font-size: 0.875rem; - --bs-popover-bg: var(--bs-body-bg); - --bs-popover-border-width: var(--bs-border-width); - --bs-popover-border-color: var(--bs-border-color-translucent); - --bs-popover-border-radius: var(--bs-border-radius-lg); - --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width)); - --bs-popover-box-shadow: var(--bs-box-shadow); - --bs-popover-header-padding-x: 1rem; - --bs-popover-header-padding-y: 0.5rem; - --bs-popover-header-font-size: 1rem; - --bs-popover-header-color: inherit; - --bs-popover-header-bg: var(--bs-secondary-bg); - --bs-popover-body-padding-x: 1rem; - --bs-popover-body-padding-y: 1rem; - --bs-popover-body-color: var(--bs-body-color); - --bs-popover-arrow-width: 1rem; - --bs-popover-arrow-height: 0.5rem; - --bs-popover-arrow-border: var(--bs-popover-border-color); - z-index: var(--bs-popover-zindex); - display: block; - max-width: var(--bs-popover-max-width); - font-family: var(--bs-font-sans-serif); - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - white-space: normal; - word-spacing: normal; - line-break: auto; - font-size: var(--bs-popover-font-size); - word-wrap: break-word; - background-color: var(--bs-popover-bg); - background-clip: padding-box; - border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); - border-radius: var(--bs-popover-border-radius); } - .popover .popover-arrow { - display: block; - width: var(--bs-popover-arrow-width); - height: var(--bs-popover-arrow-height); } - .popover .popover-arrow::before, .popover .popover-arrow::after { - position: absolute; - display: block; - content: ""; - border-color: transparent; - border-style: solid; - border-width: 0; } - -.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^="top"] > .popover-arrow { - bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); } - .bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::after { - border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0; } - .bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::before { - bottom: 0; - border-top-color: var(--bs-popover-arrow-border); } - .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::after { - bottom: var(--bs-popover-border-width); - border-top-color: var(--bs-popover-bg); } - -/* rtl:begin:ignore */ -.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^="right"] > .popover-arrow { - left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); - width: var(--bs-popover-arrow-height); - height: var(--bs-popover-arrow-width); } - .bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::after { - border-width: calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0; } - .bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::before { - left: 0; - border-right-color: var(--bs-popover-arrow-border); } - .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::after { - left: var(--bs-popover-border-width); - border-right-color: var(--bs-popover-bg); } - -/* rtl:end:ignore */ -.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow { - top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); } - .bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::after { - border-width: 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height); } - .bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::before { - top: 0; - border-bottom-color: var(--bs-popover-arrow-border); } - .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::after { - top: var(--bs-popover-border-width); - border-bottom-color: var(--bs-popover-bg); } - -.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^="bottom"] .popover-header::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: var(--bs-popover-arrow-width); - margin-left: calc(-.5 * var(--bs-popover-arrow-width)); - content: ""; - border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg); } - -/* rtl:begin:ignore */ -.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^="left"] > .popover-arrow { - right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); - width: var(--bs-popover-arrow-height); - height: var(--bs-popover-arrow-width); } - .bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::after { - border-width: calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height); } - .bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::before { - right: 0; - border-left-color: var(--bs-popover-arrow-border); } - .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::after { - right: var(--bs-popover-border-width); - border-left-color: var(--bs-popover-bg); } - -/* rtl:end:ignore */ -.popover-header { - padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x); - margin-bottom: 0; - font-size: var(--bs-popover-header-font-size); - color: var(--bs-popover-header-color); - background-color: var(--bs-popover-header-bg); - border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color); - border-top-left-radius: var(--bs-popover-inner-border-radius); - border-top-right-radius: var(--bs-popover-inner-border-radius); } - .popover-header:empty { - display: none; } - -.popover-body { - padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x); - color: var(--bs-popover-body-color); } - -.carousel { - position: relative; } - -.carousel.pointer-event { - touch-action: pan-y; } - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; } - .carousel-inner::after { - display: block; - clear: both; - content: ""; } - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - transition: transform 0.6s ease-in-out; } - @media (prefers-reduced-motion: reduce) { - .carousel-item { - transition: none; } } -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; } - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); } - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); } - -.carousel-fade .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; } - -.carousel-fade .carousel-item.active, -.carousel-fade .carousel-item-next.carousel-item-start, -.carousel-fade .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; } - -.carousel-fade .active.carousel-item-start, -.carousel-fade .active.carousel-item-end { - z-index: 0; - opacity: 0; - transition: opacity 0s 0.6s; } - @media (prefers-reduced-motion: reduce) { - .carousel-fade .active.carousel-item-start, - .carousel-fade .active.carousel-item-end { - transition: none; } } -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - display: flex; - align-items: center; - justify-content: center; - width: 15%; - padding: 0; - color: #fff; - text-align: center; - background: none; - border: 0; - opacity: 0.5; - transition: opacity 0.15s ease; } - @media (prefers-reduced-motion: reduce) { - .carousel-control-prev, - .carousel-control-next { - transition: none; } } - .carousel-control-prev:hover, .carousel-control-prev:focus, - .carousel-control-next:hover, - .carousel-control-next:focus { - color: #fff; - text-decoration: none; - outline: 0; - opacity: 0.9; } - -.carousel-control-prev { - left: 0; } - -.carousel-control-next { - right: 0; } - -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: 2rem; - height: 2rem; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; } - -.carousel-control-prev-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")*/; } - -.carousel-control-next-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")*/; } - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - margin-right: 15%; - margin-bottom: 1rem; - margin-left: 15%; } - .carousel-indicators [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: 30px; - height: 3px; - padding: 0; - margin-right: 3px; - margin-left: 3px; - text-indent: -999px; - cursor: pointer; - background-color: #fff; - background-clip: padding-box; - border: 0; - border-top: 10px solid transparent; - border-bottom: 10px solid transparent; - opacity: 0.5; - transition: opacity 0.6s ease; } - @media (prefers-reduced-motion: reduce) { - .carousel-indicators [data-bs-target] { - transition: none; } } - .carousel-indicators .active { - opacity: 1; } - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 1.25rem; - left: 15%; - padding-top: 1.25rem; - padding-bottom: 1.25rem; - color: #fff; - text-align: center; } - -.carousel-dark .carousel-control-prev-icon, -.carousel-dark .carousel-control-next-icon { - filter: invert(1) grayscale(100); } - -.carousel-dark .carousel-indicators [data-bs-target] { - background-color: #000; } - -.carousel-dark .carousel-caption { - color: #000; } - -[data-bs-theme="dark"] .carousel .carousel-control-prev-icon, -[data-bs-theme="dark"] .carousel .carousel-control-next-icon, [data-bs-theme="dark"].carousel .carousel-control-prev-icon, -[data-bs-theme="dark"].carousel .carousel-control-next-icon { - filter: invert(1) grayscale(100); } - -[data-bs-theme="dark"] .carousel .carousel-indicators [data-bs-target], [data-bs-theme="dark"].carousel .carousel-indicators [data-bs-target] { - background-color: #000; } - -[data-bs-theme="dark"] .carousel .carousel-caption, [data-bs-theme="dark"].carousel .carousel-caption { - color: #000; } - -.spinner-grow, -.spinner-border { - display: inline-block; - width: var(--bs-spinner-width); - height: var(--bs-spinner-height); - vertical-align: var(--bs-spinner-vertical-align); - border-radius: 50%; - animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name); } - -@keyframes spinner-border { - to { - transform: rotate(360deg) /* rtl:ignore */; } } - -.spinner-border { - --bs-spinner-width: 2rem; - --bs-spinner-height: 2rem; - --bs-spinner-vertical-align: -0.125em; - --bs-spinner-border-width: 0.25em; - --bs-spinner-animation-speed: 0.75s; - --bs-spinner-animation-name: spinner-border; - border: var(--bs-spinner-border-width) solid currentcolor; - border-right-color: transparent; } - -.spinner-border-sm { - --bs-spinner-width: 1rem; - --bs-spinner-height: 1rem; - --bs-spinner-border-width: 0.2em; } - -@keyframes spinner-grow { - 0% { - transform: scale(0); } - 50% { - opacity: 1; - transform: none; } } - -.spinner-grow { - --bs-spinner-width: 2rem; - --bs-spinner-height: 2rem; - --bs-spinner-vertical-align: -0.125em; - --bs-spinner-animation-speed: 0.75s; - --bs-spinner-animation-name: spinner-grow; - background-color: currentcolor; - opacity: 0; } - -.spinner-grow-sm { - --bs-spinner-width: 1rem; - --bs-spinner-height: 1rem; } - -@media (prefers-reduced-motion: reduce) { - .spinner-border, - .spinner-grow { - --bs-spinner-animation-speed: 1.5s; } } - -.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm { - --bs-offcanvas-zindex: 1045; - --bs-offcanvas-width: 400px; - --bs-offcanvas-height: 30vh; - --bs-offcanvas-padding-x: 1rem; - --bs-offcanvas-padding-y: 1rem; - --bs-offcanvas-color: var(--bs-body-color); - --bs-offcanvas-bg: var(--bs-body-bg); - --bs-offcanvas-border-width: var(--bs-border-width); - --bs-offcanvas-border-color: var(--bs-border-color-translucent); - --bs-offcanvas-box-shadow: var(--bs-box-shadow-sm); - --bs-offcanvas-transition: transform 0.3s ease-in-out; - --bs-offcanvas-title-line-height: 1.5; } - -@media (max-width: 575.98px) { - .offcanvas-sm { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); } } - @media (max-width: 575.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-sm { - transition: none; } } -@media (max-width: 575.98px) { - .offcanvas-sm.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); } - .offcanvas-sm.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); } - .offcanvas-sm.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); } - .offcanvas-sm.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); } - .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) { - transform: none; } - .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show { - visibility: visible; } } - -@media (min-width: 576px) { - .offcanvas-sm { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; } - .offcanvas-sm .offcanvas-header { - display: none; } - .offcanvas-sm .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; } } - -@media (max-width: 767.98px) { - .offcanvas-md { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); } } - @media (max-width: 767.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-md { - transition: none; } } -@media (max-width: 767.98px) { - .offcanvas-md.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); } - .offcanvas-md.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); } - .offcanvas-md.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); } - .offcanvas-md.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); } - .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) { - transform: none; } - .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show { - visibility: visible; } } - -@media (min-width: 768px) { - .offcanvas-md { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; } - .offcanvas-md .offcanvas-header { - display: none; } - .offcanvas-md .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; } } - -@media (max-width: 991.98px) { - .offcanvas-lg { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); } } - @media (max-width: 991.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-lg { - transition: none; } } -@media (max-width: 991.98px) { - .offcanvas-lg.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); } - .offcanvas-lg.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); } - .offcanvas-lg.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); } - .offcanvas-lg.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); } - .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) { - transform: none; } - .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show { - visibility: visible; } } - -@media (min-width: 992px) { - .offcanvas-lg { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; } - .offcanvas-lg .offcanvas-header { - display: none; } - .offcanvas-lg .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; } } - -@media (max-width: 1199.98px) { - .offcanvas-xl { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); } } - @media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-xl { - transition: none; } } -@media (max-width: 1199.98px) { - .offcanvas-xl.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); } - .offcanvas-xl.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); } - .offcanvas-xl.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); } - .offcanvas-xl.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); } - .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) { - transform: none; } - .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show { - visibility: visible; } } - -@media (min-width: 1200px) { - .offcanvas-xl { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; } - .offcanvas-xl .offcanvas-header { - display: none; } - .offcanvas-xl .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; } } - -@media (max-width: 1399.98px) { - .offcanvas-xxl { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); } } - @media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-xxl { - transition: none; } } -@media (max-width: 1399.98px) { - .offcanvas-xxl.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); } - .offcanvas-xxl.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); } - .offcanvas-xxl.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); } - .offcanvas-xxl.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); } - .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) { - transform: none; } - .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show { - visibility: visible; } } - -@media (min-width: 1400px) { - .offcanvas-xxl { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; } - .offcanvas-xxl .offcanvas-header { - display: none; } - .offcanvas-xxl .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; } } - -.offcanvas { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); } - @media (prefers-reduced-motion: reduce) { - .offcanvas { - transition: none; } } - .offcanvas.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); } - .offcanvas.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); } - .offcanvas.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); } - .offcanvas.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); } - .offcanvas.showing, .offcanvas.show:not(.hiding) { - transform: none; } - .offcanvas.showing, .offcanvas.hiding, .offcanvas.show { - visibility: visible; } - -.offcanvas-backdrop { - position: fixed; - top: 0; - left: 0; - z-index: 1040; - width: 100vw; - height: 100vh; - background-color: #000; } - .offcanvas-backdrop.fade { - opacity: 0; } - .offcanvas-backdrop.show { - opacity: 0.5; } - -.offcanvas-header { - display: flex; - align-items: center; - padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); } - .offcanvas-header .btn-close { - padding: calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5); - margin: calc(-.5 * var(--bs-offcanvas-padding-y)) calc(-.5 * var(--bs-offcanvas-padding-x)) calc(-.5 * var(--bs-offcanvas-padding-y)) auto; } - -.offcanvas-title { - margin-bottom: 0; - line-height: var(--bs-offcanvas-title-line-height); } - -.offcanvas-body { - flex-grow: 1; - padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); - overflow-y: auto; } - -.placeholder { - display: inline-block; - min-height: 1em; - vertical-align: middle; - cursor: wait; - background-color: currentcolor; - opacity: 0.5; } - .placeholder.btn::before { - display: inline-block; - content: ""; } - -.placeholder-xs { - min-height: .6em; } - -.placeholder-sm { - min-height: .8em; } - -.placeholder-lg { - min-height: 1.2em; } - -.placeholder-glow .placeholder { - animation: placeholder-glow 2s ease-in-out infinite; } - -@keyframes placeholder-glow { - 50% { - opacity: 0.2; } } - -.placeholder-wave { - mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); - mask-size: 200% 100%; - animation: placeholder-wave 2s linear infinite; } - -@keyframes placeholder-wave { - 100% { - mask-position: -200% 0%; } } - -.clearfix::after { - display: block; - clear: both; - content: ""; } - -.text-bg-primary { - color: #fff !important; - background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important; } - -.text-bg-secondary { - color: #fff !important; - background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important; } - -.text-bg-success { - color: #fff !important; - background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important; } - -.text-bg-info { - color: #000 !important; - background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important; } - -.text-bg-warning { - color: #000 !important; - background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important; } - -.text-bg-danger { - color: #fff !important; - background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important; } - -.text-bg-light { - color: #000 !important; - background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important; } - -.text-bg-dark { - color: #fff !important; - background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important; } - -.link-primary { - color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important; } - .link-primary:hover, .link-primary:focus { - color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important; } - -.link-secondary { - color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important; } - .link-secondary:hover, .link-secondary:focus { - color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important; } - -.link-success { - color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important; } - .link-success:hover, .link-success:focus { - color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important; } - -.link-info { - color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important; } - .link-info:hover, .link-info:focus { - color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important; } - -.link-warning { - color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important; } - .link-warning:hover, .link-warning:focus { - color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important; } - -.link-danger { - color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important; } - .link-danger:hover, .link-danger:focus { - color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important; } - -.link-light { - color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important; } - .link-light:hover, .link-light:focus { - color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important; } - -.link-dark { - color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important; } - .link-dark:hover, .link-dark:focus { - color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important; } - -.link-body-emphasis { - color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important; } - .link-body-emphasis:hover, .link-body-emphasis:focus { - color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important; - text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important; } - -.focus-ring:focus { - outline: 0; - box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color); } - -.icon-link { - display: inline-flex; - gap: 0.375rem; - align-items: center; - text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5)); - text-underline-offset: 0.25em; - backface-visibility: hidden; } - .icon-link > .bi { - flex-shrink: 0; - width: 1em; - height: 1em; - fill: currentcolor; - transition: 0.2s ease-in-out transform; } - @media (prefers-reduced-motion: reduce) { - .icon-link > .bi { - transition: none; } } -.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi { - transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0)); } - -.ratio { - position: relative; - width: 100%; } - .ratio::before { - display: block; - padding-top: var(--bs-aspect-ratio); - content: ""; } - .ratio > * { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; } - -.ratio-1x1 { - --bs-aspect-ratio: 100%; } - -.ratio-4x3 { - --bs-aspect-ratio: calc(3 / 4 * 100%); } - -.ratio-16x9 { - --bs-aspect-ratio: calc(9 / 16 * 100%); } - -.ratio-21x9 { - --bs-aspect-ratio: calc(9 / 21 * 100%); } - -.fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; } - -.fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; } - -.sticky-top { - position: sticky; - top: 0; - z-index: 1020; } - -.sticky-bottom { - position: sticky; - bottom: 0; - z-index: 1020; } - -@media (min-width: 576px) { - .sticky-sm-top { - position: sticky; - top: 0; - z-index: 1020; } - .sticky-sm-bottom { - position: sticky; - bottom: 0; - z-index: 1020; } } - -@media (min-width: 768px) { - .sticky-md-top { - position: sticky; - top: 0; - z-index: 1020; } - .sticky-md-bottom { - position: sticky; - bottom: 0; - z-index: 1020; } } - -@media (min-width: 992px) { - .sticky-lg-top { - position: sticky; - top: 0; - z-index: 1020; } - .sticky-lg-bottom { - position: sticky; - bottom: 0; - z-index: 1020; } } - -@media (min-width: 1200px) { - .sticky-xl-top { - position: sticky; - top: 0; - z-index: 1020; } - .sticky-xl-bottom { - position: sticky; - bottom: 0; - z-index: 1020; } } - -@media (min-width: 1400px) { - .sticky-xxl-top { - position: sticky; - top: 0; - z-index: 1020; } - .sticky-xxl-bottom { - position: sticky; - bottom: 0; - z-index: 1020; } } - -.hstack { - display: flex; - flex-direction: row; - align-items: center; - align-self: stretch; } - -.vstack { - display: flex; - flex: 1 1 auto; - flex-direction: column; - align-self: stretch; } - -.visually-hidden, -.visually-hidden-focusable:not(:focus):not(:focus-within) { - width: 1px !important; - height: 1px !important; - padding: 0 !important; - margin: -1px !important; - overflow: hidden !important; - clip: rect(0, 0, 0, 0) !important; - white-space: nowrap !important; - border: 0 !important; } - .visually-hidden:not(caption), - .visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) { - position: absolute !important; } - -.stretched-link::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - content: ""; } - -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } - -.vr { - display: inline-block; - align-self: stretch; - width: var(--bs-border-width); - min-height: 1em; - background-color: currentcolor; - opacity: 0.25; } - -.align-baseline { - vertical-align: baseline !important; } - -.align-top { - vertical-align: top !important; } - -.align-middle { - vertical-align: middle !important; } - -.align-bottom { - vertical-align: bottom !important; } - -.align-text-bottom { - vertical-align: text-bottom !important; } - -.align-text-top { - vertical-align: text-top !important; } - -.float-start { - float: left !important; } - -.float-end { - float: right !important; } - -.float-none { - float: none !important; } - -.object-fit-contain { - object-fit: contain !important; } - -.object-fit-cover { - object-fit: cover !important; } - -.object-fit-fill { - object-fit: fill !important; } - -.object-fit-scale { - object-fit: scale-down !important; } - -.object-fit-none { - object-fit: none !important; } - -.opacity-0 { - opacity: 0 !important; } - -.opacity-25 { - opacity: 0.25 !important; } - -.opacity-50 { - opacity: 0.5 !important; } - -.opacity-75 { - opacity: 0.75 !important; } - -.opacity-100 { - opacity: 1 !important; } - -.overflow-auto { - overflow: auto !important; } - -.overflow-hidden { - overflow: hidden !important; } - -.overflow-visible { - overflow: visible !important; } - -.overflow-scroll { - overflow: scroll !important; } - -.overflow-x-auto { - overflow-x: auto !important; } - -.overflow-x-hidden { - overflow-x: hidden !important; } - -.overflow-x-visible { - overflow-x: visible !important; } - -.overflow-x-scroll { - overflow-x: scroll !important; } - -.overflow-y-auto { - overflow-y: auto !important; } - -.overflow-y-hidden { - overflow-y: hidden !important; } - -.overflow-y-visible { - overflow-y: visible !important; } - -.overflow-y-scroll { - overflow-y: scroll !important; } - -.d-inline { - display: inline !important; } - -.d-inline-block { - display: inline-block !important; } - -.d-block { - display: block !important; } - -.d-grid { - display: grid !important; } - -.d-inline-grid { - display: inline-grid !important; } - -.d-table { - display: table !important; } - -.d-table-row { - display: table-row !important; } - -.d-table-cell { - display: table-cell !important; } - -.d-flex { - display: flex !important; } - -.d-inline-flex { - display: inline-flex !important; } - -.d-none { - display: none !important; } - -.shadow { - box-shadow: var(--bs-box-shadow) !important; } - -.shadow-sm { - box-shadow: var(--bs-box-shadow-sm) !important; } - -.shadow-lg { - box-shadow: var(--bs-box-shadow-lg) !important; } - -.shadow-none { - box-shadow: none !important; } - -.focus-ring-primary { - --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity)); } - -.focus-ring-secondary { - --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity)); } - -.focus-ring-success { - --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity)); } - -.focus-ring-info { - --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity)); } - -.focus-ring-warning { - --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity)); } - -.focus-ring-danger { - --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity)); } - -.focus-ring-light { - --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity)); } - -.focus-ring-dark { - --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity)); } - -.position-static { - position: static !important; } - -.position-relative { - position: relative !important; } - -.position-absolute { - position: absolute !important; } - -.position-fixed { - position: fixed !important; } - -.position-sticky { - position: sticky !important; } - -.top-0 { - top: 0 !important; } - -.top-50 { - top: 50% !important; } - -.top-100 { - top: 100% !important; } - -.bottom-0 { - bottom: 0 !important; } - -.bottom-50 { - bottom: 50% !important; } - -.bottom-100 { - bottom: 100% !important; } - -.start-0 { - left: 0 !important; } - -.start-50 { - left: 50% !important; } - -.start-100 { - left: 100% !important; } - -.end-0 { - right: 0 !important; } - -.end-50 { - right: 50% !important; } - -.end-100 { - right: 100% !important; } - -.translate-middle { - transform: translate(-50%, -50%) !important; } - -.translate-middle-x { - transform: translateX(-50%) !important; } - -.translate-middle-y { - transform: translateY(-50%) !important; } - -.border { - border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; } - -.border-0 { - border: 0 !important; } - -.border-top { - border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; } - -.border-top-0 { - border-top: 0 !important; } - -.border-end { - border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; } - -.border-end-0 { - border-right: 0 !important; } - -.border-bottom { - border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; } - -.border-bottom-0 { - border-bottom: 0 !important; } - -.border-start { - border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; } - -.border-start-0 { - border-left: 0 !important; } - -.border-primary { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important; } - -.border-secondary { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important; } - -.border-success { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important; } - -.border-info { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important; } - -.border-warning { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important; } - -.border-danger { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important; } - -.border-light { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important; } - -.border-dark { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important; } - -.border-black { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important; } - -.border-white { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important; } - -.border-primary-subtle { - border-color: var(--bs-primary-border-subtle) !important; } - -.border-secondary-subtle { - border-color: var(--bs-secondary-border-subtle) !important; } - -.border-success-subtle { - border-color: var(--bs-success-border-subtle) !important; } - -.border-info-subtle { - border-color: var(--bs-info-border-subtle) !important; } - -.border-warning-subtle { - border-color: var(--bs-warning-border-subtle) !important; } - -.border-danger-subtle { - border-color: var(--bs-danger-border-subtle) !important; } - -.border-light-subtle { - border-color: var(--bs-light-border-subtle) !important; } - -.border-dark-subtle { - border-color: var(--bs-dark-border-subtle) !important; } - -.border-1 { - border-width: 1px !important; } - -.border-2 { - border-width: 2px !important; } - -.border-3 { - border-width: 3px !important; } - -.border-4 { - border-width: 4px !important; } - -.border-5 { - border-width: 5px !important; } - -.border-opacity-10 { - --bs-border-opacity: 0.1; } - -.border-opacity-25 { - --bs-border-opacity: 0.25; } - -.border-opacity-50 { - --bs-border-opacity: 0.5; } - -.border-opacity-75 { - --bs-border-opacity: 0.75; } - -.border-opacity-100 { - --bs-border-opacity: 1; } - -.w-25 { - width: 25% !important; } - -.w-50 { - width: 50% !important; } - -.w-75 { - width: 75% !important; } - -.w-100 { - width: 100% !important; } - -.w-auto { - width: auto !important; } - -.mw-100 { - max-width: 100% !important; } - -.vw-100 { - width: 100vw !important; } - -.min-vw-100 { - min-width: 100vw !important; } - -.h-25 { - height: 25% !important; } - -.h-50 { - height: 50% !important; } - -.h-75 { - height: 75% !important; } - -.h-100 { - height: 100% !important; } - -.h-auto { - height: auto !important; } - -.mh-100 { - max-height: 100% !important; } - -.vh-100 { - height: 100vh !important; } - -.min-vh-100 { - min-height: 100vh !important; } - -.flex-fill { - flex: 1 1 auto !important; } - -.flex-row { - flex-direction: row !important; } - -.flex-column { - flex-direction: column !important; } - -.flex-row-reverse { - flex-direction: row-reverse !important; } - -.flex-column-reverse { - flex-direction: column-reverse !important; } - -.flex-grow-0 { - flex-grow: 0 !important; } - -.flex-grow-1 { - flex-grow: 1 !important; } - -.flex-shrink-0 { - flex-shrink: 0 !important; } - -.flex-shrink-1 { - flex-shrink: 1 !important; } - -.flex-wrap { - flex-wrap: wrap !important; } - -.flex-nowrap { - flex-wrap: nowrap !important; } - -.flex-wrap-reverse { - flex-wrap: wrap-reverse !important; } - -.justify-content-start { - justify-content: flex-start !important; } - -.justify-content-end { - justify-content: flex-end !important; } - -.justify-content-center { - justify-content: center !important; } - -.justify-content-between { - justify-content: space-between !important; } - -.justify-content-around { - justify-content: space-around !important; } - -.justify-content-evenly { - justify-content: space-evenly !important; } - -.align-items-start { - align-items: flex-start !important; } - -.align-items-end { - align-items: flex-end !important; } - -.align-items-center { - align-items: center !important; } - -.align-items-baseline { - align-items: baseline !important; } - -.align-items-stretch { - align-items: stretch !important; } - -.align-content-start { - align-content: flex-start !important; } - -.align-content-end { - align-content: flex-end !important; } - -.align-content-center { - align-content: center !important; } - -.align-content-between { - align-content: space-between !important; } - -.align-content-around { - align-content: space-around !important; } - -.align-content-stretch { - align-content: stretch !important; } - -.align-self-auto { - align-self: auto !important; } - -.align-self-start { - align-self: flex-start !important; } - -.align-self-end { - align-self: flex-end !important; } - -.align-self-center { - align-self: center !important; } - -.align-self-baseline { - align-self: baseline !important; } - -.align-self-stretch { - align-self: stretch !important; } - -.order-first { - order: -1 !important; } - -.order-0 { - order: 0 !important; } - -.order-1 { - order: 1 !important; } - -.order-2 { - order: 2 !important; } - -.order-3 { - order: 3 !important; } - -.order-4 { - order: 4 !important; } - -.order-5 { - order: 5 !important; } - -.order-last { - order: 6 !important; } - -.m-0 { - margin: 0 !important; } - -.m-1 { - margin: 0.25rem !important; } - -.m-2 { - margin: 0.5rem !important; } - -.m-3 { - margin: 1rem !important; } - -.m-4 { - margin: 1.5rem !important; } - -.m-5 { - margin: 3rem !important; } - -.m-auto { - margin: auto !important; } - -.mx-0 { - margin-right: 0 !important; - margin-left: 0 !important; } - -.mx-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; } - -.mx-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; } - -.mx-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; } - -.mx-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; } - -.mx-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; } - -.mx-auto { - margin-right: auto !important; - margin-left: auto !important; } - -.my-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; } - -.my-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; } - -.my-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; } - -.my-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; } - -.my-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; } - -.my-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; } - -.my-auto { - margin-top: auto !important; - margin-bottom: auto !important; } - -.mt-0 { - margin-top: 0 !important; } - -.mt-1 { - margin-top: 0.25rem !important; } - -.mt-2 { - margin-top: 0.5rem !important; } - -.mt-3 { - margin-top: 1rem !important; } - -.mt-4 { - margin-top: 1.5rem !important; } - -.mt-5 { - margin-top: 3rem !important; } - -.mt-auto { - margin-top: auto !important; } - -.me-0 { - margin-right: 0 !important; } - -.me-1 { - margin-right: 0.25rem !important; } - -.me-2 { - margin-right: 0.5rem !important; } - -.me-3 { - margin-right: 1rem !important; } - -.me-4 { - margin-right: 1.5rem !important; } - -.me-5 { - margin-right: 3rem !important; } - -.me-auto { - margin-right: auto !important; } - -.mb-0 { - margin-bottom: 0 !important; } - -.mb-1 { - margin-bottom: 0.25rem !important; } - -.mb-2 { - margin-bottom: 0.5rem !important; } - -.mb-3 { - margin-bottom: 1rem !important; } - -.mb-4 { - margin-bottom: 1.5rem !important; } - -.mb-5 { - margin-bottom: 3rem !important; } - -.mb-auto { - margin-bottom: auto !important; } - -.ms-0 { - margin-left: 0 !important; } - -.ms-1 { - margin-left: 0.25rem !important; } - -.ms-2 { - margin-left: 0.5rem !important; } - -.ms-3 { - margin-left: 1rem !important; } - -.ms-4 { - margin-left: 1.5rem !important; } - -.ms-5 { - margin-left: 3rem !important; } - -.ms-auto { - margin-left: auto !important; } - -.p-0 { - padding: 0 !important; } - -.p-1 { - padding: 0.25rem !important; } - -.p-2 { - padding: 0.5rem !important; } - -.p-3 { - padding: 1rem !important; } - -.p-4 { - padding: 1.5rem !important; } - -.p-5 { - padding: 3rem !important; } - -.px-0 { - padding-right: 0 !important; - padding-left: 0 !important; } - -.px-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; } - -.px-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; } - -.px-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; } - -.px-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; } - -.px-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; } - -.py-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; } - -.py-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; } - -.py-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; } - -.py-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; } - -.py-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; } - -.py-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; } - -.pt-0 { - padding-top: 0 !important; } - -.pt-1 { - padding-top: 0.25rem !important; } - -.pt-2 { - padding-top: 0.5rem !important; } - -.pt-3 { - padding-top: 1rem !important; } - -.pt-4 { - padding-top: 1.5rem !important; } - -.pt-5 { - padding-top: 3rem !important; } - -.pe-0 { - padding-right: 0 !important; } - -.pe-1 { - padding-right: 0.25rem !important; } - -.pe-2 { - padding-right: 0.5rem !important; } - -.pe-3 { - padding-right: 1rem !important; } - -.pe-4 { - padding-right: 1.5rem !important; } - -.pe-5 { - padding-right: 3rem !important; } - -.pb-0 { - padding-bottom: 0 !important; } - -.pb-1 { - padding-bottom: 0.25rem !important; } - -.pb-2 { - padding-bottom: 0.5rem !important; } - -.pb-3 { - padding-bottom: 1rem !important; } - -.pb-4 { - padding-bottom: 1.5rem !important; } - -.pb-5 { - padding-bottom: 3rem !important; } - -.ps-0 { - padding-left: 0 !important; } - -.ps-1 { - padding-left: 0.25rem !important; } - -.ps-2 { - padding-left: 0.5rem !important; } - -.ps-3 { - padding-left: 1rem !important; } - -.ps-4 { - padding-left: 1.5rem !important; } - -.ps-5 { - padding-left: 3rem !important; } - -.gap-0 { - gap: 0 !important; } - -.gap-1 { - gap: 0.25rem !important; } - -.gap-2 { - gap: 0.5rem !important; } - -.gap-3 { - gap: 1rem !important; } - -.gap-4 { - gap: 1.5rem !important; } - -.gap-5 { - gap: 3rem !important; } - -.row-gap-0 { - row-gap: 0 !important; } - -.row-gap-1 { - row-gap: 0.25rem !important; } - -.row-gap-2 { - row-gap: 0.5rem !important; } - -.row-gap-3 { - row-gap: 1rem !important; } - -.row-gap-4 { - row-gap: 1.5rem !important; } - -.row-gap-5 { - row-gap: 3rem !important; } - -.column-gap-0 { - column-gap: 0 !important; } - -.column-gap-1 { - column-gap: 0.25rem !important; } - -.column-gap-2 { - column-gap: 0.5rem !important; } - -.column-gap-3 { - column-gap: 1rem !important; } - -.column-gap-4 { - column-gap: 1.5rem !important; } - -.column-gap-5 { - column-gap: 3rem !important; } - -.font-monospace { - font-family: var(--bs-font-monospace) !important; } - -.fs-1 { - font-size: calc(1.375rem + 1.5vw) !important; } - -.fs-2 { - font-size: calc(1.325rem + 0.9vw) !important; } - -.fs-3 { - font-size: calc(1.3rem + 0.6vw) !important; } - -.fs-4 { - font-size: calc(1.275rem + 0.3vw) !important; } - -.fs-5 { - font-size: 1.25rem !important; } - -.fs-6 { - font-size: 1rem !important; } - -.fst-italic { - font-style: italic !important; } - -.fst-normal { - font-style: normal !important; } - -.fw-lighter { - font-weight: lighter !important; } - -.fw-light { - font-weight: 300 !important; } - -.fw-normal { - font-weight: 400 !important; } - -.fw-medium { - font-weight: 500 !important; } - -.fw-semibold { - font-weight: 600 !important; } - -.fw-bold { - font-weight: 700 !important; } - -.fw-bolder { - font-weight: bolder !important; } - -.lh-1 { - line-height: 1 !important; } - -.lh-sm { - line-height: 1.25 !important; } - -.lh-base { - line-height: 1.5 !important; } - -.lh-lg { - line-height: 2 !important; } - -.text-start { - text-align: left !important; } - -.text-end { - text-align: right !important; } - -.text-center { - text-align: center !important; } - -.text-decoration-none { - text-decoration: none !important; } - -.text-decoration-underline { - text-decoration: underline !important; } - -.text-decoration-line-through { - text-decoration: line-through !important; } - -.text-lowercase { - text-transform: lowercase !important; } - -.text-uppercase { - text-transform: uppercase !important; } - -.text-capitalize { - text-transform: capitalize !important; } - -.text-wrap { - white-space: normal !important; } - -.text-nowrap { - white-space: nowrap !important; } - -/* rtl:begin:remove */ -.text-break { - word-wrap: break-word !important; - word-break: break-word !important; } - -/* rtl:end:remove */ -.text-primary { - --bs-text-opacity: 1; - color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; } - -.text-secondary { - --bs-text-opacity: 1; - color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; } - -.text-success { - --bs-text-opacity: 1; - color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; } - -.text-info { - --bs-text-opacity: 1; - color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; } - -.text-warning { - --bs-text-opacity: 1; - color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; } - -.text-danger { - --bs-text-opacity: 1; - color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; } - -.text-light { - --bs-text-opacity: 1; - color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; } - -.text-dark { - --bs-text-opacity: 1; - color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; } - -.text-black { - --bs-text-opacity: 1; - color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; } - -.text-white { - --bs-text-opacity: 1; - color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; } - -.text-body { - --bs-text-opacity: 1; - color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; } - -.text-muted { - --bs-text-opacity: 1; - color: var(--bs-secondary-color) !important; } - -.text-black-50 { - --bs-text-opacity: 1; - color: rgba(0, 0, 0, 0.5) !important; } - -.text-white-50 { - --bs-text-opacity: 1; - color: rgba(255, 255, 255, 0.5) !important; } - -.text-body-secondary { - --bs-text-opacity: 1; - color: var(--bs-secondary-color) !important; } - -.text-body-tertiary { - --bs-text-opacity: 1; - color: var(--bs-tertiary-color) !important; } - -.text-body-emphasis { - --bs-text-opacity: 1; - color: var(--bs-emphasis-color) !important; } - -.text-reset { - --bs-text-opacity: 1; - color: inherit !important; } - -.text-opacity-25 { - --bs-text-opacity: 0.25; } - -.text-opacity-50 { - --bs-text-opacity: 0.5; } - -.text-opacity-75 { - --bs-text-opacity: 0.75; } - -.text-opacity-100 { - --bs-text-opacity: 1; } - -.text-primary-emphasis { - color: var(--bs-primary-text-emphasis) !important; } - -.text-secondary-emphasis { - color: var(--bs-secondary-text-emphasis) !important; } - -.text-success-emphasis { - color: var(--bs-success-text-emphasis) !important; } - -.text-info-emphasis { - color: var(--bs-info-text-emphasis) !important; } - -.text-warning-emphasis { - color: var(--bs-warning-text-emphasis) !important; } - -.text-danger-emphasis { - color: var(--bs-danger-text-emphasis) !important; } - -.text-light-emphasis { - color: var(--bs-light-text-emphasis) !important; } - -.text-dark-emphasis { - color: var(--bs-dark-text-emphasis) !important; } - -.link-opacity-10 { - --bs-link-opacity: 0.1; } - -.link-opacity-10-hover:hover { - --bs-link-opacity: 0.1; } - -.link-opacity-25 { - --bs-link-opacity: 0.25; } - -.link-opacity-25-hover:hover { - --bs-link-opacity: 0.25; } - -.link-opacity-50 { - --bs-link-opacity: 0.5; } - -.link-opacity-50-hover:hover { - --bs-link-opacity: 0.5; } - -.link-opacity-75 { - --bs-link-opacity: 0.75; } - -.link-opacity-75-hover:hover { - --bs-link-opacity: 0.75; } - -.link-opacity-100 { - --bs-link-opacity: 1; } - -.link-opacity-100-hover:hover { - --bs-link-opacity: 1; } - -.link-offset-1 { - text-underline-offset: 0.125em !important; } - -.link-offset-1-hover:hover { - text-underline-offset: 0.125em !important; } - -.link-offset-2 { - text-underline-offset: 0.25em !important; } - -.link-offset-2-hover:hover { - text-underline-offset: 0.25em !important; } - -.link-offset-3 { - text-underline-offset: 0.375em !important; } - -.link-offset-3-hover:hover { - text-underline-offset: 0.375em !important; } - -.link-underline-primary { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important; } - -.link-underline-secondary { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important; } - -.link-underline-success { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important; } - -.link-underline-info { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important; } - -.link-underline-warning { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important; } - -.link-underline-danger { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important; } - -.link-underline-light { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important; } - -.link-underline-dark { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important; } - -.link-underline { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important; } - -.link-underline-opacity-0 { - --bs-link-underline-opacity: 0; } - -.link-underline-opacity-0-hover:hover { - --bs-link-underline-opacity: 0; } - -.link-underline-opacity-10 { - --bs-link-underline-opacity: 0.1; } - -.link-underline-opacity-10-hover:hover { - --bs-link-underline-opacity: 0.1; } - -.link-underline-opacity-25 { - --bs-link-underline-opacity: 0.25; } - -.link-underline-opacity-25-hover:hover { - --bs-link-underline-opacity: 0.25; } - -.link-underline-opacity-50 { - --bs-link-underline-opacity: 0.5; } - -.link-underline-opacity-50-hover:hover { - --bs-link-underline-opacity: 0.5; } - -.link-underline-opacity-75 { - --bs-link-underline-opacity: 0.75; } - -.link-underline-opacity-75-hover:hover { - --bs-link-underline-opacity: 0.75; } - -.link-underline-opacity-100 { - --bs-link-underline-opacity: 1; } - -.link-underline-opacity-100-hover:hover { - --bs-link-underline-opacity: 1; } - -.bg-primary { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; } - -.bg-secondary { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important; } - -.bg-success { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important; } - -.bg-info { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; } - -.bg-warning { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important; } - -.bg-danger { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important; } - -.bg-light { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important; } - -.bg-dark { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; } - -.bg-black { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important; } - -.bg-white { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important; } - -.bg-body { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important; } - -.bg-transparent { - --bs-bg-opacity: 1; - background-color: transparent !important; } - -.bg-body-secondary { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important; } - -.bg-body-tertiary { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important; } - -.bg-opacity-10 { - --bs-bg-opacity: 0.1; } - -.bg-opacity-25 { - --bs-bg-opacity: 0.25; } - -.bg-opacity-50 { - --bs-bg-opacity: 0.5; } - -.bg-opacity-75 { - --bs-bg-opacity: 0.75; } - -.bg-opacity-100 { - --bs-bg-opacity: 1; } - -.bg-primary-subtle { - background-color: var(--bs-primary-bg-subtle) !important; } - -.bg-secondary-subtle { - background-color: var(--bs-secondary-bg-subtle) !important; } - -.bg-success-subtle { - background-color: var(--bs-success-bg-subtle) !important; } - -.bg-info-subtle { - background-color: var(--bs-info-bg-subtle) !important; } - -.bg-warning-subtle { - background-color: var(--bs-warning-bg-subtle) !important; } - -.bg-danger-subtle { - background-color: var(--bs-danger-bg-subtle) !important; } - -.bg-light-subtle { - background-color: var(--bs-light-bg-subtle) !important; } - -.bg-dark-subtle { - background-color: var(--bs-dark-bg-subtle) !important; } - -.bg-gradient { - background-image: var(--bs-gradient) !important; } - -.user-select-all { - user-select: all !important; } - -.user-select-auto { - user-select: auto !important; } - -.user-select-none { - user-select: none !important; } - -.pe-none { - pointer-events: none !important; } - -.pe-auto { - pointer-events: auto !important; } - -.rounded { - border-radius: var(--bs-border-radius) !important; } - -.rounded-0 { - border-radius: 0 !important; } - -.rounded-1 { - border-radius: var(--bs-border-radius-sm) !important; } - -.rounded-2 { - border-radius: var(--bs-border-radius) !important; } - -.rounded-3 { - border-radius: var(--bs-border-radius-lg) !important; } - -.rounded-4 { - border-radius: var(--bs-border-radius-xl) !important; } - -.rounded-5 { - border-radius: var(--bs-border-radius-xxl) !important; } - -.rounded-circle { - border-radius: 50% !important; } - -.rounded-pill { - border-radius: var(--bs-border-radius-pill) !important; } - -.rounded-top { - border-top-left-radius: var(--bs-border-radius) !important; - border-top-right-radius: var(--bs-border-radius) !important; } - -.rounded-top-0 { - border-top-left-radius: 0 !important; - border-top-right-radius: 0 !important; } - -.rounded-top-1 { - border-top-left-radius: var(--bs-border-radius-sm) !important; - border-top-right-radius: var(--bs-border-radius-sm) !important; } - -.rounded-top-2 { - border-top-left-radius: var(--bs-border-radius) !important; - border-top-right-radius: var(--bs-border-radius) !important; } - -.rounded-top-3 { - border-top-left-radius: var(--bs-border-radius-lg) !important; - border-top-right-radius: var(--bs-border-radius-lg) !important; } - -.rounded-top-4 { - border-top-left-radius: var(--bs-border-radius-xl) !important; - border-top-right-radius: var(--bs-border-radius-xl) !important; } - -.rounded-top-5 { - border-top-left-radius: var(--bs-border-radius-xxl) !important; - border-top-right-radius: var(--bs-border-radius-xxl) !important; } - -.rounded-top-circle { - border-top-left-radius: 50% !important; - border-top-right-radius: 50% !important; } - -.rounded-top-pill { - border-top-left-radius: var(--bs-border-radius-pill) !important; - border-top-right-radius: var(--bs-border-radius-pill) !important; } - -.rounded-end { - border-top-right-radius: var(--bs-border-radius) !important; - border-bottom-right-radius: var(--bs-border-radius) !important; } - -.rounded-end-0 { - border-top-right-radius: 0 !important; - border-bottom-right-radius: 0 !important; } - -.rounded-end-1 { - border-top-right-radius: var(--bs-border-radius-sm) !important; - border-bottom-right-radius: var(--bs-border-radius-sm) !important; } - -.rounded-end-2 { - border-top-right-radius: var(--bs-border-radius) !important; - border-bottom-right-radius: var(--bs-border-radius) !important; } - -.rounded-end-3 { - border-top-right-radius: var(--bs-border-radius-lg) !important; - border-bottom-right-radius: var(--bs-border-radius-lg) !important; } - -.rounded-end-4 { - border-top-right-radius: var(--bs-border-radius-xl) !important; - border-bottom-right-radius: var(--bs-border-radius-xl) !important; } - -.rounded-end-5 { - border-top-right-radius: var(--bs-border-radius-xxl) !important; - border-bottom-right-radius: var(--bs-border-radius-xxl) !important; } - -.rounded-end-circle { - border-top-right-radius: 50% !important; - border-bottom-right-radius: 50% !important; } - -.rounded-end-pill { - border-top-right-radius: var(--bs-border-radius-pill) !important; - border-bottom-right-radius: var(--bs-border-radius-pill) !important; } - -.rounded-bottom { - border-bottom-right-radius: var(--bs-border-radius) !important; - border-bottom-left-radius: var(--bs-border-radius) !important; } - -.rounded-bottom-0 { - border-bottom-right-radius: 0 !important; - border-bottom-left-radius: 0 !important; } - -.rounded-bottom-1 { - border-bottom-right-radius: var(--bs-border-radius-sm) !important; - border-bottom-left-radius: var(--bs-border-radius-sm) !important; } - -.rounded-bottom-2 { - border-bottom-right-radius: var(--bs-border-radius) !important; - border-bottom-left-radius: var(--bs-border-radius) !important; } - -.rounded-bottom-3 { - border-bottom-right-radius: var(--bs-border-radius-lg) !important; - border-bottom-left-radius: var(--bs-border-radius-lg) !important; } - -.rounded-bottom-4 { - border-bottom-right-radius: var(--bs-border-radius-xl) !important; - border-bottom-left-radius: var(--bs-border-radius-xl) !important; } - -.rounded-bottom-5 { - border-bottom-right-radius: var(--bs-border-radius-xxl) !important; - border-bottom-left-radius: var(--bs-border-radius-xxl) !important; } - -.rounded-bottom-circle { - border-bottom-right-radius: 50% !important; - border-bottom-left-radius: 50% !important; } - -.rounded-bottom-pill { - border-bottom-right-radius: var(--bs-border-radius-pill) !important; - border-bottom-left-radius: var(--bs-border-radius-pill) !important; } - -.rounded-start { - border-bottom-left-radius: var(--bs-border-radius) !important; - border-top-left-radius: var(--bs-border-radius) !important; } - -.rounded-start-0 { - border-bottom-left-radius: 0 !important; - border-top-left-radius: 0 !important; } - -.rounded-start-1 { - border-bottom-left-radius: var(--bs-border-radius-sm) !important; - border-top-left-radius: var(--bs-border-radius-sm) !important; } - -.rounded-start-2 { - border-bottom-left-radius: var(--bs-border-radius) !important; - border-top-left-radius: var(--bs-border-radius) !important; } - -.rounded-start-3 { - border-bottom-left-radius: var(--bs-border-radius-lg) !important; - border-top-left-radius: var(--bs-border-radius-lg) !important; } - -.rounded-start-4 { - border-bottom-left-radius: var(--bs-border-radius-xl) !important; - border-top-left-radius: var(--bs-border-radius-xl) !important; } - -.rounded-start-5 { - border-bottom-left-radius: var(--bs-border-radius-xxl) !important; - border-top-left-radius: var(--bs-border-radius-xxl) !important; } - -.rounded-start-circle { - border-bottom-left-radius: 50% !important; - border-top-left-radius: 50% !important; } - -.rounded-start-pill { - border-bottom-left-radius: var(--bs-border-radius-pill) !important; - border-top-left-radius: var(--bs-border-radius-pill) !important; } - -.visible { - visibility: visible !important; } - -.invisible { - visibility: hidden !important; } - -.z-n1 { - z-index: -1 !important; } - -.z-0 { - z-index: 0 !important; } - -.z-1 { - z-index: 1 !important; } - -.z-2 { - z-index: 2 !important; } - -.z-3 { - z-index: 3 !important; } - -@media (min-width: 576px) { - .float-sm-start { - float: left !important; } - .float-sm-end { - float: right !important; } - .float-sm-none { - float: none !important; } - .object-fit-sm-contain { - object-fit: contain !important; } - .object-fit-sm-cover { - object-fit: cover !important; } - .object-fit-sm-fill { - object-fit: fill !important; } - .object-fit-sm-scale { - object-fit: scale-down !important; } - .object-fit-sm-none { - object-fit: none !important; } - .d-sm-inline { - display: inline !important; } - .d-sm-inline-block { - display: inline-block !important; } - .d-sm-block { - display: block !important; } - .d-sm-grid { - display: grid !important; } - .d-sm-inline-grid { - display: inline-grid !important; } - .d-sm-table { - display: table !important; } - .d-sm-table-row { - display: table-row !important; } - .d-sm-table-cell { - display: table-cell !important; } - .d-sm-flex { - display: flex !important; } - .d-sm-inline-flex { - display: inline-flex !important; } - .d-sm-none { - display: none !important; } - .flex-sm-fill { - flex: 1 1 auto !important; } - .flex-sm-row { - flex-direction: row !important; } - .flex-sm-column { - flex-direction: column !important; } - .flex-sm-row-reverse { - flex-direction: row-reverse !important; } - .flex-sm-column-reverse { - flex-direction: column-reverse !important; } - .flex-sm-grow-0 { - flex-grow: 0 !important; } - .flex-sm-grow-1 { - flex-grow: 1 !important; } - .flex-sm-shrink-0 { - flex-shrink: 0 !important; } - .flex-sm-shrink-1 { - flex-shrink: 1 !important; } - .flex-sm-wrap { - flex-wrap: wrap !important; } - .flex-sm-nowrap { - flex-wrap: nowrap !important; } - .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !important; } - .justify-content-sm-start { - justify-content: flex-start !important; } - .justify-content-sm-end { - justify-content: flex-end !important; } - .justify-content-sm-center { - justify-content: center !important; } - .justify-content-sm-between { - justify-content: space-between !important; } - .justify-content-sm-around { - justify-content: space-around !important; } - .justify-content-sm-evenly { - justify-content: space-evenly !important; } - .align-items-sm-start { - align-items: flex-start !important; } - .align-items-sm-end { - align-items: flex-end !important; } - .align-items-sm-center { - align-items: center !important; } - .align-items-sm-baseline { - align-items: baseline !important; } - .align-items-sm-stretch { - align-items: stretch !important; } - .align-content-sm-start { - align-content: flex-start !important; } - .align-content-sm-end { - align-content: flex-end !important; } - .align-content-sm-center { - align-content: center !important; } - .align-content-sm-between { - align-content: space-between !important; } - .align-content-sm-around { - align-content: space-around !important; } - .align-content-sm-stretch { - align-content: stretch !important; } - .align-self-sm-auto { - align-self: auto !important; } - .align-self-sm-start { - align-self: flex-start !important; } - .align-self-sm-end { - align-self: flex-end !important; } - .align-self-sm-center { - align-self: center !important; } - .align-self-sm-baseline { - align-self: baseline !important; } - .align-self-sm-stretch { - align-self: stretch !important; } - .order-sm-first { - order: -1 !important; } - .order-sm-0 { - order: 0 !important; } - .order-sm-1 { - order: 1 !important; } - .order-sm-2 { - order: 2 !important; } - .order-sm-3 { - order: 3 !important; } - .order-sm-4 { - order: 4 !important; } - .order-sm-5 { - order: 5 !important; } - .order-sm-last { - order: 6 !important; } - .m-sm-0 { - margin: 0 !important; } - .m-sm-1 { - margin: 0.25rem !important; } - .m-sm-2 { - margin: 0.5rem !important; } - .m-sm-3 { - margin: 1rem !important; } - .m-sm-4 { - margin: 1.5rem !important; } - .m-sm-5 { - margin: 3rem !important; } - .m-sm-auto { - margin: auto !important; } - .mx-sm-0 { - margin-right: 0 !important; - margin-left: 0 !important; } - .mx-sm-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; } - .mx-sm-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; } - .mx-sm-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; } - .mx-sm-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; } - .mx-sm-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; } - .mx-sm-auto { - margin-right: auto !important; - margin-left: auto !important; } - .my-sm-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; } - .my-sm-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; } - .my-sm-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; } - .my-sm-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; } - .my-sm-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; } - .my-sm-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; } - .my-sm-auto { - margin-top: auto !important; - margin-bottom: auto !important; } - .mt-sm-0 { - margin-top: 0 !important; } - .mt-sm-1 { - margin-top: 0.25rem !important; } - .mt-sm-2 { - margin-top: 0.5rem !important; } - .mt-sm-3 { - margin-top: 1rem !important; } - .mt-sm-4 { - margin-top: 1.5rem !important; } - .mt-sm-5 { - margin-top: 3rem !important; } - .mt-sm-auto { - margin-top: auto !important; } - .me-sm-0 { - margin-right: 0 !important; } - .me-sm-1 { - margin-right: 0.25rem !important; } - .me-sm-2 { - margin-right: 0.5rem !important; } - .me-sm-3 { - margin-right: 1rem !important; } - .me-sm-4 { - margin-right: 1.5rem !important; } - .me-sm-5 { - margin-right: 3rem !important; } - .me-sm-auto { - margin-right: auto !important; } - .mb-sm-0 { - margin-bottom: 0 !important; } - .mb-sm-1 { - margin-bottom: 0.25rem !important; } - .mb-sm-2 { - margin-bottom: 0.5rem !important; } - .mb-sm-3 { - margin-bottom: 1rem !important; } - .mb-sm-4 { - margin-bottom: 1.5rem !important; } - .mb-sm-5 { - margin-bottom: 3rem !important; } - .mb-sm-auto { - margin-bottom: auto !important; } - .ms-sm-0 { - margin-left: 0 !important; } - .ms-sm-1 { - margin-left: 0.25rem !important; } - .ms-sm-2 { - margin-left: 0.5rem !important; } - .ms-sm-3 { - margin-left: 1rem !important; } - .ms-sm-4 { - margin-left: 1.5rem !important; } - .ms-sm-5 { - margin-left: 3rem !important; } - .ms-sm-auto { - margin-left: auto !important; } - .p-sm-0 { - padding: 0 !important; } - .p-sm-1 { - padding: 0.25rem !important; } - .p-sm-2 { - padding: 0.5rem !important; } - .p-sm-3 { - padding: 1rem !important; } - .p-sm-4 { - padding: 1.5rem !important; } - .p-sm-5 { - padding: 3rem !important; } - .px-sm-0 { - padding-right: 0 !important; - padding-left: 0 !important; } - .px-sm-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; } - .px-sm-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; } - .px-sm-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; } - .px-sm-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; } - .px-sm-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; } - .py-sm-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; } - .py-sm-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; } - .py-sm-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; } - .py-sm-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; } - .py-sm-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; } - .py-sm-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; } - .pt-sm-0 { - padding-top: 0 !important; } - .pt-sm-1 { - padding-top: 0.25rem !important; } - .pt-sm-2 { - padding-top: 0.5rem !important; } - .pt-sm-3 { - padding-top: 1rem !important; } - .pt-sm-4 { - padding-top: 1.5rem !important; } - .pt-sm-5 { - padding-top: 3rem !important; } - .pe-sm-0 { - padding-right: 0 !important; } - .pe-sm-1 { - padding-right: 0.25rem !important; } - .pe-sm-2 { - padding-right: 0.5rem !important; } - .pe-sm-3 { - padding-right: 1rem !important; } - .pe-sm-4 { - padding-right: 1.5rem !important; } - .pe-sm-5 { - padding-right: 3rem !important; } - .pb-sm-0 { - padding-bottom: 0 !important; } - .pb-sm-1 { - padding-bottom: 0.25rem !important; } - .pb-sm-2 { - padding-bottom: 0.5rem !important; } - .pb-sm-3 { - padding-bottom: 1rem !important; } - .pb-sm-4 { - padding-bottom: 1.5rem !important; } - .pb-sm-5 { - padding-bottom: 3rem !important; } - .ps-sm-0 { - padding-left: 0 !important; } - .ps-sm-1 { - padding-left: 0.25rem !important; } - .ps-sm-2 { - padding-left: 0.5rem !important; } - .ps-sm-3 { - padding-left: 1rem !important; } - .ps-sm-4 { - padding-left: 1.5rem !important; } - .ps-sm-5 { - padding-left: 3rem !important; } - .gap-sm-0 { - gap: 0 !important; } - .gap-sm-1 { - gap: 0.25rem !important; } - .gap-sm-2 { - gap: 0.5rem !important; } - .gap-sm-3 { - gap: 1rem !important; } - .gap-sm-4 { - gap: 1.5rem !important; } - .gap-sm-5 { - gap: 3rem !important; } - .row-gap-sm-0 { - row-gap: 0 !important; } - .row-gap-sm-1 { - row-gap: 0.25rem !important; } - .row-gap-sm-2 { - row-gap: 0.5rem !important; } - .row-gap-sm-3 { - row-gap: 1rem !important; } - .row-gap-sm-4 { - row-gap: 1.5rem !important; } - .row-gap-sm-5 { - row-gap: 3rem !important; } - .column-gap-sm-0 { - column-gap: 0 !important; } - .column-gap-sm-1 { - column-gap: 0.25rem !important; } - .column-gap-sm-2 { - column-gap: 0.5rem !important; } - .column-gap-sm-3 { - column-gap: 1rem !important; } - .column-gap-sm-4 { - column-gap: 1.5rem !important; } - .column-gap-sm-5 { - column-gap: 3rem !important; } - .text-sm-start { - text-align: left !important; } - .text-sm-end { - text-align: right !important; } - .text-sm-center { - text-align: center !important; } } - -@media (min-width: 768px) { - .float-md-start { - float: left !important; } - .float-md-end { - float: right !important; } - .float-md-none { - float: none !important; } - .object-fit-md-contain { - object-fit: contain !important; } - .object-fit-md-cover { - object-fit: cover !important; } - .object-fit-md-fill { - object-fit: fill !important; } - .object-fit-md-scale { - object-fit: scale-down !important; } - .object-fit-md-none { - object-fit: none !important; } - .d-md-inline { - display: inline !important; } - .d-md-inline-block { - display: inline-block !important; } - .d-md-block { - display: block !important; } - .d-md-grid { - display: grid !important; } - .d-md-inline-grid { - display: inline-grid !important; } - .d-md-table { - display: table !important; } - .d-md-table-row { - display: table-row !important; } - .d-md-table-cell { - display: table-cell !important; } - .d-md-flex { - display: flex !important; } - .d-md-inline-flex { - display: inline-flex !important; } - .d-md-none { - display: none !important; } - .flex-md-fill { - flex: 1 1 auto !important; } - .flex-md-row { - flex-direction: row !important; } - .flex-md-column { - flex-direction: column !important; } - .flex-md-row-reverse { - flex-direction: row-reverse !important; } - .flex-md-column-reverse { - flex-direction: column-reverse !important; } - .flex-md-grow-0 { - flex-grow: 0 !important; } - .flex-md-grow-1 { - flex-grow: 1 !important; } - .flex-md-shrink-0 { - flex-shrink: 0 !important; } - .flex-md-shrink-1 { - flex-shrink: 1 !important; } - .flex-md-wrap { - flex-wrap: wrap !important; } - .flex-md-nowrap { - flex-wrap: nowrap !important; } - .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !important; } - .justify-content-md-start { - justify-content: flex-start !important; } - .justify-content-md-end { - justify-content: flex-end !important; } - .justify-content-md-center { - justify-content: center !important; } - .justify-content-md-between { - justify-content: space-between !important; } - .justify-content-md-around { - justify-content: space-around !important; } - .justify-content-md-evenly { - justify-content: space-evenly !important; } - .align-items-md-start { - align-items: flex-start !important; } - .align-items-md-end { - align-items: flex-end !important; } - .align-items-md-center { - align-items: center !important; } - .align-items-md-baseline { - align-items: baseline !important; } - .align-items-md-stretch { - align-items: stretch !important; } - .align-content-md-start { - align-content: flex-start !important; } - .align-content-md-end { - align-content: flex-end !important; } - .align-content-md-center { - align-content: center !important; } - .align-content-md-between { - align-content: space-between !important; } - .align-content-md-around { - align-content: space-around !important; } - .align-content-md-stretch { - align-content: stretch !important; } - .align-self-md-auto { - align-self: auto !important; } - .align-self-md-start { - align-self: flex-start !important; } - .align-self-md-end { - align-self: flex-end !important; } - .align-self-md-center { - align-self: center !important; } - .align-self-md-baseline { - align-self: baseline !important; } - .align-self-md-stretch { - align-self: stretch !important; } - .order-md-first { - order: -1 !important; } - .order-md-0 { - order: 0 !important; } - .order-md-1 { - order: 1 !important; } - .order-md-2 { - order: 2 !important; } - .order-md-3 { - order: 3 !important; } - .order-md-4 { - order: 4 !important; } - .order-md-5 { - order: 5 !important; } - .order-md-last { - order: 6 !important; } - .m-md-0 { - margin: 0 !important; } - .m-md-1 { - margin: 0.25rem !important; } - .m-md-2 { - margin: 0.5rem !important; } - .m-md-3 { - margin: 1rem !important; } - .m-md-4 { - margin: 1.5rem !important; } - .m-md-5 { - margin: 3rem !important; } - .m-md-auto { - margin: auto !important; } - .mx-md-0 { - margin-right: 0 !important; - margin-left: 0 !important; } - .mx-md-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; } - .mx-md-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; } - .mx-md-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; } - .mx-md-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; } - .mx-md-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; } - .mx-md-auto { - margin-right: auto !important; - margin-left: auto !important; } - .my-md-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; } - .my-md-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; } - .my-md-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; } - .my-md-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; } - .my-md-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; } - .my-md-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; } - .my-md-auto { - margin-top: auto !important; - margin-bottom: auto !important; } - .mt-md-0 { - margin-top: 0 !important; } - .mt-md-1 { - margin-top: 0.25rem !important; } - .mt-md-2 { - margin-top: 0.5rem !important; } - .mt-md-3 { - margin-top: 1rem !important; } - .mt-md-4 { - margin-top: 1.5rem !important; } - .mt-md-5 { - margin-top: 3rem !important; } - .mt-md-auto { - margin-top: auto !important; } - .me-md-0 { - margin-right: 0 !important; } - .me-md-1 { - margin-right: 0.25rem !important; } - .me-md-2 { - margin-right: 0.5rem !important; } - .me-md-3 { - margin-right: 1rem !important; } - .me-md-4 { - margin-right: 1.5rem !important; } - .me-md-5 { - margin-right: 3rem !important; } - .me-md-auto { - margin-right: auto !important; } - .mb-md-0 { - margin-bottom: 0 !important; } - .mb-md-1 { - margin-bottom: 0.25rem !important; } - .mb-md-2 { - margin-bottom: 0.5rem !important; } - .mb-md-3 { - margin-bottom: 1rem !important; } - .mb-md-4 { - margin-bottom: 1.5rem !important; } - .mb-md-5 { - margin-bottom: 3rem !important; } - .mb-md-auto { - margin-bottom: auto !important; } - .ms-md-0 { - margin-left: 0 !important; } - .ms-md-1 { - margin-left: 0.25rem !important; } - .ms-md-2 { - margin-left: 0.5rem !important; } - .ms-md-3 { - margin-left: 1rem !important; } - .ms-md-4 { - margin-left: 1.5rem !important; } - .ms-md-5 { - margin-left: 3rem !important; } - .ms-md-auto { - margin-left: auto !important; } - .p-md-0 { - padding: 0 !important; } - .p-md-1 { - padding: 0.25rem !important; } - .p-md-2 { - padding: 0.5rem !important; } - .p-md-3 { - padding: 1rem !important; } - .p-md-4 { - padding: 1.5rem !important; } - .p-md-5 { - padding: 3rem !important; } - .px-md-0 { - padding-right: 0 !important; - padding-left: 0 !important; } - .px-md-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; } - .px-md-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; } - .px-md-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; } - .px-md-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; } - .px-md-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; } - .py-md-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; } - .py-md-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; } - .py-md-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; } - .py-md-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; } - .py-md-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; } - .py-md-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; } - .pt-md-0 { - padding-top: 0 !important; } - .pt-md-1 { - padding-top: 0.25rem !important; } - .pt-md-2 { - padding-top: 0.5rem !important; } - .pt-md-3 { - padding-top: 1rem !important; } - .pt-md-4 { - padding-top: 1.5rem !important; } - .pt-md-5 { - padding-top: 3rem !important; } - .pe-md-0 { - padding-right: 0 !important; } - .pe-md-1 { - padding-right: 0.25rem !important; } - .pe-md-2 { - padding-right: 0.5rem !important; } - .pe-md-3 { - padding-right: 1rem !important; } - .pe-md-4 { - padding-right: 1.5rem !important; } - .pe-md-5 { - padding-right: 3rem !important; } - .pb-md-0 { - padding-bottom: 0 !important; } - .pb-md-1 { - padding-bottom: 0.25rem !important; } - .pb-md-2 { - padding-bottom: 0.5rem !important; } - .pb-md-3 { - padding-bottom: 1rem !important; } - .pb-md-4 { - padding-bottom: 1.5rem !important; } - .pb-md-5 { - padding-bottom: 3rem !important; } - .ps-md-0 { - padding-left: 0 !important; } - .ps-md-1 { - padding-left: 0.25rem !important; } - .ps-md-2 { - padding-left: 0.5rem !important; } - .ps-md-3 { - padding-left: 1rem !important; } - .ps-md-4 { - padding-left: 1.5rem !important; } - .ps-md-5 { - padding-left: 3rem !important; } - .gap-md-0 { - gap: 0 !important; } - .gap-md-1 { - gap: 0.25rem !important; } - .gap-md-2 { - gap: 0.5rem !important; } - .gap-md-3 { - gap: 1rem !important; } - .gap-md-4 { - gap: 1.5rem !important; } - .gap-md-5 { - gap: 3rem !important; } - .row-gap-md-0 { - row-gap: 0 !important; } - .row-gap-md-1 { - row-gap: 0.25rem !important; } - .row-gap-md-2 { - row-gap: 0.5rem !important; } - .row-gap-md-3 { - row-gap: 1rem !important; } - .row-gap-md-4 { - row-gap: 1.5rem !important; } - .row-gap-md-5 { - row-gap: 3rem !important; } - .column-gap-md-0 { - column-gap: 0 !important; } - .column-gap-md-1 { - column-gap: 0.25rem !important; } - .column-gap-md-2 { - column-gap: 0.5rem !important; } - .column-gap-md-3 { - column-gap: 1rem !important; } - .column-gap-md-4 { - column-gap: 1.5rem !important; } - .column-gap-md-5 { - column-gap: 3rem !important; } - .text-md-start { - text-align: left !important; } - .text-md-end { - text-align: right !important; } - .text-md-center { - text-align: center !important; } } - -@media (min-width: 992px) { - .float-lg-start { - float: left !important; } - .float-lg-end { - float: right !important; } - .float-lg-none { - float: none !important; } - .object-fit-lg-contain { - object-fit: contain !important; } - .object-fit-lg-cover { - object-fit: cover !important; } - .object-fit-lg-fill { - object-fit: fill !important; } - .object-fit-lg-scale { - object-fit: scale-down !important; } - .object-fit-lg-none { - object-fit: none !important; } - .d-lg-inline { - display: inline !important; } - .d-lg-inline-block { - display: inline-block !important; } - .d-lg-block { - display: block !important; } - .d-lg-grid { - display: grid !important; } - .d-lg-inline-grid { - display: inline-grid !important; } - .d-lg-table { - display: table !important; } - .d-lg-table-row { - display: table-row !important; } - .d-lg-table-cell { - display: table-cell !important; } - .d-lg-flex { - display: flex !important; } - .d-lg-inline-flex { - display: inline-flex !important; } - .d-lg-none { - display: none !important; } - .flex-lg-fill { - flex: 1 1 auto !important; } - .flex-lg-row { - flex-direction: row !important; } - .flex-lg-column { - flex-direction: column !important; } - .flex-lg-row-reverse { - flex-direction: row-reverse !important; } - .flex-lg-column-reverse { - flex-direction: column-reverse !important; } - .flex-lg-grow-0 { - flex-grow: 0 !important; } - .flex-lg-grow-1 { - flex-grow: 1 !important; } - .flex-lg-shrink-0 { - flex-shrink: 0 !important; } - .flex-lg-shrink-1 { - flex-shrink: 1 !important; } - .flex-lg-wrap { - flex-wrap: wrap !important; } - .flex-lg-nowrap { - flex-wrap: nowrap !important; } - .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !important; } - .justify-content-lg-start { - justify-content: flex-start !important; } - .justify-content-lg-end { - justify-content: flex-end !important; } - .justify-content-lg-center { - justify-content: center !important; } - .justify-content-lg-between { - justify-content: space-between !important; } - .justify-content-lg-around { - justify-content: space-around !important; } - .justify-content-lg-evenly { - justify-content: space-evenly !important; } - .align-items-lg-start { - align-items: flex-start !important; } - .align-items-lg-end { - align-items: flex-end !important; } - .align-items-lg-center { - align-items: center !important; } - .align-items-lg-baseline { - align-items: baseline !important; } - .align-items-lg-stretch { - align-items: stretch !important; } - .align-content-lg-start { - align-content: flex-start !important; } - .align-content-lg-end { - align-content: flex-end !important; } - .align-content-lg-center { - align-content: center !important; } - .align-content-lg-between { - align-content: space-between !important; } - .align-content-lg-around { - align-content: space-around !important; } - .align-content-lg-stretch { - align-content: stretch !important; } - .align-self-lg-auto { - align-self: auto !important; } - .align-self-lg-start { - align-self: flex-start !important; } - .align-self-lg-end { - align-self: flex-end !important; } - .align-self-lg-center { - align-self: center !important; } - .align-self-lg-baseline { - align-self: baseline !important; } - .align-self-lg-stretch { - align-self: stretch !important; } - .order-lg-first { - order: -1 !important; } - .order-lg-0 { - order: 0 !important; } - .order-lg-1 { - order: 1 !important; } - .order-lg-2 { - order: 2 !important; } - .order-lg-3 { - order: 3 !important; } - .order-lg-4 { - order: 4 !important; } - .order-lg-5 { - order: 5 !important; } - .order-lg-last { - order: 6 !important; } - .m-lg-0 { - margin: 0 !important; } - .m-lg-1 { - margin: 0.25rem !important; } - .m-lg-2 { - margin: 0.5rem !important; } - .m-lg-3 { - margin: 1rem !important; } - .m-lg-4 { - margin: 1.5rem !important; } - .m-lg-5 { - margin: 3rem !important; } - .m-lg-auto { - margin: auto !important; } - .mx-lg-0 { - margin-right: 0 !important; - margin-left: 0 !important; } - .mx-lg-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; } - .mx-lg-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; } - .mx-lg-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; } - .mx-lg-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; } - .mx-lg-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; } - .mx-lg-auto { - margin-right: auto !important; - margin-left: auto !important; } - .my-lg-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; } - .my-lg-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; } - .my-lg-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; } - .my-lg-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; } - .my-lg-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; } - .my-lg-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; } - .my-lg-auto { - margin-top: auto !important; - margin-bottom: auto !important; } - .mt-lg-0 { - margin-top: 0 !important; } - .mt-lg-1 { - margin-top: 0.25rem !important; } - .mt-lg-2 { - margin-top: 0.5rem !important; } - .mt-lg-3 { - margin-top: 1rem !important; } - .mt-lg-4 { - margin-top: 1.5rem !important; } - .mt-lg-5 { - margin-top: 3rem !important; } - .mt-lg-auto { - margin-top: auto !important; } - .me-lg-0 { - margin-right: 0 !important; } - .me-lg-1 { - margin-right: 0.25rem !important; } - .me-lg-2 { - margin-right: 0.5rem !important; } - .me-lg-3 { - margin-right: 1rem !important; } - .me-lg-4 { - margin-right: 1.5rem !important; } - .me-lg-5 { - margin-right: 3rem !important; } - .me-lg-auto { - margin-right: auto !important; } - .mb-lg-0 { - margin-bottom: 0 !important; } - .mb-lg-1 { - margin-bottom: 0.25rem !important; } - .mb-lg-2 { - margin-bottom: 0.5rem !important; } - .mb-lg-3 { - margin-bottom: 1rem !important; } - .mb-lg-4 { - margin-bottom: 1.5rem !important; } - .mb-lg-5 { - margin-bottom: 3rem !important; } - .mb-lg-auto { - margin-bottom: auto !important; } - .ms-lg-0 { - margin-left: 0 !important; } - .ms-lg-1 { - margin-left: 0.25rem !important; } - .ms-lg-2 { - margin-left: 0.5rem !important; } - .ms-lg-3 { - margin-left: 1rem !important; } - .ms-lg-4 { - margin-left: 1.5rem !important; } - .ms-lg-5 { - margin-left: 3rem !important; } - .ms-lg-auto { - margin-left: auto !important; } - .p-lg-0 { - padding: 0 !important; } - .p-lg-1 { - padding: 0.25rem !important; } - .p-lg-2 { - padding: 0.5rem !important; } - .p-lg-3 { - padding: 1rem !important; } - .p-lg-4 { - padding: 1.5rem !important; } - .p-lg-5 { - padding: 3rem !important; } - .px-lg-0 { - padding-right: 0 !important; - padding-left: 0 !important; } - .px-lg-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; } - .px-lg-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; } - .px-lg-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; } - .px-lg-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; } - .px-lg-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; } - .py-lg-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; } - .py-lg-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; } - .py-lg-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; } - .py-lg-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; } - .py-lg-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; } - .py-lg-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; } - .pt-lg-0 { - padding-top: 0 !important; } - .pt-lg-1 { - padding-top: 0.25rem !important; } - .pt-lg-2 { - padding-top: 0.5rem !important; } - .pt-lg-3 { - padding-top: 1rem !important; } - .pt-lg-4 { - padding-top: 1.5rem !important; } - .pt-lg-5 { - padding-top: 3rem !important; } - .pe-lg-0 { - padding-right: 0 !important; } - .pe-lg-1 { - padding-right: 0.25rem !important; } - .pe-lg-2 { - padding-right: 0.5rem !important; } - .pe-lg-3 { - padding-right: 1rem !important; } - .pe-lg-4 { - padding-right: 1.5rem !important; } - .pe-lg-5 { - padding-right: 3rem !important; } - .pb-lg-0 { - padding-bottom: 0 !important; } - .pb-lg-1 { - padding-bottom: 0.25rem !important; } - .pb-lg-2 { - padding-bottom: 0.5rem !important; } - .pb-lg-3 { - padding-bottom: 1rem !important; } - .pb-lg-4 { - padding-bottom: 1.5rem !important; } - .pb-lg-5 { - padding-bottom: 3rem !important; } - .ps-lg-0 { - padding-left: 0 !important; } - .ps-lg-1 { - padding-left: 0.25rem !important; } - .ps-lg-2 { - padding-left: 0.5rem !important; } - .ps-lg-3 { - padding-left: 1rem !important; } - .ps-lg-4 { - padding-left: 1.5rem !important; } - .ps-lg-5 { - padding-left: 3rem !important; } - .gap-lg-0 { - gap: 0 !important; } - .gap-lg-1 { - gap: 0.25rem !important; } - .gap-lg-2 { - gap: 0.5rem !important; } - .gap-lg-3 { - gap: 1rem !important; } - .gap-lg-4 { - gap: 1.5rem !important; } - .gap-lg-5 { - gap: 3rem !important; } - .row-gap-lg-0 { - row-gap: 0 !important; } - .row-gap-lg-1 { - row-gap: 0.25rem !important; } - .row-gap-lg-2 { - row-gap: 0.5rem !important; } - .row-gap-lg-3 { - row-gap: 1rem !important; } - .row-gap-lg-4 { - row-gap: 1.5rem !important; } - .row-gap-lg-5 { - row-gap: 3rem !important; } - .column-gap-lg-0 { - column-gap: 0 !important; } - .column-gap-lg-1 { - column-gap: 0.25rem !important; } - .column-gap-lg-2 { - column-gap: 0.5rem !important; } - .column-gap-lg-3 { - column-gap: 1rem !important; } - .column-gap-lg-4 { - column-gap: 1.5rem !important; } - .column-gap-lg-5 { - column-gap: 3rem !important; } - .text-lg-start { - text-align: left !important; } - .text-lg-end { - text-align: right !important; } - .text-lg-center { - text-align: center !important; } } - -@media (min-width: 1200px) { - .float-xl-start { - float: left !important; } - .float-xl-end { - float: right !important; } - .float-xl-none { - float: none !important; } - .object-fit-xl-contain { - object-fit: contain !important; } - .object-fit-xl-cover { - object-fit: cover !important; } - .object-fit-xl-fill { - object-fit: fill !important; } - .object-fit-xl-scale { - object-fit: scale-down !important; } - .object-fit-xl-none { - object-fit: none !important; } - .d-xl-inline { - display: inline !important; } - .d-xl-inline-block { - display: inline-block !important; } - .d-xl-block { - display: block !important; } - .d-xl-grid { - display: grid !important; } - .d-xl-inline-grid { - display: inline-grid !important; } - .d-xl-table { - display: table !important; } - .d-xl-table-row { - display: table-row !important; } - .d-xl-table-cell { - display: table-cell !important; } - .d-xl-flex { - display: flex !important; } - .d-xl-inline-flex { - display: inline-flex !important; } - .d-xl-none { - display: none !important; } - .flex-xl-fill { - flex: 1 1 auto !important; } - .flex-xl-row { - flex-direction: row !important; } - .flex-xl-column { - flex-direction: column !important; } - .flex-xl-row-reverse { - flex-direction: row-reverse !important; } - .flex-xl-column-reverse { - flex-direction: column-reverse !important; } - .flex-xl-grow-0 { - flex-grow: 0 !important; } - .flex-xl-grow-1 { - flex-grow: 1 !important; } - .flex-xl-shrink-0 { - flex-shrink: 0 !important; } - .flex-xl-shrink-1 { - flex-shrink: 1 !important; } - .flex-xl-wrap { - flex-wrap: wrap !important; } - .flex-xl-nowrap { - flex-wrap: nowrap !important; } - .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !important; } - .justify-content-xl-start { - justify-content: flex-start !important; } - .justify-content-xl-end { - justify-content: flex-end !important; } - .justify-content-xl-center { - justify-content: center !important; } - .justify-content-xl-between { - justify-content: space-between !important; } - .justify-content-xl-around { - justify-content: space-around !important; } - .justify-content-xl-evenly { - justify-content: space-evenly !important; } - .align-items-xl-start { - align-items: flex-start !important; } - .align-items-xl-end { - align-items: flex-end !important; } - .align-items-xl-center { - align-items: center !important; } - .align-items-xl-baseline { - align-items: baseline !important; } - .align-items-xl-stretch { - align-items: stretch !important; } - .align-content-xl-start { - align-content: flex-start !important; } - .align-content-xl-end { - align-content: flex-end !important; } - .align-content-xl-center { - align-content: center !important; } - .align-content-xl-between { - align-content: space-between !important; } - .align-content-xl-around { - align-content: space-around !important; } - .align-content-xl-stretch { - align-content: stretch !important; } - .align-self-xl-auto { - align-self: auto !important; } - .align-self-xl-start { - align-self: flex-start !important; } - .align-self-xl-end { - align-self: flex-end !important; } - .align-self-xl-center { - align-self: center !important; } - .align-self-xl-baseline { - align-self: baseline !important; } - .align-self-xl-stretch { - align-self: stretch !important; } - .order-xl-first { - order: -1 !important; } - .order-xl-0 { - order: 0 !important; } - .order-xl-1 { - order: 1 !important; } - .order-xl-2 { - order: 2 !important; } - .order-xl-3 { - order: 3 !important; } - .order-xl-4 { - order: 4 !important; } - .order-xl-5 { - order: 5 !important; } - .order-xl-last { - order: 6 !important; } - .m-xl-0 { - margin: 0 !important; } - .m-xl-1 { - margin: 0.25rem !important; } - .m-xl-2 { - margin: 0.5rem !important; } - .m-xl-3 { - margin: 1rem !important; } - .m-xl-4 { - margin: 1.5rem !important; } - .m-xl-5 { - margin: 3rem !important; } - .m-xl-auto { - margin: auto !important; } - .mx-xl-0 { - margin-right: 0 !important; - margin-left: 0 !important; } - .mx-xl-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; } - .mx-xl-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; } - .mx-xl-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; } - .mx-xl-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; } - .mx-xl-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; } - .mx-xl-auto { - margin-right: auto !important; - margin-left: auto !important; } - .my-xl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; } - .my-xl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; } - .my-xl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; } - .my-xl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; } - .my-xl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; } - .my-xl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; } - .my-xl-auto { - margin-top: auto !important; - margin-bottom: auto !important; } - .mt-xl-0 { - margin-top: 0 !important; } - .mt-xl-1 { - margin-top: 0.25rem !important; } - .mt-xl-2 { - margin-top: 0.5rem !important; } - .mt-xl-3 { - margin-top: 1rem !important; } - .mt-xl-4 { - margin-top: 1.5rem !important; } - .mt-xl-5 { - margin-top: 3rem !important; } - .mt-xl-auto { - margin-top: auto !important; } - .me-xl-0 { - margin-right: 0 !important; } - .me-xl-1 { - margin-right: 0.25rem !important; } - .me-xl-2 { - margin-right: 0.5rem !important; } - .me-xl-3 { - margin-right: 1rem !important; } - .me-xl-4 { - margin-right: 1.5rem !important; } - .me-xl-5 { - margin-right: 3rem !important; } - .me-xl-auto { - margin-right: auto !important; } - .mb-xl-0 { - margin-bottom: 0 !important; } - .mb-xl-1 { - margin-bottom: 0.25rem !important; } - .mb-xl-2 { - margin-bottom: 0.5rem !important; } - .mb-xl-3 { - margin-bottom: 1rem !important; } - .mb-xl-4 { - margin-bottom: 1.5rem !important; } - .mb-xl-5 { - margin-bottom: 3rem !important; } - .mb-xl-auto { - margin-bottom: auto !important; } - .ms-xl-0 { - margin-left: 0 !important; } - .ms-xl-1 { - margin-left: 0.25rem !important; } - .ms-xl-2 { - margin-left: 0.5rem !important; } - .ms-xl-3 { - margin-left: 1rem !important; } - .ms-xl-4 { - margin-left: 1.5rem !important; } - .ms-xl-5 { - margin-left: 3rem !important; } - .ms-xl-auto { - margin-left: auto !important; } - .p-xl-0 { - padding: 0 !important; } - .p-xl-1 { - padding: 0.25rem !important; } - .p-xl-2 { - padding: 0.5rem !important; } - .p-xl-3 { - padding: 1rem !important; } - .p-xl-4 { - padding: 1.5rem !important; } - .p-xl-5 { - padding: 3rem !important; } - .px-xl-0 { - padding-right: 0 !important; - padding-left: 0 !important; } - .px-xl-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; } - .px-xl-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; } - .px-xl-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; } - .px-xl-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; } - .px-xl-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; } - .py-xl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; } - .py-xl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; } - .py-xl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; } - .py-xl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; } - .py-xl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; } - .py-xl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; } - .pt-xl-0 { - padding-top: 0 !important; } - .pt-xl-1 { - padding-top: 0.25rem !important; } - .pt-xl-2 { - padding-top: 0.5rem !important; } - .pt-xl-3 { - padding-top: 1rem !important; } - .pt-xl-4 { - padding-top: 1.5rem !important; } - .pt-xl-5 { - padding-top: 3rem !important; } - .pe-xl-0 { - padding-right: 0 !important; } - .pe-xl-1 { - padding-right: 0.25rem !important; } - .pe-xl-2 { - padding-right: 0.5rem !important; } - .pe-xl-3 { - padding-right: 1rem !important; } - .pe-xl-4 { - padding-right: 1.5rem !important; } - .pe-xl-5 { - padding-right: 3rem !important; } - .pb-xl-0 { - padding-bottom: 0 !important; } - .pb-xl-1 { - padding-bottom: 0.25rem !important; } - .pb-xl-2 { - padding-bottom: 0.5rem !important; } - .pb-xl-3 { - padding-bottom: 1rem !important; } - .pb-xl-4 { - padding-bottom: 1.5rem !important; } - .pb-xl-5 { - padding-bottom: 3rem !important; } - .ps-xl-0 { - padding-left: 0 !important; } - .ps-xl-1 { - padding-left: 0.25rem !important; } - .ps-xl-2 { - padding-left: 0.5rem !important; } - .ps-xl-3 { - padding-left: 1rem !important; } - .ps-xl-4 { - padding-left: 1.5rem !important; } - .ps-xl-5 { - padding-left: 3rem !important; } - .gap-xl-0 { - gap: 0 !important; } - .gap-xl-1 { - gap: 0.25rem !important; } - .gap-xl-2 { - gap: 0.5rem !important; } - .gap-xl-3 { - gap: 1rem !important; } - .gap-xl-4 { - gap: 1.5rem !important; } - .gap-xl-5 { - gap: 3rem !important; } - .row-gap-xl-0 { - row-gap: 0 !important; } - .row-gap-xl-1 { - row-gap: 0.25rem !important; } - .row-gap-xl-2 { - row-gap: 0.5rem !important; } - .row-gap-xl-3 { - row-gap: 1rem !important; } - .row-gap-xl-4 { - row-gap: 1.5rem !important; } - .row-gap-xl-5 { - row-gap: 3rem !important; } - .column-gap-xl-0 { - column-gap: 0 !important; } - .column-gap-xl-1 { - column-gap: 0.25rem !important; } - .column-gap-xl-2 { - column-gap: 0.5rem !important; } - .column-gap-xl-3 { - column-gap: 1rem !important; } - .column-gap-xl-4 { - column-gap: 1.5rem !important; } - .column-gap-xl-5 { - column-gap: 3rem !important; } - .text-xl-start { - text-align: left !important; } - .text-xl-end { - text-align: right !important; } - .text-xl-center { - text-align: center !important; } } - -@media (min-width: 1400px) { - .float-xxl-start { - float: left !important; } - .float-xxl-end { - float: right !important; } - .float-xxl-none { - float: none !important; } - .object-fit-xxl-contain { - object-fit: contain !important; } - .object-fit-xxl-cover { - object-fit: cover !important; } - .object-fit-xxl-fill { - object-fit: fill !important; } - .object-fit-xxl-scale { - object-fit: scale-down !important; } - .object-fit-xxl-none { - object-fit: none !important; } - .d-xxl-inline { - display: inline !important; } - .d-xxl-inline-block { - display: inline-block !important; } - .d-xxl-block { - display: block !important; } - .d-xxl-grid { - display: grid !important; } - .d-xxl-inline-grid { - display: inline-grid !important; } - .d-xxl-table { - display: table !important; } - .d-xxl-table-row { - display: table-row !important; } - .d-xxl-table-cell { - display: table-cell !important; } - .d-xxl-flex { - display: flex !important; } - .d-xxl-inline-flex { - display: inline-flex !important; } - .d-xxl-none { - display: none !important; } - .flex-xxl-fill { - flex: 1 1 auto !important; } - .flex-xxl-row { - flex-direction: row !important; } - .flex-xxl-column { - flex-direction: column !important; } - .flex-xxl-row-reverse { - flex-direction: row-reverse !important; } - .flex-xxl-column-reverse { - flex-direction: column-reverse !important; } - .flex-xxl-grow-0 { - flex-grow: 0 !important; } - .flex-xxl-grow-1 { - flex-grow: 1 !important; } - .flex-xxl-shrink-0 { - flex-shrink: 0 !important; } - .flex-xxl-shrink-1 { - flex-shrink: 1 !important; } - .flex-xxl-wrap { - flex-wrap: wrap !important; } - .flex-xxl-nowrap { - flex-wrap: nowrap !important; } - .flex-xxl-wrap-reverse { - flex-wrap: wrap-reverse !important; } - .justify-content-xxl-start { - justify-content: flex-start !important; } - .justify-content-xxl-end { - justify-content: flex-end !important; } - .justify-content-xxl-center { - justify-content: center !important; } - .justify-content-xxl-between { - justify-content: space-between !important; } - .justify-content-xxl-around { - justify-content: space-around !important; } - .justify-content-xxl-evenly { - justify-content: space-evenly !important; } - .align-items-xxl-start { - align-items: flex-start !important; } - .align-items-xxl-end { - align-items: flex-end !important; } - .align-items-xxl-center { - align-items: center !important; } - .align-items-xxl-baseline { - align-items: baseline !important; } - .align-items-xxl-stretch { - align-items: stretch !important; } - .align-content-xxl-start { - align-content: flex-start !important; } - .align-content-xxl-end { - align-content: flex-end !important; } - .align-content-xxl-center { - align-content: center !important; } - .align-content-xxl-between { - align-content: space-between !important; } - .align-content-xxl-around { - align-content: space-around !important; } - .align-content-xxl-stretch { - align-content: stretch !important; } - .align-self-xxl-auto { - align-self: auto !important; } - .align-self-xxl-start { - align-self: flex-start !important; } - .align-self-xxl-end { - align-self: flex-end !important; } - .align-self-xxl-center { - align-self: center !important; } - .align-self-xxl-baseline { - align-self: baseline !important; } - .align-self-xxl-stretch { - align-self: stretch !important; } - .order-xxl-first { - order: -1 !important; } - .order-xxl-0 { - order: 0 !important; } - .order-xxl-1 { - order: 1 !important; } - .order-xxl-2 { - order: 2 !important; } - .order-xxl-3 { - order: 3 !important; } - .order-xxl-4 { - order: 4 !important; } - .order-xxl-5 { - order: 5 !important; } - .order-xxl-last { - order: 6 !important; } - .m-xxl-0 { - margin: 0 !important; } - .m-xxl-1 { - margin: 0.25rem !important; } - .m-xxl-2 { - margin: 0.5rem !important; } - .m-xxl-3 { - margin: 1rem !important; } - .m-xxl-4 { - margin: 1.5rem !important; } - .m-xxl-5 { - margin: 3rem !important; } - .m-xxl-auto { - margin: auto !important; } - .mx-xxl-0 { - margin-right: 0 !important; - margin-left: 0 !important; } - .mx-xxl-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; } - .mx-xxl-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; } - .mx-xxl-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; } - .mx-xxl-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; } - .mx-xxl-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; } - .mx-xxl-auto { - margin-right: auto !important; - margin-left: auto !important; } - .my-xxl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; } - .my-xxl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; } - .my-xxl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; } - .my-xxl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; } - .my-xxl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; } - .my-xxl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; } - .my-xxl-auto { - margin-top: auto !important; - margin-bottom: auto !important; } - .mt-xxl-0 { - margin-top: 0 !important; } - .mt-xxl-1 { - margin-top: 0.25rem !important; } - .mt-xxl-2 { - margin-top: 0.5rem !important; } - .mt-xxl-3 { - margin-top: 1rem !important; } - .mt-xxl-4 { - margin-top: 1.5rem !important; } - .mt-xxl-5 { - margin-top: 3rem !important; } - .mt-xxl-auto { - margin-top: auto !important; } - .me-xxl-0 { - margin-right: 0 !important; } - .me-xxl-1 { - margin-right: 0.25rem !important; } - .me-xxl-2 { - margin-right: 0.5rem !important; } - .me-xxl-3 { - margin-right: 1rem !important; } - .me-xxl-4 { - margin-right: 1.5rem !important; } - .me-xxl-5 { - margin-right: 3rem !important; } - .me-xxl-auto { - margin-right: auto !important; } - .mb-xxl-0 { - margin-bottom: 0 !important; } - .mb-xxl-1 { - margin-bottom: 0.25rem !important; } - .mb-xxl-2 { - margin-bottom: 0.5rem !important; } - .mb-xxl-3 { - margin-bottom: 1rem !important; } - .mb-xxl-4 { - margin-bottom: 1.5rem !important; } - .mb-xxl-5 { - margin-bottom: 3rem !important; } - .mb-xxl-auto { - margin-bottom: auto !important; } - .ms-xxl-0 { - margin-left: 0 !important; } - .ms-xxl-1 { - margin-left: 0.25rem !important; } - .ms-xxl-2 { - margin-left: 0.5rem !important; } - .ms-xxl-3 { - margin-left: 1rem !important; } - .ms-xxl-4 { - margin-left: 1.5rem !important; } - .ms-xxl-5 { - margin-left: 3rem !important; } - .ms-xxl-auto { - margin-left: auto !important; } - .p-xxl-0 { - padding: 0 !important; } - .p-xxl-1 { - padding: 0.25rem !important; } - .p-xxl-2 { - padding: 0.5rem !important; } - .p-xxl-3 { - padding: 1rem !important; } - .p-xxl-4 { - padding: 1.5rem !important; } - .p-xxl-5 { - padding: 3rem !important; } - .px-xxl-0 { - padding-right: 0 !important; - padding-left: 0 !important; } - .px-xxl-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; } - .px-xxl-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; } - .px-xxl-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; } - .px-xxl-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; } - .px-xxl-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; } - .py-xxl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; } - .py-xxl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; } - .py-xxl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; } - .py-xxl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; } - .py-xxl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; } - .py-xxl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; } - .pt-xxl-0 { - padding-top: 0 !important; } - .pt-xxl-1 { - padding-top: 0.25rem !important; } - .pt-xxl-2 { - padding-top: 0.5rem !important; } - .pt-xxl-3 { - padding-top: 1rem !important; } - .pt-xxl-4 { - padding-top: 1.5rem !important; } - .pt-xxl-5 { - padding-top: 3rem !important; } - .pe-xxl-0 { - padding-right: 0 !important; } - .pe-xxl-1 { - padding-right: 0.25rem !important; } - .pe-xxl-2 { - padding-right: 0.5rem !important; } - .pe-xxl-3 { - padding-right: 1rem !important; } - .pe-xxl-4 { - padding-right: 1.5rem !important; } - .pe-xxl-5 { - padding-right: 3rem !important; } - .pb-xxl-0 { - padding-bottom: 0 !important; } - .pb-xxl-1 { - padding-bottom: 0.25rem !important; } - .pb-xxl-2 { - padding-bottom: 0.5rem !important; } - .pb-xxl-3 { - padding-bottom: 1rem !important; } - .pb-xxl-4 { - padding-bottom: 1.5rem !important; } - .pb-xxl-5 { - padding-bottom: 3rem !important; } - .ps-xxl-0 { - padding-left: 0 !important; } - .ps-xxl-1 { - padding-left: 0.25rem !important; } - .ps-xxl-2 { - padding-left: 0.5rem !important; } - .ps-xxl-3 { - padding-left: 1rem !important; } - .ps-xxl-4 { - padding-left: 1.5rem !important; } - .ps-xxl-5 { - padding-left: 3rem !important; } - .gap-xxl-0 { - gap: 0 !important; } - .gap-xxl-1 { - gap: 0.25rem !important; } - .gap-xxl-2 { - gap: 0.5rem !important; } - .gap-xxl-3 { - gap: 1rem !important; } - .gap-xxl-4 { - gap: 1.5rem !important; } - .gap-xxl-5 { - gap: 3rem !important; } - .row-gap-xxl-0 { - row-gap: 0 !important; } - .row-gap-xxl-1 { - row-gap: 0.25rem !important; } - .row-gap-xxl-2 { - row-gap: 0.5rem !important; } - .row-gap-xxl-3 { - row-gap: 1rem !important; } - .row-gap-xxl-4 { - row-gap: 1.5rem !important; } - .row-gap-xxl-5 { - row-gap: 3rem !important; } - .column-gap-xxl-0 { - column-gap: 0 !important; } - .column-gap-xxl-1 { - column-gap: 0.25rem !important; } - .column-gap-xxl-2 { - column-gap: 0.5rem !important; } - .column-gap-xxl-3 { - column-gap: 1rem !important; } - .column-gap-xxl-4 { - column-gap: 1.5rem !important; } - .column-gap-xxl-5 { - column-gap: 3rem !important; } - .text-xxl-start { - text-align: left !important; } - .text-xxl-end { - text-align: right !important; } - .text-xxl-center { - text-align: center !important; } } - -@media (min-width: 1200px) { - .fs-1 { - font-size: 2.5rem !important; } - .fs-2 { - font-size: 2rem !important; } - .fs-3 { - font-size: 1.75rem !important; } - .fs-4 { - font-size: 1.5rem !important; } } - -@media print { - .d-print-inline { - display: inline !important; } - .d-print-inline-block { - display: inline-block !important; } - .d-print-block { - display: block !important; } - .d-print-grid { - display: grid !important; } - .d-print-inline-grid { - display: inline-grid !important; } - .d-print-table { - display: table !important; } - .d-print-table-row { - display: table-row !important; } - .d-print-table-cell { - display: table-cell !important; } - .d-print-flex { - display: flex !important; } - .d-print-inline-flex { - display: inline-flex !important; } - .d-print-none { - display: none !important; } } - -:root { - --blue-900-hsl: 243, 72%, 25%; - --blue-800-hsl: 239, 70%, 32%; - --blue-700-hsl: 235, 68%, 38%; - --blue-600-hsl: 231, 66%, 45%; - --blue-500-hsl: 226, 66%, 51%; - --blue-400-hsl: 221, 77%, 60%; - --blue-300-hsl: 217, 88%, 69%; - --blue-200-hsl: 212, 100%, 79%; - --blue-100-hsl: 207, 100%, 88%; - --blue-50-hsl: 198, 100%, 97%; - --green-900-hsl: 153, 54%, 20%; - --green-800-hsl: 145, 57%, 25%; - --green-700-hsl: 136, 60%, 29%; - --green-600-hsl: 128, 63%, 34%; - --green-500-hsl: 119, 66%, 39%; - --green-400-hsl: 114, 49%, 51%; - --green-300-hsl: 110, 56%, 62%; - --green-200-hsl: 105, 64%, 74%; - --green-100-hsl: 102, 69%, 86%; - --green-50-hsl: 98, 73%, 97%; - --red-900-hsl: 344, 48%, 33%; - --red-800-hsl: 348, 50%, 40%; - --red-700-hsl: 352, 53%, 46%; - --red-600-hsl: 356, 62%, 53%; - --red-500-hsl: 1, 84%, 59%; - --red-400-hsl: 356, 98%, 67%; - --red-300-hsl: 350, 100%, 73%; - --red-200-hsl: 345, 100%, 80%; - --red-100-hsl: 339, 100%, 88%; - --red-50-hsl: 332, 100%, 97%; - --yellow-900-hsl: 44, 60%, 17%; - --yellow-800-hsl: 45, 59%, 25%; - --yellow-700-hsl: 46, 58%, 33%; - --yellow-600-hsl: 48, 57%, 41%; - --yellow-500-hsl: 48, 55%, 49%; - --yellow-400-hsl: 50, 72%, 57%; - --yellow-300-hsl: 51, 98%, 65%; - --yellow-200-hsl: 54, 100%, 72%; - --yellow-100-hsl: 54, 100%, 81%; - --yellow-50-hsl: 55, 100%, 93%; - --cyan-900-hsl: 194, 100%, 16%; - --cyan-800-hsl: 193, 100%, 21%; - --cyan-700-hsl: 192, 100%, 27%; - --cyan-600-hsl: 191, 100%, 32%; - --cyan-500-hsl: 190, 98%, 37%; - --cyan-400-hsl: 189, 94%, 43%; - --cyan-300-hsl: 187, 85%, 58%; - --cyan-200-hsl: 185, 100%, 72%; - --cyan-100-hsl: 180, 100%, 83%; - --cyan-50-hsl: 180, 100%, 94%; - --cardinal-900-hsl: 355, 68%, 21%; - --cardinal-800-hsl: 353, 67%, 29%; - --cardinal-700-hsl: 353, 65%, 37%; - --cardinal-600-hsl: 352, 63%, 45%; - --cardinal-500-hsl: 351, 67%, 52%; - --cardinal-400-hsl: 350, 89%, 60%; - --cardinal-300-hsl: 347, 100%, 68%; - --cardinal-200-hsl: 343, 100%, 75%; - --cardinal-100-hsl: 340, 100%, 83%; - --cardinal-50-hsl: 338, 100%, 96%; - --magenta-900-hsl: 297, 63%, 21%; - --magenta-800-hsl: 296, 62%, 29%; - --magenta-700-hsl: 295, 61%, 37%; - --magenta-600-hsl: 294, 58%, 45%; - --magenta-500-hsl: 293, 63%, 53%; - --magenta-400-hsl: 292, 84%, 61%; - --magenta-300-hsl: 291, 100%, 69%; - --magenta-200-hsl: 292, 100%, 75%; - --magenta-100-hsl: 293, 100%, 84%; - --magenta-50-hsl: 293, 100%, 94%; - --emerald-900-hsl: 165, 97%, 13%; - --emerald-800-hsl: 164, 96%, 18%; - --emerald-700-hsl: 163, 93%, 23%; - --emerald-600-hsl: 162, 89%, 29%; - --emerald-500-hsl: 161, 87%, 34%; - --emerald-400-hsl: 160, 84%, 39%; - --emerald-300-hsl: 158, 66%, 53%; - --emerald-200-hsl: 154, 77%, 68%; - --emerald-100-hsl: 149, 89%, 82%; - --emerald-50-hsl: 145, 100%, 94%; - --blue-900: hsl(var(--blue-900-hsl)); - --blue-800: hsl(var(--blue-800-hsl)); - --blue-700: hsl(var(--blue-700-hsl)); - --blue-600: hsl(var(--blue-600-hsl)); - --blue-500: hsl(var(--blue-500-hsl)); - --blue-400: hsl(var(--blue-400-hsl)); - --blue-300: hsl(var(--blue-300-hsl)); - --blue-200: hsl(var(--blue-200-hsl)); - --blue-100: hsl(var(--blue-100-hsl)); - --blue-50: hsl(var(--blue-50-hsl)); - --green-900: hsl(var(--green-900-hsl)); - --green-800: hsl(var(--green-800-hsl)); - --green-700: hsl(var(--green-700-hsl)); - --green-600: hsl(var(--green-600-hsl)); - --green-500: hsl(var(--green-500-hsl)); - --green-400: hsl(var(--green-400-hsl)); - --green-300: hsl(var(--green-300-hsl)); - --green-200: hsl(var(--green-200-hsl)); - --green-100: hsl(var(--green-100-hsl)); - --green-50: hsl(var(--green-50-hsl)); - --red-900: hsl(var(--red-900-hsl)); - --red-800: hsl(var(--red-800-hsl)); - --red-700: hsl(var(--red-700-hsl)); - --red-600: hsl(var(--red-600-hsl)); - --red-500: hsl(var(--red-500-hsl)); - --red-400: hsl(var(--red-400-hsl)); - --red-300: hsl(var(--red-300-hsl)); - --red-200: hsl(var(--red-200-hsl)); - --red-100: hsl(var(--red-100-hsl)); - --red-50: hsl(var(--red-50-hsl)); - --yellow-900: hsl(var(--yellow-900-hsl)); - --yellow-800: hsl(var(--yellow-800-hsl)); - --yellow-700: hsl(var(--yellow-700-hsl)); - --yellow-600: hsl(var(--yellow-600-hsl)); - --yellow-500: hsl(var(--yellow-500-hsl)); - --yellow-400: hsl(var(--yellow-400-hsl)); - --yellow-300: hsl(var(--yellow-300-hsl)); - --yellow-200: hsl(var(--yellow-200-hsl)); - --yellow-100: hsl(var(--yellow-100-hsl)); - --yellow-50: hsl(var(--yellow-50-hsl)); - --cyan-900: hsl(var(--cyan-900-hsl)); - --cyan-800: hsl(var(--cyan-800-hsl)); - --cyan-700: hsl(var(--cyan-700-hsl)); - --cyan-600: hsl(var(--cyan-600-hsl)); - --cyan-500: hsl(var(--cyan-500-hsl)); - --cyan-400: hsl(var(--cyan-400-hsl)); - --cyan-300: hsl(var(--cyan-300-hsl)); - --cyan-200: hsl(var(--cyan-200-hsl)); - --cyan-100: hsl(var(--cyan-100-hsl)); - --cyan-50: hsl(var(--cyan-50-hsl)); - --cardinal-900: hsl(var(--cardinal-900-hsl)); - --cardinal-800: hsl(var(--cardinal-800-hsl)); - --cardinal-700: hsl(var(--cardinal-700-hsl)); - --cardinal-600: hsl(var(--cardinal-600-hsl)); - --cardinal-500: hsl(var(--cardinal-500-hsl)); - --cardinal-400: hsl(var(--cardinal-400-hsl)); - --cardinal-300: hsl(var(--cardinal-300-hsl)); - --cardinal-200: hsl(var(--cardinal-200-hsl)); - --cardinal-100: hsl(var(--cardinal-100-hsl)); - --cardinal-50: hsl(var(--cardinal-50-hsl)); - --magenta-900: hsl(var(--magenta-900-hsl)); - --magenta-800: hsl(var(--magenta-800-hsl)); - --magenta-700: hsl(var(--magenta-700-hsl)); - --magenta-600: hsl(var(--magenta-600-hsl)); - --magenta-500: hsl(var(--magenta-500-hsl)); - --magenta-400: hsl(var(--magenta-400-hsl)); - --magenta-300: hsl(var(--magenta-300-hsl)); - --magenta-200: hsl(var(--magenta-200-hsl)); - --magenta-100: hsl(var(--magenta-100-hsl)); - --magenta-50: hsl(var(--magenta-50-hsl)); - --emerald-900: hsl(var(--emerald-900-hsl)); - --emerald-800: hsl(var(--emerald-800-hsl)); - --emerald-700: hsl(var(--emerald-700-hsl)); - --emerald-600: hsl(var(--emerald-600-hsl)); - --emerald-500: hsl(var(--emerald-500-hsl)); - --emerald-400: hsl(var(--emerald-400-hsl)); - --emerald-300: hsl(var(--emerald-300-hsl)); - --emerald-200: hsl(var(--emerald-200-hsl)); - --emerald-100: hsl(var(--emerald-100-hsl)); - --emerald-50: hsl(var(--emerald-50-hsl)); - --blue: var(--blue-500); - --green: var(--green-500); - --red: var(--red-500); - --yellow: var(--yellow-500); - --cyan: var(--cyan-500); - --cardinal: var(--cardinal-500); - --magenta: var(--magenta-500); - --emerald: var(--emerald-500); - --secondary: var(--gray-600); - --success: var(--green); - --info: var(--cyan); - --warning: var(--yellow); - --danger: var(--red); - --light: var(--gray-100); - --dark: #181921; - --dark-alt: #212529; - --dark-secondary: #292a35; - --white: #ffffff; - --gray-50: #f7fafc; - --gray-100: #f8f9fa; - --gray-200: #e9ecef; - --gray-300: #dee2e6; - --gray-400: #ced4da; - --gray-500: #adb5bd; - --gray-600: #6c757d; - --gray-700: #495057; - --gray-800: #343a40; - --gray-900: #212529; - --black: #000000; - --link-color: var(--primary); - --link-decoration: underline; - --link-shade-percentage: 20%; - --link-hover-decoration: null; - --text-default: var(--text-dark); - --text-default-inv: var(--text-light); - --text-muted: var(--gray-600); - --bs-secondary-color: var(--gray-600); - --body-color: var(--text-default); - --body-bg: var(--white); - --text-dark: #3C4257; - --text-light: #dee2e6; - --fw-medium: 600; - --shadow-sm: 0 .125rem .25rem rgba(var(--dark), .15); - --shadow: 0 0 3px rgba(var(--dark), .15); - --shadow-md: 0 5px 13px rgba(var(--dark), .2); - --shadow-lg: 0 10px 25px rgba(var(--dark), 0.15); - --overlay: rgba(var(--dark), 0.7); - --bg-overlay-white: rgba(var(--white), 0.5); - --back-to-top-color: var(--white); - --simplebar-color: #adb5bd; - --footer: #202942; - --footer-bg: var(--white); - --foot-social-color: #adb5bd; - --social-border-color: #adb5bd; - --foot-social-color-white: var(--white); - --l-100: 100%; - --btn-soft-color: var(--primary); - --btn-soft-bg: transparent; - --btn-soft-border: var(--gray-200); - --btn-primary-color: var(--white); - --btn-primary-bg: var(--primary); - --btn-primary-border: transparent; - --btn-default-color: var(--text-default); - --btn-default-hover-color: var(--primary); - --btn-default-bg: transparent; - --btn-default-border: transparent; - --icon-color: var(--primary); - --folder: "\e2c7"; - --article: "\ef42"; - --dash: "\f88a"; - --dir-right: "\e5da"; - --card-bg: var(--white); - --card-border-color: var(--gray-400); - --card-border-hover-color: var(--primary); - --sidebar-primary: var(--primary); - --sidebar-bg: var(--white); - --top-header-bg: hsla(255,100%,100%,0.8); - --sidebar-text-color: #606770; - --sidebar-border-color: var(--gray-200); - --sidebar-dropdown-hover-bg: #eff1f4; - --sidebar-menu-active-bg: #f5f6f8; - --sidebar-icon-bg: #f8f9fa; - --sidebar-light-icon: #f8f9fa; - --sidebar-scrollbar-thumb-color: var(--gray-200); - --sidebar-directory-icon: var(--dir-right); - --sidebar-file-icon: var(--dash); } - -[data-dark-mode] { - --body-bg: var(--dark); - --text-default: var(--text-light); - --text-default-inv: var(--text-dark); - --text-muted: #b6b9be; - --bs-secondary-color: #6c757d; - --btn-soft-color: var(--gray-400); - --btn-soft-bg: none; - --btn-soft-border: var(--gray-800); - --btn-primary-color: var(--primary-200); - --btn-primary-bg: none; - --btn-primary-border: var(--gray-700); - --btn-default-color: var(--text-default); - --btn-default-hover-color: var(--primary-300); - --btn-default-bg: transparent; - --btn-default-border: transparent; - --icon-color: #b6bbc9; - --card-bg: none; - --card-border-color: var(--gray-800); - --card-border-hover-color: var(--primary-200); - --sidebar-primary: var(--primary-300); - --sidebar-bg: var(--dark); - --top-header-bg: hsla(233,16%,11%,0.8); - --sidebar-text-color: #b6bbc9; - --sidebar-border-color: var(--gray-900); - --sidebar-dropdown-hover-bg: #2b303b; - --sidebar-menu-active-bg: #2b303b; - --sidebar-icon-bg: #2b303b; - --sidebar-light-icon: #f8f9fa; - --sidebar-scrollbar-thumb-color: var(--gray-800); } - -html { - scroll-padding-top: 80px; - background-color: var(--body-bg); } - -body { - font-family: Inter; - overflow-x: hidden !important; - font-size: 1rem; - color: var(--body-color); - background-color: var(--body-bg); } - -@media (max-width: 1199px) { - html { - scroll-padding-top: 120px; } - body { - font-size: 0.9rem; } } - -h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { - font-family: var(--bs-font-sans-serif); - line-height: 1.4; - font-weight: 600; } - -::selection { - background: var(--primary); - color: var(--white); - opacity: 0.9; } - -a { - text-decoration: none; - transition: all 0.5s ease; - color: var(--primary); } - a:hover { - color: var(--primary-800); } - -p { - line-height: 1.6; } - -img { - height: auto; } - -:root { - --content-icon-color: var(--primary); - --content-icon-bg: var(--sidebar-icon-bg); - --content-icon-border: var(--sidebar-icon-bg); - --content-link-color: var(--primary); - --ordered-list-bg: var(--gray-300); - --ordered-list-color: var(--gray-800); - --blockquote-border-color: var(--gray-300); - --code-block-bg: #212d63; - --inline-code-bg: var(--gray-100); - --inline-code-border: 1px solid var(--gray-400); } - -[data-dark-mode] { - --content-icon-color: var(--primary-200); - --content-icon-bg: hsl(var(--primary-hsl), 0.15); - --content-icon-border: var(--primary-800); - --content-link-color: var(--primary-300); - --ordered-list-bg: var(--gray-700); - --ordered-list-color: var(--gray-200); - --blockquote-border-color: var(--primary-200); - --code-block-bg: var(--gray-900); - --inline-code-bg: var(--gray-800); - --inline-code-border: 1px solid var(--gray-600); } - -.docs-content { - order: 1; } - -.docs-content .main-content a { - font-weight: 600; - color: var(--content-link-color); } - .docs-content .main-content a:hover { - text-decoration: underline 2px var(--primary-200); - text-underline-offset: 2.5px !important; - transition: 0s !important; } - .docs-content .main-content a code { - color: var(--content-link-color); } - -.docs-content .main-content #edit-this-page a:hover, -.docs-content .main-content #list-item a:hover { - text-decoration: none !important; } - -.docs-content .main-content li { - color: var(--text-default); } - -.docs-content .main-content h1, .docs-content .main-content .h1, -.docs-content .main-content h2, -.docs-content .main-content .h2, -.docs-content .main-content h3, -.docs-content .main-content .h3, -.docs-content .main-content h4, -.docs-content .main-content .h4, -.docs-content .main-content h5, -.docs-content .main-content .h5 { - font-weight: 700; - color: var(--body-color); } - -.docs-content .content-title { - font-weight: 700; - align-self: center; } - -i.title-icon { - width: 44px; - height: 44px; - color: var(--content-icon-color); - background-color: var(--content-icon-bg); - display: inline-flex !important; - align-self: center; - align-items: center; - justify-content: center; - font-size: 24px; - border-radius: 5px; } - @media (max-width: 768px) { - i.title-icon { - align-self: auto; } } -.docs-content p.lead { - color: var(--text-muted); - font-weight: 400; } - -@media (max-width: 1199px) { - .docs-content { - padding-left: calc(var(--bs-gutter-x) * 1.05); - padding-right: calc(var(--bs-gutter-x) * 1.05); } - .docs-content h2, .docs-content .h2 { - margin-bottom: 1rem; } - .docs-content p.lead { - font-size: 1rem; } } - -.docs-content .main-content img, -.docs-content .main-content svg { - max-width: 100%; - height: auto; } - -.docs-content .main-content a svg { - vertical-align: middle; - padding-bottom: 0.25rem; - margin-left: 3px; } - -.docs-content .main-content ul { - padding-left: 0; } - .docs-content .main-content ul > li { - position: relative; - padding-left: 32px; } - .docs-content .main-content ul > li::before { - content: ""; - position: absolute; - width: 6px; - height: 6px; - left: 8px; - top: 10px; - border-radius: 30%; - background: var(--gray-500); } - -.docs-content .main-content ol { - counter-reset: listitem; } - .docs-content .main-content ol > li { - counter-increment: listitem; - position: relative; - padding-left: 32px; } - .docs-content .main-content ol > li::before { - content: counter(listitem); - background: var(--ordered-list-bg); - color: var(--ordered-list-color); - font-size: 12px; - font-weight: 500; - line-height: 10px; - text-align: center; - padding: 5px 0; - width: 20px; - height: 20px; - border-radius: 5px; - position: absolute; - left: 0; - top: 3px; } - -.docs-content .main-content ol, -.docs-content .main-content ul { - list-style: none; - line-height: 26px; } - -.docs-content .main-content blockquote { - margin-bottom: 1rem; - font-size: 1.25rem; - border-left: 3px solid var(--blockquote-border-color); - padding-left: 1rem; } - -.docs-content .main-content div.highlight { - margin: 16px 0; - padding: 0; - background: var(--code-block-bg); - border-radius: 4px; } - .docs-content .main-content div.highlight pre { - padding: 0; } - -.docs-content .main-content code { - font-size: inherit; - font-weight: 400; - padding: 1px 2px; - background: var(--inline-code-bg); - border: var(--inline-code-border); - border-radius: 4px; } - -.docs-content .main-content pre { - margin: 0; - border-radius: 4px; - padding: 0; } - .docs-content .main-content pre code { - font-size: 0.8rem; - display: block; - border: none; - overflow-x: auto; - line-height: 1.5; - padding: 0 2.5rem 1.25rem 2.5rem; - tab-size: 4; - scrollbar-width: thin; } - -.docs-content .main-content strong code { - font-weight: 700; } - -.docs-content .main-content td pre code { - overflow-x: unset !important; } - -.docs-content .main-content .alert ul { - font-size: var(--font-size-sm); } - -.docs-content figcaption { - font-size: small; } - -.page-wrapper { - height: 100vh; } - .page-wrapper .sidebar-wrapper { - transition: all 0.3s ease; - width: 300px; - height: 100%; - max-height: 100%; - position: fixed; - top: 0; - left: -300px; - z-index: 999; } - @media (min-width: 1025px) { - .page-wrapper .sidebar-wrapper { - z-index: 1000; } } - @media (max-width: 1024px) { - .page-wrapper .sidebar-wrapper { - left: 0; } } - @media (max-width: 425px) { - .page-wrapper .sidebar-wrapper { - width: 260px; } } - .page-wrapper .sidebar-wrapper ul { - list-style-type: none; - padding: 0; - margin: 0; } - .page-wrapper .sidebar-wrapper a { - text-decoration: none; } - .page-wrapper .sidebar-wrapper .sidebar-content { - background: var(--sidebar-bg); - max-height: calc(100% - 30px); - height: calc(100% - 30px); - overflow: scroll; - overflow-x: hidden; - overflow-y: overlay; - position: relative; - border-right: 1px solid var(--sidebar-border-color); - scrollbar-width: thin; - scrollbar-color: var(--sidebar-bg) var(--sidebar-bg); } - .page-wrapper .sidebar-wrapper .sidebar-content.desktop { - overflow-y: hidden; } - .page-wrapper .sidebar-wrapper .sidebar-content:hover { - scrollbar-color: var(--sidebar-scrollbar-thumb-color) var(--sidebar-bg); } - .page-wrapper .sidebar-wrapper .sidebar-content::-webkit-scrollbar { - width: 5px; - height: 8px; } - .page-wrapper .sidebar-wrapper .sidebar-content::-webkit-scrollbar-track { - background: var(--sidebar-bg); - display: none; } - .page-wrapper .sidebar-wrapper .sidebar-content:hover::-webkit-scrollbar-thumb { - background: var(--sidebar-scrollbar-thumb-color); } - .page-wrapper .sidebar-wrapper .sidebar-brand { - background: var(--sidebar-bg); - padding: 10px 20px; - border-bottom: 1px solid var(--sidebar-border-color); - display: flex; - align-items: center; - height: 72px; } - .page-wrapper .sidebar-wrapper .sidebar-brand > a { - text-transform: uppercase; - font-weight: bold; - flex-grow: 1; - transition: all 0.3s ease; } - .page-wrapper .sidebar-wrapper .sidebar-brand > a:focus { - outline: none; } - .page-wrapper .sidebar-wrapper .sidebar-brand > a svg { - height: 26px; } - .page-wrapper .sidebar-wrapper .sidebar-brand #close-sidebar { - cursor: pointer; - font-size: 24px; - transition: all 0.3s ease; } - .page-wrapper .sidebar-wrapper .sidebar-header { - padding: 20px; - overflow: hidden; } - .page-wrapper .sidebar-wrapper .sidebar-menu { - padding: 16px 0 16px 10px; } - .page-wrapper .sidebar-wrapper .sidebar-menu .header-menu span { - font-weight: bold; - font-size: 14px; - padding: 15px 20px 5px 20px; - display: inline-block; } - .page-wrapper .sidebar-wrapper .sidebar-menu li a, .page-wrapper .sidebar-wrapper .sidebar-menu li button { - display: inline-block; - color: var(--sidebar-text-color); - width: 100%; - text-decoration: none; - position: relative; - padding: 4px 35px 5px 10px; - margin: 4px 0 4px 0; - border: none; - letter-spacing: normal; - transition: all 0.3s ease; - display: flex; - align-items: center; - text-align: left; } - @media (max-width: 1024px) { - .page-wrapper .sidebar-wrapper .sidebar-menu li a, .page-wrapper .sidebar-wrapper .sidebar-menu li button { - padding: 6px 24px 6px 24px; } } - @media screen and (max-width: 425px) { - .page-wrapper .sidebar-wrapper .sidebar-menu li a, .page-wrapper .sidebar-wrapper .sidebar-menu li button { - padding: 6px 26px 6px 12px; } } - .page-wrapper .sidebar-wrapper .sidebar-menu li a:hover > i::before, .page-wrapper .sidebar-wrapper .sidebar-menu li button:hover > i::before { - display: inline-block; } - .page-wrapper .sidebar-wrapper .sidebar-menu li a:focus, .page-wrapper .sidebar-wrapper .sidebar-menu li button:focus { - outline: none; } - .page-wrapper .sidebar-wrapper .sidebar-menu li a i, .page-wrapper .sidebar-wrapper .sidebar-menu li button i { - min-width: 36px; - height: 36px; - background-color: var(--sidebar-icon-bg); - display: inline-flex !important; - align-items: center; - justify-content: center; - font-size: 20px; - text-align: center; - border-radius: 4px; - transition: all 0.3s ease; } - .page-wrapper .sidebar-wrapper .sidebar-menu li a.sidebar-nested-link, .page-wrapper .sidebar-wrapper .sidebar-menu li button.sidebar-nested-link { - align-items: normal; } - .page-wrapper .sidebar-wrapper .sidebar-menu li a:hover, .page-wrapper .sidebar-wrapper .sidebar-menu li.sidebar-dropdown button:hover { - background-color: var(--sidebar-dropdown-hover-bg); - border-radius: 4px 0 0 4px; - margin: 4px 0 4px 0; } - .page-wrapper .sidebar-wrapper .sidebar-menu li:hover i, .page-wrapper .sidebar-wrapper .sidebar-menu li.active i { - background-color: var(--sidebar-menu-active-bg); } - .page-wrapper .sidebar-wrapper .sidebar-menu li.no-icon > a:before { - content: none !important; } - .page-wrapper .sidebar-wrapper .sidebar-menu li.no-icon > button { - margin: 1px 0 1px 0; } - .page-wrapper .sidebar-wrapper .sidebar-menu li.no-icon > button:hover { - margin: 1px 0 1px 0; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-root-link { - font-size: 1rem; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.no-icon > button:after { - top: inherit !important; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown > button:after { - content: "\e5cc" !important; - color: var(--sidebar-text-color); - font-family: 'Material Symbols Outlined'; - font-weight: 500; - font-size: 22px; - position: absolute; - right: 15px; - top: 7px; - transition: all 0.3s ease; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.nested.no-icon > button:after { - top: inherit !important; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.nested.no-icon > button:before { - content: none !important; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.nested button { - font-size: 14px; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.nested button:before { - content: var(--sidebar-directory-icon); - color: var(--sidebar-text-color); - font-family: 'Material Symbols Outlined'; - margin-right: 4px; - font-size: 14px; - transition: all 0.3s ease; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.nested button:after { - top: inherit; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.active > button:after { - transform: rotate(90deg); - right: 17px; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.current > button:after { - color: var(--sidebar-primary); } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu { - display: none; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu ul { - padding: 3px 0; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu ul li { - padding-left: 15px; - font-size: 14px; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu ul li a { - font-weight: 400; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu ul li a:before { - content: var(--sidebar-file-icon); - color: var(--sidebar-text-color); - font-family: 'Material Symbols Outlined'; - margin-right: 4px; - font-size: 14px; - transition: all 0.3s ease; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu ul li a .badge, - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu ul li a .label { - float: right; - margin-top: 0px; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu ul li.no-icon { - padding-left: 10px; } - .page-wrapper .sidebar-wrapper .sidebar-menu ul li a span.label, .page-wrapper .sidebar-wrapper .sidebar-menu ul li a span.badge { - float: right; - margin-top: 8px; - margin-left: 5px; } - .page-wrapper .sidebar-wrapper .sidebar-header .user-info .user-role, - .page-wrapper .sidebar-wrapper .sidebar-header .user-info .user-status, - .page-wrapper .sidebar-wrapper .sidebar-brand > a, - .page-wrapper .sidebar-wrapper .sidebar-menu li a { - color: var(--sidebar-text-color); - font-weight: 600; } - .page-wrapper .sidebar-wrapper .sidebar-menu li.current > a, - .page-wrapper .sidebar-wrapper .sidebar-menu li:active > a, - .page-wrapper .sidebar-wrapper .sidebar-menu li:active > a:before, - .page-wrapper .sidebar-wrapper .sidebar-menu li.current > a:before, - .page-wrapper .sidebar-wrapper .sidebar-menu li.current > button:before, - .page-wrapper .sidebar-wrapper .sidebar-header .user-info, - .page-wrapper .sidebar-wrapper .sidebar-brand > a:hover { - color: var(--sidebar-primary) !important; } - .page-wrapper .sidebar-wrapper .sidebar-menu li.current > a { - font-weight: 600 !important; - background-color: var(--sidebar-menu-active-bg); - border-right: 3px solid var(--primary); - border-radius: 4px 0 0 4px; - margin: 4px 0 4px 0; } - .page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.current > button { - color: var(--sidebar-primary) !important; } - .page-wrapper .sidebar-wrapper .sidebar-brand .sidebar-colored { - display: none; } - .page-wrapper .sidebar-wrapper .sidebar-brand .logo-dark-mode { - display: none; } - .page-wrapper .sidebar-wrapper .sidebar-brand .logo-light-mode { - display: inline-block; } - .page-wrapper .page-content { - display: inline-block; - width: 100%; - padding-left: 0px; - transition: all 0.3s ease; } - .page-wrapper .page-content .top-header { - position: fixed; - right: 0; - top: 0; - z-index: 999; - max-height: 70px; - left: 0px; - transition: all 0.3s; } - .page-wrapper .page-content .top-header .header-bar { - background: var(--top-header-bg); - backdrop-filter: saturate(180%) blur(5px); - height: 72px; - border-bottom: 1px solid var(--sidebar-border-color); - position: relative; - justify-content: space-between; - align-items: center; - padding: 24px; } - @media (max-width: 425px) { - .page-wrapper .page-content .top-header .header-bar { - padding: 24px 12px; } } - .page-wrapper .page-content .top-header .header-bar .logo-icon { - display: none; } - @media (max-width: 1024px) { - .page-wrapper .page-content .top-header .header-bar .logo-icon { - display: block; } } - .page-wrapper .page-content .top-header .header-bar .logo-icon .small { - display: none; } - @media (max-width: 767px) { - .page-wrapper .page-content .top-header .header-bar .logo-icon .small { - display: block; } } - .page-wrapper .page-content .top-header .header-bar .logo-icon .small svg { - height: 22px; } - .page-wrapper .page-content .top-header .header-bar .logo-icon .big { - display: none; } - .page-wrapper .page-content .top-header .header-bar .logo-icon .big .logo-dark-mode { - display: none; } - .page-wrapper .page-content .top-header .header-bar .logo-icon .big .logo-light-mode { - display: inline-block; } - @media (min-width: 768px) and (max-width: 1024px) { - .page-wrapper .page-content .top-header .header-bar .logo-icon .big { - display: block; } } - .page-wrapper .page-content .layout-spacing { - padding: 94px 14px 24px !important; - min-height: calc(100vh - 66px) !important; - position: relative; } - @media (max-width: 425px) { - .page-wrapper .page-content .layout-spacing { - padding: 84px 0 24px !important; } } - @media screen and (min-width: 1025px) { - .page-wrapper.toggled .page-content { - padding-left: 300px; } } - .page-wrapper.toggled .top-header { - left: 300px; } - @media (max-width: 1024px) { - .page-wrapper.toggled .top-header { - left: 0; } } - .page-wrapper.toggled .sidebar-wrapper { - left: 0px; } - @media (max-width: 1024px) { - .page-wrapper.toggled .sidebar-wrapper { - left: -300px; } } -.sidebar-footer { - position: absolute; - background: var(--sidebar-bg); - width: 100%; - bottom: 0; - left: 0; - right: 0; - padding: 9px 24px 9px 20px !important; - border-right: 1px solid var(--sidebar-border-color); - height: 60px; } - @media (max-width: 425px) { - .sidebar-footer { - padding: 9px 12px !important; } } -:root { - --doc-nav-title-link-color: var(--primary); } - -[data-dark-mode] { - --doc-nav-title-link-color: var(--primary-300); } - -#doc-nav .card-title { - color: var(--doc-nav-title-link-color); } - -#doc-nav .card-text { - color: var(--text-muted); } - -@media (max-width: 425px) { - .doc-next { - order: 2; } - .doc-prev { - order: 1; } } - -.doc-hr { - border-top: 1px solid var(--gray-500); - margin-top: 2rem; - margin-bottom: 0px; - padding-top: 1rem; } - -:root { - --toc-link-hover-bg-color: var(--gray-300); - --toc-mobile-btn-bg-color: var(--gray-100); - --toc-mobile-menu-bg-color: var(--white); - --toc-mobile-link-hover-color: var(--primary); } - -[data-dark-mode] { - --toc-link-hover-bg-color: var(--gray-700); - --toc-mobile-btn-bg-color: var(--gray-900); - --toc-mobile-menu-bg-color: var(--body-bg); - --toc-mobile-link-hover-color: var(--primary-300); } - -.docs-toc-mobile { - position: sticky; - top: 85px; - padding-left: calc(var(--bs-gutter-x) * 1.05); - padding-right: calc(var(--bs-gutter-x) * 1.05); - z-index: 20; } - .docs-toc-mobile a { - color: var(--text-default); } - .docs-toc-mobile a:hover { - color: var(--toc-mobile-link-hover-color); } - .docs-toc-mobile .dropdown-toggle { - margin-bottom: 16px; - background: var(--toc-mobile-btn-bg-color); - color: var(--text-default); - padding: 4px; - border: 1px solid var(--alert-border-color); - border-radius: 4px; - width: calc(100% + 2px); - white-space: normal; } - .docs-toc-mobile .dropdown-menu { - transform: translateY(-16.5px) !important; - background: var(--toc-mobile-menu-bg-color); - inset: -1px auto none var(--bs-gutter-x) !important; - border: 1px solid var(--alert-border-color); - border-top: none; - border-radius: 0 0 4px 4px; - width: calc(100% - (var(--bs-gutter-x)*2)); - max-height: 40vh; - overflow-y: auto; - scrollbar-width: thin; } - .docs-toc-mobile .dropdown-menu li { - list-style: none; - padding: 0 0 4px 0; } - .docs-toc-mobile .dropdown-menu li ul { - padding-left: 1rem; } - -.docs-toc { - position: -webkit-sticky; - position: sticky; - top: 6rem; - height: calc(100vh - 11.1rem); - overflow-y: auto; - order: 2; - scrollbar-width: thin; - scrollbar-color: var(--simplebar-color) rgba(var(--bs-light-rgb), var(--bs-bg-opacity)); } - @media (max-width: 1199px) { - .docs-toc { - position: absolute !important; - width: 1px !important; - height: 1px !important; - padding: 0 !important; - margin: -1px !important; - overflow: hidden !important; - clip: rect(0, 0, 0, 0) !important; - white-space: nowrap !important; - border: 0 !important; } } -.docs-toc::-webkit-scrollbar { - width: 4px; - height: 18px; } - -.docs-toc::-webkit-scrollbar-track { - background: transparent; } - -.docs-toc::-webkit-scrollbar-thumb { - background-color: var(--simplebar-color); - border-radius: 4px; - border: transparent; } - -#TableOfContents ul, -#toc ul { - padding-left: 0; - margin-bottom: 0; - list-style: none; } - #TableOfContents ul li, - #toc ul li { - padding-bottom: 5px; } - #TableOfContents ul li ul li, - #toc ul li ul li { - border-top: none; - padding-left: 1rem; - margin-top: 0.125rem; - padding-top: 0.125rem; - padding-bottom: 0; } - -#TableOfContents a, -#toc a { - display: block; - color: var(--text-default); - padding: 0 10px 0 10px; - padding-block: 0px 0.05rem; - margin: 0 0 0 -10px; - border-radius: 4px; - width: fit-content; - font-size: 15px; - letter-spacing: 0.02em; - transition: all 0.1s; - -webkit-transition: all 0.1s; } - #TableOfContents a:hover, - #toc a:hover { - background-color: var(--toc-link-hover-bg-color); - transition: all 0.1s; - -webkit-transition: all 0.2s; } - -#toc a.active { - color: var(--white); - background-color: var(--primary); - opacity: 0.9; } - -footer { - position: relative; - color: var(--text-muted); - background: var(--body-bg); - height: 58px; } - footer .text-foot { - color: var(--gray-500); } - footer .footer-head { - font-size: 18px !important; - letter-spacing: 1px; - font-weight: 500; } - footer a { - color: var(--content-link-color); } - footer a:hover { - color: var(--content-link-color); - text-decoration: underline 1.5px var(--primary-200); - text-underline-offset: 3px !important; - transition: 0s !important; } - -.footnote-backref { - font-size: 1.1rem; - vertical-align: middle; - margin-left: 0.25rem; } - -:root { - --invert: invert(0%); - --btn-modal-hover-bg: var(--gray-200); } - -[data-dark-mode] { - --invert: invert(100%); - --btn-modal-hover-bg: var(--gray-800); } - -.btn-soft { - background-color: var(--btn-soft-bg) !important; - border: 1px solid var(--btn-soft-border) !important; - color: var(--btn-soft-color) !important; } - .btn-soft:hover, .btn-soft:active, .btn-soft.active, .btn-soft.focus { - background: var(--btn-soft-bg); - border-color: var(--btn-soft-border) !important; - color: var(--btn-soft-color) !important; } - -.btn-primary { - background-color: var(--btn-primary-bg) !important; - border: 1px solid var(--btn-primary-border) !important; - color: var(--btn-primary-color) !important; } - .btn-primary:hover, .btn-primary:active, .btn-primary.active, .btn-primary.focus { - background: var(--btn-primary-bg); - border-color: var(--btn-primary-border) !important; - color: var(--btn-primary-color) !important; } - -.btn-default { - background-color: var(--btn-default-bg) !important; - border: 1px solid var(--btn-default-border) !important; - color: var(--btn-default-color) !important; } - .btn-default:hover, .btn-default:active, .btn-default.active, .btn-default.focus { - background: var(--btn-default-bg); - border-color: var(--btn-default-border) !important; - color: var(--btn-default-hover-color) !important; } - -.btn-link-modal { - --bs-btn-font-weight: 600; - --bs-btn-color: var(--text-default); - --bs-btn-bg: none; - --bs-btn-border-color: var(--bd-violet-bg); - --bs-btn-hover-color: var(--btn-default-hover-color); - --bs-btn-hover-bg: var(--btn-modal-hover-bg); - --bs-btn-hover-border-color: var(--bd-violet-bg); - --bs-btn-focus-shadow-rgb: var(--bd-violet-rgb); - --bs-btn-active-color: var(--bs-btn-hover-color); - --bs-btn-active-bg: var(--bd-violet-bg); - --bs-btn-active-border-color: var(--bd-violet-bg); } - -.btn-close { - filter: var(--invert); } - -body .toggle-dark { - display: block; } - -body .toggle-light { - display: none; } - -[data-dark-mode] body .toggle-light { - display: block; } - -[data-dark-mode] body .toggle-dark { - display: none; } - -.btn { - padding: 8px 20px; - outline: none; - text-decoration: none; - font-size: 16px; - letter-spacing: 0.5px; - transition: all 0.3s; - font-weight: 600; - border-radius: 6px; } - .btn:focus { - box-shadow: none !important; } - .btn.btn-sm, .btn-group-sm > .btn { - padding: 7px 16px; - font-size: 12px; } - .btn.btn-xs { - padding: 4px 10px; - font-size: 10px; } - .btn.btn-lg, .btn-group-lg > .btn { - padding: 14px 30px; - font-size: 16px; } - .btn.searchbtn { - padding: 6px 20px; } - .btn.btn-pills { - border-radius: 30px; } - .btn.btn-outline-light { - border-color: var(--gray-200) !important; } - .btn.btn-soft-light { - color: var(--gray-500) !important; - border-color: var(--gray-200) !important; } - .btn.btn-soft-dark:hover, .btn.btn-soft-dark:focus, .btn.btn-soft-dark:active, .btn.btn-soft-dark.active, .btn.btn-soft-dark.focus { - color: var(--gray-400) !important; - border-color: var(--gray-200) !important; } - .btn.btn-dark, .btn.btn-secondary { - color: var(--gray-200); } - .btn.btn-outline-light { - color: var(--gray-900); } - .btn.btn-icon { - height: 36px; - width: 36px; - display: inline-flex; - align-items: center; - justify-content: center; - padding: 0; } - .btn.btn-icon .icons { - height: 16px; - width: 16px; - font-size: 16px; } - .btn.btn-icon.btn-lg, .btn-group-lg > .btn-icon.btn { - height: 48px; - width: 48px; - line-height: 46px; } - .btn.btn-icon.btn-lg .icons, .btn-group-lg > .btn-icon.btn .icons { - height: 20px; - width: 20px; - font-size: 20px; } - .btn.btn-icon.btn-sm, .btn-group-sm > .btn-icon.btn { - height: 30px; - width: 30px; - line-height: 28px; } - -button:not(:disabled) { - outline: none; } - -:root { - --breadcrumb-item-color: var(--primary); } - -[data-dark-mode] { - --breadcrumb-item-color: var(--primary-300); } - -.breadcrumb .breadcrumb-item a { - color: var(--breadcrumb-item-color); } - -.breadcrumb .breadcrumb-item.active { - color: var(--text-muted); } - -@media (max-width: 1199px) { - .breadcrumb { - --bs-breadcrumb-padding-x: 0.7rem; } } - -.badge { - letter-spacing: 1.1px; - padding: 6px 8px 7px 8px; - font-weight: 600; - line-height: 11px; - border-radius: 4px; } - .badge.badge-link:hover { - color: var(--white) !important; } - -:root { - --bg-default: hsl(var(--primary-800-hsl),0.1); - --bg-default-border: hsl(var(--primary-800-hsl),0.1); - --bg-default-color: var(--text-default); } - -[data-dark-mode] { - --bg-default: var(--gray-800); - --bg-default-border: hsl(var(--primary-200-hsl),0.1); - --bg-default-color: var(--text-default); } - -.bg-default { - background-color: var(--bg-default) !important; - border: 1px solid var(--bg-default-border) !important; - color: var(--bg-default-color) !important; } - -.bg-primary { - background-color: var(--btn-primary-bg) !important; - border: 1px solid var(--btn-primary-border) !important; - color: var(--btn-primary-color) !important; } - -:root { - --dropdown-link-color: var(--text-default); - --dropdown-bg: var(--body-bg); - --dropdown-border-color: var(--alert-border-color); - --dropdown-border-radius: 0 0 4px 4px; - --dropdown-link-hover-color: var(--primary); } - -[data-dark-mode] { - --dropdown-link-color: var(--text-default); - --dropdown-bg: var(--body-bg); - --dropdown-border-color: var(--alert-border-color); - --dropdown-border-radius: 0 0 4px 4px; - --dropdown-link-hover-color: var(--primary-300); } - -.dropdown-menu { - --bs-dropdown-min-width: 7rem; - --bs-dropdown-link-color: var(--dropdown-link-color); - --bs-dropdown-bg: var(--dropdown-bg); - --bs-dropdown-border-color: var(--dropdown-border-color); - --bs-dropdown-link-hover-bg: none; - --bs-dropdown-link-hover-color: var(--dropdown-link-hover-color); - --bs-dropdown-border-radius: var(--dropdown-border-radius); - transform: translate(0px, 57px) !important; - border-top: none; } - -:root { - --alert-border-color: #dee2e6; - --alert-default-color: 225.9, 68%, 95.1%; - --alert-default-bg: hsl(var(--alert-default-color)); - --alert-default-border-color: var(--alert-border-color); - --alert-primary-color: var(--primary-50-hsl); - --alert-primary-bg: hsl(var(--alert-primary-color),0.5); - --alert-primary-border-color: var(--alert-border-color); - --alert-info-color: 204, 45.5%, 97.8%; - --alert-info-bg: hsl(var(--alert-info-color)); - --alert-info-border-color: var(--alert-border-color); - --alert-success-color: var(--emerald-50-hsl); - --alert-success-bg: hsl(var(--alert-success-color),0.4); - --alert-success-border-color: var(--alert-border-color); - --alert-danger-color: var(--cardinal-50-hsl); - --alert-danger-bg: hsl(var(--alert-danger-color),0.5); - --alert-danger-border-color: var(--alert-border-color); - --alert-warning-color: var(--yellow-50-hsl); - --alert-warning-bg: hsl(var(--alert-warning-color),0.5); - --alert-warning-border-color: var(--alert-border-color); - --alert-light-bg: var(--gray-200); - --alert-light-border-color: var(--alert-border-color); - --alert-dark-bg: var(--gray-800); - --alert-dark-border-color: var(--alert-border-color); } - -[data-dark-mode] { - --alert-border-color: var(--gray-800); - --alert-default-bg: hsl(var(--alert-default-color),0.05); - --alert-default-border-color: var(--alert-border-color); - --alert-primary-bg: hsl(var(--primary-hsl),0.1); - --alert-primary-icon-color: var(--primary-200); - --alert-primary-border-color: var(--primary-800); - --alert-info-bg: hsl(var(--blue-500-hsl),0.1); - --alert-info-icon-color: var(--blue-200); - --alert-info-border-color: var(--blue-800); - --alert-success-bg: hsl(var(--emerald-500-hsl),0.1); - --alert-success-icon-color: var(--emerald-200); - --alert-success-border-color: var(--emerald-800); - --alert-danger-bg: hsl(var(--cardinal-500-hsl),0.1); - --alert-danger-icon-color: var(--cardinal-200); - --alert-danger-border-color: var(--cardinal-800); - --alert-warning-bg: hsl(var(--yellow-500-hsl),0.1); - --alert-warning-icon-color: var(--yellow-200); - --alert-warning-border-color: var(--yellow-800); - --alert-light-bg: var(--gray-900); - --alert-light-icon-color: var(--gray-200); - --alert-light-border-color: var(--gray-800); - --alert-dark-bg: var(--gray-400); - --alert-dark-icon-color: var(--gray-800); - --alert-dark-border-color: var(--gray-200); } - -.alert { - font-size: var(--font-size-sm); - border-radius: 4px; - color: var(--gray-700); } - .alert p { - line-height: 1.525rem; } - .alert p:last-child { - margin-bottom: 0; } - -.alert-icon { - margin-right: 0.35rem; } - -.alert-default { - background-color: var(--alert-default-bg); - border-color: var(--alert-border-color); - color: var(--text-default); } - -.alert-white { - background-color: rgba(255, 255, 255, 0.95); } - -.alert-primary { - background-color: var(--alert-primary-bg); - border-color: var(--alert-primary-border-color); - color: var(--text-default); } - .alert-primary > .alert-icon span { - color: var(--alert-primary-icon-color); - margin-top: 0.15rem; } - -.alert-primary a { - font-weight: bold; } - -.alert-success { - background-color: var(--alert-success-bg); - border-color: var(--alert-success-border-color); - color: var(--text-default); } - .alert-success > .alert-icon span { - color: var(--alert-success-icon-color); - margin-top: 0.15rem; } - -.alert-success a { - font-weight: bold; } - -.alert-info { - background-color: var(--alert-info-bg); - border-color: var(--alert-info-border-color); - color: var(--text-default); } - .alert-info > .alert-icon span { - color: var(--alert-info-icon-color); - margin-top: 0.15rem; } - -.alert-info a { - font-weight: bold; } - -.alert-warning { - background-color: var(--alert-warning-bg); - border-color: var(--alert-warning-border-color); - color: var(--text-default); } - .alert-warning > .alert-icon span { - color: var(--alert-warning-icon-color); - margin-top: 0.15rem; } - -.alert-warning .alert-link { - color: #523e02; } - -.alert-danger { - background-color: var(--alert-danger-bg); - border-color: var(--alert-danger-border-color); - color: var(--text-default); } - .alert-danger > .alert-icon span { - color: var(--alert-danger-icon-color); - margin-top: 0.15rem; } - -.alert-danger .alert-link { - color: #6a1a21; } - -.alert-light { - background-color: var(--alert-light-bg); - border-color: var(--alert-light-border-color); - color: var(--text-default); } - .alert-light > .alert-icon span { - color: var(--alert-light-icon-color); - margin-top: 0.15rem; } - -.alert-light .alert-link { - color: #4f5050; } - -.alert-dark { - background-color: var(--alert-dark-bg); - border-color: var(--alert-dark-border-color); - color: var(--text-default-inv); } - .alert-dark > .alert-icon span { - color: var(--alert-dark-icon-color); - margin-top: 0.15rem; } - -.alert-dark .alert-link { - color: #101214; } - -.alert .alert-link:hover, -.alert .alert-link:focus { - text-decoration: none; } - -.alert-dismissible .btn-close { - position: absolute; - top: 50%; - transform: translateY(-50%); - right: 1rem; - z-index: 2; - padding: 0.5rem; - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-x'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E"); - background-size: 1.5rem; - filter: invert(1) grayscale(100%) brightness(200%); } - -[data-global-alert="closed"] #announcement { - display: none; } - -:root { - --card-title-color: var(--text-default); - --card-text-color: var(--text-muted); } - -[data-dark-mode] { - --card-title-color: var(--text-default); - --card-text-color: var(--gray-500); } - -.card { - background: var(--card-bg); - border-color: var(--card-border-color); - border-radius: 4px; - transition: all 0.2s; - -webkit-transition: all 0.2s; } - .card .card-body { - padding: 1.5rem; } - .card:hover { - border-color: var(--card-border-hover-color); } - .card:hover .card-title { - color: #fff; } - -.card-title { - color: var(--card-title-color); } - -.card-text { - color: var(--card-text-color); - font-weight: 500; } - -:root { - --form-border-color: var(--gray-200); - --form-control-focus-color: var(--gray-900); - --form-control-focus-bg-color: none; - --form-control-focus-border-color: var(--primary); - --form-control-placeholder-color: #666d78; - --form-check-input-border-color:var(--gray-400); - --form-check-input-background-color:var(--primary); - --form-check-input-checked-border-color:var(--primary); - --form-check-input-checked-bg-image: url("data:image/svg+xml,"); } - -[data-dark-mode] { - --form-border-color: var(--gray-800); - --form-control-focus-color: var(--gray-200); - --form-control-focus-bg-color: #000; - --form-control-focus-border-color: var(--primary-300); - --form-control-placeholder-color: #7f8497; - --form-check-input-border-color:var(--gray-700); - --form-check-input-background-color:var(--primary-300); - --form-check-input-checked-border-color:var(--primary-300); - --form-check-input-checked-bg-image: url("data:image/svg+xml,"); } - -.form-label, -.form-check-label { - font-weight: 700; - font-size: 14px; } - -.form-control { - border: 1px solid var(--form-border-color); - font-size: 14px; - line-height: 22px; - border-radius: 4px; - color: var(--text-default) !important; - background-color: var(--body-bg); - text-align: left; } - .form-control:focus { - border-color: var(--primary); - box-shadow: none; } - .form-control[readonly] { - background-color: var(--white); } - .form-control:disabled { - background-color: var(--gray-300); } - .form-control::placeholder { - color: var(--form-control-placeholder-color); } - -.form-control:focus { - color: var(--form-control-focus-color); - border-color: var(--form-control-focus-border-color); - background-color: var(--form-control-focus-bg-color); } - -.form-check-input { - border: 1px solid var(--form-check-input-border-color); - background-color: var(--body-bg); } - .form-check-input:focus { - border-color: var(--primary); - box-shadow: none; } - .form-check-input.form-check-input:checked { - background-color: var(--form-check-input-background-color); - border-color: var(--form-check-input-checked-border-color); - --bs-form-check-bg-image: var(--form-check-input-checked-bg-image); } - -:root { - --table-hover-bg: rgba(0, 0, 0, 0.075); } - -[data-dark-mode] { - --table-hover-bg: rgba(255, 255, 255, 0.075); } - -table td { - border-top: 1px solid var(--card-border-color); } - -table td, table th { - border-right: 1px solid var(--card-border-color); - padding: 8px 12px; } - -table td:last-child, table th:last-child { - border-right: 0; } - -.table { - --bs-table-color: var(--text-default); - --bs-table-bg: transparent; - --bs-table-accent-bg: none; - --bs-table-striped-color: var(--text-default); - --bs-table-striped-bg: var(--alert-primary-bg); - --bs-table-hover-color: var(--text-default); - --bs-table-hover-bg: var(--table-hover-bg); - color: var(--text-default); - font-size: 0.875rem; - border-collapse: separate; - border-spacing: 0; } - .table > :not(caption) > * > * { - padding: 1rem 1rem; - border-bottom-width: 0; } - .table tbody { - vertical-align: top; } - .table tbody td { - border-top: inherit; - border-bottom-width: 1px; } - .table tbody td:first-child { - border-left-width: 1px; } - .table tbody td:last-child { - border-right: inherit; - border-right-width: 1px; } - .table tbody tr:first-child td { - border-top-width: 1px; } - .table tbody tr:first-child td:first-child { - border-top-left-radius: 4px; } - .table tbody tr:first-child td:last-child { - border-top-right-radius: 4px; } - .table tbody tr:last-child td:first-child { - border-bottom-left-radius: 4px; } - .table tbody tr:last-child td:last-child { - border-bottom-right-radius: 4px; } - .table td, .table th { - border-right: 0; } - .table thead, .table tbody, .table tfoot, .table tr, .table td, .table th { - border-color: var(--card-border-color); } - .table thead tr th { - text-transform: uppercase; - background: none; } - -.table-sm > :not(caption) > * > *, -.table-striped > :not(caption) > * > *, -.table-borderless > :not(caption) > * > *, -.table-hover > :not(caption) > * > *, -.table-striped-columns > :not(caption) > * > * { - padding: 0.6rem 0.6rem; } - -@media (max-width: 1199px) { - .table-sm > :not(caption) > * > *, - .table-striped > :not(caption) > * > *, - .table-borderless > :not(caption) > * > *, - .table-hover > :not(caption) > * > *, - .table-striped-columns > :not(caption) > * > * { - padding: 0.6rem 0.25rem; } } - -.table-xs > :not(caption) > * > * { - padding: 0.25rem 0.25rem; } - -.table-borderless > :not(caption) > * > * { - border-bottom-width: 0 !important; } - -.table-borderless td:first-child { - border-left-width: 0 !important; } - -.table-borderless td:last-child { - border-right-width: 0 !important; } - -.table-borderless tr:first-child td { - border-top-width: 0 !important; } - -.table-striped-columns > :not(caption) > tr > th:nth-child(2n) { - --bs-table-striped-bg: none; } - -.table-responsive { - display: block; - width: 100%; - overflow-x: auto; } - -:root { - --nav-tabs-border-width: none; - --nav-tabs-link-active-bg: none; - --nav-tabs-link-active-color: var(--text-default); - --nav-tabs-border-color: var(--gray-400); } - -[data-dark-mode] { - --nav-tabs-border-color: var(--gray-800); } - -.nav-tabs { - --bs-nav-tabs-border-width: var(--nav-tabs-border-width); - --bs-nav-tabs-link-active-bg: var(--nav-tabs-link-active-bg); - --bs-nav-tabs-link-active-color: var(--nav-tabs-link-active-color); - border-bottom: 1px solid var(--nav-tabs-border-color); - margin-bottom: 0.8rem; } - .nav-tabs .nav-link { - color: var(--text-muted) !important; - margin-bottom: -1px; } - .nav-tabs .nav-link:hover { - text-decoration: none !important; } - .nav-tabs .nav-link.active { - border-bottom: 2px solid var(--content-link-color); - color: var(--content-link-color) !important; } - -.tab-content { - margin-bottom: 0.8rem; } - -:root { - --tooltip-bg: var(--white); - --tooltip-border-color: var(--content-link-color); - --tooltip-drop-shadow-color: var(--gray-500); - --tooltip-link-color: var(--gray-700); } - -[data-dark-mode] { - --tooltip-bg: var(--dark-alt); - --tooltip-border-color: var(--primary-300); - --tooltip-drop-shadow-color: var(--gray-900); - --tooltip-link-color: var(--gray-500); } - -.tooltip { - --bs-tooltip-bg: var(--tooltip-bg); - --bs-tooltip-opacity: 1.0; - --bs-tooltip-font-size: 0.575rem; - --bs-tooltip-max-width: 300px; } - -.tooltip-inner { - text-align: left; - border: 2px solid var(--tooltip-border-color); - border-width: 2px 2px 2px 8px; - filter: drop-shadow(4px 4px 5px var(--tooltip-drop-shadow-color)); - --bs-tooltip-border-radius: 4px; } - .tooltip-inner a { - color: var(--tooltip-link-color); - font-size: 0.85rem; - line-height: 1.55; } - .tooltip-inner a p { - margin-bottom: 0.2rem; - color: var(--text-muted); - font-weight: 600; } - .tooltip-inner a strong { - font-size: 0.975rem; - line-height: 2; - color: var(--text-default); } - -:root { - --feature-icon-color: var(--primary); - --feature-icon-faint: var(--gray-200); - --feature-link-hover-bg-color: var(--primary); } - -[data-dark-mode] { - --feature-icon-color: var(--primary-300); - --feature-icon-faint: var(--gray-900); - --feature-link-hover-bg-color: var(--gray-900); } - -.features .icon { - background: rgba(var(--primary), 0.1); } - -.features .image:before { - background: linear-gradient(45deg, transparent, rgba(var(--primary), 0.1)); } - -.features .read-more, -.features .color { - color: var(--primary) !important; } - -.features.feature-clean .icons { - color: var(--primary) !important; } - .features.feature-clean .icons i { - background-color: rgba(var(--primary), 0.1); } - -.features.feature-clean .title:hover { - color: var(--primary-800) !important; } - -.features.feature-full-bg .icon-color { - color: var(--feature-icon-color) !important; } - -.features.feature-full-bg .icon-faint { - color: var(--feature-icon-faint) !important; - transition: all 0.5s ease; } - -.features.feature-full-bg:hover { - background-color: var(--feature-link-hover-bg-color) !important; } - -.features.key-feature .icon { - background: linear-gradient(45deg, transparent, rgba(var(--primary), 0.15)); - color: var(--primary); } - -.features.course-feature .full-img { - color: var(--primary) !important; } - -.features.explore-feature:hover .icons, -.features.explore-feature:hover .title { - color: var(--primary) !important; } - -.features .btn-soft { - background-color: rgba(var(--primary), 0.05) !important; - border: 1px solid rgba(var(--primary), 0.05) !important; - color: var(--primary) !important; - box-shadow: 0 3px 5px 0 rgba(var(--primary), 0.1); } - .features .btn-soft:hover, .features .btn-soft:focus, .features .btn-soft:active, .features .btn-soft.active, .features .btn-soft.focus { - background-color: var(--primary) !important; - border-color: var(--primary) !important; - color: var(--white) !important; } - -.features:hover .image:before { - background: rgba(var(--primary), 0.1); } - -.features .image:before { - content: ""; - position: absolute; - bottom: 5px; - left: 5px; - width: 64px; - height: 64px; - border-radius: 6px; - transform: rotate(33.75deg); } - -.features.feature-clean { - background-color: var(--body-bg); } - .features.feature-clean .icons i { - height: 65px; - width: 65px; - line-height: 65px; } - -.features .ride-image { - transform: rotate(-45deg); } - .features .ride-image img { - border-radius: 100% 100% 100% 0; } - -.features.key-feature { - transition: all 0.3s ease; } - .features.key-feature:hover { - transform: scale(1.05); - box-shadow: var(--shadow-md) !important; } - -.features:hover .image:before { - animation: spinner-border 5s linear infinite !important; } - -.features.feature-full-bg { - transition: all 0.5s ease; } - .features.feature-full-bg .big-icon { - position: absolute; - top: 50%; - transform: translateY(-50%); - left: 0; - right: 0; - opacity: 0.015; - font-size: 180px; } - .features.feature-full-bg:hover { - box-shadow: var--(shadow-lg); - color: var(--white) !important; } - .features.feature-full-bg:hover .icon-color i, - .features.feature-full-bg:hover .badge, - .features.feature-full-bg:hover .para { - color: var(--white) !important; - opacity: 0.5; } - .features.feature-full-bg:hover .content, - .features.feature-full-bg:hover .icon-color { - z-index: 2; } - .features.feature-full-bg:hover .big-icon { - opacity: 0.05; } - .features.feature-full-bg:hover .readmore { - color: var(--white) !important; } - -.features.course-feature { - transition: all 0.5s ease; } - .features.course-feature .full-img { - position: absolute; - bottom: 50%; - transform: translateY(50%); - left: 0; - right: 0; - opacity: 0; - margin: 0 auto; - z-index: -2; - transition: all 0.5s ease; - font-size: 250px; } - .features.course-feature:hover { - transform: translateY(-10px); } - .features.course-feature:hover .full-img { - opacity: 0.05; } - -.features.explore-feature { - transition: all 0.5s ease; } - .features.explore-feature .icons { - height: 80px; - width: 80px; - line-height: 80px; - transition: all 0.5s ease; } - .features.explore-feature:hover { - box-shadow: var(--shadow-lg) !important; } - -.features .title, -.key-feature .title { - font-size: 18px !important; } - -.features .icon, -.key-feature .icon { - height: 45px; - min-width: 45px; - display: flex; - align-items: center; - justify-content: center; } - -.fw-medium { - font-weight: var(--fw-medium); } - -.section { - padding: 100px 0; - position: relative; } - @media (max-width: 768px) { - .section { - padding: 60px 0; } } -.bg-overlay { - background-color: var(--overlay); - position: absolute; - top: 0; - right: 0; - left: 0; - bottom: 0; - width: 100%; - height: 100%; } - -.bg-overlay-white { - background-color: var(--bg-overlay-white); } - -.title-heading { - line-height: 26px; } - .title-heading .heading { - font-size: 45px !important; - letter-spacing: 1px; } - @media (max-width: 768px) { - .title-heading .heading { - font-size: 35px !important; } } - .title-heading .para-desc { - font-size: 18px; } - -.section-title .title { - letter-spacing: 0.5px; - font-size: 30px !important; } - @media (max-width: 768px) { - .section-title .title { - font-size: 24px !important; } } -.para-desc { - max-width: 600px; } - -.mt-100 { - margin-top: 100px; } - -.back-to-top { - position: fixed; - z-index: 99; - bottom: 30px; - right: 30px; - display: none; - transition: all 0.5s ease; - height: 36px; - width: 36px; - line-height: 0; - padding: 0; - border-radius: 4px; - border: none; - background: var(--primary); } - .back-to-top svg { - transition: all 0.5s ease; } - .back-to-top:hover { - transform: rotate(45deg); } - .back-to-top:hover svg { - transform: rotate(-45deg) !important; } - -.opacity-05 { - opacity: 0.05; } - -.opacity-1 { - opacity: 0.1; } - -.opacity-2 { - opacity: 0.2; } - -.opacity-3 { - opacity: 0.3; } - -.opacity-4 { - opacity: 0.4; } - -.opacity-5 { - opacity: 0.5; } - -.opacity-6 { - opacity: 0.6; } - -.opacity-7 { - opacity: 0.7; } - -.opacity-075 { - opacity: 0.075; } - -.opacity-8 { - opacity: 0.8; } - -.opacity-9 { - opacity: 0.9; } - -.back-to-home { - position: fixed; - top: 4%; - right: 2%; - z-index: 1; } - -.sticky-bar { - position: sticky; - top: 80px; } - -[class^=uil-]:before, -[class*=" uil-"]:before { - margin: 0; } - -.uim-svg { - vertical-align: 0 !important; } - -.social-icon li a { - color: var(--dark); - border: 1px solid var(--dark); - height: 32px; - width: 32px; - display: inline-flex; - justify-content: center; - align-items: center; - text-align: center; - transition: all 0.4s ease; - overflow: hidden; - position: relative; } - .social-icon li a .fea-social { - stroke-width: 2; } - .social-icon li a:hover { - background-color: var(--primary); - border-color: var(--primary) !important; - color: var(--foot-social-color-white) !important; } - .social-icon li a:hover .fea-social { - fill: var(--primary); } - -.social-icon.social li a { - color: var(--foot-social-color); - border-color: var(--social-border-color); } - -.social-icon.foot-social-icon li a { - color: var(--foot-social-color); - border-color: hsl(var(--footer), 100%, calc(var(--l) + 5%)); } - -.rounded { - border-radius: 6px !important; } - -.rounded-top { - border-top-left-radius: 6px !important; - border-top-right-radius: 6px !important; } - -.rounded-left { - border-top-left-radius: 6px !important; - border-bottom-left-radius: 6px !important; } - -.rounded-bottom { - border-bottom-left-radius: 6px !important; - border-bottom-right-radius: 6px !important; } - -.rounded-right { - border-top-right-radius: 6px !important; - border-bottom-right-radius: 6px !important; } - -.rounded-md { - border-radius: 10px !important; } - -.rounded-lg { - border-radius: 30px !important; } - -.bg-white-color { - background: var(--bg-white-color); } - -.d-flex .flex-1 { - flex: 1; } - -.material-icons { - font-family: 'Material Symbols Outlined'; - font-weight: normal; - font-style: normal; - font-size: 24px; - /* Preferred icon size */ - display: inline-block; - line-height: 1; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - white-space: nowrap; - direction: ltr; - overflow: hidden; - /* Support for all WebKit browsers. */ - -webkit-font-smoothing: antialiased; - /* Support for Safari and Chrome. */ - text-rendering: optimizeLegibility; - /* Support for Firefox. */ - -moz-osx-font-smoothing: grayscale; - /* Support for IE. */ - font-feature-settings: 'liga'; } - -/* Recommended icon sizes */ -span.size-16, -i.size-16 { - font-size: 16px !important; - font-variation-settings: 'OPSZ' 16; } - -span.size-20, -i.size-20 { - font-size: 20px !important; - font-variation-settings: 'OPSZ' 20; } - -span.size-24, -i.size-24 { - font-size: 24px !important; - font-variation-settings: 'OPSZ' 24; } - -span.size-40, -i.size-40 { - font-size: 40px !important; - font-variation-settings: 'OPSZ' 40; } - -span.size-48, -i.size-48 { - font-size: 48px !important; - font-variation-settings: 'OPSZ' 48; } - -.anchor { - visibility: hidden; } - -h1:hover a, .h1:hover a, -h2:hover a, -.h2:hover a, -h3:hover a, -.h3:hover a, -h4:hover a, -.h4:hover a { - visibility: visible; - text-decoration: none; } - -/* PrismJS 1.29.0 -https://prismjs.com/download.html#themes=prism-solarizedlight&languages=markup+css+clike+javascript */ -/* - Solarized Color Schemes originally by Ethan Schoonover - http://ethanschoonover.com/solarized - - Ported for PrismJS by Hector Matos - Website: https://krakendev.io - Twitter Handle: https://twitter.com/allonsykraken - - Adapted for Lotus Docs by Colin Wilson - Website: https://colinwilson.uk - Twitter Handle: https://twitter.com/colinwilsonuk -*/ -/* -SOLARIZED HEX ---------- ------- -base03 #002b36 -base02 #073642 -base01 #586e75 -base00 #657b83 -base0 #839496 -base1 #93a1a1 -base2 #eee8d5 -base3 #fdf6e3 -yellow #b58900 -orange #cb4b16 -red #dc322f -magenta #d33682 -violet #6c71c4 -blue #268bd2 -cyan #2aa198 -green #859900 -*/ -:root { - --prism-code-color: #657b83; - --prism-code-bg: #fdf6e3; - --prism-code-scrollbar-thumb-color: var(--gray-400); - --prism-line-highlight-bg-color: #e9967a; - --prism-copy-btn-bg-hover-color: var(--gray-700); } - -[data-dark-mode] { - --prism-code-color: #dee2e6; - --prism-code-bg: var(--gray-900); - --prism-code-scrollbar-thumb-color: var(--gray-600); - --prism-line-highlight-bg-color: var(--gray-600); - --prism-copy-btn-bg-hover-color: var(--white); } - -code[class*="language-"], -pre[class*="language-"] { - color: var(--prism-code-color); - /* base00 */ - background: var(--prism-code-bg) !important; } - -pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, -code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { - background: #073642; - /* base02 */ } - -pre[class*="language-"]::selection, pre[class*="language-"] ::selection, -code[class*="language-"]::selection, code[class*="language-"] ::selection { - background: #073642; - /* base02 */ } - -/* Code blocks */ -pre[class*="language-"] { - overflow: auto; - border-radius: 0 0 4px 4px; } - -:not(pre) > code[class*="language-"], -pre[class*="language-"] { - background-color: #fdf6e3; - /* base3 */ } - -/* Inline code */ -:not(pre) > code[class*="language-"] { - padding: .1em; - border-radius: .3em; - white-space: normal; } - -.line-highlight:before, -.line-highlight[data-end]:after { - background-color: var(--prism-line-highlight-bg-color); } - -[data-copy-state="copy"] span:empty::before { - background-color: var(--gray-500); } - -[data-copy-state="copy"] span:empty:hover::before { - background-color: var(--prism-copy-btn-bg-hover-color); } - -[data-copy-state="copy-success"] span:empty::before { - background-color: var(--emerald-400); } - -.token.comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: #93a1a1; - /* base1 */ } - -.token.punctuation { - color: #586e75; - /* base01 */ } - -.token.namespace { - opacity: .7; } - -.token.property, -.token.tag, -.token.boolean, -.token.number, -.token.constant, -.token.symbol, -.token.deleted { - color: #268bd2; - /* blue */ } - -.token.selector, -.token.attr-name, -.token.string, -.token.char, -.token.builtin, -.token.url, -.token.inserted { - color: #2aa198; - /* cyan */ } - -.token.entity { - color: #657b83; - /* base00 */ - background: #eee8d5; - /* base2 */ } - -.token.atrule, -.token.attr-value, -.token.keyword { - color: #859900; - /* green */ } - -.token.function, -.token.class-name { - color: #b58900; - /* yellow */ } - -.token.regex, -.token.important, -.token.variable { - color: #cb4b16; - /* orange */ } - -.token.important, -.token.bold { - font-weight: bold; } - -.token.italic { - font-style: italic; } - -.token.entity { - cursor: help; } - -/* PrismJS 1.29.0 */ -code { - color: var(--text-default); } - -.docs-content .main-content pre { - background-color: var(--prism-code-bg) !important; } - -code[class*="language-"], -pre[class*="language-"] { - border: none !important; - font-family: Fira Code; - font-size: 0.8rem; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - text-rendering: optimizeLegibility; - scrollbar-width: thin; - scrollbar-color: var(--prism-code-scrollbar-thumb-color) var(--prism-code-bg); } - code[class*="language-"]::-webkit-scrollbar, - pre[class*="language-"]::-webkit-scrollbar { - height: 5px; - background: var(--prism-code-bg); } - code[class*="language-"]::-webkit-scrollbar-thumb, - pre[class*="language-"]::-webkit-scrollbar-thumb { - background: var(--prism-code-scrollbar-thumb-color); } - -pre[data-line] { - position: relative; - padding: 0 !important; } - -.line-highlight:first-of-type { - margin-top: 0em; } - -.line-highlight:last-of-type { - margin-top: 0em !important; } - -.line-highlight { - position: absolute; - left: 0; - right: 0; - padding: inherit 0; - margin-top: 0em; - /* Same as .prism’s padding-top */ - background: rgba(153, 122, 102, 0.08); - background: linear-gradient(to right, rgba(153, 122, 102, 0.1) 70%, rgba(153, 122, 102, 0)); - pointer-events: none; - line-height: inherit; - white-space: pre; } - -@media print { - .line-highlight { - /* - * This will prevent browsers from replacing the background color with white. - * It's necessary because the element is layered on top of the displayed code. - */ - -webkit-print-color-adjust: exact; - color-adjust: exact; } } - -.line-highlight:before, -.line-highlight[data-end]:after { - content: attr(data-start); - position: absolute; - top: 0.14em; - left: .6em; - min-width: 1.5em; - padding: 0 .5em; - color: #f5f2f0; - font: bold 95%/1.3 sans-serif; - text-align: center; - vertical-align: .3em; - border-radius: 4px; - text-shadow: none; } - -.line-highlight[data-end]:after { - content: attr(data-end); - top: auto; - bottom: .14em; } - -.line-numbers .line-highlight { - margin-top: 0em !important; } - -.line-numbers .line-highlight:before, -.line-numbers .line-highlight:after { - content: none; } - -pre[id].linkable-line-numbers span.line-numbers-rows { - pointer-events: all; } - -pre[id].linkable-line-numbers span.line-numbers-rows > span:before { - cursor: pointer; } - -pre[id].linkable-line-numbers span.line-numbers-rows > span:hover:before { - background-color: rgba(128, 128, 128, 0.2); } - -pre[class*="language-"].line-numbers { - position: relative; - padding-left: 0; - counter-reset: linenumber; } - -pre[class*="language-"].line-numbers > code { - position: relative; - white-space: inherit; - padding: 0.3rem 3.0rem 1.25rem 3rem !important; } - -.line-numbers .line-numbers-rows { - position: absolute; - pointer-events: none; - top: .40em; - font-size: 100%; - left: 0em; - width: 3em; - /* works for line-numbers below 1000 lines */ - letter-spacing: -1px; - border-right: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - -.line-numbers-rows > span { - display: block; - counter-increment: linenumber; } - -.line-numbers-rows > span:before { - content: counter(linenumber); - color: var(--gray-400); - display: block; - padding-right: 0.8em; - text-align: right; } - -div.code-toolbar { - position: relative; - margin: 16px 0; - padding-top: 1.25rem !important; - background-color: var(--prism-code-bg); - border-radius: 4px; } - -div.prism-codeblock.hl_lines .code-toolbar { - padding-top: 1.25rem !important; } - -div.prism-shortcode.data-line .code-toolbar { - padding-top: 1.25rem !important; } - -div.code-toolbar > .toolbar { - position: absolute; - z-index: 10; - top: .4em; - right: .4em; - transition: opacity 0.3s ease-in-out; - opacity: 0; } - -div.code-toolbar:hover > .toolbar { - opacity: 1; } - -/* Separate line b/c rules are thrown out if selector is invalid. - IE11 and old Edge versions don't support :focus-within. */ -div.code-toolbar:focus-within > .toolbar { - opacity: 1; } - -div.code-toolbar > .toolbar > .toolbar-item { - display: inline-block; } - -div.code-toolbar > .toolbar > .toolbar-item > a { - cursor: pointer; } - -div.code-toolbar > .toolbar > .toolbar-item > button { - background: none; - border: 0; - color: inherit; - font: inherit; - line-height: normal; - overflow: visible; - padding: 0; - -webkit-user-select: none; - /* for button */ - -moz-user-select: none; - -ms-user-select: none; } - div.code-toolbar > .toolbar > .toolbar-item > button.copy-to-clipboard-button { - box-shadow: none; - background: var(--prism-code-bg); - opacity: 0.9; } - -[data-copy-state="copy"] span:empty::before { - content: ""; - -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='48' width='48' viewBox='0 0 48 48'%3E%3Cpath d='M9 43.95q-1.2 0-2.1-.9-.9-.9-.9-2.1V10.8h3v30.15h23.7v3Zm6-6q-1.2 0-2.1-.9-.9-.9-.9-2.1v-28q0-1.2.9-2.1.9-.9 2.1-.9h22q1.2 0 2.1.9.9.9.9 2.1v28q0 1.2-.9 2.1-.9.9-2.1.9Zm0-3h22v-28H15v28Zm0 0v-28 28Z'/%3E%3C/svg%3E"); - mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='48' width='48' viewBox='0 0 48 48'%3E%3Cpath d='M9 43.95q-1.2 0-2.1-.9-.9-.9-.9-2.1V10.8h3v30.15h23.7v3Zm6-6q-1.2 0-2.1-.9-.9-.9-.9-2.1v-28q0-1.2.9-2.1.9-.9 2.1-.9h22q1.2 0 2.1.9.9.9.9 2.1v28q0 1.2-.9 2.1-.9.9-2.1.9Zm0-3h22v-28H15v28Zm0 0v-28 28Z'/%3E%3C/svg%3E"); - -webkit-mask-size: contain; - mask-size: contain; - display: block; - height: 24px; - width: 24px; } - -[data-copy-state="copy-success"] span:empty::before { - content: ""; - -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='48' width='48' viewBox='0 0 48 48'%3E%3Cpath d='M18.9 35.7 7.7 24.5l2.15-2.15 9.05 9.05 19.2-19.2 2.15 2.15Z'/%3E%3C/svg%3E"); - mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='48' width='48' viewBox='0 0 48 48'%3E%3Cpath d='M18.9 35.7 7.7 24.5l2.15-2.15 9.05 9.05 19.2-19.2 2.15 2.15Z'/%3E%3C/svg%3E"); - -webkit-mask-size: contain; - mask-size: contain; - display: block; - height: 24px; - width: 24px; } - -[data-copy-state="copy-error"] span:empty::before { - content: ""; - -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='48' width='48' viewBox='0 0 48 48'%3E%3Cpath d='M24 34q.7 0 1.175-.475.475-.475.475-1.175 0-.7-.475-1.175Q24.7 30.7 24 30.7q-.7 0-1.175.475-.475.475-.475 1.175 0 .7.475 1.175Q23.3 34 24 34Zm-1.35-7.65h3V13.7h-3ZM24 44q-4.1 0-7.75-1.575-3.65-1.575-6.375-4.3-2.725-2.725-4.3-6.375Q4 28.1 4 23.95q0-4.1 1.575-7.75 1.575-3.65 4.3-6.35 2.725-2.7 6.375-4.275Q19.9 4 24.05 4q4.1 0 7.75 1.575 3.65 1.575 6.35 4.275 2.7 2.7 4.275 6.35Q44 19.85 44 24q0 4.1-1.575 7.75-1.575 3.65-4.275 6.375t-6.35 4.3Q28.15 44 24 44Zm.05-3q7.05 0 12-4.975T41 23.95q0-7.05-4.95-12T24 7q-7.05 0-12.025 4.95Q7 16.9 7 24q0 7.05 4.975 12.025Q16.95 41 24.05 41ZM24 24Z'/%3E%3C/svg%3E"); - mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='48' width='48' viewBox='0 0 48 48'%3E%3Cpath d='M24 34q.7 0 1.175-.475.475-.475.475-1.175 0-.7-.475-1.175Q24.7 30.7 24 30.7q-.7 0-1.175.475-.475.475-.475 1.175 0 .7.475 1.175Q23.3 34 24 34Zm-1.35-7.65h3V13.7h-3ZM24 44q-4.1 0-7.75-1.575-3.65-1.575-6.375-4.3-2.725-2.725-4.3-6.375Q4 28.1 4 23.95q0-4.1 1.575-7.75 1.575-3.65 4.3-6.35 2.725-2.7 6.375-4.275Q19.9 4 24.05 4q4.1 0 7.75 1.575 3.65 1.575 6.35 4.275 2.7 2.7 4.275 6.35Q44 19.85 44 24q0 4.1-1.575 7.75-1.575 3.65-4.275 6.375t-6.35 4.3Q28.15 44 24 44Zm.05-3q7.05 0 12-4.975T41 23.95q0-7.05-4.95-12T24 7q-7.05 0-12.025 4.95Q7 16.9 7 24q0 7.05 4.975 12.025Q16.95 41 24.05 41ZM24 24Z'/%3E%3C/svg%3E"); - -webkit-mask-size: contain; - mask-size: contain; - background-color: var(--cardinal-300); - display: block; - height: 24px; - width: 24px; } - -div.code-toolbar > .toolbar > .toolbar-item > a, -div.code-toolbar > .toolbar > .toolbar-item > button, -div.code-toolbar > .toolbar > .toolbar-item > span { - color: #bbb; - font-size: .8em; - padding: 4px; - background: rgba(224, 224, 224, 0.2); - box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2); - border-radius: 4px; } - -div.code-toolbar > .toolbar > .toolbar-item > a:hover, -div.code-toolbar > .toolbar > .toolbar-item > a:focus, -div.code-toolbar > .toolbar > .toolbar-item > button:hover, -div.code-toolbar > .toolbar > .toolbar-item > button:focus, -div.code-toolbar > .toolbar > .toolbar-item > span:hover, -div.code-toolbar > .toolbar > .toolbar-item > span:focus { - color: inherit; - text-decoration: none; } - -.token.treeview-part .entry-line { - position: relative; - text-indent: -99em; - display: inline-block; - vertical-align: top; - width: 1.2em; } - -.token.treeview-part .entry-line:before, -.token.treeview-part .line-h:after { - content: ""; - position: absolute; - top: 0; - left: 50%; - width: 50%; - height: 100%; } - -.token.treeview-part .line-h:before, -.token.treeview-part .line-v:before { - border-left: 1px solid #ccc; } - -.token.treeview-part .line-v-last:before { - height: 50%; - border-left: 1px solid #ccc; - border-bottom: 1px solid #ccc; } - -.token.treeview-part .line-h:after { - height: 50%; - border-bottom: 1px solid #ccc; } - -.token.treeview-part .entry-name { - position: relative; - display: inline-block; - vertical-align: top; } - -.token.treeview-part .entry-name.dotfile { - opacity: 0.5; } - -/* @GENERATED-FONT */ -@font-face { - font-family: "PrismTreeview"; - /** - * This font is generated from the .svg files in the `icons` folder. See the `treeviewIconFont` function in - * `gulpfile.js/index.js` for more information. - * - * Use the following escape sequences to refer to a specific icon: - * - * - \ea01 file - * - \ea02 folder - * - \ea03 image - * - \ea04 audio - * - \ea05 video - * - \ea06 text - * - \ea07 code - * - \ea08 archive - * - \ea09 pdf - * - \ea0a excel - * - \ea0b powerpoint - * - \ea0c word - */ - src: url("data:application/font-woff;base64,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") format("woff"); } - -.token.treeview-part .entry-name:before { - content: "\ea01"; - font-family: "PrismTreeview"; - font-size: inherit; - font-style: normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - width: 2.5ex; - display: inline-block; } - -.token.treeview-part .entry-name.dir:before { - content: "\ea02"; } - -.token.treeview-part .entry-name.ext-bmp:before, -.token.treeview-part .entry-name.ext-eps:before, -.token.treeview-part .entry-name.ext-gif:before, -.token.treeview-part .entry-name.ext-jpe:before, -.token.treeview-part .entry-name.ext-jpg:before, -.token.treeview-part .entry-name.ext-jpeg:before, -.token.treeview-part .entry-name.ext-png:before, -.token.treeview-part .entry-name.ext-svg:before, -.token.treeview-part .entry-name.ext-tiff:before { - content: "\ea03"; } - -.token.treeview-part .entry-name.ext-cfg:before, -.token.treeview-part .entry-name.ext-conf:before, -.token.treeview-part .entry-name.ext-config:before, -.token.treeview-part .entry-name.ext-csv:before, -.token.treeview-part .entry-name.ext-ini:before, -.token.treeview-part .entry-name.ext-log:before, -.token.treeview-part .entry-name.ext-md:before, -.token.treeview-part .entry-name.ext-nfo:before, -.token.treeview-part .entry-name.ext-txt:before { - content: "\ea06"; } - -.token.treeview-part .entry-name.ext-asp:before, -.token.treeview-part .entry-name.ext-aspx:before, -.token.treeview-part .entry-name.ext-c:before, -.token.treeview-part .entry-name.ext-cc:before, -.token.treeview-part .entry-name.ext-cpp:before, -.token.treeview-part .entry-name.ext-cs:before, -.token.treeview-part .entry-name.ext-css:before, -.token.treeview-part .entry-name.ext-h:before, -.token.treeview-part .entry-name.ext-hh:before, -.token.treeview-part .entry-name.ext-htm:before, -.token.treeview-part .entry-name.ext-html:before, -.token.treeview-part .entry-name.ext-jav:before, -.token.treeview-part .entry-name.ext-java:before, -.token.treeview-part .entry-name.ext-js:before, -.token.treeview-part .entry-name.ext-php:before, -.token.treeview-part .entry-name.ext-rb:before, -.token.treeview-part .entry-name.ext-xml:before { - content: "\ea07"; } - -.token.treeview-part .entry-name.ext-7z:before, -.token.treeview-part .entry-name.ext-bz:before, -.token.treeview-part .entry-name.ext-bz2:before, -.token.treeview-part .entry-name.ext-gz:before, -.token.treeview-part .entry-name.ext-rar:before, -.token.treeview-part .entry-name.ext-tar:before, -.token.treeview-part .entry-name.ext-tgz:before, -.token.treeview-part .entry-name.ext-zip:before { - content: "\ea08"; } - -.token.treeview-part .entry-name.ext-aac:before, -.token.treeview-part .entry-name.ext-au:before, -.token.treeview-part .entry-name.ext-cda:before, -.token.treeview-part .entry-name.ext-flac:before, -.token.treeview-part .entry-name.ext-mp3:before, -.token.treeview-part .entry-name.ext-oga:before, -.token.treeview-part .entry-name.ext-ogg:before, -.token.treeview-part .entry-name.ext-wav:before, -.token.treeview-part .entry-name.ext-wma:before { - content: "\ea04"; } - -.token.treeview-part .entry-name.ext-avi:before, -.token.treeview-part .entry-name.ext-flv:before, -.token.treeview-part .entry-name.ext-mkv:before, -.token.treeview-part .entry-name.ext-mov:before, -.token.treeview-part .entry-name.ext-mp4:before, -.token.treeview-part .entry-name.ext-mpeg:before, -.token.treeview-part .entry-name.ext-mpg:before, -.token.treeview-part .entry-name.ext-ogv:before, -.token.treeview-part .entry-name.ext-webm:before { - content: "\ea05"; } - -.token.treeview-part .entry-name.ext-pdf:before { - content: "\ea09"; } - -.token.treeview-part .entry-name.ext-xls:before, -.token.treeview-part .entry-name.ext-xlsx:before { - content: "\ea0a"; } - -.token.treeview-part .entry-name.ext-doc:before, -.token.treeview-part .entry-name.ext-docm:before, -.token.treeview-part .entry-name.ext-docx:before { - content: "\ea0c"; } - -.token.treeview-part .entry-name.ext-pps:before, -.token.treeview-part .entry-name.ext-ppt:before, -.token.treeview-part .entry-name.ext-pptx:before { - content: "\ea0b"; } - -/* FlexSearch */ -:root { - --flexsearch-container-bg-color: var(--gray-100); - --flexsearch-after-bg-color: var(--primary); - --flexsearch-after-color: var(--white); - --flexsearch-button-hover-bg-color: none; - --flexsearch-key-bg-color: var(--primary); - --flexsearch-key-color: #fff; - --flexsearch-suggestion-bg-color: var(--white); - --flexsearch-suggestion-link-hover-bg-color: #f5f6f7; - --flexsearch-suggestion-title-color: var(--primary); - --flexsearch-suggestion-title-border-color: var(--gray-300); - --flexsearch-suggestion-desc-color: var(--text-default); } - -[data-dark-mode] { - --flexsearch-container-bg-color: var(--dark-secondary); - --flexsearch-after-bg-color: hsl(var(--primary-hsl),0.15); - --flexsearch-after-color: var(--primary-200); - --flexsearch-button-hover-bg-color: var(--black); - --flexsearch-key-bg-color: hsl(var(--primary-hsl), 0.15); - --flexsearch-key-color: var(--primary-200); - --flexsearch-suggestion-bg-color: var(--dark-secondary); - --flexsearch-suggestion-link-hover-bg-color: var(--gray-800); - --flexsearch-suggestion-title-color: var(--primary-200); - --flexsearch-suggestion-title-border-color: var(--gray-700); - --flexsearch-suggestion-desc-color: var(--gray-300); } - -#FlexSearchCollapse { - transition: 0.05s ease; - width: fit-content; } - -.flexsearch-container { - background-color: var(--flexsearch-container-bg-color); - padding: 0.8rem; } - .flexsearch-container .form-control { - border: 2px solid var(--primary); - font-size: 1.2rem; } - -@media (min-width: 768px) { - .flexsearch-container { - border-radius: 0 0 4px 0; } - .flexsearch { - min-width: 500px; - width: 500px; } } - -.flexsearch-keymap { - padding: 0 0 0.8rem 0.5rem; - list-style: none; - display: flex; } - .flexsearch-keymap .flexsearch-button-cmd-key { - height: 20px; - width: 30px; } - .flexsearch-keymap li:not(:last-of-type) { - margin-right: 0.8rem; } - .flexsearch-keymap li { - align-items: center; - display: flex; } - -@media (max-width: 768px) { - .flexsearch-keymap { - display: none; } } - -.flexsearch-key-label { - color: var(--form-control-placeholder-color); - font-size: 0.75em; - line-height: 1.6em; } - -.flexsearch-button-keys { - display: flex; - min-width: calc(40px + .8em); } - -.flexsearch-button-cmd-key { - align-items: center; - background: var(--flexsearch-key-bg-color); - border-radius: 3px; - color: var(--flexsearch-key-color); - display: flex; - height: 18px; - justify-content: center; - margin-right: .4em; - position: relative; - border: 0; - width: 56px; } - -.flexsearch-button-key { - align-items: center; - background: var(--flexsearch-key-bg-color); - border-radius: 3px; - color: var(--flexsearch-key-color); - display: flex; - height: 18px; - justify-content: center; - margin-right: .4em; - padding: 0; - position: relative; - border: 0; - width: 20px; - font-size: 11px; } - -#flexsearch-button { - display: flex; - height: 36px; - padding: 0 8px; - margin: 0 0 0 16px; - font-weight: 400; - align-items: center; - justify-content: space-between; - border-radius: 4px; } - #flexsearch-button .flexsearch-button-placeholder { - color: var(--form-control-placeholder-color); } - -#flexsearch-button:hover { - background: var(--flexsearch-button-hover-bg-color) !important; } - #flexsearch-button:hover .flexsearch-button-placeholder { - color: var(--text-default); } - -@media (min-width: 992px) { - .flexsearch::after { - right: 0.5125rem; } } - -#suggestions { - position: absolute; - background-color: var(--flexsearch-suggestion-bg-color); - left: 0; - max-height: 70vh; - overflow-y: auto; - scrollbar-width: thin; - margin-top: 0.5rem; - max-width: calc(100vw - 0.15rem); - z-index: 999; } - #suggestions::-webkit-scrollbar { - width: 5px; } - #suggestions::-webkit-scrollbar-track { - background: transparent; } - #suggestions::-webkit-scrollbar-thumb { - background-color: rgba(155, 155, 155, 0.5); - border-radius: 2px; - border: transparent; } - -@media (min-width: 992px) { - #suggestions { - left: 0; } } - -#suggestions a, -.suggestion__no-results { - padding: 0.75rem; - margin: 0 0.5rem; } - -#suggestions a { - display: block; - text-decoration: none; } - -#suggestions a:focus { - background: var(--flexsearch-suggestion-link-hover-bg-color); - border-radius: 4px; - outline: 0; } - -#suggestions div:first-child { - margin-top: 0.5rem; } - -#suggestions div:last-child { - margin-bottom: 0.5rem; } - -#suggestions a:hover { - background: var(--flexsearch-suggestion-link-hover-bg-color); - border-radius: 4px; } - -#suggestions span { - display: flex; - font-size: 1rem; } - -.suggestion__title { - font-weight: 700; - color: var(--flexsearch-suggestion-title-color); } - -.suggestion__description, -.suggestion__no-results { - color: var(--flexsearch-suggestion-desc-color); } - -@media (min-width: 992px) { - #suggestions { - width: 500px; - max-width: 500px; } - #suggestions a { - display: flex; } - .suggestion__title { - width: 9rem; - padding-right: 1rem; - border-right: 1px solid var(--flexsearch-suggestion-title-border-color); - display: inline-block; - text-align: left; } - .suggestion__description { - width: 20.1rem; - padding-left: 1rem; } } - -/* Mermaid */ -.docs-content .main-content pre.mermaid { - background-color: transparent !important; - text-align: center !important; } - .docs-content .main-content pre.mermaid .messageText { - fill: var(--text-default) !important; } - .docs-content .main-content pre.mermaid .messageLine0, - .docs-content .main-content pre.mermaid .messageLine1 { - stroke: var(--text-default) !important; } - .docs-content .main-content pre.mermaid #arrowhead path, - .docs-content .main-content pre.mermaid #crosshead path { - fill: var(--text-default) !important; - stroke: var(--text-default) !important; } - .docs-content .main-content pre.mermaid .edgePaths path { - stroke: var(--text-default) !important; } - .docs-content .main-content pre.mermaid .marker { - fill: var(--text-default) !important; - stroke: var(--text-default) !important; } - .docs-content .main-content pre.mermaid .grid .tick { - stroke: var(--text-default) !important; } - .docs-content .main-content pre.mermaid .grid .tick text { - fill: var(--text-default) !important; } - .docs-content .main-content pre.mermaid line { - stroke: var(--text-default) !important; } - .docs-content .main-content pre.mermaid text { - fill: var(--text-default) !important; } - -/*# sourceMappingURL=style.css.map */ \ No newline at end of file diff --git a/public/docs/scss/style.min.615e280daa11bef926baef047c962047a84da05eb988d2270815010b8de17d7232889a012f275094455861f5339ab434.css b/public/docs/scss/style.min.615e280daa11bef926baef047c962047a84da05eb988d2270815010b8de17d7232889a012f275094455861f5339ab434.css new file mode 100644 index 0000000..9273048 --- /dev/null +++ b/public/docs/scss/style.min.615e280daa11bef926baef047c962047a84da05eb988d2270815010b8de17d7232889a012f275094455861f5339ab434.css @@ -0,0 +1,3 @@ +@charset "UTF-8";@font-face{font-family:material symbols outlined;font-weight:400 700;font-display:block;font-style:normal;src:local("Material Symbols Outlined"),local("Material Icons"),local("MaterialIcons-Outlined"),url(../fonts/material-symbols-outlined.woff2)format("woff2")}:root{--primary:var(--blue);--primary-50:var(--blue-50);--primary-100:var(--blue-100);--primary-200:var(--blue-200);--primary-300:var(--blue-300);--primary-400:var(--blue-400);--primary-800:var(--blue-800);--primary-hsl:var(--blue-500-hsl);--primary-50-hsl:var(--blue-50-hsl);--primary-100-hsl:var(--blue-100-hsl);--primary-200-hsl:var(--blue-200-hsl);--primary-300-hsl:var(--blue-300-hsl);--primary-800-hsl:var(--blue-800-hsl)}/*!* Bootstrap v5.3.3 (https://getbootstrap.com/) +* Copyright 2011-2024 The Bootstrap Authors +* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)*/:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13, 110, 253;--bs-secondary-rgb:108, 117, 125;--bs-success-rgb:25, 135, 84;--bs-info-rgb:13, 202, 240;--bs-warning-rgb:255, 193, 7;--bs-danger-rgb:220, 53, 69;--bs-light-rgb:248, 249, 250;--bs-dark-rgb:33, 37, 41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255, 255, 255;--bs-black-rgb:0, 0, 0;--bs-font-sans-serif:Inter;--bs-font-monospace:Fira Code;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33, 37, 41;--bs-body-bg:#fff;--bs-body-bg-rgb:255, 255, 255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0, 0, 0;--bs-secondary-color:rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb:33, 37, 41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233, 236, 239;--bs-tertiary-color:rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb:33, 37, 41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248, 249, 250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13, 110, 253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10, 88, 202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(13, 110, 253, 0.25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222, 226, 230;--bs-body-bg:#212529;--bs-body-bg-rgb:33, 37, 41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255, 255, 255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222, 226, 230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52, 58, 64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222, 226, 230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43, 48, 53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110, 168, 254;--bs-link-hover-color-rgb:139, 185, 254;--bs-code-color:#e685b5;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#664d03;--bs-border-color:#495057;--bs-border-color-translucent:rgba(255, 255, 255, 0.15);--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,*::before,*::after{box-sizing:border-box}@media(prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width)solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media(min-width:1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + .9vw)}@media(min-width:1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + .6vw)}@media(min-width:1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + .3vw)}@media(min-width:1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small{font-size:.875em}mark,.mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media(min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width)solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media(min-width:576px){.container-sm,.container{max-width:540px}}@media(min-width:768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width:992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width:1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width:1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0}.row-cols-auto>*{flex:none;width:auto}.row-cols-1>*{flex:none;width:100%}.row-cols-2>*{flex:none;width:50%}.row-cols-3>*{flex:none;width:33.33333333%}.row-cols-4>*{flex:none;width:25%}.row-cols-5>*{flex:none;width:20%}.row-cols-6>*{flex:none;width:16.66666667%}.col-auto{flex:none;width:auto}.col-1{flex:none;width:8.33333333%}.col-2{flex:none;width:16.66666667%}.col-3{flex:none;width:25%}.col-4{flex:none;width:33.33333333%}.col-5{flex:none;width:41.66666667%}.col-6{flex:none;width:50%}.col-7{flex:none;width:58.33333333%}.col-8{flex:none;width:66.66666667%}.col-9{flex:none;width:75%}.col-10{flex:none;width:83.33333333%}.col-11{flex:none;width:91.66666667%}.col-12{flex:none;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media(min-width:576px){.col-sm{flex:1 0}.row-cols-sm-auto>*{flex:none;width:auto}.row-cols-sm-1>*{flex:none;width:100%}.row-cols-sm-2>*{flex:none;width:50%}.row-cols-sm-3>*{flex:none;width:33.33333333%}.row-cols-sm-4>*{flex:none;width:25%}.row-cols-sm-5>*{flex:none;width:20%}.row-cols-sm-6>*{flex:none;width:16.66666667%}.col-sm-auto{flex:none;width:auto}.col-sm-1{flex:none;width:8.33333333%}.col-sm-2{flex:none;width:16.66666667%}.col-sm-3{flex:none;width:25%}.col-sm-4{flex:none;width:33.33333333%}.col-sm-5{flex:none;width:41.66666667%}.col-sm-6{flex:none;width:50%}.col-sm-7{flex:none;width:58.33333333%}.col-sm-8{flex:none;width:66.66666667%}.col-sm-9{flex:none;width:75%}.col-sm-10{flex:none;width:83.33333333%}.col-sm-11{flex:none;width:91.66666667%}.col-sm-12{flex:none;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media(min-width:768px){.col-md{flex:1 0}.row-cols-md-auto>*{flex:none;width:auto}.row-cols-md-1>*{flex:none;width:100%}.row-cols-md-2>*{flex:none;width:50%}.row-cols-md-3>*{flex:none;width:33.33333333%}.row-cols-md-4>*{flex:none;width:25%}.row-cols-md-5>*{flex:none;width:20%}.row-cols-md-6>*{flex:none;width:16.66666667%}.col-md-auto{flex:none;width:auto}.col-md-1{flex:none;width:8.33333333%}.col-md-2{flex:none;width:16.66666667%}.col-md-3{flex:none;width:25%}.col-md-4{flex:none;width:33.33333333%}.col-md-5{flex:none;width:41.66666667%}.col-md-6{flex:none;width:50%}.col-md-7{flex:none;width:58.33333333%}.col-md-8{flex:none;width:66.66666667%}.col-md-9{flex:none;width:75%}.col-md-10{flex:none;width:83.33333333%}.col-md-11{flex:none;width:91.66666667%}.col-md-12{flex:none;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media(min-width:992px){.col-lg{flex:1 0}.row-cols-lg-auto>*{flex:none;width:auto}.row-cols-lg-1>*{flex:none;width:100%}.row-cols-lg-2>*{flex:none;width:50%}.row-cols-lg-3>*{flex:none;width:33.33333333%}.row-cols-lg-4>*{flex:none;width:25%}.row-cols-lg-5>*{flex:none;width:20%}.row-cols-lg-6>*{flex:none;width:16.66666667%}.col-lg-auto{flex:none;width:auto}.col-lg-1{flex:none;width:8.33333333%}.col-lg-2{flex:none;width:16.66666667%}.col-lg-3{flex:none;width:25%}.col-lg-4{flex:none;width:33.33333333%}.col-lg-5{flex:none;width:41.66666667%}.col-lg-6{flex:none;width:50%}.col-lg-7{flex:none;width:58.33333333%}.col-lg-8{flex:none;width:66.66666667%}.col-lg-9{flex:none;width:75%}.col-lg-10{flex:none;width:83.33333333%}.col-lg-11{flex:none;width:91.66666667%}.col-lg-12{flex:none;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media(min-width:1200px){.col-xl{flex:1 0}.row-cols-xl-auto>*{flex:none;width:auto}.row-cols-xl-1>*{flex:none;width:100%}.row-cols-xl-2>*{flex:none;width:50%}.row-cols-xl-3>*{flex:none;width:33.33333333%}.row-cols-xl-4>*{flex:none;width:25%}.row-cols-xl-5>*{flex:none;width:20%}.row-cols-xl-6>*{flex:none;width:16.66666667%}.col-xl-auto{flex:none;width:auto}.col-xl-1{flex:none;width:8.33333333%}.col-xl-2{flex:none;width:16.66666667%}.col-xl-3{flex:none;width:25%}.col-xl-4{flex:none;width:33.33333333%}.col-xl-5{flex:none;width:41.66666667%}.col-xl-6{flex:none;width:50%}.col-xl-7{flex:none;width:58.33333333%}.col-xl-8{flex:none;width:66.66666667%}.col-xl-9{flex:none;width:75%}.col-xl-10{flex:none;width:83.33333333%}.col-xl-11{flex:none;width:91.66666667%}.col-xl-12{flex:none;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media(min-width:1400px){.col-xxl{flex:1 0}.row-cols-xxl-auto>*{flex:none;width:auto}.row-cols-xxl-1>*{flex:none;width:100%}.row-cols-xxl-2>*{flex:none;width:50%}.row-cols-xxl-3>*{flex:none;width:33.33333333%}.row-cols-xxl-4>*{flex:none;width:25%}.row-cols-xxl-5>*{flex:none;width:20%}.row-cols-xxl-6>*{flex:none;width:16.66666667%}.col-xxl-auto{flex:none;width:auto}.col-xxl-1{flex:none;width:8.33333333%}.col-xxl-2{flex:none;width:16.66666667%}.col-xxl-3{flex:none;width:25%}.col-xxl-4{flex:none;width:33.33333333%}.col-xxl-5{flex:none;width:41.66666667%}.col-xxl-6{flex:none;width:50%}.col-xxl-7{flex:none;width:58.33333333%}.col-xxl-8{flex:none;width:66.66666667%}.col-xxl-9{flex:none;width:75%}.col-xxl-10{flex:none;width:83.33333333%}.col-xxl-11{flex:none;width:91.66666667%}.col-xxl-12{flex:none;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), 0.05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), 0.1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2)solid}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width)0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#a6b5cc;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#b5b6b7;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#a7b9b1;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#a6c3ca;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#ccc2a4;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#c6acae;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#4d5154;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width)solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width)0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width)solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:50%;background-size:contain;border:var(--bs-border-width)solid var(--bs-border-color);print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:0;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:100%;--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width)solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85)translateY(-.5rem)translateX(.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85)translateY(-.5rem)translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width)0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width)solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem)center;background-size:calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem)right calc(.375em + .1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:var(--bs-form-valid-border-color)}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + .75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:var(--bs-form-valid-border-color)}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:var(--bs-form-valid-color)}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem)center;background-size:calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem)right calc(.375em + .1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:var(--bs-form-invalid-border-color)}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + .75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:var(--bs-form-invalid-border-color)}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:var(--bs-form-invalid-color)}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y)var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;border:var(--bs-btn-border-width)solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49, 132, 253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130, 138, 145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60, 153, 110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11, 172, 204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217, 164, 6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225, 83, 97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211, 212, 213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66, 70, 73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13, 110, 253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108, 117, 125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25, 135, 84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13, 202, 240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255, 193, 7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220, 53, 69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248, 249, 250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33, 37, 41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49, 132, 253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y)var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width)solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y)0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y)var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius,0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y)var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y)var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(var(--bs-border-width) * -1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(var(--bs-border-width) * -1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y)var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:0 0;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width)solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width)solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:0.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width)solid transparent}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:initial}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:initial}.nav-fill>.nav-link,.nav-fill .nav-item{flex:auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), 0.65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), 0.8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y)var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y)var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width)solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:50%;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media(min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width)solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:auto;padding:var(--bs-card-spacer-y)var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y)var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width)solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius)var(--bs-card-inner-border-radius)0 0}.card-footer{padding:var(--bs-card-cap-padding-y)var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width)solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius)var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y)var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width))0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width)solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y)var(--bs-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}.accordion-flush>.accordion-item>.accordion-collapse{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y)var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider,"/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y)var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width)solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width) * -1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y)var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;position:relative;padding:var(--bs-alert-padding-y)var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height)var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section,".")". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y)var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width)solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity:0.5;--bs-btn-close-hover-opacity:0.75;--bs-btn-close-focus-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:0.25;--bs-btn-close-white-filter:invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em;color:var(--bs-btn-close-color);background:var(--bs-btn-close-bg)50%/1em no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width)solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y)var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width)solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media(prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width)solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width)solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5)calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y))calc(-.5 * var(--bs-modal-header-padding-x))calc(-.5 * var(--bs-modal-header-padding-y))auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width)solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media(min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media(min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media(min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height)calc(var(--bs-tooltip-arrow-width) * .5)0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5)var(--bs-tooltip-arrow-height)calc(var(--bs-tooltip-arrow-width) * .5)0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5)var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5)0 calc(var(--bs-tooltip-arrow-width) * .5)var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y)var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width)solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height)calc(var(--bs-popover-arrow-width) * .5)0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width) * .5)var(--bs-popover-arrow-height)calc(var(--bs-popover-arrow-width) * .5)0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width) * .5)var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width)solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width) * .5)0 calc(var(--bs-popover-arrow-width) * .5)var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y)var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width)solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y)var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion:reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:initial;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1)grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1)grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed)linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width)solid;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media(prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform 0.3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media(max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media(max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent !important}}@media(max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media(max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent !important}}@media(max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media(max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent !important}}@media(max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media(max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent !important}}@media(max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media(max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;padding:var(--bs-offcanvas-padding-y)var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5)calc(var(--bs-offcanvas-padding-x) * .5);margin:calc(-.5 * var(--bs-offcanvas-padding-y))calc(-.5 * var(--bs-offcanvas-padding-x))calc(-.5 * var(--bs-offcanvas-padding-y))auto}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y)var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,.8) 75%,#000 95%);mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1)) !important}.text-bg-info{color:#000 !important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1)) !important}.text-bg-warning{color:#000 !important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(10,88,202,var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86,94,100,var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1)) !important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1)) !important}.link-success:hover,.link-success:focus{color:RGBA(20,108,67,var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1)) !important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1)) !important}.link-info:hover,.link-info:focus{color:RGBA(61,213,243,var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(255,205,57,var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(176,42,55,var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1)) !important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249,250,251,var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(26,30,33,var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x,0)var(--bs-focus-ring-y,0)var(--bs-focus-ring-blur,0)var(--bs-focus-ring-width)var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));text-underline-offset:.25em;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width:576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0,0,0,0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:var(--bs-box-shadow) !important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm) !important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg) !important}.shadow-none{box-shadow:none !important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%,-50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.375rem + 1.5vw) !important}.fs-2{font-size:calc(1.325rem + .9vw) !important}.fs-3{font-size:calc(1.3rem + .6vw) !important}.fs-4{font-size:calc(1.275rem + .3vw) !important}.fs-5{font-size:1.25rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity:1;color:inherit !important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity:0.1}.link-opacity-10-hover:hover{--bs-link-opacity:0.1}.link-opacity-25{--bs-link-opacity:0.25}.link-opacity-25-hover:hover{--bs-link-opacity:0.25}.link-opacity-50{--bs-link-opacity:0.5}.link-opacity-50-hover:hover{--bs-link-opacity:0.5}.link-opacity-75{--bs-link-opacity:0.75}.link-opacity-75-hover:hover{--bs-link-opacity:0.75}.link-opacity-100{--bs-link-opacity:1}.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-primary{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity:0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10{--bs-link-underline-opacity:0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:0.1}.link-underline-opacity-25{--bs-link-underline-opacity:0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:0.25}.link-underline-opacity-50{--bs-link-underline-opacity:0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:0.5}.link-underline-opacity-75{--bs-link-underline-opacity:0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:0.75}.link-underline-opacity-100{--bs-link-underline-opacity:1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent !important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width:576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width:768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width:992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width:1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width:1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}@media(min-width:1200px){.fs-1{font-size:2.5rem !important}.fs-2{font-size:2rem !important}.fs-3{font-size:1.75rem !important}.fs-4{font-size:1.5rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--blue-900-hsl:243, 72%, 25%;--blue-800-hsl:239, 70%, 32%;--blue-700-hsl:235, 68%, 38%;--blue-600-hsl:231, 66%, 45%;--blue-500-hsl:226, 66%, 51%;--blue-400-hsl:221, 77%, 60%;--blue-300-hsl:217, 88%, 69%;--blue-200-hsl:212, 100%, 79%;--blue-100-hsl:207, 100%, 88%;--blue-50-hsl:198, 100%, 97%;--green-900-hsl:153, 54%, 20%;--green-800-hsl:145, 57%, 25%;--green-700-hsl:136, 60%, 29%;--green-600-hsl:128, 63%, 34%;--green-500-hsl:119, 66%, 39%;--green-400-hsl:114, 49%, 51%;--green-300-hsl:110, 56%, 62%;--green-200-hsl:105, 64%, 74%;--green-100-hsl:102, 69%, 86%;--green-50-hsl:98, 73%, 97%;--red-900-hsl:344, 48%, 33%;--red-800-hsl:348, 50%, 40%;--red-700-hsl:352, 53%, 46%;--red-600-hsl:356, 62%, 53%;--red-500-hsl:1, 84%, 59%;--red-400-hsl:356, 98%, 67%;--red-300-hsl:350, 100%, 73%;--red-200-hsl:345, 100%, 80%;--red-100-hsl:339, 100%, 88%;--red-50-hsl:332, 100%, 97%;--yellow-900-hsl:44, 60%, 17%;--yellow-800-hsl:45, 59%, 25%;--yellow-700-hsl:46, 58%, 33%;--yellow-600-hsl:48, 57%, 41%;--yellow-500-hsl:48, 55%, 49%;--yellow-400-hsl:50, 72%, 57%;--yellow-300-hsl:51, 98%, 65%;--yellow-200-hsl:54, 100%, 72%;--yellow-100-hsl:54, 100%, 81%;--yellow-50-hsl:55, 100%, 93%;--cyan-900-hsl:194, 100%, 16%;--cyan-800-hsl:193, 100%, 21%;--cyan-700-hsl:192, 100%, 27%;--cyan-600-hsl:191, 100%, 32%;--cyan-500-hsl:190, 98%, 37%;--cyan-400-hsl:189, 94%, 43%;--cyan-300-hsl:187, 85%, 58%;--cyan-200-hsl:185, 100%, 72%;--cyan-100-hsl:180, 100%, 83%;--cyan-50-hsl:180, 100%, 94%;--cardinal-900-hsl:355, 68%, 21%;--cardinal-800-hsl:353, 67%, 29%;--cardinal-700-hsl:353, 65%, 37%;--cardinal-600-hsl:352, 63%, 45%;--cardinal-500-hsl:351, 67%, 52%;--cardinal-400-hsl:350, 89%, 60%;--cardinal-300-hsl:347, 100%, 68%;--cardinal-200-hsl:343, 100%, 75%;--cardinal-100-hsl:340, 100%, 83%;--cardinal-50-hsl:338, 100%, 96%;--magenta-900-hsl:297, 63%, 21%;--magenta-800-hsl:296, 62%, 29%;--magenta-700-hsl:295, 61%, 37%;--magenta-600-hsl:294, 58%, 45%;--magenta-500-hsl:293, 63%, 53%;--magenta-400-hsl:292, 84%, 61%;--magenta-300-hsl:291, 100%, 69%;--magenta-200-hsl:292, 100%, 75%;--magenta-100-hsl:293, 100%, 84%;--magenta-50-hsl:293, 100%, 94%;--emerald-900-hsl:165, 97%, 13%;--emerald-800-hsl:164, 96%, 18%;--emerald-700-hsl:163, 93%, 23%;--emerald-600-hsl:162, 89%, 29%;--emerald-500-hsl:161, 87%, 34%;--emerald-400-hsl:160, 84%, 39%;--emerald-300-hsl:158, 66%, 53%;--emerald-200-hsl:154, 77%, 68%;--emerald-100-hsl:149, 89%, 82%;--emerald-50-hsl:145, 100%, 94%;--blue-900:hsl(var(--blue-900-hsl));--blue-800:hsl(var(--blue-800-hsl));--blue-700:hsl(var(--blue-700-hsl));--blue-600:hsl(var(--blue-600-hsl));--blue-500:hsl(var(--blue-500-hsl));--blue-400:hsl(var(--blue-400-hsl));--blue-300:hsl(var(--blue-300-hsl));--blue-200:hsl(var(--blue-200-hsl));--blue-100:hsl(var(--blue-100-hsl));--blue-50:hsl(var(--blue-50-hsl));--green-900:hsl(var(--green-900-hsl));--green-800:hsl(var(--green-800-hsl));--green-700:hsl(var(--green-700-hsl));--green-600:hsl(var(--green-600-hsl));--green-500:hsl(var(--green-500-hsl));--green-400:hsl(var(--green-400-hsl));--green-300:hsl(var(--green-300-hsl));--green-200:hsl(var(--green-200-hsl));--green-100:hsl(var(--green-100-hsl));--green-50:hsl(var(--green-50-hsl));--red-900:hsl(var(--red-900-hsl));--red-800:hsl(var(--red-800-hsl));--red-700:hsl(var(--red-700-hsl));--red-600:hsl(var(--red-600-hsl));--red-500:hsl(var(--red-500-hsl));--red-400:hsl(var(--red-400-hsl));--red-300:hsl(var(--red-300-hsl));--red-200:hsl(var(--red-200-hsl));--red-100:hsl(var(--red-100-hsl));--red-50:hsl(var(--red-50-hsl));--yellow-900:hsl(var(--yellow-900-hsl));--yellow-800:hsl(var(--yellow-800-hsl));--yellow-700:hsl(var(--yellow-700-hsl));--yellow-600:hsl(var(--yellow-600-hsl));--yellow-500:hsl(var(--yellow-500-hsl));--yellow-400:hsl(var(--yellow-400-hsl));--yellow-300:hsl(var(--yellow-300-hsl));--yellow-200:hsl(var(--yellow-200-hsl));--yellow-100:hsl(var(--yellow-100-hsl));--yellow-50:hsl(var(--yellow-50-hsl));--cyan-900:hsl(var(--cyan-900-hsl));--cyan-800:hsl(var(--cyan-800-hsl));--cyan-700:hsl(var(--cyan-700-hsl));--cyan-600:hsl(var(--cyan-600-hsl));--cyan-500:hsl(var(--cyan-500-hsl));--cyan-400:hsl(var(--cyan-400-hsl));--cyan-300:hsl(var(--cyan-300-hsl));--cyan-200:hsl(var(--cyan-200-hsl));--cyan-100:hsl(var(--cyan-100-hsl));--cyan-50:hsl(var(--cyan-50-hsl));--cardinal-900:hsl(var(--cardinal-900-hsl));--cardinal-800:hsl(var(--cardinal-800-hsl));--cardinal-700:hsl(var(--cardinal-700-hsl));--cardinal-600:hsl(var(--cardinal-600-hsl));--cardinal-500:hsl(var(--cardinal-500-hsl));--cardinal-400:hsl(var(--cardinal-400-hsl));--cardinal-300:hsl(var(--cardinal-300-hsl));--cardinal-200:hsl(var(--cardinal-200-hsl));--cardinal-100:hsl(var(--cardinal-100-hsl));--cardinal-50:hsl(var(--cardinal-50-hsl));--magenta-900:hsl(var(--magenta-900-hsl));--magenta-800:hsl(var(--magenta-800-hsl));--magenta-700:hsl(var(--magenta-700-hsl));--magenta-600:hsl(var(--magenta-600-hsl));--magenta-500:hsl(var(--magenta-500-hsl));--magenta-400:hsl(var(--magenta-400-hsl));--magenta-300:hsl(var(--magenta-300-hsl));--magenta-200:hsl(var(--magenta-200-hsl));--magenta-100:hsl(var(--magenta-100-hsl));--magenta-50:hsl(var(--magenta-50-hsl));--emerald-900:hsl(var(--emerald-900-hsl));--emerald-800:hsl(var(--emerald-800-hsl));--emerald-700:hsl(var(--emerald-700-hsl));--emerald-600:hsl(var(--emerald-600-hsl));--emerald-500:hsl(var(--emerald-500-hsl));--emerald-400:hsl(var(--emerald-400-hsl));--emerald-300:hsl(var(--emerald-300-hsl));--emerald-200:hsl(var(--emerald-200-hsl));--emerald-100:hsl(var(--emerald-100-hsl));--emerald-50:hsl(var(--emerald-50-hsl));--blue:var(--blue-500);--green:var(--green-500);--red:var(--red-500);--yellow:var(--yellow-500);--cyan:var(--cyan-500);--cardinal:var(--cardinal-500);--magenta:var(--magenta-500);--emerald:var(--emerald-500);--secondary:var(--gray-600);--success:var(--green);--info:var(--cyan);--warning:var(--yellow);--danger:var(--red);--light:var(--gray-100);--dark:#181921;--dark-alt:#212529;--dark-secondary:#292a35;--white:#ffffff;--gray-50:#f7fafc;--gray-100:#f8f9fa;--gray-200:#e9ecef;--gray-300:#dee2e6;--gray-400:#ced4da;--gray-500:#adb5bd;--gray-600:#6c757d;--gray-700:#495057;--gray-800:#343a40;--gray-900:#212529;--black:#000000;--link-color:var(--primary);--link-decoration:underline;--link-shade-percentage:20%;--link-hover-decoration:null;--text-default:var(--text-dark);--text-default-inv:var(--text-light);--text-muted:var(--gray-600);--bs-secondary-color:var(--gray-600);--body-color:var(--text-default);--body-bg:var(--white);--text-dark:#3C4257;--text-light:#dee2e6;--fw-medium:600;--shadow-sm:0 .125rem .25rem rgba(var(--dark), .15);--shadow:0 0 3px rgba(var(--dark), .15);--shadow-md:0 5px 13px rgba(var(--dark), .2);--shadow-lg:0 10px 25px rgba(var(--dark), 0.15);--overlay:rgba(var(--dark), 0.7);--bg-overlay-white:rgba(var(--white), 0.5);--back-to-top-color:var(--white);--simplebar-color:#adb5bd;--footer:#202942;--footer-bg:var(--white);--foot-social-color:#adb5bd;--social-border-color:#adb5bd;--foot-social-color-white:var(--white);--l-100:100%;--btn-soft-color:var(--primary);--btn-soft-bg:transparent;--btn-soft-border:var(--gray-200);--btn-primary-color:var(--white);--btn-primary-bg:var(--primary);--btn-primary-border:transparent;--btn-default-color:var(--text-default);--btn-default-hover-color:var(--primary);--btn-default-bg:transparent;--btn-default-border:transparent;--icon-color:var(--primary);--folder:"\e2c7";--article:"\ef42";--dash:"\f88a";--dir-right:"\e5da";--card-bg:var(--white);--card-border-color:var(--gray-400);--card-border-hover-color:var(--primary);--sidebar-primary:var(--primary);--sidebar-bg:var(--white);--top-header-bg:hsla(255,100%,100%,0.8);--sidebar-text-color:#606770;--sidebar-border-color:var(--gray-200);--sidebar-dropdown-hover-bg:#eff1f4;--sidebar-menu-active-bg:#f5f6f8;--sidebar-icon-bg:#f8f9fa;--sidebar-light-icon:#f8f9fa;--sidebar-scrollbar-thumb-color:var(--gray-200);--sidebar-directory-icon:var(--dir-right);--sidebar-file-icon:var(--dash)}[data-dark-mode]{--body-bg:var(--dark);--text-default:var(--text-light);--text-default-inv:var(--text-dark);--text-muted:#b6b9be;--bs-secondary-color:#6c757d;--btn-soft-color:var(--gray-400);--btn-soft-bg:none;--btn-soft-border:var(--gray-800);--btn-primary-color:var(--primary-200);--btn-primary-bg:none;--btn-primary-border:var(--gray-700);--btn-default-color:var(--text-default);--btn-default-hover-color:var(--primary-300);--btn-default-bg:transparent;--btn-default-border:transparent;--icon-color:#b6bbc9;--card-bg:none;--card-border-color:var(--gray-800);--card-border-hover-color:var(--primary-200);--sidebar-primary:var(--primary-300);--sidebar-bg:var(--dark);--top-header-bg:hsla(233,16%,11%,0.8);--sidebar-text-color:#b6bbc9;--sidebar-border-color:var(--gray-900);--sidebar-dropdown-hover-bg:#2b303b;--sidebar-menu-active-bg:#2b303b;--sidebar-icon-bg:#2b303b;--sidebar-light-icon:#f8f9fa;--sidebar-scrollbar-thumb-color:var(--gray-800)}html{scroll-padding-top:80px;background-color:var(--body-bg)}body{font-family:Inter;overflow-x:hidden !important;font-size:1rem;color:var(--body-color);background-color:var(--body-bg)}@media(max-width:1199px){html{scroll-padding-top:120px}body{font-size:.9rem}}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:var(--bs-font-sans-serif);line-height:1.4;font-weight:600}::selection{background:var(--primary);color:var(--white);opacity:.9}a{text-decoration:none;transition:all .5s ease;color:var(--primary)}a:hover{color:var(--primary-800)}p{line-height:1.6}img{height:auto}:root{--content-icon-color:var(--primary);--content-icon-bg:var(--sidebar-icon-bg);--content-icon-border:var(--sidebar-icon-bg);--content-link-color:var(--primary);--ordered-list-bg:var(--gray-300);--ordered-list-color:var(--gray-800);--blockquote-border-color:var(--gray-300);--code-block-bg:#212d63;--inline-code-bg:var(--gray-100);--inline-code-border:1px solid var(--gray-400)}[data-dark-mode]{--content-icon-color:var(--primary-200);--content-icon-bg:hsl(var(--primary-hsl), 0.15);--content-icon-border:var(--primary-800);--content-link-color:var(--primary-300);--ordered-list-bg:var(--gray-700);--ordered-list-color:var(--gray-200);--blockquote-border-color:var(--primary-200);--code-block-bg:var(--gray-900);--inline-code-bg:var(--gray-800);--inline-code-border:1px solid var(--gray-600)}.docs-content{order:1}.docs-content .main-content a{font-weight:600;color:var(--content-link-color)}.docs-content .main-content a:hover{text-decoration:underline 2px var(--primary-200);text-underline-offset:2.5px !important;transition:0s !important}.docs-content .main-content a code{color:var(--content-link-color)}.docs-content .main-content #edit-this-page a:hover,.docs-content .main-content #list-item a:hover{text-decoration:none !important}.docs-content .main-content li{color:var(--text-default)}.docs-content .main-content h1,.docs-content .main-content .h1,.docs-content .main-content h2,.docs-content .main-content .h2,.docs-content .main-content h3,.docs-content .main-content .h3,.docs-content .main-content h4,.docs-content .main-content .h4,.docs-content .main-content h5,.docs-content .main-content .h5{font-weight:700;color:var(--body-color)}.docs-content .content-title{font-weight:700;align-self:center}i.title-icon{width:44px;height:44px;color:var(--content-icon-color);background-color:var(--content-icon-bg);display:inline-flex !important;align-self:center;align-items:center;justify-content:center;font-size:24px;border-radius:5px}@media(max-width:768px){i.title-icon{align-self:auto}}.docs-content p.lead{color:var(--text-muted);font-weight:400}@media(max-width:1199px){.docs-content{padding-left:calc(var(--bs-gutter-x) * 1.05);padding-right:calc(var(--bs-gutter-x) * 1.05)}.docs-content h2,.docs-content .h2{margin-bottom:1rem}.docs-content p.lead{font-size:1rem}}.docs-content .main-content img,.docs-content .main-content svg{max-width:100%;height:auto}.docs-content .main-content a svg{vertical-align:middle;padding-bottom:.25rem;margin-left:3px}.docs-content .main-content ul{padding-left:0}.docs-content .main-content ul>li{position:relative;padding-left:32px}.docs-content .main-content ul>li::before{content:"";position:absolute;width:6px;height:6px;left:8px;top:10px;border-radius:30%;background:var(--gray-500)}.docs-content .main-content ol{counter-reset:listitem}.docs-content .main-content ol>li{counter-increment:listitem;position:relative;padding-left:32px}.docs-content .main-content ol>li::before{content:counter(listitem);background:var(--ordered-list-bg);color:var(--ordered-list-color);font-size:12px;font-weight:500;line-height:10px;text-align:center;padding:5px 0;width:20px;height:20px;border-radius:5px;position:absolute;left:0;top:3px}.docs-content .main-content ol,.docs-content .main-content ul{list-style:none;line-height:26px}.docs-content .main-content blockquote{margin-bottom:1rem;font-size:1.25rem;border-left:3px solid var(--blockquote-border-color);padding-left:1rem}.docs-content .main-content div.highlight{margin:16px 0;padding:0;background:var(--code-block-bg);border-radius:4px}.docs-content .main-content div.highlight pre{padding:0}.docs-content .main-content code{font-size:inherit;font-weight:400;padding:1px 2px;background:var(--inline-code-bg);border:var(--inline-code-border);border-radius:4px}.docs-content .main-content pre{margin:0;border-radius:4px;padding:0}.docs-content .main-content pre code{font-size:.8rem;display:block;border:none;overflow-x:auto;line-height:1.5;padding:0 2.5rem 1.25rem;tab-size:4;scrollbar-width:thin}.docs-content .main-content strong code{font-weight:700}.docs-content .main-content td pre code{overflow-x:unset !important}.docs-content .main-content .alert ul{font-size:var(--font-size-sm)}.docs-content figcaption{font-size:small}.page-wrapper{height:100vh}.page-wrapper .sidebar-wrapper{transition:all .3s ease;width:300px;height:100%;max-height:100%;position:fixed;top:0;left:-300px;z-index:999}@media(min-width:1025px){.page-wrapper .sidebar-wrapper{z-index:1000}}@media(max-width:1024px){.page-wrapper .sidebar-wrapper{left:0}}@media(max-width:425px){.page-wrapper .sidebar-wrapper{width:260px}}.page-wrapper .sidebar-wrapper ul{list-style-type:none;padding:0;margin:0}.page-wrapper .sidebar-wrapper a{text-decoration:none}.page-wrapper .sidebar-wrapper .sidebar-content{background:var(--sidebar-bg);max-height:calc(100% - 30px);height:calc(100% - 30px);overflow:scroll;overflow-x:hidden;overflow-y:overlay;position:relative;border-right:1px solid var(--sidebar-border-color);scrollbar-width:thin;scrollbar-color:var(--sidebar-bg)var(--sidebar-bg)}.page-wrapper .sidebar-wrapper .sidebar-content.desktop{overflow-y:hidden}.page-wrapper .sidebar-wrapper .sidebar-content:hover{scrollbar-color:var(--sidebar-scrollbar-thumb-color)var(--sidebar-bg)}.page-wrapper .sidebar-wrapper .sidebar-content::-webkit-scrollbar{width:5px;height:8px}.page-wrapper .sidebar-wrapper .sidebar-content::-webkit-scrollbar-track{background:var(--sidebar-bg);display:none}.page-wrapper .sidebar-wrapper .sidebar-content:hover::-webkit-scrollbar-thumb{background:var(--sidebar-scrollbar-thumb-color)}.page-wrapper .sidebar-wrapper .sidebar-brand{background:var(--sidebar-bg);padding:10px 20px;border-bottom:1px solid var(--sidebar-border-color);display:flex;align-items:center;height:72px}.page-wrapper .sidebar-wrapper .sidebar-brand>a{text-transform:uppercase;font-weight:700;flex-grow:1;transition:all .3s ease}.page-wrapper .sidebar-wrapper .sidebar-brand>a:focus{outline:none}.page-wrapper .sidebar-wrapper .sidebar-brand>a svg{height:26px}.page-wrapper .sidebar-wrapper .sidebar-brand #close-sidebar{cursor:pointer;font-size:24px;transition:all .3s ease}.page-wrapper .sidebar-wrapper .sidebar-header{padding:20px;overflow:hidden}.page-wrapper .sidebar-wrapper .sidebar-menu{padding:16px 0 16px 10px}.page-wrapper .sidebar-wrapper .sidebar-menu .header-menu span{font-weight:700;font-size:14px;padding:15px 20px 5px;display:inline-block}.page-wrapper .sidebar-wrapper .sidebar-menu li a,.page-wrapper .sidebar-wrapper .sidebar-menu li button{display:inline-block;color:var(--sidebar-text-color);width:100%;text-decoration:none;position:relative;padding:4px 35px 5px 10px;margin:4px 0;border:none;letter-spacing:normal;transition:all .3s ease;display:flex;align-items:center;text-align:left}@media(max-width:1024px){.page-wrapper .sidebar-wrapper .sidebar-menu li a,.page-wrapper .sidebar-wrapper .sidebar-menu li button{padding:6px 24px}}@media screen and (max-width:425px){.page-wrapper .sidebar-wrapper .sidebar-menu li a,.page-wrapper .sidebar-wrapper .sidebar-menu li button{padding:6px 26px 6px 12px}}.page-wrapper .sidebar-wrapper .sidebar-menu li a:hover>i::before,.page-wrapper .sidebar-wrapper .sidebar-menu li button:hover>i::before{display:inline-block}.page-wrapper .sidebar-wrapper .sidebar-menu li a:focus,.page-wrapper .sidebar-wrapper .sidebar-menu li button:focus{outline:none}.page-wrapper .sidebar-wrapper .sidebar-menu li a i,.page-wrapper .sidebar-wrapper .sidebar-menu li button i{min-width:36px;height:36px;background-color:var(--sidebar-icon-bg);display:inline-flex !important;align-items:center;justify-content:center;font-size:20px;text-align:center;border-radius:4px;transition:all .3s ease}.page-wrapper .sidebar-wrapper .sidebar-menu li a.sidebar-nested-link,.page-wrapper .sidebar-wrapper .sidebar-menu li button.sidebar-nested-link{align-items:normal}.page-wrapper .sidebar-wrapper .sidebar-menu li a:hover,.page-wrapper .sidebar-wrapper .sidebar-menu li.sidebar-dropdown button:hover{background-color:var(--sidebar-dropdown-hover-bg);border-radius:4px 0 0 4px;margin:4px 0}.page-wrapper .sidebar-wrapper .sidebar-menu li:hover i,.page-wrapper .sidebar-wrapper .sidebar-menu li.active i{background-color:var(--sidebar-menu-active-bg)}.page-wrapper .sidebar-wrapper .sidebar-menu li.no-icon>a:before{content:none !important}.page-wrapper .sidebar-wrapper .sidebar-menu li.no-icon>button{margin:1px 0}.page-wrapper .sidebar-wrapper .sidebar-menu li.no-icon>button:hover{margin:1px 0}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-root-link{font-size:1rem}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.no-icon>button:after{top:inherit !important}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown>button:after{content:"\e5cc" !important;color:var(--sidebar-text-color);font-family:material symbols outlined;font-weight:500;font-size:22px;position:absolute;right:15px;top:7px;transition:all .3s ease}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.nested.no-icon>button:after{top:inherit !important}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.nested.no-icon>button:before{content:none !important}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.nested button{font-size:14px}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.nested button:before{content:var(--sidebar-directory-icon);color:var(--sidebar-text-color);font-family:material symbols outlined;margin-right:4px;font-size:14px;transition:all .3s ease}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.nested button:after{top:inherit}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.active>button:after{transform:rotate(90deg);right:17px}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.current>button:after{color:var(--sidebar-primary)}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu{display:none}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu ul{padding:3px 0}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu ul li{padding-left:15px;font-size:14px}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu ul li a{font-weight:400}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu ul li a:before{content:var(--sidebar-file-icon);color:var(--sidebar-text-color);font-family:material symbols outlined;margin-right:4px;font-size:14px;transition:all .3s ease}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu ul li a .badge,.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu ul li a .label{float:right;margin-top:0}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown .sidebar-submenu ul li.no-icon{padding-left:10px}.page-wrapper .sidebar-wrapper .sidebar-menu ul li a span.label,.page-wrapper .sidebar-wrapper .sidebar-menu ul li a span.badge{float:right;margin-top:8px;margin-left:5px}.page-wrapper .sidebar-wrapper .sidebar-header .user-info .user-role,.page-wrapper .sidebar-wrapper .sidebar-header .user-info .user-status,.page-wrapper .sidebar-wrapper .sidebar-brand>a,.page-wrapper .sidebar-wrapper .sidebar-menu li a{color:var(--sidebar-text-color);font-weight:600}.page-wrapper .sidebar-wrapper .sidebar-menu li.current>a,.page-wrapper .sidebar-wrapper .sidebar-menu li:active>a,.page-wrapper .sidebar-wrapper .sidebar-menu li:active>a:before,.page-wrapper .sidebar-wrapper .sidebar-menu li.current>a:before,.page-wrapper .sidebar-wrapper .sidebar-menu li.current>button:before,.page-wrapper .sidebar-wrapper .sidebar-header .user-info,.page-wrapper .sidebar-wrapper .sidebar-brand>a:hover{color:var(--sidebar-primary) !important}.page-wrapper .sidebar-wrapper .sidebar-menu li.current>a{font-weight:600 !important;background-color:var(--sidebar-menu-active-bg);border-right:3px solid var(--primary);border-radius:4px 0 0 4px;margin:4px 0}.page-wrapper .sidebar-wrapper .sidebar-menu .sidebar-dropdown.current>button{color:var(--sidebar-primary) !important}.page-wrapper .sidebar-wrapper .sidebar-brand .sidebar-colored{display:none}.page-wrapper .sidebar-wrapper .sidebar-brand .logo-dark-mode{display:none}.page-wrapper .sidebar-wrapper .sidebar-brand .logo-light-mode{display:inline-block}.page-wrapper .page-content{display:inline-block;width:100%;padding-left:0;transition:all .3s ease}.page-wrapper .page-content .top-header{position:fixed;right:0;top:0;z-index:999;max-height:70px;left:0;transition:all .3s}.page-wrapper .page-content .top-header .header-bar{background:var(--top-header-bg);backdrop-filter:saturate(180%)blur(5px);height:72px;border-bottom:1px solid var(--sidebar-border-color);position:relative;justify-content:space-between;align-items:center;padding:24px}@media(max-width:425px){.page-wrapper .page-content .top-header .header-bar{padding:24px 12px}}.page-wrapper .page-content .top-header .header-bar .logo-icon{display:none}@media(max-width:1024px){.page-wrapper .page-content .top-header .header-bar .logo-icon{display:block}}.page-wrapper .page-content .top-header .header-bar .logo-icon .small{display:none}@media(max-width:767px){.page-wrapper .page-content .top-header .header-bar .logo-icon .small{display:block}}.page-wrapper .page-content .top-header .header-bar .logo-icon .small svg{height:22px}.page-wrapper .page-content .top-header .header-bar .logo-icon .big{display:none}.page-wrapper .page-content .top-header .header-bar .logo-icon .big .logo-dark-mode{display:none}.page-wrapper .page-content .top-header .header-bar .logo-icon .big .logo-light-mode{display:inline-block}@media(min-width:768px) and (max-width:1024px){.page-wrapper .page-content .top-header .header-bar .logo-icon .big{display:block}}.page-wrapper .page-content .layout-spacing{padding:94px 14px 24px !important;min-height:calc(100vh - 66px) !important;position:relative}@media(max-width:425px){.page-wrapper .page-content .layout-spacing{padding:84px 0 24px !important}}@media screen and (min-width:1025px){.page-wrapper.toggled .page-content{padding-left:300px}}.page-wrapper.toggled .top-header{left:300px}@media(max-width:1024px){.page-wrapper.toggled .top-header{left:0}}.page-wrapper.toggled .sidebar-wrapper{left:0}@media(max-width:1024px){.page-wrapper.toggled .sidebar-wrapper{left:-300px}}.sidebar-footer{position:absolute;background:var(--sidebar-bg);width:100%;bottom:0;left:0;right:0;padding:9px 24px 9px 20px !important;border-right:1px solid var(--sidebar-border-color);height:60px}@media(max-width:425px){.sidebar-footer{padding:9px 12px !important}}:root{--doc-nav-title-link-color:var(--primary)}[data-dark-mode]{--doc-nav-title-link-color:var(--primary-300)}#doc-nav .card-title{color:var(--doc-nav-title-link-color)}#doc-nav .card-text{color:var(--text-muted)}@media(max-width:425px){.doc-next{order:2}.doc-prev{order:1}}.doc-hr{border-top:1px solid var(--gray-500);margin-top:2rem;margin-bottom:0;padding-top:1rem}:root{--toc-link-hover-bg-color:var(--gray-300);--toc-mobile-btn-bg-color:var(--gray-100);--toc-mobile-menu-bg-color:var(--white);--toc-mobile-link-hover-color:var(--primary)}[data-dark-mode]{--toc-link-hover-bg-color:var(--gray-700);--toc-mobile-btn-bg-color:var(--gray-900);--toc-mobile-menu-bg-color:var(--body-bg);--toc-mobile-link-hover-color:var(--primary-300)}.docs-toc-mobile{position:sticky;top:85px;padding-left:calc(var(--bs-gutter-x) * 1.05);padding-right:calc(var(--bs-gutter-x) * 1.05);z-index:20}.docs-toc-mobile a{color:var(--text-default)}.docs-toc-mobile a:hover{color:var(--toc-mobile-link-hover-color)}.docs-toc-mobile .dropdown-toggle{margin-bottom:16px;background:var(--toc-mobile-btn-bg-color);color:var(--text-default);padding:4px;border:1px solid var(--alert-border-color);border-radius:4px;width:calc(100% + 2px);white-space:normal}.docs-toc-mobile .dropdown-menu{transform:translateY(-16.5px) !important;background:var(--toc-mobile-menu-bg-color);inset:-1px auto none var(--bs-gutter-x) !important;border:1px solid var(--alert-border-color);border-top:none;border-radius:0 0 4px 4px;width:calc(100% - (var(--bs-gutter-x)*2));max-height:40vh;overflow-y:auto;scrollbar-width:thin}.docs-toc-mobile .dropdown-menu li{list-style:none;padding:0 0 4px}.docs-toc-mobile .dropdown-menu li ul{padding-left:1rem}.docs-toc{position:-webkit-sticky;position:sticky;top:6rem;height:calc(100vh - 11.1rem);overflow-y:auto;order:2;scrollbar-width:thin;scrollbar-color:var(--simplebar-color)rgba(var(--bs-light-rgb),var(--bs-bg-opacity))}@media(max-width:1199px){.docs-toc{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0,0,0,0) !important;white-space:nowrap !important;border:0 !important}}.docs-toc::-webkit-scrollbar{width:4px;height:18px}.docs-toc::-webkit-scrollbar-track{background:0 0}.docs-toc::-webkit-scrollbar-thumb{background-color:var(--simplebar-color);border-radius:4px;border:transparent}#TableOfContents ul,#toc ul{padding-left:0;margin-bottom:0;list-style:none}#TableOfContents ul li,#toc ul li{padding-bottom:5px}#TableOfContents ul li ul li,#toc ul li ul li{border-top:none;padding-left:1rem;margin-top:.125rem;padding-top:.125rem;padding-bottom:0}#TableOfContents a,#toc a{display:block;color:var(--text-default);padding:0 10px;padding-block:0 .05rem;margin:0 0 0 -10px;border-radius:4px;width:fit-content;font-size:15px;letter-spacing:.02em;transition:all .1s;-webkit-transition:all .1s}#TableOfContents a:hover,#toc a:hover{background-color:var(--toc-link-hover-bg-color);transition:all .1s;-webkit-transition:all .2s}#toc a.active{color:var(--white);background-color:var(--primary);opacity:.9}footer{position:relative;color:var(--text-muted);background:var(--body-bg);height:58px}footer .text-foot{color:var(--gray-500)}footer .footer-head{font-size:18px !important;letter-spacing:1px;font-weight:500}footer a{color:var(--content-link-color)}footer a:hover{color:var(--content-link-color);text-decoration:underline 1.5px var(--primary-200);text-underline-offset:3px !important;transition:0s !important}.footnote-backref{font-size:1.1rem;vertical-align:middle;margin-left:.25rem}:root{--invert:invert(0%);--btn-modal-hover-bg:var(--gray-200)}[data-dark-mode]{--invert:invert(100%);--btn-modal-hover-bg:var(--gray-800)}.btn-soft{background-color:var(--btn-soft-bg) !important;border:1px solid var(--btn-soft-border) !important;color:var(--btn-soft-color) !important}.btn-soft:hover,.btn-soft:active,.btn-soft.active,.btn-soft.focus{background:var(--btn-soft-bg);border-color:var(--btn-soft-border) !important;color:var(--btn-soft-color) !important}.btn-primary{background-color:var(--btn-primary-bg) !important;border:1px solid var(--btn-primary-border) !important;color:var(--btn-primary-color) !important}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.focus{background:var(--btn-primary-bg);border-color:var(--btn-primary-border) !important;color:var(--btn-primary-color) !important}.btn-default{background-color:var(--btn-default-bg) !important;border:1px solid var(--btn-default-border) !important;color:var(--btn-default-color) !important}.btn-default:hover,.btn-default:active,.btn-default.active,.btn-default.focus{background:var(--btn-default-bg);border-color:var(--btn-default-border) !important;color:var(--btn-default-hover-color) !important}.btn-link-modal{--bs-btn-font-weight:600;--bs-btn-color:var(--text-default);--bs-btn-bg:none;--bs-btn-border-color:var(--bd-violet-bg);--bs-btn-hover-color:var(--btn-default-hover-color);--bs-btn-hover-bg:var(--btn-modal-hover-bg);--bs-btn-hover-border-color:var(--bd-violet-bg);--bs-btn-focus-shadow-rgb:var(--bd-violet-rgb);--bs-btn-active-color:var(--bs-btn-hover-color);--bs-btn-active-bg:var(--bd-violet-bg);--bs-btn-active-border-color:var(--bd-violet-bg)}.btn-close{filter:var(--invert)}body .toggle-dark{display:block}body .toggle-light{display:none}[data-dark-mode] body .toggle-light{display:block}[data-dark-mode] body .toggle-dark{display:none}.btn{padding:8px 20px;outline:none;text-decoration:none;font-size:16px;letter-spacing:.5px;transition:all .3s;font-weight:600;border-radius:6px}.btn:focus{box-shadow:none !important}.btn.btn-sm,.btn-group-sm>.btn{padding:7px 16px;font-size:12px}.btn.btn-xs{padding:4px 10px;font-size:10px}.btn.btn-lg,.btn-group-lg>.btn{padding:14px 30px;font-size:16px}.btn.searchbtn{padding:6px 20px}.btn.btn-pills{border-radius:30px}.btn.btn-outline-light{border-color:var(--gray-200) !important}.btn.btn-soft-light{color:var(--gray-500) !important;border-color:var(--gray-200) !important}.btn.btn-soft-dark:hover,.btn.btn-soft-dark:focus,.btn.btn-soft-dark:active,.btn.btn-soft-dark.active,.btn.btn-soft-dark.focus{color:var(--gray-400) !important;border-color:var(--gray-200) !important}.btn.btn-dark,.btn.btn-secondary{color:var(--gray-200)}.btn.btn-outline-light{color:var(--gray-900)}.btn.btn-icon{height:36px;width:36px;display:inline-flex;align-items:center;justify-content:center;padding:0}.btn.btn-icon .icons{height:16px;width:16px;font-size:16px}.btn.btn-icon.btn-lg,.btn-group-lg>.btn-icon.btn{height:48px;width:48px;line-height:46px}.btn.btn-icon.btn-lg .icons,.btn-group-lg>.btn-icon.btn .icons{height:20px;width:20px;font-size:20px}.btn.btn-icon.btn-sm,.btn-group-sm>.btn-icon.btn{height:30px;width:30px;line-height:28px}button:not(:disabled){outline:none}:root{--breadcrumb-item-color:var(--primary)}[data-dark-mode]{--breadcrumb-item-color:var(--primary-300)}.breadcrumb .breadcrumb-item a{color:var(--breadcrumb-item-color)}.breadcrumb .breadcrumb-item.active{color:var(--text-muted)}@media(max-width:1199px){.breadcrumb{--bs-breadcrumb-padding-x:0.7rem}}.badge{letter-spacing:1.1px;padding:6px 8px 7px;font-weight:600;line-height:11px;border-radius:4px}.badge.badge-link:hover{color:var(--white) !important}:root{--bg-default:hsl(var(--primary-800-hsl),0.1);--bg-default-border:hsl(var(--primary-800-hsl),0.1);--bg-default-color:var(--text-default)}[data-dark-mode]{--bg-default:var(--gray-800);--bg-default-border:hsl(var(--primary-200-hsl),0.1);--bg-default-color:var(--text-default)}.bg-default{background-color:var(--bg-default) !important;border:1px solid var(--bg-default-border) !important;color:var(--bg-default-color) !important}.bg-primary{background-color:var(--btn-primary-bg) !important;border:1px solid var(--btn-primary-border) !important;color:var(--btn-primary-color) !important}:root{--dropdown-link-color:var(--text-default);--dropdown-bg:var(--body-bg);--dropdown-border-color:var(--alert-border-color);--dropdown-border-radius:0 0 4px 4px;--dropdown-link-hover-color:var(--primary)}[data-dark-mode]{--dropdown-link-color:var(--text-default);--dropdown-bg:var(--body-bg);--dropdown-border-color:var(--alert-border-color);--dropdown-border-radius:0 0 4px 4px;--dropdown-link-hover-color:var(--primary-300)}.dropdown-menu{--bs-dropdown-min-width:7rem;--bs-dropdown-link-color:var(--dropdown-link-color);--bs-dropdown-bg:var(--dropdown-bg);--bs-dropdown-border-color:var(--dropdown-border-color);--bs-dropdown-link-hover-bg:none;--bs-dropdown-link-hover-color:var(--dropdown-link-hover-color);--bs-dropdown-border-radius:var(--dropdown-border-radius);transform:translate(0,57px) !important;border-top:none}:root{--alert-border-color:#dee2e6;--alert-default-color:225.9, 68%, 95.1%;--alert-default-bg:hsl(var(--alert-default-color));--alert-default-border-color:var(--alert-border-color);--alert-primary-color:var(--primary-50-hsl);--alert-primary-bg:hsl(var(--alert-primary-color),0.5);--alert-primary-border-color:var(--alert-border-color);--alert-info-color:204, 45.5%, 97.8%;--alert-info-bg:hsl(var(--alert-info-color));--alert-info-border-color:var(--alert-border-color);--alert-success-color:var(--emerald-50-hsl);--alert-success-bg:hsl(var(--alert-success-color),0.4);--alert-success-border-color:var(--alert-border-color);--alert-danger-color:var(--cardinal-50-hsl);--alert-danger-bg:hsl(var(--alert-danger-color),0.5);--alert-danger-border-color:var(--alert-border-color);--alert-warning-color:var(--yellow-50-hsl);--alert-warning-bg:hsl(var(--alert-warning-color),0.5);--alert-warning-border-color:var(--alert-border-color);--alert-light-bg:var(--gray-200);--alert-light-border-color:var(--alert-border-color);--alert-dark-bg:var(--gray-800);--alert-dark-border-color:var(--alert-border-color)}[data-dark-mode]{--alert-border-color:var(--gray-800);--alert-default-bg:hsl(var(--alert-default-color),0.05);--alert-default-border-color:var(--alert-border-color);--alert-primary-bg:hsl(var(--primary-hsl),0.1);--alert-primary-icon-color:var(--primary-200);--alert-primary-border-color:var(--primary-800);--alert-info-bg:hsl(var(--blue-500-hsl),0.1);--alert-info-icon-color:var(--blue-200);--alert-info-border-color:var(--blue-800);--alert-success-bg:hsl(var(--emerald-500-hsl),0.1);--alert-success-icon-color:var(--emerald-200);--alert-success-border-color:var(--emerald-800);--alert-danger-bg:hsl(var(--cardinal-500-hsl),0.1);--alert-danger-icon-color:var(--cardinal-200);--alert-danger-border-color:var(--cardinal-800);--alert-warning-bg:hsl(var(--yellow-500-hsl),0.1);--alert-warning-icon-color:var(--yellow-200);--alert-warning-border-color:var(--yellow-800);--alert-light-bg:var(--gray-900);--alert-light-icon-color:var(--gray-200);--alert-light-border-color:var(--gray-800);--alert-dark-bg:var(--gray-400);--alert-dark-icon-color:var(--gray-800);--alert-dark-border-color:var(--gray-200)}.alert{font-size:var(--font-size-sm);border-radius:4px;color:var(--gray-700)}.alert p{line-height:1.525rem}.alert p:last-child{margin-bottom:0}.alert-icon{margin-right:.35rem}.alert-default{background-color:var(--alert-default-bg);border-color:var(--alert-border-color);color:var(--text-default)}.alert-white{background-color:rgba(255,255,255,.95)}.alert-primary{background-color:var(--alert-primary-bg);border-color:var(--alert-primary-border-color);color:var(--text-default)}.alert-primary>.alert-icon span{color:var(--alert-primary-icon-color);margin-top:.15rem}.alert-primary a{font-weight:700}.alert-success{background-color:var(--alert-success-bg);border-color:var(--alert-success-border-color);color:var(--text-default)}.alert-success>.alert-icon span{color:var(--alert-success-icon-color);margin-top:.15rem}.alert-success a{font-weight:700}.alert-info{background-color:var(--alert-info-bg);border-color:var(--alert-info-border-color);color:var(--text-default)}.alert-info>.alert-icon span{color:var(--alert-info-icon-color);margin-top:.15rem}.alert-info a{font-weight:700}.alert-warning{background-color:var(--alert-warning-bg);border-color:var(--alert-warning-border-color);color:var(--text-default)}.alert-warning>.alert-icon span{color:var(--alert-warning-icon-color);margin-top:.15rem}.alert-warning .alert-link{color:#523e02}.alert-danger{background-color:var(--alert-danger-bg);border-color:var(--alert-danger-border-color);color:var(--text-default)}.alert-danger>.alert-icon span{color:var(--alert-danger-icon-color);margin-top:.15rem}.alert-danger .alert-link{color:#6a1a21}.alert-light{background-color:var(--alert-light-bg);border-color:var(--alert-light-border-color);color:var(--text-default)}.alert-light>.alert-icon span{color:var(--alert-light-icon-color);margin-top:.15rem}.alert-light .alert-link{color:#4f5050}.alert-dark{background-color:var(--alert-dark-bg);border-color:var(--alert-dark-border-color);color:var(--text-default-inv)}.alert-dark>.alert-icon span{color:var(--alert-dark-icon-color);margin-top:.15rem}.alert-dark .alert-link{color:#101214}.alert .alert-link:hover,.alert .alert-link:focus{text-decoration:none}.alert-dismissible .btn-close{position:absolute;top:50%;transform:translateY(-50%);right:1rem;z-index:2;padding:.5rem;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-x'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");background-size:1.5rem;filter:invert(1)grayscale(100%)brightness(200%)}[data-global-alert=closed] #announcement{display:none}:root{--card-title-color:var(--text-default);--card-text-color:var(--text-muted)}[data-dark-mode]{--card-title-color:var(--text-default);--card-text-color:var(--gray-500)}.card{background:var(--card-bg);border-color:var(--card-border-color);border-radius:4px;transition:all .2s;-webkit-transition:all .2s}.card .card-body{padding:1.5rem}.card:hover{border-color:var(--card-border-hover-color)}.card:hover .card-title{color:#fff}.card-title{color:var(--card-title-color)}.card-text{color:var(--card-text-color);font-weight:500}:root{--form-border-color:var(--gray-200);--form-control-focus-color:var(--gray-900);--form-control-focus-bg-color:none;--form-control-focus-border-color:var(--primary);--form-control-placeholder-color:#666d78;--form-check-input-border-color:var(--gray-400);--form-check-input-background-color:var(--primary);--form-check-input-checked-border-color:var(--primary);--form-check-input-checked-bg-image:url("data:image/svg+xml,")}[data-dark-mode]{--form-border-color:var(--gray-800);--form-control-focus-color:var(--gray-200);--form-control-focus-bg-color:#000;--form-control-focus-border-color:var(--primary-300);--form-control-placeholder-color:#7f8497;--form-check-input-border-color:var(--gray-700);--form-check-input-background-color:var(--primary-300);--form-check-input-checked-border-color:var(--primary-300);--form-check-input-checked-bg-image:url("data:image/svg+xml,")}.form-label,.form-check-label{font-weight:700;font-size:14px}.form-control{border:1px solid var(--form-border-color);font-size:14px;line-height:22px;border-radius:4px;color:var(--text-default) !important;background-color:var(--body-bg);text-align:left}.form-control:focus{border-color:var(--primary);box-shadow:none}.form-control[readonly]{background-color:var(--white)}.form-control:disabled{background-color:var(--gray-300)}.form-control::placeholder{color:var(--form-control-placeholder-color)}.form-control:focus{color:var(--form-control-focus-color);border-color:var(--form-control-focus-border-color);background-color:var(--form-control-focus-bg-color)}.form-check-input{border:1px solid var(--form-check-input-border-color);background-color:var(--body-bg)}.form-check-input:focus{border-color:var(--primary);box-shadow:none}.form-check-input.form-check-input:checked{background-color:var(--form-check-input-background-color);border-color:var(--form-check-input-checked-border-color);--bs-form-check-bg-image:var(--form-check-input-checked-bg-image)}:root{--table-hover-bg:rgba(0, 0, 0, 0.075)}[data-dark-mode]{--table-hover-bg:rgba(255, 255, 255, 0.075)}table td{border-top:1px solid var(--card-border-color)}table td,table th{border-right:1px solid var(--card-border-color);padding:8px 12px}table td:last-child,table th:last-child{border-right:0}.table{--bs-table-color:var(--text-default);--bs-table-bg:transparent;--bs-table-accent-bg:none;--bs-table-striped-color:var(--text-default);--bs-table-striped-bg:var(--alert-primary-bg);--bs-table-hover-color:var(--text-default);--bs-table-hover-bg:var(--table-hover-bg);color:var(--text-default);font-size:.875rem;border-collapse:separate;border-spacing:0}.table>:not(caption)>*>*{padding:1rem;border-bottom-width:0}.table tbody{vertical-align:top}.table tbody td{border-top:inherit;border-bottom-width:1px}.table tbody td:first-child{border-left-width:1px}.table tbody td:last-child{border-right:inherit;border-right-width:1px}.table tbody tr:first-child td{border-top-width:1px}.table tbody tr:first-child td:first-child{border-top-left-radius:4px}.table tbody tr:first-child td:last-child{border-top-right-radius:4px}.table tbody tr:last-child td:first-child{border-bottom-left-radius:4px}.table tbody tr:last-child td:last-child{border-bottom-right-radius:4px}.table td,.table th{border-right:0}.table thead,.table tbody,.table tfoot,.table tr,.table td,.table th{border-color:var(--card-border-color)}.table thead tr th{text-transform:uppercase;background:0 0}.table-sm>:not(caption)>*>*,.table-striped>:not(caption)>*>*,.table-borderless>:not(caption)>*>*,.table-hover>:not(caption)>*>*,.table-striped-columns>:not(caption)>*>*{padding:.6rem}@media(max-width:1199px){.table-sm>:not(caption)>*>*,.table-striped>:not(caption)>*>*,.table-borderless>:not(caption)>*>*,.table-hover>:not(caption)>*>*,.table-striped-columns>:not(caption)>*>*{padding:.6rem .25rem}}.table-xs>:not(caption)>*>*{padding:.25rem}.table-borderless>:not(caption)>*>*{border-bottom-width:0 !important}.table-borderless td:first-child{border-left-width:0 !important}.table-borderless td:last-child{border-right-width:0 !important}.table-borderless tr:first-child td{border-top-width:0 !important}.table-striped-columns>:not(caption)>tr>th:nth-child(2n){--bs-table-striped-bg:none}.table-responsive{display:block;width:100%;overflow-x:auto}:root{--nav-tabs-border-width:none;--nav-tabs-link-active-bg:none;--nav-tabs-link-active-color:var(--text-default);--nav-tabs-border-color:var(--gray-400)}[data-dark-mode]{--nav-tabs-border-color:var(--gray-800)}.nav-tabs{--bs-nav-tabs-border-width:var(--nav-tabs-border-width);--bs-nav-tabs-link-active-bg:var(--nav-tabs-link-active-bg);--bs-nav-tabs-link-active-color:var(--nav-tabs-link-active-color);border-bottom:1px solid var(--nav-tabs-border-color);margin-bottom:.8rem}.nav-tabs .nav-link{color:var(--text-muted) !important;margin-bottom:-1px}.nav-tabs .nav-link:hover{text-decoration:none !important}.nav-tabs .nav-link.active{border-bottom:2px solid var(--content-link-color);color:var(--content-link-color) !important}.tab-content{margin-bottom:.8rem}:root{--tooltip-bg:var(--white);--tooltip-border-color:var(--content-link-color);--tooltip-drop-shadow-color:var(--gray-500);--tooltip-link-color:var(--gray-700)}[data-dark-mode]{--tooltip-bg:var(--dark-alt);--tooltip-border-color:var(--primary-300);--tooltip-drop-shadow-color:var(--gray-900);--tooltip-link-color:var(--gray-500)}.tooltip{--bs-tooltip-bg:var(--tooltip-bg);--bs-tooltip-opacity:1.0;--bs-tooltip-font-size:0.575rem;--bs-tooltip-max-width:300px}.tooltip-inner{text-align:left;border:2px solid var(--tooltip-border-color);border-width:2px 2px 2px 8px;filter:drop-shadow(4px 4px 5px var(--tooltip-drop-shadow-color));--bs-tooltip-border-radius:4px}.tooltip-inner a{color:var(--tooltip-link-color);font-size:.85rem;line-height:1.55}.tooltip-inner a p{margin-bottom:.2rem;color:var(--text-muted);font-weight:600}.tooltip-inner a strong{font-size:.975rem;line-height:2;color:var(--text-default)}:root{--feature-icon-color:var(--primary);--feature-icon-faint:var(--gray-200);--feature-link-hover-bg-color:var(--primary)}[data-dark-mode]{--feature-icon-color:var(--primary-300);--feature-icon-faint:var(--gray-900);--feature-link-hover-bg-color:var(--gray-900)}.features .icon{background:rgba(var(--primary),.1)}.features .image:before{background:linear-gradient(45deg,transparent,rgba(var(--primary),.1))}.features .read-more,.features .color{color:var(--primary) !important}.features.feature-clean .icons{color:var(--primary) !important}.features.feature-clean .icons i{background-color:rgba(var(--primary),.1)}.features.feature-clean .title:hover{color:var(--primary-800) !important}.features.feature-full-bg .icon-color{color:var(--feature-icon-color) !important}.features.feature-full-bg .icon-faint{color:var(--feature-icon-faint) !important;transition:all .5s ease}.features.feature-full-bg:hover{background-color:var(--feature-link-hover-bg-color) !important}.features.key-feature .icon{background:linear-gradient(45deg,transparent,rgba(var(--primary),.15));color:var(--primary)}.features.course-feature .full-img{color:var(--primary) !important}.features.explore-feature:hover .icons,.features.explore-feature:hover .title{color:var(--primary) !important}.features .btn-soft{background-color:rgba(var(--primary),.05) !important;border:1px solid rgba(var(--primary),.05) !important;color:var(--primary) !important;box-shadow:0 3px 5px rgba(var(--primary),.1)}.features .btn-soft:hover,.features .btn-soft:focus,.features .btn-soft:active,.features .btn-soft.active,.features .btn-soft.focus{background-color:var(--primary) !important;border-color:var(--primary) !important;color:var(--white) !important}.features:hover .image:before{background:rgba(var(--primary),.1)}.features .image:before{content:"";position:absolute;bottom:5px;left:5px;width:64px;height:64px;border-radius:6px;transform:rotate(33.75deg)}.features.feature-clean{background-color:var(--body-bg)}.features.feature-clean .icons i{height:65px;width:65px;line-height:65px}.features .ride-image{transform:rotate(-45deg)}.features .ride-image img{border-radius:100% 100% 100% 0}.features.key-feature{transition:all .3s ease}.features.key-feature:hover{transform:scale(1.05);box-shadow:var(--shadow-md) !important}.features:hover .image:before{animation:spinner-border 5s linear infinite !important}.features.feature-full-bg{transition:all .5s ease}.features.feature-full-bg .big-icon{position:absolute;top:50%;transform:translateY(-50%);left:0;right:0;opacity:.015;font-size:180px}.features.feature-full-bg:hover{box-shadow:var--(shadow-lg);color:var(--white) !important}.features.feature-full-bg:hover .icon-color i,.features.feature-full-bg:hover .badge,.features.feature-full-bg:hover .para{color:var(--white) !important;opacity:.5}.features.feature-full-bg:hover .content,.features.feature-full-bg:hover .icon-color{z-index:2}.features.feature-full-bg:hover .big-icon{opacity:.05}.features.feature-full-bg:hover .readmore{color:var(--white) !important}.features.course-feature{transition:all .5s ease}.features.course-feature .full-img{position:absolute;bottom:50%;transform:translateY(50%);left:0;right:0;opacity:0;margin:0 auto;z-index:-2;transition:all .5s ease;font-size:250px}.features.course-feature:hover{transform:translateY(-10px)}.features.course-feature:hover .full-img{opacity:.05}.features.explore-feature{transition:all .5s ease}.features.explore-feature .icons{height:80px;width:80px;line-height:80px;transition:all .5s ease}.features.explore-feature:hover{box-shadow:var(--shadow-lg) !important}.features .title,.key-feature .title{font-size:18px !important}.features .icon,.key-feature .icon{height:45px;min-width:45px;display:flex;align-items:center;justify-content:center}.fw-medium{font-weight:var(--fw-medium)}.section{padding:100px 0;position:relative}@media(max-width:768px){.section{padding:60px 0}}.bg-overlay{background-color:var(--overlay);position:absolute;top:0;right:0;left:0;bottom:0;width:100%;height:100%}.bg-overlay-white{background-color:var(--bg-overlay-white)}.title-heading{line-height:26px}.title-heading .heading{font-size:45px !important;letter-spacing:1px}@media(max-width:768px){.title-heading .heading{font-size:35px !important}}.title-heading .para-desc{font-size:18px}.section-title .title{letter-spacing:.5px;font-size:30px !important}@media(max-width:768px){.section-title .title{font-size:24px !important}}.para-desc{max-width:600px}.mt-100{margin-top:100px}.back-to-top{position:fixed;z-index:99;bottom:30px;right:30px;display:none;transition:all .5s ease;height:36px;width:36px;line-height:0;padding:0;border-radius:4px;border:none;background:var(--primary)}.back-to-top svg{transition:all .5s ease}.back-to-top:hover{transform:rotate(45deg)}.back-to-top:hover svg{transform:rotate(-45deg) !important}.opacity-05{opacity:.05}.opacity-1{opacity:.1}.opacity-2{opacity:.2}.opacity-3{opacity:.3}.opacity-4{opacity:.4}.opacity-5{opacity:.5}.opacity-6{opacity:.6}.opacity-7{opacity:.7}.opacity-075{opacity:.075}.opacity-8{opacity:.8}.opacity-9{opacity:.9}.back-to-home{position:fixed;top:4%;right:2%;z-index:1}.sticky-bar{position:sticky;top:80px}[class^=uil-]:before,[class*=" uil-"]:before{margin:0}.uim-svg{vertical-align:0 !important}.social-icon li a{color:var(--dark);border:1px solid var(--dark);height:32px;width:32px;display:inline-flex;justify-content:center;align-items:center;text-align:center;transition:all .4s ease;overflow:hidden;position:relative}.social-icon li a .fea-social{stroke-width:2}.social-icon li a:hover{background-color:var(--primary);border-color:var(--primary) !important;color:var(--foot-social-color-white) !important}.social-icon li a:hover .fea-social{fill:var(--primary)}.social-icon.social li a{color:var(--foot-social-color);border-color:var(--social-border-color)}.social-icon.foot-social-icon li a{color:var(--foot-social-color);border-color:hsl(var(--footer),100%,calc(var(--l) + 5%))}.rounded{border-radius:6px !important}.rounded-top{border-top-left-radius:6px !important;border-top-right-radius:6px !important}.rounded-left{border-top-left-radius:6px !important;border-bottom-left-radius:6px !important}.rounded-bottom{border-bottom-left-radius:6px !important;border-bottom-right-radius:6px !important}.rounded-right{border-top-right-radius:6px !important;border-bottom-right-radius:6px !important}.rounded-md{border-radius:10px !important}.rounded-lg{border-radius:30px !important}.bg-white-color{background:var(--bg-white-color)}.d-flex .flex-1{flex:1}.material-icons{font-family:material symbols outlined;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;overflow:hidden;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:'liga'}span.size-16,i.size-16{font-size:16px !important;font-variation-settings:'OPSZ' 16}span.size-20,i.size-20{font-size:20px !important;font-variation-settings:'OPSZ' 20}span.size-24,i.size-24{font-size:24px !important;font-variation-settings:'OPSZ' 24}span.size-40,i.size-40{font-size:40px !important;font-variation-settings:'OPSZ' 40}span.size-48,i.size-48{font-size:48px !important;font-variation-settings:'OPSZ' 48}.anchor{visibility:hidden}h1:hover a,.h1:hover a,h2:hover a,.h2:hover a,h3:hover a,.h3:hover a,h4:hover a,.h4:hover a{visibility:visible;text-decoration:none}:root{--prism-code-color:#657b83;--prism-code-bg:#fdf6e3;--prism-code-scrollbar-thumb-color:var(--gray-400);--prism-line-highlight-bg-color:#e9967a;--prism-copy-btn-bg-hover-color:var(--gray-700)}[data-dark-mode]{--prism-code-color:#dee2e6;--prism-code-bg:var(--gray-900);--prism-code-scrollbar-thumb-color:var(--gray-600);--prism-line-highlight-bg-color:var(--gray-600);--prism-copy-btn-bg-hover-color:var(--white)}code[class*=language-],pre[class*=language-]{color:var(--prism-code-color);background:var(--prism-code-bg) !important}pre[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,code[class*=language-] ::-moz-selection{background:#073642}pre[class*=language-]::selection,pre[class*=language-] ::selection,code[class*=language-]::selection,code[class*=language-] ::selection{background:#073642}pre[class*=language-]{overflow:auto;border-radius:0 0 4px 4px}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:#fdf6e3}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.line-highlight:before,.line-highlight[data-end]:after{background-color:var(--prism-line-highlight-bg-color)}[data-copy-state=copy] span:empty::before{background-color:var(--gray-500)}[data-copy-state=copy] span:empty:hover::before{background-color:var(--prism-copy-btn-bg-hover-color)}[data-copy-state=copy-success] span:empty::before{background-color:var(--emerald-400)}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#93a1a1}.token.punctuation{color:#586e75}.token.namespace{opacity:.7}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{color:#268bd2}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.url,.token.inserted{color:#2aa198}.token.entity{color:#657b83;background:#eee8d5}.token.atrule,.token.attr-value,.token.keyword{color:#859900}.token.function,.token.class-name{color:#b58900}.token.regex,.token.important,.token.variable{color:#cb4b16}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}code{color:var(--text-default)}.docs-content .main-content pre{background-color:var(--prism-code-bg) !important}code[class*=language-],pre[class*=language-]{border:none !important;font-family:Fira Code;font-size:.8rem;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;scrollbar-width:thin;scrollbar-color:var(--prism-code-scrollbar-thumb-color)var(--prism-code-bg)}code[class*=language-]::-webkit-scrollbar,pre[class*=language-]::-webkit-scrollbar{height:5px;background:var(--prism-code-bg)}code[class*=language-]::-webkit-scrollbar-thumb,pre[class*=language-]::-webkit-scrollbar-thumb{background:var(--prism-code-scrollbar-thumb-color)}pre[data-line]{position:relative;padding:0 !important}.line-highlight:first-of-type{margin-top:0}.line-highlight:last-of-type{margin-top:0 !important}.line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:0;background:rgba(153,122,102,8%);background:linear-gradient(to right,rgba(153,122,102,.1) 70%,rgba(153,122,102,0));pointer-events:none;line-height:inherit;white-space:pre}@media print{.line-highlight{-webkit-print-color-adjust:exact;color-adjust:exact}}.line-highlight:before,.line-highlight[data-end]:after{content:attr(data-start);position:absolute;top:.14em;left:.6em;min-width:1.5em;padding:0 .5em;color:#f5f2f0;font:700 95%/1.3 sans-serif;text-align:center;vertical-align:.3em;border-radius:4px;text-shadow:none}.line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.14em}.line-numbers .line-highlight{margin-top:0 !important}.line-numbers .line-highlight:before,.line-numbers .line-highlight:after{content:none}pre[id].linkable-line-numbers span.line-numbers-rows{pointer-events:all}pre[id].linkable-line-numbers span.line-numbers-rows>span:before{cursor:pointer}pre[id].linkable-line-numbers span.line-numbers-rows>span:hover:before{background-color:rgba(128,128,128,.2)}pre[class*=language-].line-numbers{position:relative;padding-left:0;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit;padding:.3rem 3rem 1.25rem !important}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:.4em;font-size:100%;left:0;width:3em;letter-spacing:-1px;border-right:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:var(--gray-400);display:block;padding-right:.8em;text-align:right}div.code-toolbar{position:relative;margin:16px 0;padding-top:1.25rem !important;background-color:var(--prism-code-bg);border-radius:4px}div.prism-codeblock.hl_lines .code-toolbar{padding-top:1.25rem !important}div.prism-shortcode.data-line .code-toolbar{padding-top:1.25rem !important}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.4em;right:.4em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>button.copy-to-clipboard-button{box-shadow:none;background:var(--prism-code-bg);opacity:.9}[data-copy-state=copy] span:empty::before{content:"";-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='48' width='48' viewBox='0 0 48 48'%3E%3Cpath d='M9 43.95q-1.2 0-2.1-.9-.9-.9-.9-2.1V10.8h3v30.15h23.7v3Zm6-6q-1.2 0-2.1-.9-.9-.9-.9-2.1v-28q0-1.2.9-2.1.9-.9 2.1-.9h22q1.2 0 2.1.9.9.9.9 2.1v28q0 1.2-.9 2.1-.9.9-2.1.9Zm0-3h22v-28H15v28Zm0 0v-28 28Z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='48' width='48' viewBox='0 0 48 48'%3E%3Cpath d='M9 43.95q-1.2 0-2.1-.9-.9-.9-.9-2.1V10.8h3v30.15h23.7v3Zm6-6q-1.2 0-2.1-.9-.9-.9-.9-2.1v-28q0-1.2.9-2.1.9-.9 2.1-.9h22q1.2 0 2.1.9.9.9.9 2.1v28q0 1.2-.9 2.1-.9.9-2.1.9Zm0-3h22v-28H15v28Zm0 0v-28 28Z'/%3E%3C/svg%3E");-webkit-mask-size:contain;mask-size:contain;display:block;height:24px;width:24px}[data-copy-state=copy-success] span:empty::before{content:"";-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='48' width='48' viewBox='0 0 48 48'%3E%3Cpath d='M18.9 35.7 7.7 24.5l2.15-2.15 9.05 9.05 19.2-19.2 2.15 2.15Z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='48' width='48' viewBox='0 0 48 48'%3E%3Cpath d='M18.9 35.7 7.7 24.5l2.15-2.15 9.05 9.05 19.2-19.2 2.15 2.15Z'/%3E%3C/svg%3E");-webkit-mask-size:contain;mask-size:contain;display:block;height:24px;width:24px}[data-copy-state=copy-error] span:empty::before{content:"";-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='48' width='48' viewBox='0 0 48 48'%3E%3Cpath d='M24 34q.7 0 1.175-.475.475-.475.475-1.175 0-.7-.475-1.175Q24.7 30.7 24 30.7q-.7 0-1.175.475-.475.475-.475 1.175 0 .7.475 1.175Q23.3 34 24 34Zm-1.35-7.65h3V13.7h-3ZM24 44q-4.1 0-7.75-1.575-3.65-1.575-6.375-4.3-2.725-2.725-4.3-6.375Q4 28.1 4 23.95q0-4.1 1.575-7.75 1.575-3.65 4.3-6.35 2.725-2.7 6.375-4.275Q19.9 4 24.05 4q4.1 0 7.75 1.575 3.65 1.575 6.35 4.275 2.7 2.7 4.275 6.35Q44 19.85 44 24q0 4.1-1.575 7.75-1.575 3.65-4.275 6.375t-6.35 4.3Q28.15 44 24 44Zm.05-3q7.05 0 12-4.975T41 23.95q0-7.05-4.95-12T24 7q-7.05 0-12.025 4.95Q7 16.9 7 24q0 7.05 4.975 12.025Q16.95 41 24.05 41ZM24 24Z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='48' width='48' viewBox='0 0 48 48'%3E%3Cpath d='M24 34q.7 0 1.175-.475.475-.475.475-1.175 0-.7-.475-1.175Q24.7 30.7 24 30.7q-.7 0-1.175.475-.475.475-.475 1.175 0 .7.475 1.175Q23.3 34 24 34Zm-1.35-7.65h3V13.7h-3ZM24 44q-4.1 0-7.75-1.575-3.65-1.575-6.375-4.3-2.725-2.725-4.3-6.375Q4 28.1 4 23.95q0-4.1 1.575-7.75 1.575-3.65 4.3-6.35 2.725-2.7 6.375-4.275Q19.9 4 24.05 4q4.1 0 7.75 1.575 3.65 1.575 6.35 4.275 2.7 2.7 4.275 6.35Q44 19.85 44 24q0 4.1-1.575 7.75-1.575 3.65-4.275 6.375t-6.35 4.3Q28.15 44 24 44Zm.05-3q7.05 0 12-4.975T41 23.95q0-7.05-4.95-12T24 7q-7.05 0-12.025 4.95Q7 16.9 7 24q0 7.05 4.975 12.025Q16.95 41 24.05 41ZM24 24Z'/%3E%3C/svg%3E");-webkit-mask-size:contain;mask-size:contain;background-color:var(--cardinal-300);display:block;height:24px;width:24px}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:4px;background:rgba(224,224,224,.2);box-shadow:0 2px rgba(0,0,0,.2);border-radius:4px}div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus{color:inherit;text-decoration:none}.token.treeview-part .entry-line{position:relative;text-indent:-99em;display:inline-block;vertical-align:top;width:1.2em}.token.treeview-part .entry-line:before,.token.treeview-part .line-h:after{content:"";position:absolute;top:0;left:50%;width:50%;height:100%}.token.treeview-part .line-h:before,.token.treeview-part .line-v:before{border-left:1px solid #ccc}.token.treeview-part .line-v-last:before{height:50%;border-left:1px solid #ccc;border-bottom:1px solid #ccc}.token.treeview-part .line-h:after{height:50%;border-bottom:1px solid #ccc}.token.treeview-part .entry-name{position:relative;display:inline-block;vertical-align:top}.token.treeview-part .entry-name.dotfile{opacity:.5}@font-face{font-family:prismtreeview;src:url(data:application/font-woff;base64,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)format("woff")}.token.treeview-part .entry-name:before{content:"\ea01";font-family:prismtreeview;font-size:inherit;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:2.5ex;display:inline-block}.token.treeview-part .entry-name.dir:before{content:"\ea02"}.token.treeview-part .entry-name.ext-bmp:before,.token.treeview-part .entry-name.ext-eps:before,.token.treeview-part .entry-name.ext-gif:before,.token.treeview-part .entry-name.ext-jpe:before,.token.treeview-part .entry-name.ext-jpg:before,.token.treeview-part .entry-name.ext-jpeg:before,.token.treeview-part .entry-name.ext-png:before,.token.treeview-part .entry-name.ext-svg:before,.token.treeview-part .entry-name.ext-tiff:before{content:"\ea03"}.token.treeview-part .entry-name.ext-cfg:before,.token.treeview-part .entry-name.ext-conf:before,.token.treeview-part .entry-name.ext-config:before,.token.treeview-part .entry-name.ext-csv:before,.token.treeview-part .entry-name.ext-ini:before,.token.treeview-part .entry-name.ext-log:before,.token.treeview-part .entry-name.ext-md:before,.token.treeview-part .entry-name.ext-nfo:before,.token.treeview-part .entry-name.ext-txt:before{content:"\ea06"}.token.treeview-part .entry-name.ext-asp:before,.token.treeview-part .entry-name.ext-aspx:before,.token.treeview-part .entry-name.ext-c:before,.token.treeview-part .entry-name.ext-cc:before,.token.treeview-part .entry-name.ext-cpp:before,.token.treeview-part .entry-name.ext-cs:before,.token.treeview-part .entry-name.ext-css:before,.token.treeview-part .entry-name.ext-h:before,.token.treeview-part .entry-name.ext-hh:before,.token.treeview-part .entry-name.ext-htm:before,.token.treeview-part .entry-name.ext-html:before,.token.treeview-part .entry-name.ext-jav:before,.token.treeview-part .entry-name.ext-java:before,.token.treeview-part .entry-name.ext-js:before,.token.treeview-part .entry-name.ext-php:before,.token.treeview-part .entry-name.ext-rb:before,.token.treeview-part .entry-name.ext-xml:before{content:"\ea07"}.token.treeview-part .entry-name.ext-7z:before,.token.treeview-part .entry-name.ext-bz:before,.token.treeview-part .entry-name.ext-bz2:before,.token.treeview-part .entry-name.ext-gz:before,.token.treeview-part .entry-name.ext-rar:before,.token.treeview-part .entry-name.ext-tar:before,.token.treeview-part .entry-name.ext-tgz:before,.token.treeview-part .entry-name.ext-zip:before{content:"\ea08"}.token.treeview-part .entry-name.ext-aac:before,.token.treeview-part .entry-name.ext-au:before,.token.treeview-part .entry-name.ext-cda:before,.token.treeview-part .entry-name.ext-flac:before,.token.treeview-part .entry-name.ext-mp3:before,.token.treeview-part .entry-name.ext-oga:before,.token.treeview-part .entry-name.ext-ogg:before,.token.treeview-part .entry-name.ext-wav:before,.token.treeview-part .entry-name.ext-wma:before{content:"\ea04"}.token.treeview-part .entry-name.ext-avi:before,.token.treeview-part .entry-name.ext-flv:before,.token.treeview-part .entry-name.ext-mkv:before,.token.treeview-part .entry-name.ext-mov:before,.token.treeview-part .entry-name.ext-mp4:before,.token.treeview-part .entry-name.ext-mpeg:before,.token.treeview-part .entry-name.ext-mpg:before,.token.treeview-part .entry-name.ext-ogv:before,.token.treeview-part .entry-name.ext-webm:before{content:"\ea05"}.token.treeview-part .entry-name.ext-pdf:before{content:"\ea09"}.token.treeview-part .entry-name.ext-xls:before,.token.treeview-part .entry-name.ext-xlsx:before{content:"\ea0a"}.token.treeview-part .entry-name.ext-doc:before,.token.treeview-part .entry-name.ext-docm:before,.token.treeview-part .entry-name.ext-docx:before{content:"\ea0c"}.token.treeview-part .entry-name.ext-pps:before,.token.treeview-part .entry-name.ext-ppt:before,.token.treeview-part .entry-name.ext-pptx:before{content:"\ea0b"}:root{--flexsearch-container-bg-color:var(--gray-100);--flexsearch-after-bg-color:var(--primary);--flexsearch-after-color:var(--white);--flexsearch-button-hover-bg-color:none;--flexsearch-key-bg-color:var(--primary);--flexsearch-key-color:#fff;--flexsearch-suggestion-bg-color:var(--white);--flexsearch-suggestion-link-hover-bg-color:#f5f6f7;--flexsearch-suggestion-title-color:var(--primary);--flexsearch-suggestion-title-border-color:var(--gray-300);--flexsearch-suggestion-desc-color:var(--text-default)}[data-dark-mode]{--flexsearch-container-bg-color:var(--dark-secondary);--flexsearch-after-bg-color:hsl(var(--primary-hsl),0.15);--flexsearch-after-color:var(--primary-200);--flexsearch-button-hover-bg-color:var(--black);--flexsearch-key-bg-color:hsl(var(--primary-hsl), 0.15);--flexsearch-key-color:var(--primary-200);--flexsearch-suggestion-bg-color:var(--dark-secondary);--flexsearch-suggestion-link-hover-bg-color:var(--gray-800);--flexsearch-suggestion-title-color:var(--primary-200);--flexsearch-suggestion-title-border-color:var(--gray-700);--flexsearch-suggestion-desc-color:var(--gray-300)}#FlexSearchCollapse{transition:.05s ease;width:fit-content}.flexsearch-container{background-color:var(--flexsearch-container-bg-color);padding:.8rem}.flexsearch-container .form-control{border:2px solid var(--primary);font-size:1.2rem}@media(min-width:768px){.flexsearch-container{border-radius:0 0 4px 0}.flexsearch{min-width:500px;width:500px}}.flexsearch-keymap{padding:0 0 .8rem .5rem;list-style:none;display:flex}.flexsearch-keymap .flexsearch-button-cmd-key{height:20px;width:30px}.flexsearch-keymap li:not(:last-of-type){margin-right:.8rem}.flexsearch-keymap li{align-items:center;display:flex}@media(max-width:768px){.flexsearch-keymap{display:none}}.flexsearch-key-label{color:var(--form-control-placeholder-color);font-size:.75em;line-height:1.6em}.flexsearch-button-keys{display:flex;min-width:calc(40px + .8em)}.flexsearch-button-cmd-key{align-items:center;background:var(--flexsearch-key-bg-color);border-radius:3px;color:var(--flexsearch-key-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;border:0;width:56px}.flexsearch-button-key{align-items:center;background:var(--flexsearch-key-bg-color);border-radius:3px;color:var(--flexsearch-key-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0;position:relative;border:0;width:20px;font-size:11px}#flexsearch-button{display:flex;height:36px;padding:0 8px;margin:0 0 0 16px;font-weight:400;align-items:center;justify-content:space-between;border-radius:4px}#flexsearch-button .flexsearch-button-placeholder{color:var(--form-control-placeholder-color)}#flexsearch-button:hover{background:var(--flexsearch-button-hover-bg-color) !important}#flexsearch-button:hover .flexsearch-button-placeholder{color:var(--text-default)}@media(min-width:992px){.flexsearch::after{right:.5125rem}}#suggestions{position:absolute;background-color:var(--flexsearch-suggestion-bg-color);left:0;max-height:70vh;overflow-y:auto;scrollbar-width:thin;margin-top:.5rem;max-width:calc(100vw - .15rem);z-index:999}#suggestions::-webkit-scrollbar{width:5px}#suggestions::-webkit-scrollbar-track{background:0 0}#suggestions::-webkit-scrollbar-thumb{background-color:rgba(155,155,155,.5);border-radius:2px;border:transparent}@media(min-width:992px){#suggestions{left:0}}#suggestions a,.suggestion__no-results{padding:.75rem;margin:0 .5rem}#suggestions a{display:block;text-decoration:none}#suggestions a:focus{background:var(--flexsearch-suggestion-link-hover-bg-color);border-radius:4px;outline:0}#suggestions div:first-child{margin-top:.5rem}#suggestions div:last-child{margin-bottom:.5rem}#suggestions a:hover{background:var(--flexsearch-suggestion-link-hover-bg-color);border-radius:4px}#suggestions span{display:flex;font-size:1rem}.suggestion__title{font-weight:700;color:var(--flexsearch-suggestion-title-color)}.suggestion__description,.suggestion__no-results{color:var(--flexsearch-suggestion-desc-color)}@media(min-width:992px){#suggestions{width:500px;max-width:500px}#suggestions a{display:flex}.suggestion__title{width:9rem;padding-right:1rem;border-right:1px solid var(--flexsearch-suggestion-title-border-color);display:inline-block;text-align:left}.suggestion__description{width:20.1rem;padding-left:1rem}}.docs-content .main-content pre.mermaid{background-color:transparent !important;text-align:center !important}.docs-content .main-content pre.mermaid .messageText{fill:var(--text-default) !important}.docs-content .main-content pre.mermaid .messageLine0,.docs-content .main-content pre.mermaid .messageLine1{stroke:var(--text-default) !important}.docs-content .main-content pre.mermaid #arrowhead path,.docs-content .main-content pre.mermaid #crosshead path{fill:var(--text-default) !important;stroke:var(--text-default) !important}.docs-content .main-content pre.mermaid .edgePaths path{stroke:var(--text-default) !important}.docs-content .main-content pre.mermaid .marker{fill:var(--text-default) !important;stroke:var(--text-default) !important}.docs-content .main-content pre.mermaid .grid .tick{stroke:var(--text-default) !important}.docs-content .main-content pre.mermaid .grid .tick text{fill:var(--text-default) !important}.docs-content .main-content pre.mermaid line{stroke:var(--text-default) !important}.docs-content .main-content pre.mermaid text{fill:var(--text-default) !important} \ No newline at end of file diff --git a/public/docs/software-catalog/bundles/index.html b/public/docs/software-catalog/bundles/index.html index 23d3d47..7d3a2b4 100644 --- a/public/docs/software-catalog/bundles/index.html +++ b/public/docs/software-catalog/bundles/index.html @@ -14,10 +14,9 @@ - + Bundles | Federated Computer Enterprise - @@ -25,20 +24,20 @@ - - - - - - + + + + + + - + - + @@ -50,8 +49,9 @@ The Federated Core Provisioner can spin up Federated Cores based on a software m - - + + + @@ -72,7 +72,8 @@ The Federated Core Provisioner can spin up Federated Cores based on a software m - + + @@ -95,7 +96,7 @@ The Federated Core Provisioner can spin up Federated Cores based on a software m
  • - + article Overview @@ -115,7 +116,7 @@ The Federated Core Provisioner can spin up Federated Cores based on a software m -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -130,47 +131,47 @@ The Federated Core Provisioner can spin up Federated Cores based on a software m -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -190,17 +191,17 @@ The Federated Core Provisioner can spin up Federated Cores based on a software m -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -220,22 +221,22 @@ The Federated Core Provisioner can spin up Federated Cores based on a software m -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -255,7 +256,7 @@ The Federated Core Provisioner can spin up Federated Cores based on a software m -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -275,12 +276,12 @@ The Federated Core Provisioner can spin up Federated Cores based on a software m -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -305,22 +306,22 @@ The Federated Core Provisioner can spin up Federated Cores based on a software m -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -340,22 +341,22 @@ The Federated Core Provisioner can spin up Federated Cores based on a software m -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -375,12 +376,12 @@ The Federated Core Provisioner can spin up Federated Cores based on a software m -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -684,10 +685,12 @@ The Federated Core Provisioner can spin up Federated Cores based on a software m - + + + - + diff --git a/public/docs/software-catalog/federated-commerce/index.html b/public/docs/software-catalog/federated-commerce/index.html index 2a38a30..da8a1d0 100644 --- a/public/docs/software-catalog/federated-commerce/index.html +++ b/public/docs/software-catalog/federated-commerce/index.html @@ -14,10 +14,9 @@ - + Federated Commerce | Federated Computer Enterprise - @@ -25,21 +24,21 @@ - - - - - - + + + + + + - + - + - + + + @@ -74,7 +74,8 @@ In addition to software, Federated provides essential services to customers such - + + @@ -97,7 +98,7 @@ In addition to software, Federated provides essential services to customers such
  • - + article Overview @@ -117,7 +118,7 @@ In addition to software, Federated provides essential services to customers such -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -132,47 +133,47 @@ In addition to software, Federated provides essential services to customers such -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -192,17 +193,17 @@ In addition to software, Federated provides essential services to customers such -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -222,22 +223,22 @@ In addition to software, Federated provides essential services to customers such -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -257,7 +258,7 @@ In addition to software, Federated provides essential services to customers such -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -277,12 +278,12 @@ In addition to software, Federated provides essential services to customers such -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -307,22 +308,22 @@ In addition to software, Federated provides essential services to customers such -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -342,22 +343,22 @@ In addition to software, Federated provides essential services to customers such -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -377,12 +378,12 @@ In addition to software, Federated provides essential services to customers such -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -658,10 +659,12 @@ In addition to software, Federated provides essential services to customers such - + + + - + diff --git a/public/docs/software-catalog/federated-omnimedia/index.html b/public/docs/software-catalog/federated-omnimedia/index.html index 99ef273..fd9a17c 100644 --- a/public/docs/software-catalog/federated-omnimedia/index.html +++ b/public/docs/software-catalog/federated-omnimedia/index.html @@ -14,10 +14,9 @@ - + Federated Omnimedia | Federated Computer Enterprise - @@ -25,12 +24,12 @@ - - - - - - + + + + + + - + - + - + + + @@ -92,7 +92,8 @@ Federated Omnimedia provides ample opportunities for additional professional and - + + @@ -115,7 +116,7 @@ Federated Omnimedia provides ample opportunities for additional professional and
  • - + article Overview @@ -135,7 +136,7 @@ Federated Omnimedia provides ample opportunities for additional professional and -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -150,47 +151,47 @@ Federated Omnimedia provides ample opportunities for additional professional and -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -210,17 +211,17 @@ Federated Omnimedia provides ample opportunities for additional professional and -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -240,22 +241,22 @@ Federated Omnimedia provides ample opportunities for additional professional and -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -275,7 +276,7 @@ Federated Omnimedia provides ample opportunities for additional professional and -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -295,12 +296,12 @@ Federated Omnimedia provides ample opportunities for additional professional and -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -325,22 +326,22 @@ Federated Omnimedia provides ample opportunities for additional professional and -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -360,22 +361,22 @@ Federated Omnimedia provides ample opportunities for additional professional and -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -395,12 +396,12 @@ Federated Omnimedia provides ample opportunities for additional professional and -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -684,10 +685,12 @@ Federated Omnimedia provides ample opportunities for additional professional and - + + + - + diff --git a/public/docs/software-catalog/index.html b/public/docs/software-catalog/index.html index 5da4fce..6f587c8 100644 --- a/public/docs/software-catalog/index.html +++ b/public/docs/software-catalog/index.html @@ -14,10 +14,9 @@ - + Software Catalog | Federated Computer Enterprise - @@ -25,17 +24,17 @@ - - - - - - + + + + + + - - + + @@ -46,8 +45,9 @@ - - + + + @@ -68,7 +68,8 @@ - + + @@ -91,7 +92,7 @@
  • - + article Overview @@ -111,7 +112,7 @@ -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -126,52 +127,47 @@ -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • - - - - -
  • Why Open Source Projects Work With Federated
  • +
  • Core Desktop
  • @@ -184,24 +180,24 @@
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • + + + + +
  • Whitelabel
  • @@ -251,7 +252,7 @@ -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -271,12 +272,12 @@ -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -301,22 +302,22 @@ -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -336,22 +337,22 @@ -
  • Operators Networks Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -371,7 +372,12 @@ -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • + + + + +
  • Roadmap
  • @@ -554,7 +560,7 @@
    - +
    article @@ -571,7 +577,7 @@
    - +
    article @@ -588,7 +594,7 @@
    - +
    article @@ -605,7 +611,7 @@
    - +
    article @@ -674,10 +680,12 @@ - + + + - + @@ -1057,6 +1065,13 @@ + + + + + + + @@ -1112,8 +1127,8 @@ id: 4 , href: "\/docs\/federated-core-platform\/provisioning\/provisioner\/", title: "Provisioner", - description: "", - content: "" + description: "The “Provisioner” is responsible for setting up, updating/upgrading, and tearing down Cores. It does this in an entirely stateless way communicating with either the aacount management and billing system or the management system. Naturally, there are command-line utilities and an API available to accomplish all functions.\nOrder linkWhen and order comes through the account management and billing system, a manifest is created asking for a Core to be create with the required SaaS titles. This manifest is sent to the Provisioner which then requests a virtual machine (or machines, if the manifest includes load balancing or other extended Core services), then begins to build the Core software from the manifest. You can read more about the minimal build at ", + content: "The “Provisioner” is responsible for setting up, updating/upgrading, and tearing down Cores. It does this in an entirely stateless way communicating with either the aacount management and billing system or the management system. Naturally, there are command-line utilities and an API available to accomplish all functions.\nOrder linkWhen and order comes through the account management and billing system, a manifest is created asking for a Core to be create with the required SaaS titles. This manifest is sent to the Provisioner which then requests a virtual machine (or machines, if the manifest includes load balancing or other extended Core services), then begins to build the Core software from the manifest. You can read more about the minimal build at " } ); index.add( @@ -1121,8 +1136,8 @@ id: 5 , href: "\/docs\/federated-core-platform\/provisioning\/core-server\/", title: "Core Server", - description: "", - content: "" + description: "Federated maintains its own Linux distribution for the specific purpose of control of the types and versions of software used in virtual machine. This descrease the surface area for attacks, increased maintainability for the Cores built on top, and assures our systems work on X64 and Arm (example: Ampere) systems as well as fully supporting IPv4 and IPv6 for cloud deployment.\nCore Server is based on OpenMandriva a Linux distribution lead by Federated Computer’s chief systems engineer. OpenMandriva is base on Fedora, in part.\n", + content: "Federated maintains its own Linux distribution for the specific purpose of control of the types and versions of software used in virtual machine. This descrease the surface area for attacks, increased maintainability for the Cores built on top, and assures our systems work on X64 and Arm (example: Ampere) systems as well as fully supporting IPv4 and IPv6 for cloud deployment.\nCore Server is based on OpenMandriva a Linux distribution lead by Federated Computer’s chief systems engineer. OpenMandriva is base on Fedora, in part.\n" } ); index.add( @@ -1130,8 +1145,8 @@ id: 6 , href: "\/docs\/federated-core-platform\/provisioning\/core-mini\/", title: "Core Mini", - description: "", - content: "" + description: "Core Mini is the minimal install of software on a Core before adding additional SaaS and any scaling services (e.g. load balancing). These are the fundamental services used by ever other SaaS application.\nTraefik linkFirewall and network management.\nPowerDNS linkDomain name service.\nAuthelia linkOIDC authentication provider.\nMail Services linkSMTP and IMAP services.\nPostgresql linkDatabase engine for SaaS services requiring Postgresql.\nMariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely be obsolete in the coming months.\n", + content: "Core Mini is the minimal install of software on a Core before adding additional SaaS and any scaling services (e.g. load balancing). These are the fundamental services used by ever other SaaS application.\nTraefik linkFirewall and network management.\nPowerDNS linkDomain name service.\nAuthelia linkOIDC authentication provider.\nMail Services linkSMTP and IMAP services.\nPostgresql linkDatabase engine for SaaS services requiring Postgresql.\nMariaDB linkDatabase engine for SaaS services requiring MariaDB. The will likely be obsolete in the coming months.\nAutodiscovery linkService for providing autodiscovery for SaaS service that use autodiscovery services. Example: email and calendar client configuration.\nFederated Monitors linkSoftare for communicating with Federated management systems.\n" } ); index.add( @@ -1139,8 +1154,8 @@ id: 7 , href: "\/docs\/federated-core-platform\/provisioning\/unified-storage\/", title: "Unified Storage", - description: "", - content: "" + description: "Every SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage\nEvery SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage.\n", + content: "Every SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage\nEvery SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage.\n" } ); index.add( @@ -1148,8 +1163,8 @@ id: 8 , href: "\/docs\/federated-core-platform\/provisioning\/unified-messaging\/", title: "Unified Messaging", - description: "", - content: "" + description: "Federated Core includes three systems for messaging.\nEmail linkThere is a full-featured IMAP/SMTP service available for any needed notifications to users.\nContainer-to-Container linkThere is a service for container-to-container communication allowing for complete workflow creation between SaaS applications when the native APIs are not enough.\nOptional: Matrix linkIf the Matrix service is loaded, you can use it like a message-bus for application notification to users.\n", + content: "Federated Core includes three systems for messaging.\nEmail linkThere is a full-featured IMAP/SMTP service available for any needed notifications to users.\nContainer-to-Container linkThere is a service for container-to-container communication allowing for complete workflow creation between SaaS applications when the native APIs are not enough.\nOptional: Matrix linkIf the Matrix service is loaded, you can use it like a message-bus for application notification to users.\n" } ); index.add( @@ -1157,8 +1172,8 @@ id: 9 , href: "\/docs\/federated-core-platform\/provisioning\/authentication\/", title: "Authentication", - description: "", - content: "" + description: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\n", + content: "One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.\nLDAP linkThe foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn’t use LDAP, it doesn’t work on the platform. There are some applications for which the only account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden outside of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).\nLDAP services can be exposed to network outside of Core to be used by other systems that use LDAP. And example would be a collection of Windows, MacOS, Linux desktop computers where you want users to log in to this machines using their Core credentials from LDAP. You could also use Core LDAP for other software systems where you want to use a central user repository for access control such as virtual desktop environments.\nCore LDAP support users and groups. For example, you can delegate administrative access controls to certain users in Nextcloud using LDAP.\nLDAP is managed through the Federated Core app “Panel”.\nOIDC linkSingle-sign on is provided in Federated Core Platform by Authelia. This allows, for example, a customer to log in to one open source SaaS application in a browser and to automatically log in to other Core applications in the same browser. It also allows the user to log out of all applications, in the same way.\nFederated Core applications default to OIDC authentication when the application supports it. Most do. Some applications only support OIDC with a premium upgrade (also supported), but a few don’t (yet) support OIDC or only support authentication using OIDC providers such as Google, etc. Federated plans to provide work arounds for all applications to use OIDC and have done this successfully for some (eg. cal.com).\n" } ); index.add( @@ -1166,8 +1181,8 @@ id: 10 , href: "\/docs\/federated-core-platform\/provisioning\/dashboard\/", title: "Dashboard", - description: "", - content: "" + description: "Federated Dashboard is a simple launcher for users. It shows the applications available, a link to helpful documentation, and a note about user management. There are significant improvements planned for Dashboard in the coming months as it transitions to Federated ", + content: "Federated Dashboard is a simple launcher for users. It shows the applications available, a link to helpful documentation, and a note about user management. There are significant improvements planned for Dashboard in the coming months as it transitions to Federated " } ); index.add( @@ -1175,15 +1190,15 @@ id: 11 , href: "\/docs\/federated-core-platform\/provisioning\/computer\/", title: "Computer", - description: "", - content: "" + description: "Federated “Computer” is a new application coming in Fall, 2025 delivering a fully customizable front-end experience for Core users. It is a bookmarking application extended to support reminders, folders for watching applications, documents, events, the ability to pick up AI workloads and customizations, and more. Federated “Computer” is intended to be fully open-sourced, will work with other SaaS applications that support URLs, and will work natively on desktops, tablets, and mobile devices.\n", + content: "Federated “Computer” is a new application coming in Fall, 2025 delivering a fully customizable front-end experience for Core users. It is a bookmarking application extended to support reminders, folders for watching applications, documents, events, the ability to pick up AI workloads and customizations, and more. Federated “Computer” is intended to be fully open-sourced, will work with other SaaS applications that support URLs, and will work natively on desktops, tablets, and mobile devices.\n" } ); index.add( { id: 12 , - href: "\/docs\/federated-core-platform\/maintenance\/", - title: "Maintenance", + href: "\/docs\/federated-core-platform\/management\/", + title: "Management", description: "", content: "" } @@ -1191,28 +1206,28 @@ index.add( { id: 13 , - href: "\/docs\/federated-core-platform\/maintenance\/core-scanner\/", + href: "\/docs\/federated-core-platform\/management\/core-scanner\/", title: "Core Scanner", - description: "", - content: "" + description: "Core Scanner is a utility to examine and manage each Core on a given installation of Federated Core Platform. It allows a customer service person to examine the Core, look at all the configuration files, see any anomalies in the files, track usage of resources (CPU, RAM, storage, network), and perform tightly managed actions on the Core to take remedial steps as needed.\nEach installation of Core Scanner includes user and group priveleges so that the owner of the Federated Core Platform can look at all Cores running, but also partners can examine and manage the Cores of their customers. For example, a managed service provider may have a number of Cores for which they will want to be able to provide monitor and fix service3. Core Scanner allows them to see those Cores, only.\n", + content: "Core Scanner is a utility to examine and manage each Core on a given installation of Federated Core Platform. It allows a customer service person to examine the Core, look at all the configuration files, see any anomalies in the files, track usage of resources (CPU, RAM, storage, network), and perform tightly managed actions on the Core to take remedial steps as needed.\nEach installation of Core Scanner includes user and group priveleges so that the owner of the Federated Core Platform can look at all Cores running, but also partners can examine and manage the Cores of their customers. For example, a managed service provider may have a number of Cores for which they will want to be able to provide monitor and fix service3. Core Scanner allows them to see those Cores, only.\nCore Scanner provides the ability to “take action” on a Core with a large library of pre-defined “actions” for each Core depending on the applications installed and the reality of the Core at the time of inspection. If a Core needs more storage, for example, “actions” are brought forward suggesting remedial action to the support person. There are also actions available to compare a given Core to normative Cores.\nCore Scanner is supported by the “machine learning” functions in the " } ); index.add( { id: 14 , - href: "\/docs\/federated-core-platform\/maintenance\/update-and-upgrade\/", + href: "\/docs\/federated-core-platform\/management\/update-and-upgrade\/", title: "Update and Upgrade", - description: "", - content: "" + description: "Each Federated Core Platform installation has a Gitea respository where the software (OS, utilities, platform, open source SaaS) for the entire system is tracked. The operator of each installation is able to package those updates into regular upgrades pushed out to some/all Cores on the system, push them out individually for testing to some Cores, or schedule updates for a given list of Cores.\nSince the nature of the Federated Core Platform is delivering open source SaaS to customers, there needs to be a testing protocol set up to ensure updates are in fact needed/wanted. Federated Computer does this centrally, so operators using Federated Core Platform can know the software will “work”. However, there may be additional concerns with respect to security, other customizations that need to be tested, etc.\n", + content: "Each Federated Core Platform installation has a Gitea respository where the software (OS, utilities, platform, open source SaaS) for the entire system is tracked. The operator of each installation is able to package those updates into regular upgrades pushed out to some/all Cores on the system, push them out individually for testing to some Cores, or schedule updates for a given list of Cores.\nSince the nature of the Federated Core Platform is delivering open source SaaS to customers, there needs to be a testing protocol set up to ensure updates are in fact needed/wanted. Federated Computer does this centrally, so operators using Federated Core Platform can know the software will “work”. However, there may be additional concerns with respect to security, other customizations that need to be tested, etc.\nWhile Federated Core Platform draws much of the software from DockerHub, there are container images maintained by Federated Computer and, over time, more of the container images will come from Federated Computer rather than DockerHub. The principle reason for this is to add an additional step for quality and security.\n" } ); index.add( { id: 15 , - href: "\/docs\/federated-core-platform\/maintenance\/monitor-and-fix\/", + href: "\/docs\/federated-core-platform\/management\/monitor-and-fix\/", title: "Monitor and Fix", - description: "", - content: "" + description: "Every Core running on an installation of Federated Core Platform, every application running on every Core, and every service not an application running on every Core, is monitored in real time to ensure it runs, has the system resources needed, and provides customers with the best experience. If there are anomalies detected, alerts are created and can be sent to the local Matrix server, and Federated Monitor and Fix system attempts to solve the problem using patterns and the service definitions in place.\n", + content: "Every Core running on an installation of Federated Core Platform, every application running on every Core, and every service not an application running on every Core, is monitored in real time to ensure it runs, has the system resources needed, and provides customers with the best experience. If there are anomalies detected, alerts are created and can be sent to the local Matrix server, and Federated Monitor and Fix system attempts to solve the problem using patterns and the service definitions in place.\nFor example, if a customer with a 500GB storage limit for their Files service decides to upload 3TB of files, the File service will fail, and Monitor and Fix will attempt to fix the problem by adding for block storage (if that service is available AND the service definition allows that to happen without customer “approval”).\nThe Monitor and Fix system continues to get better and better as we see more patterns and improve the paths to successful amelioration of problems.\n" } ); index.add( @@ -1229,8 +1244,8 @@ id: 17 , href: "\/docs\/federated-core-platform\/customization\/core-workflow-intelligence\/", title: "Core Workflow Intelligence", - description: "", - content: "" + description: "Federated will be delivering in early 2026 an “on premise” solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.\n", + content: "Federated will be delivering in early 2026 an “on premise” solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.\nWe believe these sorts of “software intelligence” are very important for the overall success of customers using Federated Core and are central to the idea that open source is the best means to achieve maximum flexibility and business differentiation from software. Further, we believe AI is uniquely situated to provide real progress in connecting software to software for custom workflows. It need not work in “real time” but in enough time to deliver the right solution to customers reliably.\n" } ); index.add( @@ -1238,8 +1253,8 @@ id: 18 , href: "\/docs\/federated-core-platform\/customization\/adding-software-to-federated-core\/", title: "Adding Software to Federated Core", - description: "", - content: "" + description: "It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\n", + content: "It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.\nIn the near future, we plan to provide a portal for projects to package and submit software for inclusion on Federated Core Platform.\n" } ); index.add( @@ -1247,13 +1262,22 @@ id: 19 , href: "\/docs\/federated-core-platform\/customization\/why-open-source-projects-work-with-federated\/", title: "Why Open Source Projects Work With Federated", - description: "", - content: "" + description: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\n", + content: "More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.\nYou can think of an open source SaaS developer as an extension of your Federated Core Platform continually adding value to your overall go-to-market. These developers think in the same way. While their principle concern is the success and completeness of their software, they recognize the value for customers when their software is integrated into a total solution with great user management, unified storage and messaging, and the many other conveniences and services offered by Federated Core Platform.\nAll pricing for software is done outside of Federated Core Platform giving each installation the flexibility to build use cases and go-to-market solutions apart from the technology offerings.\n" } ); index.add( { id: 20 , + href: "\/docs\/federated-core-platform\/customization\/whitelabel\/", + title: "Whitelabel", + description: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n", + content: "Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the “home” website for information and ordering.\n" + } + ); + index.add( + { + id: 21 , href: "\/docs\/federated-core-platform\/billing\/", title: "Billing", description: "", @@ -1262,16 +1286,16 @@ ); index.add( { - id: 21 , + id: 22 , href: "\/docs\/federated-core-platform\/billing\/account-management-and-billing\/", title: "Account Management and Billing", - description: "", - content: "" + description: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n", + content: "Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.\nThe billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is not a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.\n" } ); index.add( { - id: 22 , + id: 23 , href: "\/docs\/federated-core-platform\/services\/", title: "Services", description: "", @@ -1280,38 +1304,29 @@ ); index.add( { - id: 23 , + id: 24 , href: "\/docs\/federated-core-platform\/services\/federated-management\/", title: "Federated Management", - description: "", - content: "" - } - ); - index.add( - { - id: 24 , - href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", - title: "Customer Service and Support", - description: "", - content: "" + description: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\n", + content: "Federated Computer can work to get your to market in the fastest and most convenient way for your organization.\nComplete Management linkWe can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform “just runs” and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).\nManagement to Train linkWe can also, depending on the level of competency of your current team, work to run the Federated Core Platform for you while training your team to take over at a date certain in the future. We have found this to be the most successl approach to training rather that working on the particulars of how to run Federated Core Platform in the abstract.\n" } ); index.add( { id: 25 , - href: "\/docs\/federated-core-platform\/provisioning\/core-desktop\/", - title: "Core Desktop", - description: "", - content: "" + href: "\/docs\/federated-core-platform\/services\/customer-service-and-support\/", + title: "Customer Service and Support", + description: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\n", + content: "Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.\nIn addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.\nEnd-user Businesses and Team linkFederated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.\nChannel Partners (Managed Service Providers) linkWe can also support your channel partners. In our experience, channel partners such as managed service providers are great ways to sell software and services but each requires significant support and explanation to best support their own customers. Federated Computer has extensive operation experience providing this service to partners and we can bring our experience, content, processes to your installation of Federated Core Platform.\nOther Operators linkIt isn’t unusual for Federated Core Platform to be sold to other “operators” who don’t want their own installation. We have done this for fiber companies, universities, and other large enterprises. Federated Computer can support your own go-to-market plans with support, content, and programs designed to find and close big opportunities such as other operators.\n" } ); index.add( { id: 26 , - href: "\/docs\/federated-core-platform\/provisioning\/why-open-source-projects-work-with-federated\/", - title: "Why Open Source Projects Work With Federated", - description: "", - content: "" + href: "\/docs\/federated-core-platform\/provisioning\/core-desktop\/", + title: "Core Desktop", + description: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\n", + content: "Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the “correct” software and services so that it “just works”.\nCore Desktop can also be installed on laptops and other mobile computers so that on-the-go team members can get a computer that “just works” without the requirements for network access.\n" } ); index.add( @@ -1372,9 +1387,9 @@ { id: 33 , href: "\/docs\/partners\/operators-networks-platforms\/", - title: "Operators Networks Platforms", - description: "Text\n", - content: "Text\n" + title: "Operators, Networks, Platforms", + description: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\n", + content: "Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.\nThe typical engagement with Federated Computer starts with some scoping sessions so that we can help you think through your product offering, your go-to-market, and how we will enable you to best support customers.\nAt the end of the day, the mission of Federated Computer is to provide you with the right tools, software, services allowing you to open up new monetization avenues within your existing hardware, datacenters, network pipes, sunk costs infrastructures, existing user bases.\n" } ); index.add( @@ -1382,8 +1397,8 @@ id: 34 , href: "\/docs\/partners\/managed-service-providers\/", title: "Managed Service Provider", - description: "", - content: "" + description: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n", + content: "Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.\nThis leaves MORE money on the table for the managed service provider to provide high-value services.\nSolutions linkFederated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.\n" } ); index.add( @@ -1391,8 +1406,8 @@ id: 35 , href: "\/docs\/partners\/pro-customers\/", title: "Pro Customers", - description: "", - content: "" + description: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n", + content: "Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are Commerce and Omnimedia.\nIt is possible to address “pro” customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.\nHowever, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don’t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.\n" } ); index.add( @@ -1400,8 +1415,8 @@ id: 36 , href: "\/docs\/partners\/on-line-affiliates\/", title: "On Line Affiliates", - description: "", - content: "" + description: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n", + content: "Outlets with significant communities can use Federated’s affilaite programs to earn up to 30% (the number is really dependent on your own installation’s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.\nWe have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate’s community is sterling.\n" } ); index.add( @@ -1418,13 +1433,22 @@ id: 38 , href: "\/docs\/about-federated-computer\/federated-company-backgrounder\/", title: "Federated Company Backgrounder", - description: "", - content: "" + description: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\n", + content: "Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, “free,” and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.\nTeam linkWe are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don’t suck away all our money, data, and sovereignty. We are FedQ’d in Colorado Springs, Colorado, USA with colleagues around the globe.\nOpen Source linkThere’s no reason to use expensive, proprietary, privacy-destroying SaaS software. But in the past, running open-source software required lots of technical knowledge. Federated Computer makes it easy for any business to adopt open-source.\nWe are great stewards of the benefits of open-source. Our company actively contributes both financially and with code to a number of open-source projects offered in Federated Core and Federated Plus including Castopod, Bookstack, Headscale, Matrix, and OpenMandriva. We do all the work for you to ensure open-source projects are integrated, work well together, and provide you with the right value.\nDavid Young linkOur CEO and founder, David Young, has a long history working with impactful startups including Joyent. At Joyent he was responsible for leading the team that invented and patented cloud computing, containers-as-a-service, cloud operating system, infrastructure-as-a-service, node.js, native-web-apps as desktop/mobile apps (what became Electron) and many more fundamental cloud innovations.\nDavid’s companies have been backed by the biggest investors including Dell, Intel; and he has brought ground-breaking solutions to cloud pioneers such as Dell, Telefonica, Singtel, working for important early cloud adopters such as Twitter, Facebook Developer Platform, Linkedin, and many, many others.\n" } ); index.add( { id: 39 , + href: "\/docs\/about-federated-computer\/roadmap\/", + title: "Roadmap", + description: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n", + content: "Federated Computer is working on the following initiatives for the benefit of our customers and partners:\nFall, 2025 linkComputer. Our take on a central web application for managing all SaaS workloads, dates, clients, messages.\nFirst Half, 2026 linkCore Workflow Intelligence. AI services for building application workflows combined between 2 or more open source SaaS applications.\nSecond Half, 2026 linkOn Premise Provisioning of Federated Cores. This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.\n" + } + ); + index.add( + { + id: 40 , href: "\/docs\/", title: "Docs", description: "", diff --git a/public/docs/software-catalog/index.xml b/public/docs/software-catalog/index.xml index e96a43f..a10966f 100644 --- a/public/docs/software-catalog/index.xml +++ b/public/docs/software-catalog/index.xml @@ -2,38 +2,38 @@ Software Catalog on Federated Computer Enterprise - http://localhost:1313/docs/software-catalog/ + http://enterprise.federated.computer/docs/software-catalog/ Recent content in Software Catalog on Federated Computer Enterprise Hugo en-us Mon, 25 Aug 2025 12:39:33 -0600 - + Software Catalog - http://localhost:1313/docs/software-catalog/software-catalog/ + http://enterprise.federated.computer/docs/software-catalog/software-catalog/ Mon, 25 Aug 2025 12:39:33 -0600 - http://localhost:1313/docs/software-catalog/software-catalog/ + http://enterprise.federated.computer/docs/software-catalog/software-catalog/ <p>Federated offers a wide range of open source SaaS software. These can be provisioned individually or as part of a bundle. Provisions can happen on the same machine or virtual machine or on separate virtual machines for the sake of vertical scaling. Load balancers can also be applied for the SaaS applications that require it for horizontal scaling.</p> <p>This catalog describes the software offerings available to customers at <a href="https://www.federated.computer/" rel="external" target="_blank">https://www.federated.computer<svg width="16" height="16" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M14 5c-.552 0-1-.448-1-1s.448-1 1-1h6c.552 0 1 .448 1 1v6c0 .552-.448 1-1 1s-1-.448-1-1v-3.586l-7.293 7.293c-.391.39-1.024.39-1.414 0-.391-.391-.391-1.024 0-1.414l7.293-7.293h-3.586zm-9 2c-.552 0-1 .448-1 1v11c0 .552.448 1 1 1h11c.552 0 1-.448 1-1v-4.563c0-.552.448-1 1-1s1 .448 1 1v4.563c0 1.657-1.343 3-3 3h-11c-1.657 0-3-1.343-3-3v-11c0-1.657 1.343-3 3-3h4.563c.552 0 1 .448 1 1s-.448 1-1 1h-4.563z"/></svg></a> today. For go-to-market reasons, we offer a reduced sub-set of this catalog based on Federated Computer’s own website but all titles can be provisioned for customers as-needed.</p> Bundles - http://localhost:1313/docs/software-catalog/bundles/ + http://enterprise.federated.computer/docs/software-catalog/bundles/ Mon, 25 Aug 2025 12:39:03 -0600 - http://localhost:1313/docs/software-catalog/bundles/ - <p>Bundles are great ways to package software for use by a type of business, a size of business, or a job function, among many other go-to-market motivations for bundling software.</p> <p>The Federated Core <a href="http://localhost:1313/docs/federated-core-platform/provisioner.md">Provisioner</a> can spin up Federated Cores based on a software manifest that can be created &ldquo;just in time&rdquo; or based on a predefined collection of software and virtual machine. This allows you to fully manage the the expects margins for a sale.</p> + http://enterprise.federated.computer/docs/software-catalog/bundles/ + <p>Bundles are great ways to package software for use by a type of business, a size of business, or a job function, among many other go-to-market motivations for bundling software.</p> <p>The Federated Core <a href="http://enterprise.federated.computer/docs/federated-core-platform/provisioner.md">Provisioner</a> can spin up Federated Cores based on a software manifest that can be created &ldquo;just in time&rdquo; or based on a predefined collection of software and virtual machine. This allows you to fully manage the the expects margins for a sale.</p> Federated Commerce - http://localhost:1313/docs/software-catalog/federated-commerce/ + http://enterprise.federated.computer/docs/software-catalog/federated-commerce/ Mon, 25 Aug 2025 12:39:14 -0600 - http://localhost:1313/docs/software-catalog/federated-commerce/ + http://enterprise.federated.computer/docs/software-catalog/federated-commerce/ <p>Federated Commerce is a bundle designed by Federated Computer for customers wanting to sell goods on the internet.</p> <p>Federated Commerce delivers &ldquo;unbreakable&rdquo; Wordpress and WooCommerce add-ons to the Federated Core &ldquo;Best&rdquo; bundle (including video conferencing, mailing list, etc) all on <em>dedicated</em> cpu virtual machines.</p> <p>In addition to software, Federated provides essential services to customers such as product imports and updates using Federated Eversync, three hour response and resolution times for issues, proviate channels for talking to support, Wordpress theme and Listmonk template support, shopping ads consultations, and a dedicated account manager.</p> Federated Omnimedia - http://localhost:1313/docs/software-catalog/federated-omnimedia/ + http://enterprise.federated.computer/docs/software-catalog/federated-omnimedia/ Mon, 25 Aug 2025 12:39:23 -0600 - http://localhost:1313/docs/software-catalog/federated-omnimedia/ + http://enterprise.federated.computer/docs/software-catalog/federated-omnimedia/ <p>Federated Omnimedia is a comprehensive bundle offered by Federated Computer to customers. It demonstrates what is possible.</p> <p>Federated Omnimedia is a complete offering for those with large digital communities. Examples are publishers, video channels, podcast channels, communities of interest.</p> <p>The purpose of Federated Omnimedia is to give these sorts of customers access to every sort of tool required to successfully monetize the community. It includes:</p> <ol> <li>Wordpress or Ghost for publishing;</li> <li>WooCommerce for eCommerce;</li> <li>Discourse for community discussion, a forum;</li> <li>Podcasting and videocasting platforms;</li> <li>Ad server to sell and display static and dynamic across all properties;</li> <li>Premium content service to &ldquo;rope off&rdquo; parts of content (posts, forums, podcasts, videos) only for premium subscribers.</li> </ol> <p>Federated Omnimedia provides ample opportunities for additional professional and technical service delivery to the customer.</p> diff --git a/public/docs/software-catalog/software-catalog/index.html b/public/docs/software-catalog/software-catalog/index.html index 209ce2c..cd21ff4 100644 --- a/public/docs/software-catalog/software-catalog/index.html +++ b/public/docs/software-catalog/software-catalog/index.html @@ -14,10 +14,9 @@ - + Software Catalog | Federated Computer Enterprise - @@ -25,20 +24,20 @@ - - - - - - + + + + + + - + - + @@ -50,8 +49,9 @@ This catalog describes the software offerings available to customers at https:// - - + + + @@ -72,7 +72,8 @@ This catalog describes the software offerings available to customers at https:// - + + @@ -95,7 +96,7 @@ This catalog describes the software offerings available to customers at https://
  • - + article Overview @@ -115,7 +116,7 @@ This catalog describes the software offerings available to customers at https:// -
  • Federated Core Platform
  • +
  • Federated Core Platform
  • @@ -130,47 +131,47 @@ This catalog describes the software offerings available to customers at https:// -
  • Provisioner
  • +
  • Provisioner
  • -
  • Core Server
  • +
  • Core Server
  • -
  • Core Mini
  • +
  • Core Mini
  • -
  • Unified Storage
  • +
  • Unified Storage
  • -
  • Unified Messaging
  • +
  • Unified Messaging
  • -
  • Authentication
  • +
  • Authentication
  • -
  • Dashboard
  • +
  • Dashboard
  • -
  • Computer
  • +
  • Computer
  • -
  • Core Desktop
  • +
  • Core Desktop
  • @@ -190,17 +191,17 @@ This catalog describes the software offerings available to customers at https:// -
  • Core Scanner
  • +
  • Core Scanner
  • -
  • Update and Upgrade
  • +
  • Update and Upgrade
  • -
  • Monitor and Fix
  • +
  • Monitor and Fix
  • @@ -220,22 +221,22 @@ This catalog describes the software offerings available to customers at https:// -
  • Core Workflow Intelligence
  • +
  • Core Workflow Intelligence
  • -
  • Adding Software to Federated Core
  • +
  • Adding Software to Federated Core
  • -
  • Why Open Source Projects Work With Federated
  • +
  • Why Open Source Projects Work With Federated
  • -
  • Whitelabel
  • +
  • Whitelabel
  • @@ -255,7 +256,7 @@ This catalog describes the software offerings available to customers at https:// -
  • Account Management and Billing
  • +
  • Account Management and Billing
  • @@ -275,12 +276,12 @@ This catalog describes the software offerings available to customers at https:// -
  • Federated Management
  • +
  • Federated Management
  • -
  • Customer Service and Support
  • +
  • Customer Service and Support
  • @@ -305,22 +306,22 @@ This catalog describes the software offerings available to customers at https:// -
  • Software Catalog
  • +
  • Software Catalog
  • -
  • Bundles
  • +
  • Bundles
  • -
  • Federated Commerce
  • +
  • Federated Commerce
  • -
  • Federated Omnimedia
  • +
  • Federated Omnimedia
  • @@ -340,22 +341,22 @@ This catalog describes the software offerings available to customers at https:// -
  • Operators, Networks, Platforms
  • +
  • Operators, Networks, Platforms
  • -
  • Managed Service Provider
  • +
  • Managed Service Provider
  • -
  • Pro Customers
  • +
  • Pro Customers
  • -
  • On Line Affiliates
  • +
  • On Line Affiliates
  • @@ -375,12 +376,12 @@ This catalog describes the software offerings available to customers at https:// -
  • Federated Company Backgrounder
  • +
  • Federated Company Backgrounder
  • -
  • Roadmap
  • +
  • Roadmap
  • @@ -793,10 +794,12 @@ This catalog describes the software offerings available to customers at https:// - + + + - + diff --git a/public/documentation/about-federated-computer/index.xml b/public/documentation/about-federated-computer/index.xml deleted file mode 100644 index e34aa1d..0000000 --- a/public/documentation/about-federated-computer/index.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - About Federated Computer on Federated Computer Enterprise - http://localhost:44247/documentation/about-federated-computer/ - Recent content in About Federated Computer on Federated Computer Enterprise - Hugo - en-us - Mon, 25 Aug 2025 12:40:08 -0600 - - - Federated Company Backgrounder - http://localhost:44247/documentation/about-federated-computer/federated-company-backgrounder/ - Mon, 25 Aug 2025 12:40:08 -0600 - http://localhost:44247/documentation/about-federated-computer/federated-company-backgrounder/ - - - - diff --git a/public/documentation/federated-core-platform/index.xml b/public/documentation/federated-core-platform/index.xml deleted file mode 100644 index 197cfe3..0000000 --- a/public/documentation/federated-core-platform/index.xml +++ /dev/null @@ -1,131 +0,0 @@ - - - - Federated Core Platform on Federated Computer Enterprise - http://localhost:44247/documentation/federated-core-platform/ - Recent content in Federated Core Platform on Federated Computer Enterprise - Hugo - en-us - Mon, 25 Aug 2025 12:36:40 -0600 - - - Why Open Source Projects Work With Federated - http://localhost:44247/documentation/federated-core-platform/why-open-source-projects-work-with-federated/ - Mon, 25 Aug 2025 12:36:40 -0600 - http://localhost:44247/documentation/federated-core-platform/why-open-source-projects-work-with-federated/ - - - - Update and Upgrade - http://localhost:44247/documentation/federated-core-platform/update-and-upgrade/ - Mon, 25 Aug 2025 12:36:19 -0600 - http://localhost:44247/documentation/federated-core-platform/update-and-upgrade/ - - - - Unified Storage - http://localhost:44247/documentation/federated-core-platform/unified-storage/ - Mon, 25 Aug 2025 12:36:10 -0600 - http://localhost:44247/documentation/federated-core-platform/unified-storage/ - - - - Unified Messaging - http://localhost:44247/documentation/federated-core-platform/unified-messaging/ - Mon, 25 Aug 2025 12:36:03 -0600 - http://localhost:44247/documentation/federated-core-platform/unified-messaging/ - - - - Provisioner - http://localhost:44247/documentation/federated-core-platform/provisioner/ - Mon, 25 Aug 2025 12:35:51 -0600 - http://localhost:44247/documentation/federated-core-platform/provisioner/ - - - - Monitor and Fix - http://localhost:44247/documentation/federated-core-platform/monitor-and-fix/ - Mon, 25 Aug 2025 12:35:43 -0600 - http://localhost:44247/documentation/federated-core-platform/monitor-and-fix/ - - - - Adding Software to Federated Core - http://localhost:44247/documentation/federated-core-platform/adding-software-to-federated-core/ - Mon, 25 Aug 2025 12:35:31 -0600 - http://localhost:44247/documentation/federated-core-platform/adding-software-to-federated-core/ - - - - Federated Management - http://localhost:44247/documentation/federated-core-platform/federated-management/ - Mon, 25 Aug 2025 12:35:12 -0600 - http://localhost:44247/documentation/federated-core-platform/federated-management/ - - - - Core Workflow Intelligence - http://localhost:44247/documentation/federated-core-platform/core-workflow-intelligence/ - Mon, 25 Aug 2025 12:34:45 -0600 - http://localhost:44247/documentation/federated-core-platform/core-workflow-intelligence/ - - - - Core Server - http://localhost:44247/documentation/federated-core-platform/core-server/ - Mon, 25 Aug 2025 12:34:34 -0600 - http://localhost:44247/documentation/federated-core-platform/core-server/ - - - - Core Scanner - http://localhost:44247/documentation/federated-core-platform/core-scanner/ - Mon, 25 Aug 2025 12:34:24 -0600 - http://localhost:44247/documentation/federated-core-platform/core-scanner/ - - - - Core Mini - http://localhost:44247/documentation/federated-core-platform/core-mini/ - Mon, 25 Aug 2025 12:34:18 -0600 - http://localhost:44247/documentation/federated-core-platform/core-mini/ - - - - Core Desktop - http://localhost:44247/documentation/federated-core-platform/core-desktop/ - Mon, 25 Aug 2025 12:34:05 -0600 - http://localhost:44247/documentation/federated-core-platform/core-desktop/ - - - - Computer - http://localhost:44247/documentation/federated-core-platform/computer/ - Mon, 25 Aug 2025 12:33:56 -0600 - http://localhost:44247/documentation/federated-core-platform/computer/ - - - - Authentication - http://localhost:44247/documentation/federated-core-platform/authentication/ - Mon, 25 Aug 2025 12:33:49 -0600 - http://localhost:44247/documentation/federated-core-platform/authentication/ - - - - Account Management_and Billing - http://localhost:44247/documentation/federated-core-platform/account-management_and-billing/ - Mon, 25 Aug 2025 12:33:38 -0600 - http://localhost:44247/documentation/federated-core-platform/account-management_and-billing/ - - - - Federated Core Platform - http://localhost:44247/documentation/federated-core-platform/federated-core-platform/ - Mon, 25 Aug 2025 12:32:20 -0600 - http://localhost:44247/documentation/federated-core-platform/federated-core-platform/ - - - - diff --git a/public/documentation/index.xml b/public/documentation/index.xml deleted file mode 100644 index abede57..0000000 --- a/public/documentation/index.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - Documentations on Federated Computer Enterprise - http://localhost:44247/documentation/ - Recent content in Documentations on Federated Computer Enterprise - Hugo - en-us - Mon, 25 Aug 2025 12:25:51 -0600 - - - Overview - http://localhost:44247/documentation/overview/ - Mon, 25 Aug 2025 12:25:51 -0600 - http://localhost:44247/documentation/overview/ - <p>We&rsquo;ve made this portal so you can learn about all the Federated Computer enterprise offerings.</p> <p>Federated Computer crafts offerings and programs from the best open source software for operators and networks, managed service providers, &ldquo;pro&rdquo; customer partners, and partners just getting started through Federated&rsquo;s on-line affiliate programs.</p> <h2 id="operators-and-networks">Operators and Networks</h2> <p>More and more, hosting company operators and networks are looking for ways to enhance the value of their physical offerings such as data centers, network pipes, hosting racks with enhanced, high-value software and services. Federated Computer works to solve key software and operational needs for these partners with our Federated Cloud Platform that does everything required to offer any sort of customer, from the small team or business, from the mid-market to large enterprise and government customer, even the family, the best open source solutions for industry-leading prices.</p> - - - diff --git a/public/documentation/partners/index.xml b/public/documentation/partners/index.xml deleted file mode 100644 index 15c9d75..0000000 --- a/public/documentation/partners/index.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - Partners on Federated Computer Enterprise - http://localhost:44247/documentation/partners/ - Recent content in Partners on Federated Computer Enterprise - Hugo - en-us - Mon, 25 Aug 2025 12:38:19 -0600 - - - Operators Networks Platforms - http://localhost:44247/documentation/partners/operators-networks-platforms/ - Mon, 25 Aug 2025 12:38:19 -0600 - http://localhost:44247/documentation/partners/operators-networks-platforms/ - - - - On Line Affiliates - http://localhost:44247/documentation/partners/on-line-affiliates/ - Mon, 25 Aug 2025 12:38:06 -0600 - http://localhost:44247/documentation/partners/on-line-affiliates/ - - - - Managed Service Provider - http://localhost:44247/documentation/partners/managed-service-provider/ - Mon, 25 Aug 2025 12:37:54 -0600 - http://localhost:44247/documentation/partners/managed-service-provider/ - - - - diff --git a/public/documentation/software-catalog/index.xml b/public/documentation/software-catalog/index.xml deleted file mode 100644 index aa01857..0000000 --- a/public/documentation/software-catalog/index.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - Software Catalog on Federated Computer Enterprise - http://localhost:44247/documentation/software-catalog/ - Recent content in Software Catalog on Federated Computer Enterprise - Hugo - en-us - Mon, 25 Aug 2025 12:39:33 -0600 - - - Software Catalog - http://localhost:44247/documentation/software-catalog/software-catalog/ - Mon, 25 Aug 2025 12:39:33 -0600 - http://localhost:44247/documentation/software-catalog/software-catalog/ - - - - Federated Omnimedia - http://localhost:44247/documentation/software-catalog/federated-omnimedia/ - Mon, 25 Aug 2025 12:39:23 -0600 - http://localhost:44247/documentation/software-catalog/federated-omnimedia/ - - - - Federated Commerce - http://localhost:44247/documentation/software-catalog/federated-commerce/ - Mon, 25 Aug 2025 12:39:14 -0600 - http://localhost:44247/documentation/software-catalog/federated-commerce/ - - - - Bundles - http://localhost:44247/documentation/software-catalog/bundles/ - Mon, 25 Aug 2025 12:39:03 -0600 - http://localhost:44247/documentation/software-catalog/bundles/ - - - - diff --git a/public/images/lotus_docs_screenshot_hu_96a4be244a204161.webp b/public/images/lotus_docs_screenshot_hu_96a4be244a204161.webp deleted file mode 100644 index cb2c4554a4a6062424671ffd2a275760854a5768..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53046 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 z 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 diff --git a/public/images/screenshots/lotusdocs_dark_v0.8.webp b/public/images/screenshots/lotusdocs_dark_v0.8.webp deleted file mode 100644 index d59570efc32d52aa96ebe54ff1c786993937abf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48742 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 OQ)qvn%G84~p#C2gyxpPz diff --git a/public/images/screenshots/lotusdocs_light_v0.8.webp b/public/images/screenshots/lotusdocs_light_v0.8.webp deleted file mode 100644 index 3d0675873df153b7726801afa4894b324bdefec7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49246 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 - + Federated Computer Enterprise - @@ -46,12 +45,12 @@ - - - - - - + + + + + + @@ -71,7 +70,7 @@ - + @@ -79,7 +78,10 @@ - + + + + @@ -509,7 +511,7 @@ - + diff --git a/public/index.xml b/public/index.xml index a332cb1..d4927e3 100644 --- a/public/index.xml +++ b/public/index.xml @@ -2,227 +2,227 @@ Federated Computer Enterprise - http://localhost:1313/ + http://enterprise.federated.computer/ Recent content on Federated Computer Enterprise Hugo en-us Thu, 28 Aug 2025 13:41:48 -0600 - + Overview - http://localhost:1313/docs/overview/ + http://enterprise.federated.computer/docs/overview/ Mon, 25 Aug 2025 12:25:51 -0600 - http://localhost:1313/docs/overview/ - <p>We&rsquo;ve made this portal so you can learn about Federated Computer enterprise offerings.</p> <h2 id="federated-core-platform">Federated Core Platform <a href="#federated-core-platform" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h2><p><a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://localhost:1313/docs/federated-core-platform/federated-core-platform/'><p>FEDERATED CORE PLATFORM</p><strong>Federated Core Platform</strong><br></a>" data-bs-toggle="tooltip" href="http://localhost:1313/docs/federated-core-platform/federated-core-platform/">Federated Core Platform</a> delivers offerings and services based on the best open source software useful to businesses, teams, individuals looking for breaktrhough price, privacy, flexiblity and value from SaaS software. The <a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://localhost:1313/docs/federated-core-platform/federated-core-platform/'><p>FEDERATED CORE PLATFORM</p><strong>Federated Core Platform</strong><br></a>" data-bs-toggle="tooltip" href="http://localhost:1313/docs/federated-core-platform/federated-core-platform/">Federated Core Platfrom</a> enables operators and networks, managed service providers, &ldquo;pro&rdquo; customer partners, and on-line affiliates to deliver great software and services to their customers.</p> + http://enterprise.federated.computer/docs/overview/ + <p>We&rsquo;ve made this portal so you can learn about Federated Computer enterprise offerings.</p> <h2 id="federated-core-platform">Federated Core Platform <a href="#federated-core-platform" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h2><p><a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://enterprise.federated.computer/docs/federated-core-platform/federated-core-platform/'><p>FEDERATED CORE PLATFORM</p><strong>Federated Core Platform</strong><br></a>" data-bs-toggle="tooltip" href="http://enterprise.federated.computer/docs/federated-core-platform/federated-core-platform/">Federated Core Platform</a> delivers offerings and services based on the best open source software useful to businesses, teams, individuals looking for breaktrhough price, privacy, flexiblity and value from SaaS software. The <a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://enterprise.federated.computer/docs/federated-core-platform/federated-core-platform/'><p>FEDERATED CORE PLATFORM</p><strong>Federated Core Platform</strong><br></a>" data-bs-toggle="tooltip" href="http://enterprise.federated.computer/docs/federated-core-platform/federated-core-platform/">Federated Core Platfrom</a> enables operators and networks, managed service providers, &ldquo;pro&rdquo; customer partners, and on-line affiliates to deliver great software and services to their customers.</p> Federated Core Platform - http://localhost:1313/docs/federated-core-platform/federated-core-platform/ + http://enterprise.federated.computer/docs/federated-core-platform/federated-core-platform/ Mon, 25 Aug 2025 12:32:20 -0600 - http://localhost:1313/docs/federated-core-platform/federated-core-platform/ + http://enterprise.federated.computer/docs/federated-core-platform/federated-core-platform/ <p>The Federated Core Platform is a suite of software providing everything needed to deliver open source SaaS applications: integrate them to work well together; manage, patch, update the software; and provide bespoke customer service for customers.</p> <p>The main component groups of Federated Core Platform are:</p> <h3 id="provisioning">Provisioning <a href="#provisioning" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><ol> <li><strong>Provisioner:</strong> interacts with cloud platform (eg Hetzner, Cloud Stack, OpenStack, Triton) to spin up virtual machine and install software and network;</li> <li><strong>Core Server:</strong> Federated Linux distribution for X64 and ARM virtual machines;</li> <li><strong>Core Mini:</strong> The minimal amount of software that must always be installed for a Core;</li> <li><strong>Unified Storage:</strong> architecture for shared storage between Core docker images;</li> <li><strong>Unified Messaging:</strong> email infrastructure for all docker images including autodiscover services;</li> <li><strong>Authentication:</strong> OIDC provider;</li> <li><strong>Dashboard:</strong> user creation, domain and application preferences;</li> <li><strong>Computer:</strong> end-user application for managing software links and workflows.</li> </ol> <h3 id="maintenance">Maintenance <a href="#maintenance" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><ol> <li><strong>CoreScanner:</strong> customer support application for monitoring and locked-down actions on customer infrastructure;</li> <li><strong>Update and Upgrade:</strong> system for discovering new software versions and pushing to customers;</li> <li><strong>Monitor and Fix:</strong> machine-learning to identify and solve operational issues based on customer support patterns.</li> </ol> <h3 id="customization">Customization <a href="#customization" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><ol> <li><strong>Core Workflow Intelligence:</strong> AI-driven workflows between SaaS applications;</li> <li><strong>Adding Software to Federated Core:</strong> how to add SaaS applications to Federated Core Platform;</li> <li><strong>Why Open Source Projects Work With Federated:</strong> the benefits of Federated Core Platform for open source SaaS projects.</li> </ol> <h3 id="billing">Billing <a href="#billing" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><ol> <li><strong>Account Management and Billing:</strong> tracking what is used and billed.</li> </ol> <h3 id="services">Services <a href="#services" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><ol> <li><strong>Federated Management:</strong> let Federated Computer run your cloud for or alongside your team;</li> <li><strong>Customer Service and Support:</strong> let Federated Computer provide 24/7 customer support for or alongside your team.</li> </ol> <p>(Note: you can learn more about these components by selecting the documentation in the left navigation.)</p> Provisioner - http://localhost:1313/docs/federated-core-platform/provisioning/provisioner/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/provisioner/ Mon, 25 Aug 2025 12:35:51 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/provisioner/ - <p>The &ldquo;Provisioner&rdquo; is responsible for setting up, updating/upgrading, and tearing down Cores. It does this in an entirely stateless way communicating with either the aacount management and billing system or the management system. Naturally, there are command-line utilities and an API available to accomplish all functions.</p> <h3 id="order">Order <a href="#order" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>When and order comes through the account management and billing system, a manifest is created asking for a Core to be create with the required SaaS titles. This <em>manifest</em> is sent to the Provisioner which then requests a virtual machine (or machines, if the manifest includes load balancing or other extended Core services), then begins to build the Core software from the manifest. You can read more about the minimal build at <a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://localhost:1313/docs/federated-core-platform/provisioning/core-mini/'><p>PROVISIONING</p> + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/provisioner/ + <p>The &ldquo;Provisioner&rdquo; is responsible for setting up, updating/upgrading, and tearing down Cores. It does this in an entirely stateless way communicating with either the aacount management and billing system or the management system. Naturally, there are command-line utilities and an API available to accomplish all functions.</p> <h3 id="order">Order <a href="#order" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>When and order comes through the account management and billing system, a manifest is created asking for a Core to be create with the required SaaS titles. This <em>manifest</em> is sent to the Provisioner which then requests a virtual machine (or machines, if the manifest includes load balancing or other extended Core services), then begins to build the Core software from the manifest. You can read more about the minimal build at <a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://enterprise.federated.computer/docs/federated-core-platform/provisioning/core-mini/'><p>PROVISIONING</p> Core Server - http://localhost:1313/docs/federated-core-platform/provisioning/core-server/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/core-server/ Mon, 25 Aug 2025 12:34:34 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/core-server/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/core-server/ <p>Federated maintains its own Linux distribution for the specific purpose of control of the types and versions of software used in virtual machine. This descrease the surface area for attacks, increased maintainability for the Cores built on top, and assures our systems work on X64 and Arm (example: Ampere) systems as well as fully supporting IPv4 and IPv6 for cloud deployment.</p> <p>Core Server is based on <a href="https://www.openmandriva.org" rel="external" target="_blank">OpenMandriva<svg width="16" height="16" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M14 5c-.552 0-1-.448-1-1s.448-1 1-1h6c.552 0 1 .448 1 1v6c0 .552-.448 1-1 1s-1-.448-1-1v-3.586l-7.293 7.293c-.391.39-1.024.39-1.414 0-.391-.391-.391-1.024 0-1.414l7.293-7.293h-3.586zm-9 2c-.552 0-1 .448-1 1v11c0 .552.448 1 1 1h11c.552 0 1-.448 1-1v-4.563c0-.552.448-1 1-1s1 .448 1 1v4.563c0 1.657-1.343 3-3 3h-11c-1.657 0-3-1.343-3-3v-11c0-1.657 1.343-3 3-3h4.563c.552 0 1 .448 1 1s-.448 1-1 1h-4.563z"/></svg></a> a Linux distribution lead by Federated Computer&rsquo;s chief systems engineer. OpenMandriva is base on Fedora, in part.</p> Core Mini - http://localhost:1313/docs/federated-core-platform/provisioning/core-mini/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/core-mini/ Mon, 25 Aug 2025 12:34:18 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/core-mini/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/core-mini/ <p>Core Mini is the minimal install of software on a Core before adding additional SaaS and any scaling services (e.g. load balancing). These are the fundamental services used by ever other SaaS application.</p> <h3 id="traefik">Traefik <a href="#traefik" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>Firewall and network management.</p> <h3 id="powerdns">PowerDNS <a href="#powerdns" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>Domain name service.</p> <h3 id="authelia">Authelia <a href="#authelia" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>OIDC authentication provider.</p> <h3 id="mail-services">Mail Services <a href="#mail-services" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>SMTP and IMAP services.</p> <h3 id="postgresql">Postgresql <a href="#postgresql" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>Database engine for SaaS services requiring Postgresql.</p> <h3 id="mariadb">MariaDB <a href="#mariadb" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>Database engine for SaaS services requiring MariaDB. The will likely be obsolete in the coming months.</p> Unified Storage - http://localhost:1313/docs/federated-core-platform/provisioning/unified-storage/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/unified-storage/ Mon, 25 Aug 2025 12:36:10 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/unified-storage/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/unified-storage/ <p>Every SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage</p> <p>Every SaaS software deployed to a Federated Core using a single expandable storage service. This is a BTRFS file system on the Core but can be deployed as block storage (if the cloud provides such a service). It can be expanded and contracted based on customer demand/usage.</p> Unified Messaging - http://localhost:1313/docs/federated-core-platform/provisioning/unified-messaging/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/unified-messaging/ Mon, 25 Aug 2025 12:36:03 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/unified-messaging/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/unified-messaging/ <p>Federated Core includes three systems for messaging.</p> <h3 id="email">Email <a href="#email" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>There is a full-featured IMAP/SMTP service available for any needed notifications to users.</p> <h3 id="container-to-container">Container-to-Container <a href="#container-to-container" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>There is a service for container-to-container communication allowing for complete workflow creation between SaaS applications when the native APIs are not enough.</p> <h3 id="optional-matrix">Optional: Matrix <a href="#optional-matrix" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>If the Matrix service is loaded, you can use it like a message-bus for application notification to users.</p> Authentication - http://localhost:1313/docs/federated-core-platform/provisioning/authentication/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/authentication/ Mon, 25 Aug 2025 12:33:49 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/authentication/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/authentication/ <p>One of the obstacles to deploying open source SaaS is user management. When each application has its own user management, it becomes complicated to build a workable system for the business or team, to build reliable workflows across applications, and to ensure security for the business or team for data. Federated Core Platform provides two layers of authentication to deal with these problems.</p> <h3 id="ldap">LDAP <a href="#ldap" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>The foundation of Federated Core Platform authentication is LDAP. Every application connects to LDAP. If it doesn&rsquo;t use LDAP, it doesn&rsquo;t work on the platform. There are some applications for which the <em>only</em> account in LDAP is the administrator and the other users are created in the application itself. And example is Vaultwarden (password manager) because of the very sensitive nature of the information in Vaultwarden <em>outside</em> of access to Core services. You create the user in Vaultwarden as the administrative user but then, the account is connected to Core LDAP (if desired).</p> Dashboard - http://localhost:1313/docs/federated-core-platform/provisioning/dashboard/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/dashboard/ Tue, 26 Aug 2025 14:43:09 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/dashboard/ - <p>Federated Dashboard is a simple launcher for users. It shows the applications available, a link to helpful documentation, and a note about user management. There are significant improvements planned for Dashboard in the coming months as it transitions to Federated <a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://localhost:1313/docs/federated-core-platform/provisioning/computer/'><p>PROVISIONING</p><strong>Computer</strong><br></a>" data-bs-toggle="tooltip" href="http://localhost:1313/docs/federated-core-platform/provisioning/computer/">Computer</a>.</p> <p> </p> + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/dashboard/ + <p>Federated Dashboard is a simple launcher for users. It shows the applications available, a link to helpful documentation, and a note about user management. There are significant improvements planned for Dashboard in the coming months as it transitions to Federated <a data-bs-delay="{&#34;hide&#34;:300,&#34;show&#34;:550}" data-bs-html="true" data-bs-title="<a href='http://enterprise.federated.computer/docs/federated-core-platform/provisioning/computer/'><p>PROVISIONING</p><strong>Computer</strong><br></a>" data-bs-toggle="tooltip" href="http://enterprise.federated.computer/docs/federated-core-platform/provisioning/computer/">Computer</a>.</p> <p> </p> Computer - http://localhost:1313/docs/federated-core-platform/provisioning/computer/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/computer/ Mon, 25 Aug 2025 12:33:56 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/computer/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/computer/ <p>Federated &ldquo;Computer&rdquo; is a new application coming in Fall, 2025 delivering a fully customizable front-end experience for Core users. It is a bookmarking application extended to support reminders, folders for watching applications, documents, events, the ability to pick up AI workloads and customizations, and more. Federated &ldquo;Computer&rdquo; is intended to be fully open-sourced, will work with other SaaS applications that support URLs, and will work natively on desktops, tablets, and mobile devices.</p> Core Scanner - http://localhost:1313/docs/federated-core-platform/management/core-scanner/ + http://enterprise.federated.computer/docs/federated-core-platform/management/core-scanner/ Mon, 25 Aug 2025 12:34:24 -0600 - http://localhost:1313/docs/federated-core-platform/management/core-scanner/ + http://enterprise.federated.computer/docs/federated-core-platform/management/core-scanner/ <p>Core Scanner is a utility to examine and manage each Core on a given installation of Federated Core Platform. It allows a customer service person to examine the Core, look at all the configuration files, see any anomalies in the files, track usage of resources (CPU, RAM, storage, network), and perform tightly managed actions on the Core to take remedial steps as needed.</p> <p>Each installation of Core Scanner includes user and group priveleges so that the owner of the Federated Core Platform can look at all Cores running, but also partners can examine and manage the Cores of their customers. For example, a managed service provider may have a number of Cores for which they will want to be able to provide monitor and fix service3. Core Scanner allows them to see those Cores, only.</p> Update and Upgrade - http://localhost:1313/docs/federated-core-platform/management/update-and-upgrade/ + http://enterprise.federated.computer/docs/federated-core-platform/management/update-and-upgrade/ Mon, 25 Aug 2025 12:36:19 -0600 - http://localhost:1313/docs/federated-core-platform/management/update-and-upgrade/ + http://enterprise.federated.computer/docs/federated-core-platform/management/update-and-upgrade/ <p>Each Federated Core Platform installation has a Gitea respository where the software (OS, utilities, platform, open source SaaS) for the entire system is tracked. The operator of each installation is able to package those updates into regular upgrades pushed out to some/all Cores on the system, push them out individually for testing to some Cores, or schedule updates for a given list of Cores.</p> <p>Since the nature of the Federated Core Platform is delivering open source SaaS to customers, there needs to be a testing protocol set up to ensure updates are in fact needed/wanted. Federated Computer does this centrally, so operators using Federated Core Platform can know the software will &ldquo;work&rdquo;. However, there may be additional concerns with respect to security, other customizations that need to be tested, etc.</p> Monitor and Fix - http://localhost:1313/docs/federated-core-platform/management/monitor-and-fix/ + http://enterprise.federated.computer/docs/federated-core-platform/management/monitor-and-fix/ Mon, 25 Aug 2025 12:35:43 -0600 - http://localhost:1313/docs/federated-core-platform/management/monitor-and-fix/ + http://enterprise.federated.computer/docs/federated-core-platform/management/monitor-and-fix/ <p>Every Core running on an installation of Federated Core Platform, every application running on every Core, and every service not an application running on every Core, is monitored in real time to ensure it runs, has the system resources needed, and provides customers with the best experience. If there are anomalies detected, alerts are created and can be sent to the local Matrix server, and Federated Monitor and Fix system attempts to solve the problem using patterns and the service definitions in place.</p> Core Workflow Intelligence - http://localhost:1313/docs/federated-core-platform/customization/core-workflow-intelligence/ + http://enterprise.federated.computer/docs/federated-core-platform/customization/core-workflow-intelligence/ Mon, 25 Aug 2025 12:34:45 -0600 - http://localhost:1313/docs/federated-core-platform/customization/core-workflow-intelligence/ + http://enterprise.federated.computer/docs/federated-core-platform/customization/core-workflow-intelligence/ <p>Federated will be delivering in early 2026 an &ldquo;on premise&rdquo; solution for using artificial intelligence to create and deploy workflows between open source SaaS applications offered by Federated Core Platform. The design goal is to empower a customer to, for example, use Core Workflow Intelligence to take a grouping of customers from EspoCRM, connect them, based on conditions or parameters, to the mailing list software, and send AI-generated email communications to those customers based on actions taken in the Woocommerce store on Core.</p> Adding Software to Federated Core - http://localhost:1313/docs/federated-core-platform/customization/adding-software-to-federated-core/ + http://enterprise.federated.computer/docs/federated-core-platform/customization/adding-software-to-federated-core/ Mon, 25 Aug 2025 12:35:31 -0600 - http://localhost:1313/docs/federated-core-platform/customization/adding-software-to-federated-core/ + http://enterprise.federated.computer/docs/federated-core-platform/customization/adding-software-to-federated-core/ <p>It is easy to package an open source SaaS application to work on Federated Core Platform. The project simply needs to create a package for the docker container, service files describing how the application connects to LDAP and Authelia for authentication, descriptions of premium licenses and how Federated Core Platform needs to recognize those for inclusion in premium services (example: OIDC), and then a template file for allowing for the correct choice of virtual machine resources and the Federated Monitor and Fix to ensure great experience for the customer. This package is dropped into the Provisioner service manager and is ready to be purchased/deployed by the billing system.</p> Why Open Source Projects Work With Federated - http://localhost:1313/docs/federated-core-platform/customization/why-open-source-projects-work-with-federated/ + http://enterprise.federated.computer/docs/federated-core-platform/customization/why-open-source-projects-work-with-federated/ Mon, 25 Aug 2025 12:36:40 -0600 - http://localhost:1313/docs/federated-core-platform/customization/why-open-source-projects-work-with-federated/ + http://enterprise.federated.computer/docs/federated-core-platform/customization/why-open-source-projects-work-with-federated/ <p>More and more, open source projects work with Federated Computer because we simplify the go-to-market. An open-source project hoping to monetize by selling a cloud service is now in the business of creating great SaaS software but also making it multi-tenant, building an ecommerce experience, and building and running a (hopefully) large cloud service. With Federated Core Platform, open source SaaS companies can off-load much of that to Federated while still maintaining the ability to charge for premium features and services.</p> Whitelabel - http://localhost:1313/docs/federated-core-platform/customization/whitelabel/ + http://enterprise.federated.computer/docs/federated-core-platform/customization/whitelabel/ Thu, 28 Aug 2025 12:01:52 -0600 - http://localhost:1313/docs/federated-core-platform/customization/whitelabel/ + http://enterprise.federated.computer/docs/federated-core-platform/customization/whitelabel/ <p>Federated Core Platform can be entirely white-labeled for all customer-facing services. Included services are: Dashboard, Panel, Computer, Core Desktop, Core Scanner, Core Workflow Intelligence, Account Management and Billing, and the &ldquo;home&rdquo; website for information and ordering.</p> Account Management and Billing - http://localhost:1313/docs/federated-core-platform/billing/account-management-and-billing/ + http://enterprise.federated.computer/docs/federated-core-platform/billing/account-management-and-billing/ Mon, 25 Aug 2025 12:33:38 -0600 - http://localhost:1313/docs/federated-core-platform/billing/account-management-and-billing/ + http://enterprise.federated.computer/docs/federated-core-platform/billing/account-management-and-billing/ <p>Federated Core Platform includes a service allowing your customers to navigate to an information website to learn about Federated Core services and offerings, sign up for a management account, then procure/modify/cancel Core subscriptions.</p> <p>The billing engine is the accounting engine that tallies all the various product offerings delivered to a customers. It is <em>not</em> a payment platform but works with your payment platform of choice including Stripe, Auth.net, various crypto services, or something built in-house.</p> Federated Management - http://localhost:1313/docs/federated-core-platform/services/federated-management/ + http://enterprise.federated.computer/docs/federated-core-platform/services/federated-management/ Mon, 25 Aug 2025 12:35:12 -0600 - http://localhost:1313/docs/federated-core-platform/services/federated-management/ + http://enterprise.federated.computer/docs/federated-core-platform/services/federated-management/ <p>Federated Computer can work to get your to market in the fastest and most convenient way for your organization.</p> <h3 id="complete-management">Complete Management <a href="#complete-management" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>We can run your installation of Federated Core Platform for your business. This includes 24/7/365 NOC operations on-top of your cloud installation or included with a Federated Computer cloud installation. In these scenarios, we ensure all software for Federated Core Platform is up and running, we work with your team to design specific product offerings and bundles, and run the updates/upgrades, we fix any Core faults in the system. The entire platform &ldquo;just runs&rdquo; and your team focuses on sales and marketing (working in conjunction with the Federated team for understanding use cases, content, blog posts, successful go-to-market).</p> Customer Service and Support - http://localhost:1313/docs/federated-core-platform/services/customer-service-and-support/ + http://enterprise.federated.computer/docs/federated-core-platform/services/customer-service-and-support/ Tue, 26 Aug 2025 14:47:00 -0600 - http://localhost:1313/docs/federated-core-platform/services/customer-service-and-support/ + http://enterprise.federated.computer/docs/federated-core-platform/services/customer-service-and-support/ <p>Federated Computer can provide end-to-end customer support for your installation of Federated Core Platform. Whether your customers are end-user businesses and team or partners such as managed-service-providers.</p> <p>In addition to customer support (offered during the timeframes you want), we offer a comprehensive documentation service and community for helping customers with self-service.</p> <h3 id="end-user-businesses-and-team">End-user Businesses and Team <a href="#end-user-businesses-and-team" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>Federated Computer can use Freescout (a great Federated Core offering) to provide full customer support via email, SMS, or telephone to your customers. We have lots of experience providing great experiences to customers including 30-day on-boarding sequences, 3 hour response and 12 hour resolution, webinars, and other ways to ensure customer success and low churn for your go-to-market efforts.</p> Core Desktop - http://localhost:1313/docs/federated-core-platform/provisioning/core-desktop/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/core-desktop/ Mon, 25 Aug 2025 12:34:05 -0600 - http://localhost:1313/docs/federated-core-platform/provisioning/core-desktop/ + http://enterprise.federated.computer/docs/federated-core-platform/provisioning/core-desktop/ <p>Federated Core supports PXE-booting two different Linux distributions (OpenMandriva and Core Desktop based on Arch) when a customer wants to complete solution for their team or office. These desktops are tied into Federated Core Authentication, have all the desktop applications (email, calendar, contacts, bookmarks, file synchronization, applications that take advantage of Nextcloud and other desktop applications) pre-configured and redy to use for the particular user as they log in to Core Desktop. This is a great solution for offices or use cases where it is important that each desktop be closely managed for the &ldquo;correct&rdquo; software and services so that it &ldquo;just works&rdquo;.</p> Software Catalog - http://localhost:1313/docs/software-catalog/software-catalog/ + http://enterprise.federated.computer/docs/software-catalog/software-catalog/ Mon, 25 Aug 2025 12:39:33 -0600 - http://localhost:1313/docs/software-catalog/software-catalog/ + http://enterprise.federated.computer/docs/software-catalog/software-catalog/ <p>Federated offers a wide range of open source SaaS software. These can be provisioned individually or as part of a bundle. Provisions can happen on the same machine or virtual machine or on separate virtual machines for the sake of vertical scaling. Load balancers can also be applied for the SaaS applications that require it for horizontal scaling.</p> <p>This catalog describes the software offerings available to customers at <a href="https://www.federated.computer/" rel="external" target="_blank">https://www.federated.computer<svg width="16" height="16" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M14 5c-.552 0-1-.448-1-1s.448-1 1-1h6c.552 0 1 .448 1 1v6c0 .552-.448 1-1 1s-1-.448-1-1v-3.586l-7.293 7.293c-.391.39-1.024.39-1.414 0-.391-.391-.391-1.024 0-1.414l7.293-7.293h-3.586zm-9 2c-.552 0-1 .448-1 1v11c0 .552.448 1 1 1h11c.552 0 1-.448 1-1v-4.563c0-.552.448-1 1-1s1 .448 1 1v4.563c0 1.657-1.343 3-3 3h-11c-1.657 0-3-1.343-3-3v-11c0-1.657 1.343-3 3-3h4.563c.552 0 1 .448 1 1s-.448 1-1 1h-4.563z"/></svg></a> today. For go-to-market reasons, we offer a reduced sub-set of this catalog based on Federated Computer’s own website but all titles can be provisioned for customers as-needed.</p> Bundles - http://localhost:1313/docs/software-catalog/bundles/ + http://enterprise.federated.computer/docs/software-catalog/bundles/ Mon, 25 Aug 2025 12:39:03 -0600 - http://localhost:1313/docs/software-catalog/bundles/ - <p>Bundles are great ways to package software for use by a type of business, a size of business, or a job function, among many other go-to-market motivations for bundling software.</p> <p>The Federated Core <a href="http://localhost:1313/docs/federated-core-platform/provisioner.md">Provisioner</a> can spin up Federated Cores based on a software manifest that can be created &ldquo;just in time&rdquo; or based on a predefined collection of software and virtual machine. This allows you to fully manage the the expects margins for a sale.</p> + http://enterprise.federated.computer/docs/software-catalog/bundles/ + <p>Bundles are great ways to package software for use by a type of business, a size of business, or a job function, among many other go-to-market motivations for bundling software.</p> <p>The Federated Core <a href="http://enterprise.federated.computer/docs/federated-core-platform/provisioner.md">Provisioner</a> can spin up Federated Cores based on a software manifest that can be created &ldquo;just in time&rdquo; or based on a predefined collection of software and virtual machine. This allows you to fully manage the the expects margins for a sale.</p> Federated Commerce - http://localhost:1313/docs/software-catalog/federated-commerce/ + http://enterprise.federated.computer/docs/software-catalog/federated-commerce/ Mon, 25 Aug 2025 12:39:14 -0600 - http://localhost:1313/docs/software-catalog/federated-commerce/ + http://enterprise.federated.computer/docs/software-catalog/federated-commerce/ <p>Federated Commerce is a bundle designed by Federated Computer for customers wanting to sell goods on the internet.</p> <p>Federated Commerce delivers &ldquo;unbreakable&rdquo; Wordpress and WooCommerce add-ons to the Federated Core &ldquo;Best&rdquo; bundle (including video conferencing, mailing list, etc) all on <em>dedicated</em> cpu virtual machines.</p> <p>In addition to software, Federated provides essential services to customers such as product imports and updates using Federated Eversync, three hour response and resolution times for issues, proviate channels for talking to support, Wordpress theme and Listmonk template support, shopping ads consultations, and a dedicated account manager.</p> Federated Omnimedia - http://localhost:1313/docs/software-catalog/federated-omnimedia/ + http://enterprise.federated.computer/docs/software-catalog/federated-omnimedia/ Mon, 25 Aug 2025 12:39:23 -0600 - http://localhost:1313/docs/software-catalog/federated-omnimedia/ + http://enterprise.federated.computer/docs/software-catalog/federated-omnimedia/ <p>Federated Omnimedia is a comprehensive bundle offered by Federated Computer to customers. It demonstrates what is possible.</p> <p>Federated Omnimedia is a complete offering for those with large digital communities. Examples are publishers, video channels, podcast channels, communities of interest.</p> <p>The purpose of Federated Omnimedia is to give these sorts of customers access to every sort of tool required to successfully monetize the community. It includes:</p> <ol> <li>Wordpress or Ghost for publishing;</li> <li>WooCommerce for eCommerce;</li> <li>Discourse for community discussion, a forum;</li> <li>Podcasting and videocasting platforms;</li> <li>Ad server to sell and display static and dynamic across all properties;</li> <li>Premium content service to &ldquo;rope off&rdquo; parts of content (posts, forums, podcasts, videos) only for premium subscribers.</li> </ol> <p>Federated Omnimedia provides ample opportunities for additional professional and technical service delivery to the customer.</p> Operators, Networks, Platforms - http://localhost:1313/docs/partners/operators-networks-platforms/ + http://enterprise.federated.computer/docs/partners/operators-networks-platforms/ Mon, 25 Aug 2025 12:38:19 -0600 - http://localhost:1313/docs/partners/operators-networks-platforms/ + http://enterprise.federated.computer/docs/partners/operators-networks-platforms/ <p>Federated Core Platform is the best way for hosting companies, fiber networks, workshare companies, on-line communities, large enterprises to take control of the offering of SaaS software within their operational boundaries. Now, more than ever, open source SaaS software meets or exceeds the capabilities of proprietary SaaS, but the complexities of marshalling and delivering these solutions to customers are immense. Federated Core Platform solves the problem with technical sophistication, at a price designed to provide you with maximum margin, and with programs allowing you to get up and running in a matter of weeks.</p> Managed Service Provider - http://localhost:1313/docs/partners/managed-service-providers/ + http://enterprise.federated.computer/docs/partners/managed-service-providers/ Mon, 25 Aug 2025 12:37:54 -0600 - http://localhost:1313/docs/partners/managed-service-providers/ + http://enterprise.federated.computer/docs/partners/managed-service-providers/ <p>Federated Computer has all the tools needed to allow a managed service provider to replace proprietary SaaS products such as Google Workplace, Microsoft Office 365, Slack, Salesforce, and many, many others with easy-to-use, high-value, priavate, flexible open source SaaS alternatives.</p> <p>This leaves MORE money on the table for the managed service provider to provide high-value services.</p> <h3 id="solutions">Solutions <a href="#solutions" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>Federated solutions include Core Scanner for active monitoring and fix of customer Cores. Our AI tools will allow you to easily build workflows for customers on top of existing open source SaaS. And our authentication services and facilities for adding software to Federated Core Platform allow MSPs to extend offerings while maintaining the security and ease-of-use of unified storage and messaging and authentication. With Federated Core Platform, you can build the comprehensive solution for a customer that includes all of their software, devices, and services in a single pane-of-glass.</p> Pro Customers - http://localhost:1313/docs/partners/pro-customers/ + http://enterprise.federated.computer/docs/partners/pro-customers/ Tue, 26 Aug 2025 11:12:45 -0600 - http://localhost:1313/docs/partners/pro-customers/ + http://enterprise.federated.computer/docs/partners/pro-customers/ <p>Federated Core Platform includes a number of bundles (collections of open source SaaS software and services) specifically designed for specific enterprise customers and market types. Examples of these are <a href="content/docs/software-catalog/federated-commerce.md">Commerce</a> and <a href="content/docs/software-catalog/federated-omnimedia.md">Omnimedia</a>.</p> <p>It is possible to address &ldquo;pro&rdquo; customers in a couple ways. The first would be to design, build, and deliver a total solution using the building blocks available in Federated Core Platform and its software catalog.</p> <p>However, there will be many opportunities to build out additional collections/bundles for customers requiring different sets of software and services delivered bespoke for their particular needs. These don&rsquo;t have to come from Federated Computer but can be designed and delivered by our partners and sold through all available channels including other operators, networks, and platforms. Open source allows us maximum flexibility to deliver great solutions to customers without re-inventing every wheel.</p> On Line Affiliates - http://localhost:1313/docs/partners/on-line-affiliates/ + http://enterprise.federated.computer/docs/partners/on-line-affiliates/ Mon, 25 Aug 2025 12:38:06 -0600 - http://localhost:1313/docs/partners/on-line-affiliates/ + http://enterprise.federated.computer/docs/partners/on-line-affiliates/ <p>Outlets with significant communities can use Federated&rsquo;s affilaite programs to earn up to 30% (the number is really dependent on your own installation&rsquo;s exigencies!) on sales. Affiliates are a great way to build reputation and trust with customers while compensating those affiliate channels for their endorsements.</p> <p>We have found the best affiliates are those that use Federated Core products. When an affiliate is emeshed in open source and especially the open source SaaS offered through Federated Core Platform, the crediblity of the recommendation to the affiliate&rsquo;s community is sterling.</p> Federated Company Backgrounder - http://localhost:1313/docs/about-federated-computer/federated-company-backgrounder/ + http://enterprise.federated.computer/docs/about-federated-computer/federated-company-backgrounder/ Mon, 25 Aug 2025 12:40:08 -0600 - http://localhost:1313/docs/about-federated-computer/federated-company-backgrounder/ + http://enterprise.federated.computer/docs/about-federated-computer/federated-company-backgrounder/ <p>Federated Computer is on a mission to transform all business software with open-source. All business software has an open-source alternative that is feature-complete, &ldquo;free,&rdquo; and flexible for integration with other open-source software. We provide automated IT services, allowing our customers to adopt open-source software with confidence. Our open-source solutions are used by tens of millions of users around the globe.</p> <h3 id="team">Team <a href="#team" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p>We are a small group of pioneers. We include founders of the cloud computer industry. We want a world and internet where big company black-holes don&rsquo;t suck away all our money, data, and sovereignty. We are FedQ&rsquo;d in Colorado Springs, Colorado, USA with colleagues around the globe.</p> Roadmap - http://localhost:1313/docs/about-federated-computer/roadmap/ + http://enterprise.federated.computer/docs/about-federated-computer/roadmap/ Thu, 28 Aug 2025 13:41:48 -0600 - http://localhost:1313/docs/about-federated-computer/roadmap/ + http://enterprise.federated.computer/docs/about-federated-computer/roadmap/ <p>Federated Computer is working on the following initiatives for the benefit of our customers and partners:</p> <h3 id="fall-2025">Fall, 2025 <a href="#fall-2025" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p><strong>Computer.</strong> Our take on a central web application for managing all SaaS workloads, dates, clients, messages.</p> <h3 id="first-half-2026">First Half, 2026 <a href="#first-half-2026" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p><strong>Core Workflow Intelligence.</strong> AI services for building application workflows combined between 2 or more open source SaaS applications.</p> <h3 id="second-half-2026">Second Half, 2026 <a href="#second-half-2026" class="anchor" aria-hidden="true"><i class="material-icons align-middle">link</i></a></h3><p><strong>On Premise Provisioning of Federated Cores.</strong> This will support customers that want to connect to high bandwidth, synchronous networks (eg Fiber) and have a Federated Core running on their own hardware with all the management services provided by Federated Core Platform.</p> diff --git a/public/js/bootstrap.f4edede35538f2efb186f99d61b2b4abacd0cc0d9250ca14f7a0d0456ecae9f4a4b7cb81b1652345ce618d482091a6b2.js b/public/js/bootstrap.f4edede35538f2efb186f99d61b2b4abacd0cc0d9250ca14f7a0d0456ecae9f4a4b7cb81b1652345ce618d482091a6b2.js new file mode 100644 index 0000000..9de2064 --- /dev/null +++ b/public/js/bootstrap.f4edede35538f2efb186f99d61b2b4abacd0cc0d9250ca14f7a0d0456ecae9f4a4b7cb81b1652345ce618d482091a6b2.js @@ -0,0 +1 @@ +(()=>{var p=new Map,O={set(e,t,r){p.has(e)||p.set(e,new Map);let n=p.get(e);if(!n.has(t)&&n.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`);return}n.set(t,r)},get(e,t){return p.has(e)&&p.get(e).get(t)||null},remove(e,t){if(!p.has(e))return;let r=p.get(e);r.delete(t),r.size===0&&p.delete(e)}};var S="transitionend",T=e=>(e&&window.CSS&&window.CSS.escape&&(e=e.replace(/#([^\s"#']+)/g,(t,r)=>`#${CSS.escape(r)}`)),e),F=e=>e==null?`${e}`:Object.prototype.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase();var gt=e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:r}=window.getComputedStyle(e),n=Number.parseFloat(t),s=Number.parseFloat(r);return!n&&!s?0:(t=t.split(",")[0],r=r.split(",")[0],(Number.parseFloat(t)+Number.parseFloat(r))*1e3)},Et=e=>{e.dispatchEvent(new Event(S))},m=e=>!e||typeof e!="object"?!1:(typeof e.jquery!="undefined"&&(e=e[0]),typeof e.nodeType!="undefined"),w=e=>m(e)?e.jquery?e[0]:e:typeof e=="string"&&e.length>0?document.querySelector(T(e)):null,U=e=>{if(!m(e)||e.getClientRects().length===0)return!1;let t=getComputedStyle(e).getPropertyValue("visibility")==="visible",r=e.closest("details:not([open])");if(!r)return t;if(r!==e){let n=e.closest("summary");if(n&&n.parentNode!==r||n===null)return!1}return t},y=e=>!e||e.nodeType!==Node.ELEMENT_NODE||e.classList.contains("disabled")?!0:typeof e.disabled!="undefined"?e.disabled:e.hasAttribute("disabled")&&e.getAttribute("disabled")!=="false";var C=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,D=[],ht=e=>{document.readyState==="loading"?(D.length||document.addEventListener("DOMContentLoaded",()=>{for(let t of D)t()}),D.push(e)):e()};var Q=e=>{ht(()=>{let t=C();if(t){let r=e.NAME,n=t.fn[r];t.fn[r]=e.jQueryInterface,t.fn[r].Constructor=e,t.fn[r].noConflict=()=>(t.fn[r]=n,e.jQueryInterface)}})},j=(e,t=[],r=e)=>typeof e=="function"?e(...t):r,q=(e,t,r=!0)=>{if(!r){j(e);return}let s=gt(t)+5,i=!1,o=({target:a})=>{a===t&&(i=!0,t.removeEventListener(S,o),j(e))};t.addEventListener(S,o),setTimeout(()=>{i||Et(t)},s)},G=(e,t,r,n)=>{let s=e.length,i=e.indexOf(t);return i===-1?!r&&n?e[s-1]:e[0]:(i+=r?1:-1,n&&(i=(i+s)%s),e[Math.max(0,Math.min(i,s-1))])};var _t=/[^.]*(?=\..*)\.|.*/,bt=/\..*/,mt=/::\d+$/,v={},z=1,J={mouseenter:"mouseover",mouseleave:"mouseout"},At=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function X(e,t){return t&&`${t}::${z++}`||e.uidEvent||z++}function Z(e){let t=X(e);return e.uidEvent=t,v[t]=v[t]||{},v[t]}function yt(e,t){return function r(n){return R(n,{delegateTarget:e}),r.oneOff&&L.off(e,n.type,t),t.apply(e,[n])}}function Ot(e,t,r){return function n(s){let i=e.querySelectorAll(t);for(let{target:o}=s;o&&o!==this;o=o.parentNode)for(let a of i)if(a===o)return R(s,{delegateTarget:o}),n.oneOff&&L.off(e,s.type,t,r),r.apply(o,[s])}}function tt(e,t,r=null){return Object.values(e).find(n=>n.callable===t&&n.delegationSelector===r)}function et(e,t,r){let n=typeof t=="string",s=n?r:t||r,i=rt(e);return At.has(i)||(i=e),[n,s,i]}function B(e,t,r,n,s){if(typeof t!="string"||!e)return;let[i,o,a]=et(t,r,n);t in J&&(o=(pt=>function(b){if(!b.relatedTarget||b.relatedTarget!==b.delegateTarget&&!b.delegateTarget.contains(b.relatedTarget))return pt.call(this,b)})(o));let u=Z(e),d=u[a]||(u[a]={}),c=tt(d,o,i?r:null);if(c){c.oneOff=c.oneOff&&s;return}let _=X(o,t.replace(_t,"")),f=i?Ot(e,r,o):yt(e,o);f.delegationSelector=i?r:null,f.callable=o,f.oneOff=s,f.uidEvent=_,d[_]=f,e.addEventListener(a,f,i)}function I(e,t,r,n,s){let i=tt(t[r],n,s);i&&(e.removeEventListener(r,i,!!s),delete t[r][i.uidEvent])}function Nt(e,t,r,n){let s=t[r]||{};for(let[i,o]of Object.entries(s))i.includes(n)&&I(e,t,r,o.callable,o.delegationSelector)}function rt(e){return e=e.replace(bt,""),J[e]||e}var L={on(e,t,r,n){B(e,t,r,n,!1)},one(e,t,r,n){B(e,t,r,n,!0)},off(e,t,r,n){if(typeof t!="string"||!e)return;let[s,i,o]=et(t,r,n),a=o!==t,u=Z(e),d=u[o]||{},c=t.startsWith(".");if(typeof i!="undefined"){if(!Object.keys(d).length)return;I(e,u,o,i,s?r:null);return}if(c)for(let _ of Object.keys(u))Nt(e,u,_,t.slice(1));for(let[_,f]of Object.entries(d)){let Y=_.replace(mt,"");(!a||t.includes(Y))&&I(e,u,o,f.callable,f.delegationSelector)}},trigger(e,t,r){if(typeof t!="string"||!e)return null;let n=C(),s=rt(t),i=t!==s,o=null,a=!0,u=!0,d=!1;i&&n&&(o=n.Event(t,r),n(e).trigger(o),a=!o.isPropagationStopped(),u=!o.isImmediatePropagationStopped(),d=o.isDefaultPrevented());let c=R(new Event(t,{bubbles:a,cancelable:!0}),r);return d&&c.preventDefault(),u&&e.dispatchEvent(c),c.defaultPrevented&&o&&o.preventDefault(),c}};function R(e,t={}){for(let[r,n]of Object.entries(t))try{e[r]=n}catch(s){Object.defineProperty(e,r,{configurable:!0,get(){return n}})}return e}var l=L;function nt(e){if(e==="true")return!0;if(e==="false")return!1;if(e===Number(e).toString())return Number(e);if(e===""||e==="null")return null;if(typeof e!="string")return e;try{return JSON.parse(decodeURIComponent(e))}catch(t){return e}}function x(e){return e.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}var Dt={setDataAttribute(e,t,r){e.setAttribute(`data-bs-${x(t)}`,r)},removeDataAttribute(e,t){e.removeAttribute(`data-bs-${x(t)}`)},getDataAttributes(e){if(!e)return{};let t={},r=Object.keys(e.dataset).filter(n=>n.startsWith("bs")&&!n.startsWith("bsConfig"));for(let n of r){let s=n.replace(/^bs/,"");s=s.charAt(0).toLowerCase()+s.slice(1,s.length),t[s]=nt(e.dataset[n])}return t},getDataAttribute(e,t){return nt(e.getAttribute(`data-bs-${x(t)}`))}},M=Dt;var $=class{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,r){let n=m(r)?M.getDataAttribute(r,"config"):{};return{...this.constructor.Default,...typeof n=="object"?n:{},...m(r)?M.getDataAttributes(r):{},...typeof t=="object"?t:{}}}_typeCheckConfig(t,r=this.constructor.DefaultType){for(let[n,s]of Object.entries(r)){let i=t[n],o=m(i)?"element":F(i);if(!new RegExp(s).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${o}" but expected type "${s}".`)}}},st=$;var St="5.3.3",P=class extends st{constructor(t,r){super(),t=w(t),t&&(this._element=t,this._config=this._getConfig(r),O.set(this._element,this.constructor.DATA_KEY,this))}dispose(){O.remove(this._element,this.constructor.DATA_KEY),l.off(this._element,this.constructor.EVENT_KEY);for(let t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,r,n=!0){q(t,r,n)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return O.get(w(t),this.DATA_KEY)}static getOrCreateInstance(t,r={}){return this.getInstance(t)||new this(t,typeof r=="object"?r:null)}static get VERSION(){return St}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}},ot=P;var k=e=>{let t=e.getAttribute("data-bs-target");if(!t||t==="#"){let r=e.getAttribute("href");if(!r||!r.includes("#")&&!r.startsWith("."))return null;r.includes("#")&&!r.startsWith("#")&&(r=`#${r.split("#")[1]}`),t=r&&r!=="#"?r.trim():null}return t?t.split(",").map(r=>T(r)).join(","):null},N={find(e,t=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(t,e))},findOne(e,t=document.documentElement){return Element.prototype.querySelector.call(t,e)},children(e,t){return[].concat(...e.children).filter(r=>r.matches(t))},parents(e,t){let r=[],n=e.parentNode.closest(t);for(;n;)r.push(n),n=n.parentNode.closest(t);return r},prev(e,t){let r=e.previousElementSibling;for(;r;){if(r.matches(t))return[r];r=r.previousElementSibling}return[]},next(e,t){let r=e.nextElementSibling;for(;r;){if(r.matches(t))return[r];r=r.nextElementSibling}return[]},focusableChildren(e){let t=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(r=>`${r}:not([tabindex^="-"])`).join(",");return this.find(t,e).filter(r=>!y(r)&&U(r))},getSelectorFromElement(e){let t=k(e);return t&&N.findOne(t)?t:null},getElementFromSelector(e){let t=k(e);return t?N.findOne(t):null},getMultipleElementsFromSelector(e){let t=k(e);return t?N.find(t):[]}},g=N;var Tt="tab",wt="bs.tab",h=`.${wt}`,Ct=`hide${h}`,vt=`hidden${h}`,It=`show${h}`,Lt=`shown${h}`,Rt=`click${h}`,xt=`keydown${h}`,Mt=`load${h}`,$t="ArrowLeft",it="ArrowRight",Pt="ArrowUp",at="ArrowDown",K="Home",ut="End",E="active",ct="fade",H="show",kt="dropdown",lt=".dropdown-toggle",Kt=".dropdown-menu",V=`:not(${lt})`,Ht='.list-group, .nav, [role="tablist"]',Vt=".nav-item, .list-group-item",Wt=`.nav-link${V}, .list-group-item${V}, [role="tab"]${V}`,ft='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',W=`${Wt}, ${ft}`,Yt=`.${E}[data-bs-toggle="tab"], .${E}[data-bs-toggle="pill"], .${E}[data-bs-toggle="list"]`,A=class e extends ot{constructor(t){super(t),this._parent=this._element.closest(Ht),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),l.on(this._element,xt,r=>this._keydown(r)))}static get NAME(){return Tt}show(){let t=this._element;if(this._elemIsActive(t))return;let r=this._getActiveElem(),n=r?l.trigger(r,Ct,{relatedTarget:t}):null;l.trigger(t,It,{relatedTarget:r}).defaultPrevented||n&&n.defaultPrevented||(this._deactivate(r,t),this._activate(t,r))}_activate(t,r){if(!t)return;t.classList.add(E),this._activate(g.getElementFromSelector(t));let n=()=>{if(t.getAttribute("role")!=="tab"){t.classList.add(H);return}t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),l.trigger(t,Lt,{relatedTarget:r})};this._queueCallback(n,t,t.classList.contains(ct))}_deactivate(t,r){if(!t)return;t.classList.remove(E),t.blur(),this._deactivate(g.getElementFromSelector(t));let n=()=>{if(t.getAttribute("role")!=="tab"){t.classList.remove(H);return}t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),l.trigger(t,vt,{relatedTarget:r})};this._queueCallback(n,t,t.classList.contains(ct))}_keydown(t){if(![$t,it,Pt,at,K,ut].includes(t.key))return;t.stopPropagation(),t.preventDefault();let r=this._getChildren().filter(s=>!y(s)),n;if([K,ut].includes(t.key))n=r[t.key===K?0:r.length-1];else{let s=[it,at].includes(t.key);n=G(r,t.target,s,!0)}n&&(n.focus({preventScroll:!0}),e.getOrCreateInstance(n).show())}_getChildren(){return g.find(W,this._parent)}_getActiveElem(){return this._getChildren().find(t=>this._elemIsActive(t))||null}_setInitialAttributes(t,r){this._setAttributeIfNotExists(t,"role","tablist");for(let n of r)this._setInitialAttributesOnChild(n)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);let r=this._elemIsActive(t),n=this._getOuterElement(t);t.setAttribute("aria-selected",r),n!==t&&this._setAttributeIfNotExists(n,"role","presentation"),r||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){let r=g.getElementFromSelector(t);r&&(this._setAttributeIfNotExists(r,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(r,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,r){let n=this._getOuterElement(t);if(!n.classList.contains(kt))return;let s=(i,o)=>{let a=g.findOne(i,n);a&&a.classList.toggle(o,r)};s(lt,E),s(Kt,H),n.setAttribute("aria-expanded",r)}_setAttributeIfNotExists(t,r,n){t.hasAttribute(r)||t.setAttribute(r,n)}_elemIsActive(t){return t.classList.contains(E)}_getInnerElement(t){return t.matches(W)?t:g.findOne(W,t)}_getOuterElement(t){return t.closest(Vt)||t}static jQueryInterface(t){return this.each(function(){let r=e.getOrCreateInstance(this);if(typeof t=="string"){if(r[t]===void 0||t.startsWith("_")||t==="constructor")throw new TypeError(`No method named "${t}"`);r[t]()}})}};l.on(document,Rt,ft,function(e){["A","AREA"].includes(this.tagName)&&e.preventDefault(),!y(this)&&A.getOrCreateInstance(this).show()});l.on(window,Mt,()=>{for(let e of g.find(Yt))A.getOrCreateInstance(e)});Q(A);var dt=A;var le={Tab:dt};})(); diff --git a/public/js/bootstrap.js b/public/js/bootstrap.js deleted file mode 100644 index 1079e04..0000000 --- a/public/js/bootstrap.js +++ /dev/null @@ -1,885 +0,0 @@ -(() => { - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/dom/data.js - var elementMap = /* @__PURE__ */ new Map(); - var data_default = { - set(element, key, instance) { - if (!elementMap.has(element)) { - elementMap.set(element, /* @__PURE__ */ new Map()); - } - const instanceMap = elementMap.get(element); - if (!instanceMap.has(key) && instanceMap.size !== 0) { - console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`); - return; - } - instanceMap.set(key, instance); - }, - get(element, key) { - if (elementMap.has(element)) { - return elementMap.get(element).get(key) || null; - } - return null; - }, - remove(element, key) { - if (!elementMap.has(element)) { - return; - } - const instanceMap = elementMap.get(element); - instanceMap.delete(key); - if (instanceMap.size === 0) { - elementMap.delete(element); - } - } - }; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/util/index.js - var MILLISECONDS_MULTIPLIER = 1e3; - var TRANSITION_END = "transitionend"; - var parseSelector = (selector) => { - if (selector && window.CSS && window.CSS.escape) { - selector = selector.replace(/#([^\s"#']+)/g, (match, id) => `#${CSS.escape(id)}`); - } - return selector; - }; - var toType = (object) => { - if (object === null || object === void 0) { - return `${object}`; - } - return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase(); - }; - var getTransitionDurationFromElement = (element) => { - if (!element) { - return 0; - } - let { transitionDuration, transitionDelay } = window.getComputedStyle(element); - const floatTransitionDuration = Number.parseFloat(transitionDuration); - const floatTransitionDelay = Number.parseFloat(transitionDelay); - if (!floatTransitionDuration && !floatTransitionDelay) { - return 0; - } - transitionDuration = transitionDuration.split(",")[0]; - transitionDelay = transitionDelay.split(",")[0]; - return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; - }; - var triggerTransitionEnd = (element) => { - element.dispatchEvent(new Event(TRANSITION_END)); - }; - var isElement = (object) => { - if (!object || typeof object !== "object") { - return false; - } - if (typeof object.jquery !== "undefined") { - object = object[0]; - } - return typeof object.nodeType !== "undefined"; - }; - var getElement = (object) => { - if (isElement(object)) { - return object.jquery ? object[0] : object; - } - if (typeof object === "string" && object.length > 0) { - return document.querySelector(parseSelector(object)); - } - return null; - }; - var isVisible = (element) => { - if (!isElement(element) || element.getClientRects().length === 0) { - return false; - } - const elementIsVisible = getComputedStyle(element).getPropertyValue("visibility") === "visible"; - const closedDetails = element.closest("details:not([open])"); - if (!closedDetails) { - return elementIsVisible; - } - if (closedDetails !== element) { - const summary = element.closest("summary"); - if (summary && summary.parentNode !== closedDetails) { - return false; - } - if (summary === null) { - return false; - } - } - return elementIsVisible; - }; - var isDisabled = (element) => { - if (!element || element.nodeType !== Node.ELEMENT_NODE) { - return true; - } - if (element.classList.contains("disabled")) { - return true; - } - if (typeof element.disabled !== "undefined") { - return element.disabled; - } - return element.hasAttribute("disabled") && element.getAttribute("disabled") !== "false"; - }; - var getjQuery = () => { - if (window.jQuery && !document.body.hasAttribute("data-bs-no-jquery")) { - return window.jQuery; - } - return null; - }; - var DOMContentLoadedCallbacks = []; - var onDOMContentLoaded = (callback) => { - if (document.readyState === "loading") { - if (!DOMContentLoadedCallbacks.length) { - document.addEventListener("DOMContentLoaded", () => { - for (const callback2 of DOMContentLoadedCallbacks) { - callback2(); - } - }); - } - DOMContentLoadedCallbacks.push(callback); - } else { - callback(); - } - }; - var defineJQueryPlugin = (plugin) => { - onDOMContentLoaded(() => { - const $ = getjQuery(); - if ($) { - const name = plugin.NAME; - const JQUERY_NO_CONFLICT = $.fn[name]; - $.fn[name] = plugin.jQueryInterface; - $.fn[name].Constructor = plugin; - $.fn[name].noConflict = () => { - $.fn[name] = JQUERY_NO_CONFLICT; - return plugin.jQueryInterface; - }; - } - }); - }; - var execute = (possibleCallback, args = [], defaultValue = possibleCallback) => { - return typeof possibleCallback === "function" ? possibleCallback(...args) : defaultValue; - }; - var executeAfterTransition = (callback, transitionElement, waitForTransition = true) => { - if (!waitForTransition) { - execute(callback); - return; - } - const durationPadding = 5; - const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding; - let called = false; - const handler = ({ target }) => { - if (target !== transitionElement) { - return; - } - called = true; - transitionElement.removeEventListener(TRANSITION_END, handler); - execute(callback); - }; - transitionElement.addEventListener(TRANSITION_END, handler); - setTimeout(() => { - if (!called) { - triggerTransitionEnd(transitionElement); - } - }, emulatedDuration); - }; - var getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => { - const listLength = list.length; - let index = list.indexOf(activeElement); - if (index === -1) { - return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]; - } - index += shouldGetNext ? 1 : -1; - if (isCycleAllowed) { - index = (index + listLength) % listLength; - } - return list[Math.max(0, Math.min(index, listLength - 1))]; - }; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/dom/event-handler.js - var namespaceRegex = /[^.]*(?=\..*)\.|.*/; - var stripNameRegex = /\..*/; - var stripUidRegex = /::\d+$/; - var eventRegistry = {}; - var uidEvent = 1; - var customEvents = { - mouseenter: "mouseover", - mouseleave: "mouseout" - }; - var nativeEvents = /* @__PURE__ */ new Set([ - "click", - "dblclick", - "mouseup", - "mousedown", - "contextmenu", - "mousewheel", - "DOMMouseScroll", - "mouseover", - "mouseout", - "mousemove", - "selectstart", - "selectend", - "keydown", - "keypress", - "keyup", - "orientationchange", - "touchstart", - "touchmove", - "touchend", - "touchcancel", - "pointerdown", - "pointermove", - "pointerup", - "pointerleave", - "pointercancel", - "gesturestart", - "gesturechange", - "gestureend", - "focus", - "blur", - "change", - "reset", - "select", - "submit", - "focusin", - "focusout", - "load", - "unload", - "beforeunload", - "resize", - "move", - "DOMContentLoaded", - "readystatechange", - "error", - "abort", - "scroll" - ]); - function makeEventUid(element, uid) { - return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++; - } - function getElementEvents(element) { - const uid = makeEventUid(element); - element.uidEvent = uid; - eventRegistry[uid] = eventRegistry[uid] || {}; - return eventRegistry[uid]; - } - function bootstrapHandler(element, fn) { - return function handler(event) { - hydrateObj(event, { delegateTarget: element }); - if (handler.oneOff) { - EventHandler.off(element, event.type, fn); - } - return fn.apply(element, [event]); - }; - } - function bootstrapDelegationHandler(element, selector, fn) { - return function handler(event) { - const domElements = element.querySelectorAll(selector); - for (let { target } = event; target && target !== this; target = target.parentNode) { - for (const domElement of domElements) { - if (domElement !== target) { - continue; - } - hydrateObj(event, { delegateTarget: target }); - if (handler.oneOff) { - EventHandler.off(element, event.type, selector, fn); - } - return fn.apply(target, [event]); - } - } - }; - } - function findHandler(events, callable, delegationSelector = null) { - return Object.values(events).find((event) => event.callable === callable && event.delegationSelector === delegationSelector); - } - function normalizeParameters(originalTypeEvent, handler, delegationFunction) { - const isDelegated = typeof handler === "string"; - const callable = isDelegated ? delegationFunction : handler || delegationFunction; - let typeEvent = getTypeEvent(originalTypeEvent); - if (!nativeEvents.has(typeEvent)) { - typeEvent = originalTypeEvent; - } - return [isDelegated, callable, typeEvent]; - } - function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) { - if (typeof originalTypeEvent !== "string" || !element) { - return; - } - let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); - if (originalTypeEvent in customEvents) { - const wrapFunction = (fn2) => { - return function(event) { - if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) { - return fn2.call(this, event); - } - }; - }; - callable = wrapFunction(callable); - } - const events = getElementEvents(element); - const handlers = events[typeEvent] || (events[typeEvent] = {}); - const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null); - if (previousFunction) { - previousFunction.oneOff = previousFunction.oneOff && oneOff; - return; - } - const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, "")); - const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable); - fn.delegationSelector = isDelegated ? handler : null; - fn.callable = callable; - fn.oneOff = oneOff; - fn.uidEvent = uid; - handlers[uid] = fn; - element.addEventListener(typeEvent, fn, isDelegated); - } - function removeHandler(element, events, typeEvent, handler, delegationSelector) { - const fn = findHandler(events[typeEvent], handler, delegationSelector); - if (!fn) { - return; - } - element.removeEventListener(typeEvent, fn, Boolean(delegationSelector)); - delete events[typeEvent][fn.uidEvent]; - } - function removeNamespacedHandlers(element, events, typeEvent, namespace) { - const storeElementEvent = events[typeEvent] || {}; - for (const [handlerKey, event] of Object.entries(storeElementEvent)) { - if (handlerKey.includes(namespace)) { - removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); - } - } - } - function getTypeEvent(event) { - event = event.replace(stripNameRegex, ""); - return customEvents[event] || event; - } - var EventHandler = { - on(element, event, handler, delegationFunction) { - addHandler(element, event, handler, delegationFunction, false); - }, - one(element, event, handler, delegationFunction) { - addHandler(element, event, handler, delegationFunction, true); - }, - off(element, originalTypeEvent, handler, delegationFunction) { - if (typeof originalTypeEvent !== "string" || !element) { - return; - } - const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); - const inNamespace = typeEvent !== originalTypeEvent; - const events = getElementEvents(element); - const storeElementEvent = events[typeEvent] || {}; - const isNamespace = originalTypeEvent.startsWith("."); - if (typeof callable !== "undefined") { - if (!Object.keys(storeElementEvent).length) { - return; - } - removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null); - return; - } - if (isNamespace) { - for (const elementEvent of Object.keys(events)) { - removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1)); - } - } - for (const [keyHandlers, event] of Object.entries(storeElementEvent)) { - const handlerKey = keyHandlers.replace(stripUidRegex, ""); - if (!inNamespace || originalTypeEvent.includes(handlerKey)) { - removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); - } - } - }, - trigger(element, event, args) { - if (typeof event !== "string" || !element) { - return null; - } - const $ = getjQuery(); - const typeEvent = getTypeEvent(event); - const inNamespace = event !== typeEvent; - let jQueryEvent = null; - let bubbles = true; - let nativeDispatch = true; - let defaultPrevented = false; - if (inNamespace && $) { - jQueryEvent = $.Event(event, args); - $(element).trigger(jQueryEvent); - bubbles = !jQueryEvent.isPropagationStopped(); - nativeDispatch = !jQueryEvent.isImmediatePropagationStopped(); - defaultPrevented = jQueryEvent.isDefaultPrevented(); - } - const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args); - if (defaultPrevented) { - evt.preventDefault(); - } - if (nativeDispatch) { - element.dispatchEvent(evt); - } - if (evt.defaultPrevented && jQueryEvent) { - jQueryEvent.preventDefault(); - } - return evt; - } - }; - function hydrateObj(obj, meta = {}) { - for (const [key, value] of Object.entries(meta)) { - try { - obj[key] = value; - } catch (e) { - Object.defineProperty(obj, key, { - configurable: true, - get() { - return value; - } - }); - } - } - return obj; - } - var event_handler_default = EventHandler; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/dom/manipulator.js - function normalizeData(value) { - if (value === "true") { - return true; - } - if (value === "false") { - return false; - } - if (value === Number(value).toString()) { - return Number(value); - } - if (value === "" || value === "null") { - return null; - } - if (typeof value !== "string") { - return value; - } - try { - return JSON.parse(decodeURIComponent(value)); - } catch (e) { - return value; - } - } - function normalizeDataKey(key) { - return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`); - } - var Manipulator = { - setDataAttribute(element, key, value) { - element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value); - }, - removeDataAttribute(element, key) { - element.removeAttribute(`data-bs-${normalizeDataKey(key)}`); - }, - getDataAttributes(element) { - if (!element) { - return {}; - } - const attributes = {}; - const bsKeys = Object.keys(element.dataset).filter((key) => key.startsWith("bs") && !key.startsWith("bsConfig")); - for (const key of bsKeys) { - let pureKey = key.replace(/^bs/, ""); - pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); - attributes[pureKey] = normalizeData(element.dataset[key]); - } - return attributes; - }, - getDataAttribute(element, key) { - return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`)); - } - }; - var manipulator_default = Manipulator; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/util/config.js - var Config = class { - // Getters - static get Default() { - return {}; - } - static get DefaultType() { - return {}; - } - static get NAME() { - throw new Error('You have to implement the static method "NAME", for each component!'); - } - _getConfig(config) { - config = this._mergeConfigObj(config); - config = this._configAfterMerge(config); - this._typeCheckConfig(config); - return config; - } - _configAfterMerge(config) { - return config; - } - _mergeConfigObj(config, element) { - const jsonConfig = isElement(element) ? manipulator_default.getDataAttribute(element, "config") : {}; - return { - ...this.constructor.Default, - ...typeof jsonConfig === "object" ? jsonConfig : {}, - ...isElement(element) ? manipulator_default.getDataAttributes(element) : {}, - ...typeof config === "object" ? config : {} - }; - } - _typeCheckConfig(config, configTypes = this.constructor.DefaultType) { - for (const [property, expectedTypes] of Object.entries(configTypes)) { - const value = config[property]; - const valueType = isElement(value) ? "element" : toType(value); - if (!new RegExp(expectedTypes).test(valueType)) { - throw new TypeError( - `${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".` - ); - } - } - } - }; - var config_default = Config; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/base-component.js - var VERSION = "5.3.3"; - var BaseComponent = class extends config_default { - constructor(element, config) { - super(); - element = getElement(element); - if (!element) { - return; - } - this._element = element; - this._config = this._getConfig(config); - data_default.set(this._element, this.constructor.DATA_KEY, this); - } - // Public - dispose() { - data_default.remove(this._element, this.constructor.DATA_KEY); - event_handler_default.off(this._element, this.constructor.EVENT_KEY); - for (const propertyName of Object.getOwnPropertyNames(this)) { - this[propertyName] = null; - } - } - _queueCallback(callback, element, isAnimated = true) { - executeAfterTransition(callback, element, isAnimated); - } - _getConfig(config) { - config = this._mergeConfigObj(config, this._element); - config = this._configAfterMerge(config); - this._typeCheckConfig(config); - return config; - } - // Static - static getInstance(element) { - return data_default.get(getElement(element), this.DATA_KEY); - } - static getOrCreateInstance(element, config = {}) { - return this.getInstance(element) || new this(element, typeof config === "object" ? config : null); - } - static get VERSION() { - return VERSION; - } - static get DATA_KEY() { - return `bs.${this.NAME}`; - } - static get EVENT_KEY() { - return `.${this.DATA_KEY}`; - } - static eventName(name) { - return `${name}${this.EVENT_KEY}`; - } - }; - var base_component_default = BaseComponent; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/dom/selector-engine.js - var getSelector = (element) => { - let selector = element.getAttribute("data-bs-target"); - if (!selector || selector === "#") { - let hrefAttribute = element.getAttribute("href"); - if (!hrefAttribute || !hrefAttribute.includes("#") && !hrefAttribute.startsWith(".")) { - return null; - } - if (hrefAttribute.includes("#") && !hrefAttribute.startsWith("#")) { - hrefAttribute = `#${hrefAttribute.split("#")[1]}`; - } - selector = hrefAttribute && hrefAttribute !== "#" ? hrefAttribute.trim() : null; - } - return selector ? selector.split(",").map((sel) => parseSelector(sel)).join(",") : null; - }; - var SelectorEngine = { - find(selector, element = document.documentElement) { - return [].concat(...Element.prototype.querySelectorAll.call(element, selector)); - }, - findOne(selector, element = document.documentElement) { - return Element.prototype.querySelector.call(element, selector); - }, - children(element, selector) { - return [].concat(...element.children).filter((child) => child.matches(selector)); - }, - parents(element, selector) { - const parents = []; - let ancestor = element.parentNode.closest(selector); - while (ancestor) { - parents.push(ancestor); - ancestor = ancestor.parentNode.closest(selector); - } - return parents; - }, - prev(element, selector) { - let previous = element.previousElementSibling; - while (previous) { - if (previous.matches(selector)) { - return [previous]; - } - previous = previous.previousElementSibling; - } - return []; - }, - // TODO: this is now unused; remove later along with prev() - next(element, selector) { - let next = element.nextElementSibling; - while (next) { - if (next.matches(selector)) { - return [next]; - } - next = next.nextElementSibling; - } - return []; - }, - focusableChildren(element) { - const focusables = [ - "a", - "button", - "input", - "textarea", - "select", - "details", - "[tabindex]", - '[contenteditable="true"]' - ].map((selector) => `${selector}:not([tabindex^="-"])`).join(","); - return this.find(focusables, element).filter((el) => !isDisabled(el) && isVisible(el)); - }, - getSelectorFromElement(element) { - const selector = getSelector(element); - if (selector) { - return SelectorEngine.findOne(selector) ? selector : null; - } - return null; - }, - getElementFromSelector(element) { - const selector = getSelector(element); - return selector ? SelectorEngine.findOne(selector) : null; - }, - getMultipleElementsFromSelector(element) { - const selector = getSelector(element); - return selector ? SelectorEngine.find(selector) : []; - } - }; - var selector_engine_default = SelectorEngine; - - // ns-hugo-imp:/home/david/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.3+incompatible/js/src/tab.js - var NAME = "tab"; - var DATA_KEY = "bs.tab"; - var EVENT_KEY = `.${DATA_KEY}`; - var EVENT_HIDE = `hide${EVENT_KEY}`; - var EVENT_HIDDEN = `hidden${EVENT_KEY}`; - var EVENT_SHOW = `show${EVENT_KEY}`; - var EVENT_SHOWN = `shown${EVENT_KEY}`; - var EVENT_CLICK_DATA_API = `click${EVENT_KEY}`; - var EVENT_KEYDOWN = `keydown${EVENT_KEY}`; - var EVENT_LOAD_DATA_API = `load${EVENT_KEY}`; - var ARROW_LEFT_KEY = "ArrowLeft"; - var ARROW_RIGHT_KEY = "ArrowRight"; - var ARROW_UP_KEY = "ArrowUp"; - var ARROW_DOWN_KEY = "ArrowDown"; - var HOME_KEY = "Home"; - var END_KEY = "End"; - var CLASS_NAME_ACTIVE = "active"; - var CLASS_NAME_FADE = "fade"; - var CLASS_NAME_SHOW = "show"; - var CLASS_DROPDOWN = "dropdown"; - var SELECTOR_DROPDOWN_TOGGLE = ".dropdown-toggle"; - var SELECTOR_DROPDOWN_MENU = ".dropdown-menu"; - var NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`; - var SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]'; - var SELECTOR_OUTER = ".nav-item, .list-group-item"; - var SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`; - var SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; - var SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`; - var SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`; - var Tab = class _Tab extends base_component_default { - constructor(element) { - super(element); - this._parent = this._element.closest(SELECTOR_TAB_PANEL); - if (!this._parent) { - return; - } - this._setInitialAttributes(this._parent, this._getChildren()); - event_handler_default.on(this._element, EVENT_KEYDOWN, (event) => this._keydown(event)); - } - // Getters - static get NAME() { - return NAME; - } - // Public - show() { - const innerElem = this._element; - if (this._elemIsActive(innerElem)) { - return; - } - const active = this._getActiveElem(); - const hideEvent = active ? event_handler_default.trigger(active, EVENT_HIDE, { relatedTarget: innerElem }) : null; - const showEvent = event_handler_default.trigger(innerElem, EVENT_SHOW, { relatedTarget: active }); - if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) { - return; - } - this._deactivate(active, innerElem); - this._activate(innerElem, active); - } - // Private - _activate(element, relatedElem) { - if (!element) { - return; - } - element.classList.add(CLASS_NAME_ACTIVE); - this._activate(selector_engine_default.getElementFromSelector(element)); - const complete = () => { - if (element.getAttribute("role") !== "tab") { - element.classList.add(CLASS_NAME_SHOW); - return; - } - element.removeAttribute("tabindex"); - element.setAttribute("aria-selected", true); - this._toggleDropDown(element, true); - event_handler_default.trigger(element, EVENT_SHOWN, { - relatedTarget: relatedElem - }); - }; - this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE)); - } - _deactivate(element, relatedElem) { - if (!element) { - return; - } - element.classList.remove(CLASS_NAME_ACTIVE); - element.blur(); - this._deactivate(selector_engine_default.getElementFromSelector(element)); - const complete = () => { - if (element.getAttribute("role") !== "tab") { - element.classList.remove(CLASS_NAME_SHOW); - return; - } - element.setAttribute("aria-selected", false); - element.setAttribute("tabindex", "-1"); - this._toggleDropDown(element, false); - event_handler_default.trigger(element, EVENT_HIDDEN, { relatedTarget: relatedElem }); - }; - this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE)); - } - _keydown(event) { - if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key)) { - return; - } - event.stopPropagation(); - event.preventDefault(); - const children = this._getChildren().filter((element) => !isDisabled(element)); - let nextActiveElement; - if ([HOME_KEY, END_KEY].includes(event.key)) { - nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]; - } else { - const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key); - nextActiveElement = getNextActiveElement(children, event.target, isNext, true); - } - if (nextActiveElement) { - nextActiveElement.focus({ preventScroll: true }); - _Tab.getOrCreateInstance(nextActiveElement).show(); - } - } - _getChildren() { - return selector_engine_default.find(SELECTOR_INNER_ELEM, this._parent); - } - _getActiveElem() { - return this._getChildren().find((child) => this._elemIsActive(child)) || null; - } - _setInitialAttributes(parent, children) { - this._setAttributeIfNotExists(parent, "role", "tablist"); - for (const child of children) { - this._setInitialAttributesOnChild(child); - } - } - _setInitialAttributesOnChild(child) { - child = this._getInnerElement(child); - const isActive = this._elemIsActive(child); - const outerElem = this._getOuterElement(child); - child.setAttribute("aria-selected", isActive); - if (outerElem !== child) { - this._setAttributeIfNotExists(outerElem, "role", "presentation"); - } - if (!isActive) { - child.setAttribute("tabindex", "-1"); - } - this._setAttributeIfNotExists(child, "role", "tab"); - this._setInitialAttributesOnTargetPanel(child); - } - _setInitialAttributesOnTargetPanel(child) { - const target = selector_engine_default.getElementFromSelector(child); - if (!target) { - return; - } - this._setAttributeIfNotExists(target, "role", "tabpanel"); - if (child.id) { - this._setAttributeIfNotExists(target, "aria-labelledby", `${child.id}`); - } - } - _toggleDropDown(element, open) { - const outerElem = this._getOuterElement(element); - if (!outerElem.classList.contains(CLASS_DROPDOWN)) { - return; - } - const toggle = (selector, className) => { - const element2 = selector_engine_default.findOne(selector, outerElem); - if (element2) { - element2.classList.toggle(className, open); - } - }; - toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE); - toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW); - outerElem.setAttribute("aria-expanded", open); - } - _setAttributeIfNotExists(element, attribute, value) { - if (!element.hasAttribute(attribute)) { - element.setAttribute(attribute, value); - } - } - _elemIsActive(elem) { - return elem.classList.contains(CLASS_NAME_ACTIVE); - } - // Try to get the inner element (usually the .nav-link) - _getInnerElement(elem) { - return elem.matches(SELECTOR_INNER_ELEM) ? elem : selector_engine_default.findOne(SELECTOR_INNER_ELEM, elem); - } - // Try to get the outer element (usually the .nav-item) - _getOuterElement(elem) { - return elem.closest(SELECTOR_OUTER) || elem; - } - // Static - static jQueryInterface(config) { - return this.each(function() { - const data = _Tab.getOrCreateInstance(this); - if (typeof config !== "string") { - return; - } - if (data[config] === void 0 || config.startsWith("_") || config === "constructor") { - throw new TypeError(`No method named "${config}"`); - } - data[config](); - }); - } - }; - event_handler_default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function(event) { - if (["A", "AREA"].includes(this.tagName)) { - event.preventDefault(); - } - if (isDisabled(this)) { - return; - } - Tab.getOrCreateInstance(this).show(); - }); - event_handler_default.on(window, EVENT_LOAD_DATA_API, () => { - for (const element of selector_engine_default.find(SELECTOR_DATA_TOGGLE_ACTIVE)) { - Tab.getOrCreateInstance(element); - } - }); - defineJQueryPlugin(Tab); - var tab_default = Tab; - - // - var stdin_default = { - Tab: tab_default - }; -})(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXBAdjUuMy4zK2luY29tcGF0aWJsZS9qcy9zcmMvZG9tL2RhdGEuanMiLCAibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXBAdjUuMy4zK2luY29tcGF0aWJsZS9qcy9zcmMvdXRpbC9pbmRleC5qcyIsICJucy1odWdvLWltcDovaG9tZS9kYXZpZC8uY2FjaGUvaHVnb19jYWNoZS9tb2R1bGVzL2ZpbGVjYWNoZS9tb2R1bGVzL3BrZy9tb2QvZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcEB2NS4zLjMraW5jb21wYXRpYmxlL2pzL3NyYy9kb20vZXZlbnQtaGFuZGxlci5qcyIsICJucy1odWdvLWltcDovaG9tZS9kYXZpZC8uY2FjaGUvaHVnb19jYWNoZS9tb2R1bGVzL2ZpbGVjYWNoZS9tb2R1bGVzL3BrZy9tb2QvZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcEB2NS4zLjMraW5jb21wYXRpYmxlL2pzL3NyYy9kb20vbWFuaXB1bGF0b3IuanMiLCAibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXBAdjUuMy4zK2luY29tcGF0aWJsZS9qcy9zcmMvdXRpbC9jb25maWcuanMiLCAibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXBAdjUuMy4zK2luY29tcGF0aWJsZS9qcy9zcmMvYmFzZS1jb21wb25lbnQuanMiLCAibnMtaHVnby1pbXA6L2hvbWUvZGF2aWQvLmNhY2hlL2h1Z29fY2FjaGUvbW9kdWxlcy9maWxlY2FjaGUvbW9kdWxlcy9wa2cvbW9kL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXBAdjUuMy4zK2luY29tcGF0aWJsZS9qcy9zcmMvZG9tL3NlbGVjdG9yLWVuZ2luZS5qcyIsICJucy1odWdvLWltcDovaG9tZS9kYXZpZC8uY2FjaGUvaHVnb19jYWNoZS9tb2R1bGVzL2ZpbGVjYWNoZS9tb2R1bGVzL3BrZy9tb2QvZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcEB2NS4zLjMraW5jb21wYXRpYmxlL2pzL3NyYy90YWIuanMiLCAiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRvbS9kYXRhLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBlbGVtZW50TWFwID0gbmV3IE1hcCgpXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc2V0KGVsZW1lbnQsIGtleSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoIWVsZW1lbnRNYXAuaGFzKGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50TWFwLnNldChlbGVtZW50LCBuZXcgTWFwKCkpXG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2VNYXAgPSBlbGVtZW50TWFwLmdldChlbGVtZW50KVxuXG4gICAgLy8gbWFrZSBpdCBjbGVhciB3ZSBvbmx5IHdhbnQgb25lIGluc3RhbmNlIHBlciBlbGVtZW50XG4gICAgLy8gY2FuIGJlIHJlbW92ZWQgbGF0ZXIgd2hlbiBtdWx0aXBsZSBrZXkvaW5zdGFuY2VzIGFyZSBmaW5lIHRvIGJlIHVzZWRcbiAgICBpZiAoIWluc3RhbmNlTWFwLmhhcyhrZXkpICYmIGluc3RhbmNlTWFwLnNpemUgIT09IDApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKGBCb290c3RyYXAgZG9lc24ndCBhbGxvdyBtb3JlIHRoYW4gb25lIGluc3RhbmNlIHBlciBlbGVtZW50LiBCb3VuZCBpbnN0YW5jZTogJHtBcnJheS5mcm9tKGluc3RhbmNlTWFwLmtleXMoKSlbMF19LmApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpbnN0YW5jZU1hcC5zZXQoa2V5LCBpbnN0YW5jZSlcbiAgfSxcblxuICBnZXQoZWxlbWVudCwga2V5KSB7XG4gICAgaWYgKGVsZW1lbnRNYXAuaGFzKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gZWxlbWVudE1hcC5nZXQoZWxlbWVudCkuZ2V0KGtleSkgfHwgbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH0sXG5cbiAgcmVtb3ZlKGVsZW1lbnQsIGtleSkge1xuICAgIGlmICghZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlTWFwID0gZWxlbWVudE1hcC5nZXQoZWxlbWVudClcblxuICAgIGluc3RhbmNlTWFwLmRlbGV0ZShrZXkpXG5cbiAgICAvLyBmcmVlIHVwIGVsZW1lbnQgcmVmZXJlbmNlcyBpZiB0aGVyZSBhcmUgbm8gaW5zdGFuY2VzIGxlZnQgZm9yIGFuIGVsZW1lbnRcbiAgICBpZiAoaW5zdGFuY2VNYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgZWxlbWVudE1hcC5kZWxldGUoZWxlbWVudClcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9pbmRleC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmNvbnN0IE1BWF9VSUQgPSAxXzAwMF8wMDBcbmNvbnN0IE1JTExJU0VDT05EU19NVUxUSVBMSUVSID0gMTAwMFxuY29uc3QgVFJBTlNJVElPTl9FTkQgPSAndHJhbnNpdGlvbmVuZCdcblxuLyoqXG4gKiBQcm9wZXJseSBlc2NhcGUgSURzIHNlbGVjdG9ycyB0byBoYW5kbGUgd2VpcmQgSURzXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHBhcnNlU2VsZWN0b3IgPSBzZWxlY3RvciA9PiB7XG4gIGlmIChzZWxlY3RvciAmJiB3aW5kb3cuQ1NTICYmIHdpbmRvdy5DU1MuZXNjYXBlKSB7XG4gICAgLy8gZG9jdW1lbnQucXVlcnlTZWxlY3RvciBuZWVkcyBlc2NhcGluZyB0byBoYW5kbGUgSURzIChodG1sNSspIGNvbnRhaW5pbmcgZm9yIGluc3RhbmNlIC9cbiAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoLyMoW15cXHNcIiMnXSspL2csIChtYXRjaCwgaWQpID0+IGAjJHtDU1MuZXNjYXBlKGlkKX1gKVxuICB9XG5cbiAgcmV0dXJuIHNlbGVjdG9yXG59XG5cbi8vIFNob3V0LW91dCBBbmd1cyBDcm9sbCAoaHR0cHM6Ly9nb28uZ2wvcHh3UUdwKVxuY29uc3QgdG9UeXBlID0gb2JqZWN0ID0+IHtcbiAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCBvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBgJHtvYmplY3R9YFxuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpLm1hdGNoKC9cXHMoW2Etel0rKS9pKVsxXS50b0xvd2VyQ2FzZSgpXG59XG5cbi8qKlxuICogUHVibGljIFV0aWwgQVBJXG4gKi9cblxuY29uc3QgZ2V0VUlEID0gcHJlZml4ID0+IHtcbiAgZG8ge1xuICAgIHByZWZpeCArPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBNQVhfVUlEKVxuICB9IHdoaWxlIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwcmVmaXgpKVxuXG4gIHJldHVybiBwcmVmaXhcbn1cblxuY29uc3QgZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuXG4gIC8vIEdldCB0cmFuc2l0aW9uLWR1cmF0aW9uIG9mIHRoZSBlbGVtZW50XG4gIGxldCB7IHRyYW5zaXRpb25EdXJhdGlvbiwgdHJhbnNpdGlvbkRlbGF5IH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuXG4gIGNvbnN0IGZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uID0gTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkR1cmF0aW9uKVxuICBjb25zdCBmbG9hdFRyYW5zaXRpb25EZWxheSA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSlcblxuICAvLyBSZXR1cm4gMCBpZiBlbGVtZW50IG9yIHRyYW5zaXRpb24gZHVyYXRpb24gaXMgbm90IGZvdW5kXG4gIGlmICghZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gJiYgIWZsb2F0VHJhbnNpdGlvbkRlbGF5KSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuXG4gIC8vIElmIG11bHRpcGxlIGR1cmF0aW9ucyBhcmUgZGVmaW5lZCwgdGFrZSB0aGUgZmlyc3RcbiAgdHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uLnNwbGl0KCcsJylbMF1cbiAgdHJhbnNpdGlvbkRlbGF5ID0gdHJhbnNpdGlvbkRlbGF5LnNwbGl0KCcsJylbMF1cblxuICByZXR1cm4gKE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbikgKyBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpKSAqIE1JTExJU0VDT05EU19NVUxUSVBMSUVSXG59XG5cbmNvbnN0IHRyaWdnZXJUcmFuc2l0aW9uRW5kID0gZWxlbWVudCA9PiB7XG4gIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoVFJBTlNJVElPTl9FTkQpKVxufVxuXG5jb25zdCBpc0VsZW1lbnQgPSBvYmplY3QgPT4ge1xuICBpZiAoIW9iamVjdCB8fCB0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmplY3QuanF1ZXJ5ICE9PSAndW5kZWZpbmVkJykge1xuICAgIG9iamVjdCA9IG9iamVjdFswXVxuICB9XG5cbiAgcmV0dXJuIHR5cGVvZiBvYmplY3Qubm9kZVR5cGUgIT09ICd1bmRlZmluZWQnXG59XG5cbmNvbnN0IGdldEVsZW1lbnQgPSBvYmplY3QgPT4ge1xuICAvLyBpdCdzIGEgalF1ZXJ5IG9iamVjdCBvciBhIG5vZGUgZWxlbWVudFxuICBpZiAoaXNFbGVtZW50KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0LmpxdWVyeSA/IG9iamVjdFswXSA6IG9iamVjdFxuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnICYmIG9iamVjdC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFyc2VTZWxlY3RvcihvYmplY3QpKVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuY29uc3QgaXNWaXNpYmxlID0gZWxlbWVudCA9PiB7XG4gIGlmICghaXNFbGVtZW50KGVsZW1lbnQpIHx8IGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IGVsZW1lbnRJc1Zpc2libGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3Zpc2liaWxpdHknKSA9PT0gJ3Zpc2libGUnXG4gIC8vIEhhbmRsZSBgZGV0YWlsc2AgZWxlbWVudCBhcyBpdHMgY29udGVudCBtYXkgZmFsc2llIGFwcGVhciB2aXNpYmxlIHdoZW4gaXQgaXMgY2xvc2VkXG4gIGNvbnN0IGNsb3NlZERldGFpbHMgPSBlbGVtZW50LmNsb3Nlc3QoJ2RldGFpbHM6bm90KFtvcGVuXSknKVxuXG4gIGlmICghY2xvc2VkRGV0YWlscykge1xuICAgIHJldHVybiBlbGVtZW50SXNWaXNpYmxlXG4gIH1cblxuICBpZiAoY2xvc2VkRGV0YWlscyAhPT0gZWxlbWVudCkge1xuICAgIGNvbnN0IHN1bW1hcnkgPSBlbGVtZW50LmNsb3Nlc3QoJ3N1bW1hcnknKVxuICAgIGlmIChzdW1tYXJ5ICYmIHN1bW1hcnkucGFyZW50Tm9kZSAhPT0gY2xvc2VkRGV0YWlscykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHN1bW1hcnkgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50SXNWaXNpYmxlXG59XG5cbmNvbnN0IGlzRGlzYWJsZWQgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFlbGVtZW50IHx8IGVsZW1lbnQubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAodHlwZW9mIGVsZW1lbnQuZGlzYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuZGlzYWJsZWRcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlzYWJsZWQnKSAhPT0gJ2ZhbHNlJ1xufVxuXG5jb25zdCBmaW5kU2hhZG93Um9vdCA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hdHRhY2hTaGFkb3cpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gQ2FuIGZpbmQgdGhlIHNoYWRvdyByb290IG90aGVyd2lzZSBpdCdsbCByZXR1cm4gdGhlIGRvY3VtZW50XG4gIGlmICh0eXBlb2YgZWxlbWVudC5nZXRSb290Tm9kZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKClcbiAgICByZXR1cm4gcm9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QgPyByb290IDogbnVsbFxuICB9XG5cbiAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgcmV0dXJuIGVsZW1lbnRcbiAgfVxuXG4gIC8vIHdoZW4gd2UgZG9uJ3QgZmluZCBhIHNoYWRvdyByb290XG4gIGlmICghZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiBmaW5kU2hhZG93Um9vdChlbGVtZW50LnBhcmVudE5vZGUpXG59XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fVxuXG4vKipcbiAqIFRyaWNrIHRvIHJlc3RhcnQgYW4gZWxlbWVudCdzIGFuaW1hdGlvblxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4gdm9pZFxuICpcbiAqIEBzZWUgaHR0cHM6Ly93d3cuY2hhcmlzdGhlby5pby9ibG9nLzIwMjEvMDIvcmVzdGFydC1hLWNzcy1hbmltYXRpb24td2l0aC1qYXZhc2NyaXB0LyNyZXN0YXJ0aW5nLWEtY3NzLWFuaW1hdGlvblxuICovXG5jb25zdCByZWZsb3cgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5vZmZzZXRIZWlnaHQgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbn1cblxuY29uc3QgZ2V0alF1ZXJ5ID0gKCkgPT4ge1xuICBpZiAod2luZG93LmpRdWVyeSAmJiAhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoJ2RhdGEtYnMtbm8tanF1ZXJ5JykpIHtcbiAgICByZXR1cm4gd2luZG93LmpRdWVyeVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuY29uc3QgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcyA9IFtdXG5cbmNvbnN0IG9uRE9NQ29udGVudExvYWRlZCA9IGNhbGxiYWNrID0+IHtcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgIC8vIGFkZCBsaXN0ZW5lciBvbiB0aGUgZmlyc3QgY2FsbCB3aGVuIHRoZSBkb2N1bWVudCBpcyBpbiBsb2FkaW5nIHN0YXRlXG4gICAgaWYgKCFET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIERPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MucHVzaChjYWxsYmFjaylcbiAgfSBlbHNlIHtcbiAgICBjYWxsYmFjaygpXG4gIH1cbn1cblxuY29uc3QgaXNSVEwgPSAoKSA9PiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGlyID09PSAncnRsJ1xuXG5jb25zdCBkZWZpbmVKUXVlcnlQbHVnaW4gPSBwbHVnaW4gPT4ge1xuICBvbkRPTUNvbnRlbnRMb2FkZWQoKCkgPT4ge1xuICAgIGNvbnN0ICQgPSBnZXRqUXVlcnkoKVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICgkKSB7XG4gICAgICBjb25zdCBuYW1lID0gcGx1Z2luLk5BTUVcbiAgICAgIGNvbnN0IEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bbmFtZV1cbiAgICAgICQuZm5bbmFtZV0gPSBwbHVnaW4ualF1ZXJ5SW50ZXJmYWNlXG4gICAgICAkLmZuW25hbWVdLkNvbnN0cnVjdG9yID0gcGx1Z2luXG4gICAgICAkLmZuW25hbWVdLm5vQ29uZmxpY3QgPSAoKSA9PiB7XG4gICAgICAgICQuZm5bbmFtZV0gPSBKUVVFUllfTk9fQ09ORkxJQ1RcbiAgICAgICAgcmV0dXJuIHBsdWdpbi5qUXVlcnlJbnRlcmZhY2VcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbmNvbnN0IGV4ZWN1dGUgPSAocG9zc2libGVDYWxsYmFjaywgYXJncyA9IFtdLCBkZWZhdWx0VmFsdWUgPSBwb3NzaWJsZUNhbGxiYWNrKSA9PiB7XG4gIHJldHVybiB0eXBlb2YgcG9zc2libGVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IHBvc3NpYmxlQ2FsbGJhY2soLi4uYXJncykgOiBkZWZhdWx0VmFsdWVcbn1cblxuY29uc3QgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiA9IChjYWxsYmFjaywgdHJhbnNpdGlvbkVsZW1lbnQsIHdhaXRGb3JUcmFuc2l0aW9uID0gdHJ1ZSkgPT4ge1xuICBpZiAoIXdhaXRGb3JUcmFuc2l0aW9uKSB7XG4gICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IGR1cmF0aW9uUGFkZGluZyA9IDVcbiAgY29uc3QgZW11bGF0ZWREdXJhdGlvbiA9IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRyYW5zaXRpb25FbGVtZW50KSArIGR1cmF0aW9uUGFkZGluZ1xuXG4gIGxldCBjYWxsZWQgPSBmYWxzZVxuXG4gIGNvbnN0IGhhbmRsZXIgPSAoeyB0YXJnZXQgfSkgPT4ge1xuICAgIGlmICh0YXJnZXQgIT09IHRyYW5zaXRpb25FbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjYWxsZWQgPSB0cnVlXG4gICAgdHJhbnNpdGlvbkVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihUUkFOU0lUSU9OX0VORCwgaGFuZGxlcilcbiAgICBleGVjdXRlKGNhbGxiYWNrKVxuICB9XG5cbiAgdHJhbnNpdGlvbkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihUUkFOU0lUSU9OX0VORCwgaGFuZGxlcilcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgIHRyaWdnZXJUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25FbGVtZW50KVxuICAgIH1cbiAgfSwgZW11bGF0ZWREdXJhdGlvbilcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHByZXZpb3VzL25leHQgZWxlbWVudCBvZiBhIGxpc3QuXG4gKlxuICogQHBhcmFtIHthcnJheX0gbGlzdCAgICBUaGUgbGlzdCBvZiBlbGVtZW50c1xuICogQHBhcmFtIGFjdGl2ZUVsZW1lbnQgICBUaGUgYWN0aXZlIGVsZW1lbnRcbiAqIEBwYXJhbSBzaG91bGRHZXROZXh0ICAgQ2hvb3NlIHRvIGdldCBuZXh0IG9yIHByZXZpb3VzIGVsZW1lbnRcbiAqIEBwYXJhbSBpc0N5Y2xlQWxsb3dlZFxuICogQHJldHVybiB7RWxlbWVudHxlbGVtfSBUaGUgcHJvcGVyIGVsZW1lbnRcbiAqL1xuY29uc3QgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQgPSAobGlzdCwgYWN0aXZlRWxlbWVudCwgc2hvdWxkR2V0TmV4dCwgaXNDeWNsZUFsbG93ZWQpID0+IHtcbiAgY29uc3QgbGlzdExlbmd0aCA9IGxpc3QubGVuZ3RoXG4gIGxldCBpbmRleCA9IGxpc3QuaW5kZXhPZihhY3RpdmVFbGVtZW50KVxuXG4gIC8vIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBsaXN0IHJldHVybiBhbiBlbGVtZW50XG4gIC8vIGRlcGVuZGluZyBvbiB0aGUgZGlyZWN0aW9uIGFuZCBpZiBjeWNsZSBpcyBhbGxvd2VkXG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gIXNob3VsZEdldE5leHQgJiYgaXNDeWNsZUFsbG93ZWQgPyBsaXN0W2xpc3RMZW5ndGggLSAxXSA6IGxpc3RbMF1cbiAgfVxuXG4gIGluZGV4ICs9IHNob3VsZEdldE5leHQgPyAxIDogLTFcblxuICBpZiAoaXNDeWNsZUFsbG93ZWQpIHtcbiAgICBpbmRleCA9IChpbmRleCArIGxpc3RMZW5ndGgpICUgbGlzdExlbmd0aFxuICB9XG5cbiAgcmV0dXJuIGxpc3RbTWF0aC5tYXgoMCwgTWF0aC5taW4oaW5kZXgsIGxpc3RMZW5ndGggLSAxKSldXG59XG5cbmV4cG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgZXhlY3V0ZSxcbiAgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbixcbiAgZmluZFNoYWRvd1Jvb3QsXG4gIGdldEVsZW1lbnQsXG4gIGdldGpRdWVyeSxcbiAgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQsXG4gIGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50LFxuICBnZXRVSUQsXG4gIGlzRGlzYWJsZWQsXG4gIGlzRWxlbWVudCxcbiAgaXNSVEwsXG4gIGlzVmlzaWJsZSxcbiAgbm9vcCxcbiAgb25ET01Db250ZW50TG9hZGVkLFxuICBwYXJzZVNlbGVjdG9yLFxuICByZWZsb3csXG4gIHRyaWdnZXJUcmFuc2l0aW9uRW5kLFxuICB0b1R5cGVcbn1cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL2V2ZW50LWhhbmRsZXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBnZXRqUXVlcnkgfSBmcm9tICcuLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IG5hbWVzcGFjZVJlZ2V4ID0gL1teLl0qKD89XFwuLiopXFwufC4qL1xuY29uc3Qgc3RyaXBOYW1lUmVnZXggPSAvXFwuLiovXG5jb25zdCBzdHJpcFVpZFJlZ2V4ID0gLzo6XFxkKyQvXG5jb25zdCBldmVudFJlZ2lzdHJ5ID0ge30gLy8gRXZlbnRzIHN0b3JhZ2VcbmxldCB1aWRFdmVudCA9IDFcbmNvbnN0IGN1c3RvbUV2ZW50cyA9IHtcbiAgbW91c2VlbnRlcjogJ21vdXNlb3ZlcicsXG4gIG1vdXNlbGVhdmU6ICdtb3VzZW91dCdcbn1cblxuY29uc3QgbmF0aXZlRXZlbnRzID0gbmV3IFNldChbXG4gICdjbGljaycsXG4gICdkYmxjbGljaycsXG4gICdtb3VzZXVwJyxcbiAgJ21vdXNlZG93bicsXG4gICdjb250ZXh0bWVudScsXG4gICdtb3VzZXdoZWVsJyxcbiAgJ0RPTU1vdXNlU2Nyb2xsJyxcbiAgJ21vdXNlb3ZlcicsXG4gICdtb3VzZW91dCcsXG4gICdtb3VzZW1vdmUnLFxuICAnc2VsZWN0c3RhcnQnLFxuICAnc2VsZWN0ZW5kJyxcbiAgJ2tleWRvd24nLFxuICAna2V5cHJlc3MnLFxuICAna2V5dXAnLFxuICAnb3JpZW50YXRpb25jaGFuZ2UnLFxuICAndG91Y2hzdGFydCcsXG4gICd0b3VjaG1vdmUnLFxuICAndG91Y2hlbmQnLFxuICAndG91Y2hjYW5jZWwnLFxuICAncG9pbnRlcmRvd24nLFxuICAncG9pbnRlcm1vdmUnLFxuICAncG9pbnRlcnVwJyxcbiAgJ3BvaW50ZXJsZWF2ZScsXG4gICdwb2ludGVyY2FuY2VsJyxcbiAgJ2dlc3R1cmVzdGFydCcsXG4gICdnZXN0dXJlY2hhbmdlJyxcbiAgJ2dlc3R1cmVlbmQnLFxuICAnZm9jdXMnLFxuICAnYmx1cicsXG4gICdjaGFuZ2UnLFxuICAncmVzZXQnLFxuICAnc2VsZWN0JyxcbiAgJ3N1Ym1pdCcsXG4gICdmb2N1c2luJyxcbiAgJ2ZvY3Vzb3V0JyxcbiAgJ2xvYWQnLFxuICAndW5sb2FkJyxcbiAgJ2JlZm9yZXVubG9hZCcsXG4gICdyZXNpemUnLFxuICAnbW92ZScsXG4gICdET01Db250ZW50TG9hZGVkJyxcbiAgJ3JlYWR5c3RhdGVjaGFuZ2UnLFxuICAnZXJyb3InLFxuICAnYWJvcnQnLFxuICAnc2Nyb2xsJ1xuXSlcblxuLyoqXG4gKiBQcml2YXRlIG1ldGhvZHNcbiAqL1xuXG5mdW5jdGlvbiBtYWtlRXZlbnRVaWQoZWxlbWVudCwgdWlkKSB7XG4gIHJldHVybiAodWlkICYmIGAke3VpZH06OiR7dWlkRXZlbnQrK31gKSB8fCBlbGVtZW50LnVpZEV2ZW50IHx8IHVpZEV2ZW50Kytcbn1cblxuZnVuY3Rpb24gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KSB7XG4gIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChlbGVtZW50KVxuXG4gIGVsZW1lbnQudWlkRXZlbnQgPSB1aWRcbiAgZXZlbnRSZWdpc3RyeVt1aWRdID0gZXZlbnRSZWdpc3RyeVt1aWRdIHx8IHt9XG5cbiAgcmV0dXJuIGV2ZW50UmVnaXN0cnlbdWlkXVxufVxuXG5mdW5jdGlvbiBib290c3RyYXBIYW5kbGVyKGVsZW1lbnQsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgaHlkcmF0ZU9iaihldmVudCwgeyBkZWxlZ2F0ZVRhcmdldDogZWxlbWVudCB9KVxuXG4gICAgaWYgKGhhbmRsZXIub25lT2ZmKSB7XG4gICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsIGV2ZW50LnR5cGUsIGZuKVxuICAgIH1cblxuICAgIHJldHVybiBmbi5hcHBseShlbGVtZW50LCBbZXZlbnRdKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJvb3RzdHJhcERlbGVnYXRpb25IYW5kbGVyKGVsZW1lbnQsIHNlbGVjdG9yLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgIGNvbnN0IGRvbUVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuXG4gICAgZm9yIChsZXQgeyB0YXJnZXQgfSA9IGV2ZW50OyB0YXJnZXQgJiYgdGFyZ2V0ICE9PSB0aGlzOyB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZSkge1xuICAgICAgZm9yIChjb25zdCBkb21FbGVtZW50IG9mIGRvbUVsZW1lbnRzKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50ICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgaHlkcmF0ZU9iaihldmVudCwgeyBkZWxlZ2F0ZVRhcmdldDogdGFyZ2V0IH0pXG5cbiAgICAgICAgaWYgKGhhbmRsZXIub25lT2ZmKSB7XG4gICAgICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCBldmVudC50eXBlLCBzZWxlY3RvciwgZm4pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGFyZ2V0LCBbZXZlbnRdKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSGFuZGxlcihldmVudHMsIGNhbGxhYmxlLCBkZWxlZ2F0aW9uU2VsZWN0b3IgPSBudWxsKSB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGV2ZW50cylcbiAgICAuZmluZChldmVudCA9PiBldmVudC5jYWxsYWJsZSA9PT0gY2FsbGFibGUgJiYgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yID09PSBkZWxlZ2F0aW9uU2VsZWN0b3IpXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICBjb25zdCBpc0RlbGVnYXRlZCA9IHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJ1xuICAvLyBUT0RPOiB0b29sdGlwIHBhc3NlcyBgZmFsc2VgIGluc3RlYWQgb2Ygc2VsZWN0b3IsIHNvIHdlIG5lZWQgdG8gY2hlY2tcbiAgY29uc3QgY2FsbGFibGUgPSBpc0RlbGVnYXRlZCA/IGRlbGVnYXRpb25GdW5jdGlvbiA6IChoYW5kbGVyIHx8IGRlbGVnYXRpb25GdW5jdGlvbilcbiAgbGV0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChvcmlnaW5hbFR5cGVFdmVudClcblxuICBpZiAoIW5hdGl2ZUV2ZW50cy5oYXModHlwZUV2ZW50KSkge1xuICAgIHR5cGVFdmVudCA9IG9yaWdpbmFsVHlwZUV2ZW50XG4gIH1cblxuICByZXR1cm4gW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XVxufVxuXG5mdW5jdGlvbiBhZGRIYW5kbGVyKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIG9uZU9mZikge1xuICBpZiAodHlwZW9mIG9yaWdpbmFsVHlwZUV2ZW50ICE9PSAnc3RyaW5nJyB8fCAhZWxlbWVudCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgbGV0IFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF0gPSBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pXG5cbiAgLy8gaW4gY2FzZSBvZiBtb3VzZWVudGVyIG9yIG1vdXNlbGVhdmUgd3JhcCB0aGUgaGFuZGxlciB3aXRoaW4gYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBmb3IgaXRzIERPTSBwb3NpdGlvblxuICAvLyB0aGlzIHByZXZlbnRzIHRoZSBoYW5kbGVyIGZyb20gYmVpbmcgZGlzcGF0Y2hlZCB0aGUgc2FtZSB3YXkgYXMgbW91c2VvdmVyIG9yIG1vdXNlb3V0IGRvZXNcbiAgaWYgKG9yaWdpbmFsVHlwZUV2ZW50IGluIGN1c3RvbUV2ZW50cykge1xuICAgIGNvbnN0IHdyYXBGdW5jdGlvbiA9IGZuID0+IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKCFldmVudC5yZWxhdGVkVGFyZ2V0IHx8IChldmVudC5yZWxhdGVkVGFyZ2V0ICE9PSBldmVudC5kZWxlZ2F0ZVRhcmdldCAmJiAhZXZlbnQuZGVsZWdhdGVUYXJnZXQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYWJsZSA9IHdyYXBGdW5jdGlvbihjYWxsYWJsZSlcbiAgfVxuXG4gIGNvbnN0IGV2ZW50cyA9IGdldEVsZW1lbnRFdmVudHMoZWxlbWVudClcbiAgY29uc3QgaGFuZGxlcnMgPSBldmVudHNbdHlwZUV2ZW50XSB8fCAoZXZlbnRzW3R5cGVFdmVudF0gPSB7fSlcbiAgY29uc3QgcHJldmlvdXNGdW5jdGlvbiA9IGZpbmRIYW5kbGVyKGhhbmRsZXJzLCBjYWxsYWJsZSwgaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbClcblxuICBpZiAocHJldmlvdXNGdW5jdGlvbikge1xuICAgIHByZXZpb3VzRnVuY3Rpb24ub25lT2ZmID0gcHJldmlvdXNGdW5jdGlvbi5vbmVPZmYgJiYgb25lT2ZmXG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChjYWxsYWJsZSwgb3JpZ2luYWxUeXBlRXZlbnQucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKVxuICBjb25zdCBmbiA9IGlzRGVsZWdhdGVkID9cbiAgICBib290c3RyYXBEZWxlZ2F0aW9uSGFuZGxlcihlbGVtZW50LCBoYW5kbGVyLCBjYWxsYWJsZSkgOlxuICAgIGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgY2FsbGFibGUpXG5cbiAgZm4uZGVsZWdhdGlvblNlbGVjdG9yID0gaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbFxuICBmbi5jYWxsYWJsZSA9IGNhbGxhYmxlXG4gIGZuLm9uZU9mZiA9IG9uZU9mZlxuICBmbi51aWRFdmVudCA9IHVpZFxuICBoYW5kbGVyc1t1aWRdID0gZm5cblxuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZUV2ZW50LCBmbiwgaXNEZWxlZ2F0ZWQpXG59XG5cbmZ1bmN0aW9uIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25TZWxlY3Rvcikge1xuICBjb25zdCBmbiA9IGZpbmRIYW5kbGVyKGV2ZW50c1t0eXBlRXZlbnRdLCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpXG5cbiAgaWYgKCFmbikge1xuICAgIHJldHVyblxuICB9XG5cbiAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIEJvb2xlYW4oZGVsZWdhdGlvblNlbGVjdG9yKSlcbiAgZGVsZXRlIGV2ZW50c1t0eXBlRXZlbnRdW2ZuLnVpZEV2ZW50XVxufVxuXG5mdW5jdGlvbiByZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIG5hbWVzcGFjZSkge1xuICBjb25zdCBzdG9yZUVsZW1lbnRFdmVudCA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IHt9XG5cbiAgZm9yIChjb25zdCBbaGFuZGxlcktleSwgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgIGlmIChoYW5kbGVyS2V5LmluY2x1ZGVzKG5hbWVzcGFjZSkpIHtcbiAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGV2ZW50LmNhbGxhYmxlLCBldmVudC5kZWxlZ2F0aW9uU2VsZWN0b3IpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFR5cGVFdmVudChldmVudCkge1xuICAvLyBhbGxvdyB0byBnZXQgdGhlIG5hdGl2ZSBldmVudHMgZnJvbSBuYW1lc3BhY2VkIGV2ZW50cyAoJ2NsaWNrLmJzLmJ1dHRvbicgLS0+ICdjbGljaycpXG4gIGV2ZW50ID0gZXZlbnQucmVwbGFjZShzdHJpcE5hbWVSZWdleCwgJycpXG4gIHJldHVybiBjdXN0b21FdmVudHNbZXZlbnRdIHx8IGV2ZW50XG59XG5cbmNvbnN0IEV2ZW50SGFuZGxlciA9IHtcbiAgb24oZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICAgIGFkZEhhbmRsZXIoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgZmFsc2UpXG4gIH0sXG5cbiAgb25lKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICBhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIHRydWUpXG4gIH0sXG5cbiAgb2ZmKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICBpZiAodHlwZW9mIG9yaWdpbmFsVHlwZUV2ZW50ICE9PSAnc3RyaW5nJyB8fCAhZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XSA9IG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbilcbiAgICBjb25zdCBpbk5hbWVzcGFjZSA9IHR5cGVFdmVudCAhPT0gb3JpZ2luYWxUeXBlRXZlbnRcbiAgICBjb25zdCBldmVudHMgPSBnZXRFbGVtZW50RXZlbnRzKGVsZW1lbnQpXG4gICAgY29uc3Qgc3RvcmVFbGVtZW50RXZlbnQgPSBldmVudHNbdHlwZUV2ZW50XSB8fCB7fVxuICAgIGNvbnN0IGlzTmFtZXNwYWNlID0gb3JpZ2luYWxUeXBlRXZlbnQuc3RhcnRzV2l0aCgnLicpXG5cbiAgICBpZiAodHlwZW9mIGNhbGxhYmxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2ltcGxlc3QgY2FzZTogaGFuZGxlciBpcyBwYXNzZWQsIHJlbW92ZSB0aGF0IGxpc3RlbmVyIE9OTFkuXG4gICAgICBpZiAoIU9iamVjdC5rZXlzKHN0b3JlRWxlbWVudEV2ZW50KS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGNhbGxhYmxlLCBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGlzTmFtZXNwYWNlKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnRFdmVudCBvZiBPYmplY3Qua2V5cyhldmVudHMpKSB7XG4gICAgICAgIHJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyhlbGVtZW50LCBldmVudHMsIGVsZW1lbnRFdmVudCwgb3JpZ2luYWxUeXBlRXZlbnQuc2xpY2UoMSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5SGFuZGxlcnMsIGV2ZW50XSBvZiBPYmplY3QuZW50cmllcyhzdG9yZUVsZW1lbnRFdmVudCkpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXJLZXkgPSBrZXlIYW5kbGVycy5yZXBsYWNlKHN0cmlwVWlkUmVnZXgsICcnKVxuXG4gICAgICBpZiAoIWluTmFtZXNwYWNlIHx8IG9yaWdpbmFsVHlwZUV2ZW50LmluY2x1ZGVzKGhhbmRsZXJLZXkpKSB7XG4gICAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGV2ZW50LmNhbGxhYmxlLCBldmVudC5kZWxlZ2F0aW9uU2VsZWN0b3IpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHRyaWdnZXIoZWxlbWVudCwgZXZlbnQsIGFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGV2ZW50ICE9PSAnc3RyaW5nJyB8fCAhZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCAkID0gZ2V0alF1ZXJ5KClcbiAgICBjb25zdCB0eXBlRXZlbnQgPSBnZXRUeXBlRXZlbnQoZXZlbnQpXG4gICAgY29uc3QgaW5OYW1lc3BhY2UgPSBldmVudCAhPT0gdHlwZUV2ZW50XG5cbiAgICBsZXQgalF1ZXJ5RXZlbnQgPSBudWxsXG4gICAgbGV0IGJ1YmJsZXMgPSB0cnVlXG4gICAgbGV0IG5hdGl2ZURpc3BhdGNoID0gdHJ1ZVxuICAgIGxldCBkZWZhdWx0UHJldmVudGVkID0gZmFsc2VcblxuICAgIGlmIChpbk5hbWVzcGFjZSAmJiAkKSB7XG4gICAgICBqUXVlcnlFdmVudCA9ICQuRXZlbnQoZXZlbnQsIGFyZ3MpXG5cbiAgICAgICQoZWxlbWVudCkudHJpZ2dlcihqUXVlcnlFdmVudClcbiAgICAgIGJ1YmJsZXMgPSAhalF1ZXJ5RXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKVxuICAgICAgbmF0aXZlRGlzcGF0Y2ggPSAhalF1ZXJ5RXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKVxuICAgICAgZGVmYXVsdFByZXZlbnRlZCA9IGpRdWVyeUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpXG4gICAgfVxuXG4gICAgY29uc3QgZXZ0ID0gaHlkcmF0ZU9iaihuZXcgRXZlbnQoZXZlbnQsIHsgYnViYmxlcywgY2FuY2VsYWJsZTogdHJ1ZSB9KSwgYXJncylcblxuICAgIGlmIChkZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgIH1cblxuICAgIGlmIChuYXRpdmVEaXNwYXRjaCkge1xuICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2dClcbiAgICB9XG5cbiAgICBpZiAoZXZ0LmRlZmF1bHRQcmV2ZW50ZWQgJiYgalF1ZXJ5RXZlbnQpIHtcbiAgICAgIGpRdWVyeUV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICB9XG5cbiAgICByZXR1cm4gZXZ0XG4gIH1cbn1cblxuZnVuY3Rpb24gaHlkcmF0ZU9iaihvYmosIG1ldGEgPSB7fSkge1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhKSkge1xuICAgIHRyeSB7XG4gICAgICBvYmpba2V5XSA9IHZhbHVlXG4gICAgfSBjYXRjaCB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG5leHBvcnQgZGVmYXVsdCBFdmVudEhhbmRsZXJcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL21hbmlwdWxhdG9yLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuZnVuY3Rpb24gbm9ybWFsaXplRGF0YSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gTnVtYmVyKHZhbHVlKS50b1N0cmluZygpKSB7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSlcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09ICdudWxsJykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVEYXRhS2V5KGtleSkge1xuICByZXR1cm4ga2V5LnJlcGxhY2UoL1tBLVpdL2csIGNociA9PiBgLSR7Y2hyLnRvTG93ZXJDYXNlKCl9YClcbn1cblxuY29uc3QgTWFuaXB1bGF0b3IgPSB7XG4gIHNldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5LCB2YWx1ZSkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWAsIHZhbHVlKVxuICB9LFxuXG4gIHJlbW92ZURhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5KSB7XG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYGRhdGEtYnMtJHtub3JtYWxpemVEYXRhS2V5KGtleSl9YClcbiAgfSxcblxuICBnZXREYXRhQXR0cmlidXRlcyhlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge31cbiAgICBjb25zdCBic0tleXMgPSBPYmplY3Qua2V5cyhlbGVtZW50LmRhdGFzZXQpLmZpbHRlcihrZXkgPT4ga2V5LnN0YXJ0c1dpdGgoJ2JzJykgJiYgIWtleS5zdGFydHNXaXRoKCdic0NvbmZpZycpKVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgYnNLZXlzKSB7XG4gICAgICBsZXQgcHVyZUtleSA9IGtleS5yZXBsYWNlKC9eYnMvLCAnJylcbiAgICAgIHB1cmVLZXkgPSBwdXJlS2V5LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgcHVyZUtleS5zbGljZSgxLCBwdXJlS2V5Lmxlbmd0aClcbiAgICAgIGF0dHJpYnV0ZXNbcHVyZUtleV0gPSBub3JtYWxpemVEYXRhKGVsZW1lbnQuZGF0YXNldFtrZXldKVxuICAgIH1cblxuICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gIH0sXG5cbiAgZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRGF0YShlbGVtZW50LmdldEF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYW5pcHVsYXRvclxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2NvbmZpZy5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuLi9kb20vbWFuaXB1bGF0b3IuanMnXG5pbXBvcnQgeyBpc0VsZW1lbnQsIHRvVHlwZSB9IGZyb20gJy4vaW5kZXguanMnXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIENvbmZpZyB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiB7fVxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBoYXZlIHRvIGltcGxlbWVudCB0aGUgc3RhdGljIG1ldGhvZCBcIk5BTUVcIiwgZm9yIGVhY2ggY29tcG9uZW50IScpXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZylcbiAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZylcbiAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9tZXJnZUNvbmZpZ09iaihjb25maWcsIGVsZW1lbnQpIHtcbiAgICBjb25zdCBqc29uQ29uZmlnID0gaXNFbGVtZW50KGVsZW1lbnQpID8gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCAnY29uZmlnJykgOiB7fSAvLyB0cnkgdG8gcGFyc2VcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHQsXG4gICAgICAuLi4odHlwZW9mIGpzb25Db25maWcgPT09ICdvYmplY3QnID8ganNvbkNvbmZpZyA6IHt9KSxcbiAgICAgIC4uLihpc0VsZW1lbnQoZWxlbWVudCkgPyBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlcyhlbGVtZW50KSA6IHt9KSxcbiAgICAgIC4uLih0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IHt9KVxuICAgIH1cbiAgfVxuXG4gIF90eXBlQ2hlY2tDb25maWcoY29uZmlnLCBjb25maWdUeXBlcyA9IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpIHtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eSwgZXhwZWN0ZWRUeXBlc10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnVHlwZXMpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1twcm9wZXJ0eV1cbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IGlzRWxlbWVudCh2YWx1ZSkgPyAnZWxlbWVudCcgOiB0b1R5cGUodmFsdWUpXG5cbiAgICAgIGlmICghbmV3IFJlZ0V4cChleHBlY3RlZFR5cGVzKS50ZXN0KHZhbHVlVHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcIiR7cHJvcGVydHl9XCIgcHJvdmlkZWQgdHlwZSBcIiR7dmFsdWVUeXBlfVwiIGJ1dCBleHBlY3RlZCB0eXBlIFwiJHtleHBlY3RlZFR5cGVzfVwiLmBcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb25maWdcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgYmFzZS1jb21wb25lbnQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgRGF0YSBmcm9tICcuL2RvbS9kYXRhLmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IENvbmZpZyBmcm9tICcuL3V0aWwvY29uZmlnLmpzJ1xuaW1wb3J0IHsgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiwgZ2V0RWxlbWVudCB9IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBWRVJTSU9OID0gJzUuMy4zJ1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBCYXNlQ29tcG9uZW50IGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgZWxlbWVudCA9IGdldEVsZW1lbnQoZWxlbWVudClcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcblxuICAgIERhdGEuc2V0KHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVksIHRoaXMpXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZGlzcG9zZSgpIHtcbiAgICBEYXRhLnJlbW92ZSh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZKVxuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9LRVkpXG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkge1xuICAgICAgdGhpc1twcm9wZXJ0eU5hbWVdID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIF9xdWV1ZUNhbGxiYWNrKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkID0gdHJ1ZSkge1xuICAgIGV4ZWN1dGVBZnRlclRyYW5zaXRpb24oY2FsbGJhY2ssIGVsZW1lbnQsIGlzQW5pbWF0ZWQpXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgdGhpcy5fZWxlbWVudClcbiAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZylcbiAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgZ2V0SW5zdGFuY2UoZWxlbWVudCkge1xuICAgIHJldHVybiBEYXRhLmdldChnZXRFbGVtZW50KGVsZW1lbnQpLCB0aGlzLkRBVEFfS0VZKVxuICB9XG5cbiAgc3RhdGljIGdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJbnN0YW5jZShlbGVtZW50KSB8fCBuZXcgdGhpcyhlbGVtZW50LCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGwpXG4gIH1cblxuICBzdGF0aWMgZ2V0IFZFUlNJT04oKSB7XG4gICAgcmV0dXJuIFZFUlNJT05cbiAgfVxuXG4gIHN0YXRpYyBnZXQgREFUQV9LRVkoKSB7XG4gICAgcmV0dXJuIGBicy4ke3RoaXMuTkFNRX1gXG4gIH1cblxuICBzdGF0aWMgZ2V0IEVWRU5UX0tFWSgpIHtcbiAgICByZXR1cm4gYC4ke3RoaXMuREFUQV9LRVl9YFxuICB9XG5cbiAgc3RhdGljIGV2ZW50TmFtZShuYW1lKSB7XG4gICAgcmV0dXJuIGAke25hbWV9JHt0aGlzLkVWRU5UX0tFWX1gXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQmFzZUNvbXBvbmVudFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkb20vc2VsZWN0b3ItZW5naW5lLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IHsgaXNEaXNhYmxlZCwgaXNWaXNpYmxlLCBwYXJzZVNlbGVjdG9yIH0gZnJvbSAnLi4vdXRpbC9pbmRleC5qcydcblxuY29uc3QgZ2V0U2VsZWN0b3IgPSBlbGVtZW50ID0+IHtcbiAgbGV0IHNlbGVjdG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtdGFyZ2V0JylcblxuICBpZiAoIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSAnIycpIHtcbiAgICBsZXQgaHJlZkF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJylcblxuICAgIC8vIFRoZSBvbmx5IHZhbGlkIGNvbnRlbnQgdGhhdCBjb3VsZCBkb3VibGUgYXMgYSBzZWxlY3RvciBhcmUgSURzIG9yIGNsYXNzZXMsXG4gICAgLy8gc28gZXZlcnl0aGluZyBzdGFydGluZyB3aXRoIGAjYCBvciBgLmAuIElmIGEgXCJyZWFsXCIgVVJMIGlzIHVzZWQgYXMgdGhlIHNlbGVjdG9yLFxuICAgIC8vIGBkb2N1bWVudC5xdWVyeVNlbGVjdG9yYCB3aWxsIHJpZ2h0ZnVsbHkgY29tcGxhaW4gaXQgaXMgaW52YWxpZC5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8zMjI3M1xuICAgIGlmICghaHJlZkF0dHJpYnV0ZSB8fCAoIWhyZWZBdHRyaWJ1dGUuaW5jbHVkZXMoJyMnKSAmJiAhaHJlZkF0dHJpYnV0ZS5zdGFydHNXaXRoKCcuJykpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8vIEp1c3QgaW4gY2FzZSBzb21lIENNUyBwdXRzIG91dCBhIGZ1bGwgVVJMIHdpdGggdGhlIGFuY2hvciBhcHBlbmRlZFxuICAgIGlmIChocmVmQXR0cmlidXRlLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyaWJ1dGUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICBocmVmQXR0cmlidXRlID0gYCMke2hyZWZBdHRyaWJ1dGUuc3BsaXQoJyMnKVsxXX1gXG4gICAgfVxuXG4gICAgc2VsZWN0b3IgPSBocmVmQXR0cmlidXRlICYmIGhyZWZBdHRyaWJ1dGUgIT09ICcjJyA/IGhyZWZBdHRyaWJ1dGUudHJpbSgpIDogbnVsbFxuICB9XG5cbiAgcmV0dXJuIHNlbGVjdG9yID8gc2VsZWN0b3Iuc3BsaXQoJywnKS5tYXAoc2VsID0+IHBhcnNlU2VsZWN0b3Ioc2VsKSkuam9pbignLCcpIDogbnVsbFxufVxuXG5jb25zdCBTZWxlY3RvckVuZ2luZSA9IHtcbiAgZmluZChzZWxlY3RvciwgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgIHJldHVybiBbXS5jb25jYXQoLi4uRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbC5jYWxsKGVsZW1lbnQsIHNlbGVjdG9yKSlcbiAgfSxcblxuICBmaW5kT25lKHNlbGVjdG9yLCBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgcmV0dXJuIEVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3IuY2FsbChlbGVtZW50LCBzZWxlY3RvcilcbiAgfSxcblxuICBjaGlsZHJlbihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIHJldHVybiBbXS5jb25jYXQoLi4uZWxlbWVudC5jaGlsZHJlbikuZmlsdGVyKGNoaWxkID0+IGNoaWxkLm1hdGNoZXMoc2VsZWN0b3IpKVxuICB9LFxuXG4gIHBhcmVudHMoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICBjb25zdCBwYXJlbnRzID0gW11cbiAgICBsZXQgYW5jZXN0b3IgPSBlbGVtZW50LnBhcmVudE5vZGUuY2xvc2VzdChzZWxlY3RvcilcblxuICAgIHdoaWxlIChhbmNlc3Rvcikge1xuICAgICAgcGFyZW50cy5wdXNoKGFuY2VzdG9yKVxuICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnROb2RlLmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudHNcbiAgfSxcblxuICBwcmV2KGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgbGV0IHByZXZpb3VzID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXG5cbiAgICB3aGlsZSAocHJldmlvdXMpIHtcbiAgICAgIGlmIChwcmV2aW91cy5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICByZXR1cm4gW3ByZXZpb3VzXVxuICAgICAgfVxuXG4gICAgICBwcmV2aW91cyA9IHByZXZpb3VzLnByZXZpb3VzRWxlbWVudFNpYmxpbmdcbiAgICB9XG5cbiAgICByZXR1cm4gW11cbiAgfSxcbiAgLy8gVE9ETzogdGhpcyBpcyBub3cgdW51c2VkOyByZW1vdmUgbGF0ZXIgYWxvbmcgd2l0aCBwcmV2KClcbiAgbmV4dChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGxldCBuZXh0ID0gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmdcblxuICAgIHdoaWxlIChuZXh0KSB7XG4gICAgICBpZiAobmV4dC5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICByZXR1cm4gW25leHRdXG4gICAgICB9XG5cbiAgICAgIG5leHQgPSBuZXh0Lm5leHRFbGVtZW50U2libGluZ1xuICAgIH1cblxuICAgIHJldHVybiBbXVxuICB9LFxuXG4gIGZvY3VzYWJsZUNoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICBjb25zdCBmb2N1c2FibGVzID0gW1xuICAgICAgJ2EnLFxuICAgICAgJ2J1dHRvbicsXG4gICAgICAnaW5wdXQnLFxuICAgICAgJ3RleHRhcmVhJyxcbiAgICAgICdzZWxlY3QnLFxuICAgICAgJ2RldGFpbHMnLFxuICAgICAgJ1t0YWJpbmRleF0nLFxuICAgICAgJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJ1xuICAgIF0ubWFwKHNlbGVjdG9yID0+IGAke3NlbGVjdG9yfTpub3QoW3RhYmluZGV4Xj1cIi1cIl0pYCkuam9pbignLCcpXG5cbiAgICByZXR1cm4gdGhpcy5maW5kKGZvY3VzYWJsZXMsIGVsZW1lbnQpLmZpbHRlcihlbCA9PiAhaXNEaXNhYmxlZChlbCkgJiYgaXNWaXNpYmxlKGVsKSlcbiAgfSxcblxuICBnZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW1lbnQpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpXG5cbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kT25lKHNlbGVjdG9yKSA/IHNlbGVjdG9yIDogbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH0sXG5cbiAgZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KVxuXG4gICAgcmV0dXJuIHNlbGVjdG9yID8gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvcikgOiBudWxsXG4gIH0sXG5cbiAgZ2V0TXVsdGlwbGVFbGVtZW50c0Zyb21TZWxlY3RvcihlbGVtZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KVxuXG4gICAgcmV0dXJuIHNlbGVjdG9yID8gU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvcikgOiBbXVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNlbGVjdG9yRW5naW5lXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHRhYi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHsgZGVmaW5lSlF1ZXJ5UGx1Z2luLCBnZXROZXh0QWN0aXZlRWxlbWVudCwgaXNEaXNhYmxlZCB9IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ3RhYidcbmNvbnN0IERBVEFfS0VZID0gJ2JzLnRhYidcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5cbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTiA9IGBrZXlkb3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfTE9BRF9EQVRBX0FQSSA9IGBsb2FkJHtFVkVOVF9LRVl9YFxuXG5jb25zdCBBUlJPV19MRUZUX0tFWSA9ICdBcnJvd0xlZnQnXG5jb25zdCBBUlJPV19SSUdIVF9LRVkgPSAnQXJyb3dSaWdodCdcbmNvbnN0IEFSUk9XX1VQX0tFWSA9ICdBcnJvd1VwJ1xuY29uc3QgQVJST1dfRE9XTl9LRVkgPSAnQXJyb3dEb3duJ1xuY29uc3QgSE9NRV9LRVkgPSAnSG9tZSdcbmNvbnN0IEVORF9LRVkgPSAnRW5kJ1xuXG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfRFJPUERPV04gPSAnZHJvcGRvd24nXG5cbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICcuZHJvcGRvd24tdG9nZ2xlJ1xuY29uc3QgU0VMRUNUT1JfRFJPUERPV05fTUVOVSA9ICcuZHJvcGRvd24tbWVudSdcbmNvbnN0IE5PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUgPSBgOm5vdCgke1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX0pYFxuXG5jb25zdCBTRUxFQ1RPUl9UQUJfUEFORUwgPSAnLmxpc3QtZ3JvdXAsIC5uYXYsIFtyb2xlPVwidGFibGlzdFwiXSdcbmNvbnN0IFNFTEVDVE9SX09VVEVSID0gJy5uYXYtaXRlbSwgLmxpc3QtZ3JvdXAtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0lOTkVSID0gYC5uYXYtbGluayR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX0sIC5saXN0LWdyb3VwLWl0ZW0ke05PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEV9LCBbcm9sZT1cInRhYlwiXSR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX1gXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJ0YWJcIl0sIFtkYXRhLWJzLXRvZ2dsZT1cInBpbGxcIl0sIFtkYXRhLWJzLXRvZ2dsZT1cImxpc3RcIl0nIC8vIFRPRE86IGNvdWxkIG9ubHkgYmUgYHRhYmAgaW4gdjZcbmNvbnN0IFNFTEVDVE9SX0lOTkVSX0VMRU0gPSBgJHtTRUxFQ1RPUl9JTk5FUn0sICR7U0VMRUNUT1JfREFUQV9UT0dHTEV9YFxuXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9BQ1RJVkUgPSBgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwidGFiXCJdLCAuJHtDTEFTU19OQU1FX0FDVElWRX1bZGF0YS1icy10b2dnbGU9XCJwaWxsXCJdLCAuJHtDTEFTU19OQU1FX0FDVElWRX1bZGF0YS1icy10b2dnbGU9XCJsaXN0XCJdYFxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBUYWIgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xuICAgIHN1cGVyKGVsZW1lbnQpXG4gICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX1RBQl9QQU5FTClcblxuICAgIGlmICghdGhpcy5fcGFyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICAgIC8vIFRPRE86IHNob3VsZCB0aHJvdyBleGNlcHRpb24gaW4gdjZcbiAgICAgIC8vIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZWxlbWVudC5vdXRlckhUTUx9IGhhcyBub3QgYSB2YWxpZCBwYXJlbnQgJHtTRUxFQ1RPUl9JTk5FUl9FTEVNfWApXG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIGluaXRpYWwgYXJpYSBhdHRyaWJ1dGVzXG4gICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXModGhpcy5fcGFyZW50LCB0aGlzLl9nZXRDaGlsZHJlbigpKVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWURPV04sIGV2ZW50ID0+IHRoaXMuX2tleWRvd24oZXZlbnQpKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBzaG93KCkgeyAvLyBTaG93cyB0aGlzIGVsZW0gYW5kIGRlYWN0aXZhdGUgdGhlIGFjdGl2ZSBzaWJsaW5nIGlmIGV4aXN0c1xuICAgIGNvbnN0IGlubmVyRWxlbSA9IHRoaXMuX2VsZW1lbnRcbiAgICBpZiAodGhpcy5fZWxlbUlzQWN0aXZlKGlubmVyRWxlbSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFNlYXJjaCBmb3IgYWN0aXZlIHRhYiBvbiBzYW1lIHBhcmVudCB0byBkZWFjdGl2YXRlIGl0XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5fZ2V0QWN0aXZlRWxlbSgpXG5cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBhY3RpdmUgP1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIoYWN0aXZlLCBFVkVOVF9ISURFLCB7IHJlbGF0ZWRUYXJnZXQ6IGlubmVyRWxlbSB9KSA6XG4gICAgICBudWxsXG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcihpbm5lckVsZW0sIEVWRU5UX1NIT1csIHsgcmVsYXRlZFRhcmdldDogYWN0aXZlIH0pXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgKGhpZGVFdmVudCAmJiBoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2RlYWN0aXZhdGUoYWN0aXZlLCBpbm5lckVsZW0pXG4gICAgdGhpcy5fYWN0aXZhdGUoaW5uZXJFbGVtLCBhY3RpdmUpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9hY3RpdmF0ZShlbGVtZW50LCByZWxhdGVkRWxlbSkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuXG4gICAgdGhpcy5fYWN0aXZhdGUoU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KSkgLy8gU2VhcmNoIGFuZCBhY3RpdmF0ZS9zaG93IHRoZSBwcm9wZXIgc2VjdGlvblxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSAhPT0gJ3RhYicpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIHRydWUpXG4gICAgICB0aGlzLl90b2dnbGVEcm9wRG93bihlbGVtZW50LCB0cnVlKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIoZWxlbWVudCwgRVZFTlRfU0hPV04sIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogcmVsYXRlZEVsZW1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgZWxlbWVudCwgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKSlcbiAgfVxuXG4gIF9kZWFjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgZWxlbWVudC5ibHVyKClcblxuICAgIHRoaXMuX2RlYWN0aXZhdGUoU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KSkgLy8gU2VhcmNoIGFuZCBkZWFjdGl2YXRlIHRoZSBzaG93biBzZWN0aW9uIHRvb1xuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSAhPT0gJ3RhYicpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgZmFsc2UpXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKVxuICAgICAgdGhpcy5fdG9nZ2xlRHJvcERvd24oZWxlbWVudCwgZmFsc2UpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcihlbGVtZW50LCBFVkVOVF9ISURERU4sIHsgcmVsYXRlZFRhcmdldDogcmVsYXRlZEVsZW0gfSlcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCBlbGVtZW50LCBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpKVxuICB9XG5cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoIShbQVJST1dfTEVGVF9LRVksIEFSUk9XX1JJR0hUX0tFWSwgQVJST1dfVVBfS0VZLCBBUlJPV19ET1dOX0tFWSwgSE9NRV9LRVksIEVORF9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSkpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKS8vIHN0b3BQcm9wYWdhdGlvbi9wcmV2ZW50RGVmYXVsdCBib3RoIGFkZGVkIHRvIHN1cHBvcnQgdXAvZG93biBrZXlzIHdpdGhvdXQgc2Nyb2xsaW5nIHRoZSBwYWdlXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9nZXRDaGlsZHJlbigpLmZpbHRlcihlbGVtZW50ID0+ICFpc0Rpc2FibGVkKGVsZW1lbnQpKVxuICAgIGxldCBuZXh0QWN0aXZlRWxlbWVudFxuXG4gICAgaWYgKFtIT01FX0tFWSwgRU5EX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgbmV4dEFjdGl2ZUVsZW1lbnQgPSBjaGlsZHJlbltldmVudC5rZXkgPT09IEhPTUVfS0VZID8gMCA6IGNoaWxkcmVuLmxlbmd0aCAtIDFdXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlzTmV4dCA9IFtBUlJPV19SSUdIVF9LRVksIEFSUk9XX0RPV05fS0VZXS5pbmNsdWRlcyhldmVudC5rZXkpXG4gICAgICBuZXh0QWN0aXZlRWxlbWVudCA9IGdldE5leHRBY3RpdmVFbGVtZW50KGNoaWxkcmVuLCBldmVudC50YXJnZXQsIGlzTmV4dCwgdHJ1ZSlcbiAgICB9XG5cbiAgICBpZiAobmV4dEFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIG5leHRBY3RpdmVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KVxuICAgICAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UobmV4dEFjdGl2ZUVsZW1lbnQpLnNob3coKVxuICAgIH1cbiAgfVxuXG4gIF9nZXRDaGlsZHJlbigpIHsgLy8gY29sbGVjdGlvbiBvZiBpbm5lciBlbGVtZW50c1xuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lOTkVSX0VMRU0sIHRoaXMuX3BhcmVudClcbiAgfVxuXG4gIF9nZXRBY3RpdmVFbGVtKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRDaGlsZHJlbigpLmZpbmQoY2hpbGQgPT4gdGhpcy5fZWxlbUlzQWN0aXZlKGNoaWxkKSkgfHwgbnVsbFxuICB9XG5cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzKHBhcmVudCwgY2hpbGRyZW4pIHtcbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhwYXJlbnQsICdyb2xlJywgJ3RhYmxpc3QnKVxuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXNPbkNoaWxkKGNoaWxkKVxuICAgIH1cbiAgfVxuXG4gIF9zZXRJbml0aWFsQXR0cmlidXRlc09uQ2hpbGQoY2hpbGQpIHtcbiAgICBjaGlsZCA9IHRoaXMuX2dldElubmVyRWxlbWVudChjaGlsZClcbiAgICBjb25zdCBpc0FjdGl2ZSA9IHRoaXMuX2VsZW1Jc0FjdGl2ZShjaGlsZClcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoY2hpbGQpXG4gICAgY2hpbGQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgaXNBY3RpdmUpXG5cbiAgICBpZiAob3V0ZXJFbGVtICE9PSBjaGlsZCkge1xuICAgICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMob3V0ZXJFbGVtLCAncm9sZScsICdwcmVzZW50YXRpb24nKVxuICAgIH1cblxuICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKVxuICAgIH1cblxuICAgIHRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKGNoaWxkLCAncm9sZScsICd0YWInKVxuXG4gICAgLy8gc2V0IGF0dHJpYnV0ZXMgdG8gdGhlIHJlbGF0ZWQgcGFuZWwgdG9vXG4gICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXNPblRhcmdldFBhbmVsKGNoaWxkKVxuICB9XG5cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzT25UYXJnZXRQYW5lbChjaGlsZCkge1xuICAgIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IoY2hpbGQpXG5cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHModGFyZ2V0LCAncm9sZScsICd0YWJwYW5lbCcpXG5cbiAgICBpZiAoY2hpbGQuaWQpIHtcbiAgICAgIHRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKHRhcmdldCwgJ2FyaWEtbGFiZWxsZWRieScsIGAke2NoaWxkLmlkfWApXG4gICAgfVxuICB9XG5cbiAgX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIG9wZW4pIHtcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoZWxlbWVudClcbiAgICBpZiAoIW91dGVyRWxlbS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfRFJPUERPV04pKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0b2dnbGUgPSAoc2VsZWN0b3IsIGNsYXNzTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IsIG91dGVyRWxlbSlcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShjbGFzc05hbWUsIG9wZW4pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdG9nZ2xlKFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSwgQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgdG9nZ2xlKFNFTEVDVE9SX0RST1BET1dOX01FTlUsIENMQVNTX05BTUVfU0hPVylcbiAgICBvdXRlckVsZW0uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgb3BlbilcbiAgfVxuXG4gIF9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhlbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIF9lbGVtSXNBY3RpdmUoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0FDVElWRSlcbiAgfVxuXG4gIC8vIFRyeSB0byBnZXQgdGhlIGlubmVyIGVsZW1lbnQgKHVzdWFsbHkgdGhlIC5uYXYtbGluaylcbiAgX2dldElubmVyRWxlbWVudChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0ubWF0Y2hlcyhTRUxFQ1RPUl9JTk5FUl9FTEVNKSA/IGVsZW0gOiBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0lOTkVSX0VMRU0sIGVsZW0pXG4gIH1cblxuICAvLyBUcnkgdG8gZ2V0IHRoZSBvdXRlciBlbGVtZW50ICh1c3VhbGx5IHRoZSAubmF2LWl0ZW0pXG4gIF9nZXRPdXRlckVsZW1lbnQoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLmNsb3Nlc3QoU0VMRUNUT1JfT1VURVIpIHx8IGVsZW1cbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGFbY29uZmlnXSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zdGFydHNXaXRoKCdfJykgfHwgY29uZmlnID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykuc2hvdygpXG59KVxuXG4vKipcbiAqIEluaXRpYWxpemUgb24gZm9jdXNcbiAqL1xuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRV9BQ1RJVkUpKSB7XG4gICAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudClcbiAgfVxufSlcbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRhYilcblxuZXhwb3J0IGRlZmF1bHQgVGFiXG4iLCAiLy8gSW1wb3J0IHRoZSBCb290c3RyYXAgY29tcG9uZW50cyB3ZSB3YW50IHRvIHVzZS5cbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL2pzL2luZGV4LnVtZC5qc1xuaW1wb3J0IFRhYiBmcm9tIFwiL2pzL2Jvb3RzdHJhcC9zcmMvdGFiXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBUYWJcbn0iXSwKICAibWFwcGluZ3MiOiAiOztBQVdBLE1BQU0sYUFBYSxvQkFBSSxJQUFJO0FBRTNCLE1BQU8sZUFBUTtBQUFBLElBQ2IsSUFBSSxTQUFTLEtBQUssVUFBVTtBQUMxQixVQUFJLENBQUMsV0FBVyxJQUFJLE9BQU8sR0FBRztBQUM1QixtQkFBVyxJQUFJLFNBQVMsb0JBQUksSUFBSSxDQUFDO0FBQUEsTUFDbkM7QUFFQSxZQUFNLGNBQWMsV0FBVyxJQUFJLE9BQU87QUFJMUMsVUFBSSxDQUFDLFlBQVksSUFBSSxHQUFHLEtBQUssWUFBWSxTQUFTLEdBQUc7QUFFbkQsZ0JBQVEsTUFBTSwrRUFBK0UsTUFBTSxLQUFLLFlBQVksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUc7QUFDakk7QUFBQSxNQUNGO0FBRUEsa0JBQVksSUFBSSxLQUFLLFFBQVE7QUFBQSxJQUMvQjtBQUFBLElBRUEsSUFBSSxTQUFTLEtBQUs7QUFDaEIsVUFBSSxXQUFXLElBQUksT0FBTyxHQUFHO0FBQzNCLGVBQU8sV0FBVyxJQUFJLE9BQU8sRUFBRSxJQUFJLEdBQUcsS0FBSztBQUFBLE1BQzdDO0FBRUEsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLE9BQU8sU0FBUyxLQUFLO0FBQ25CLFVBQUksQ0FBQyxXQUFXLElBQUksT0FBTyxHQUFHO0FBQzVC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 diff --git a/public/js/bundle.js b/public/js/bundle.js deleted file mode 100644 index f182d2e..0000000 --- a/public/js/bundle.js +++ /dev/null @@ -1,30 +0,0 @@ -// Menu sticky -function windowScroll() { - const navbar = document.getElementById("topnav"); - if(navbar!=null){ - if ( - document.body.scrollTop >= 50 || - document.documentElement.scrollTop >= 50 - ) { - navbar.classList.add("nav-sticky"); - } else { - navbar.classList.remove("nav-sticky"); - } - } -} - -window.addEventListener('scroll', (ev) => { - ev.preventDefault(); - windowScroll(); -}) - -// Toggle menu -function toggleMenu() { - document.getElementById('isToggle').classList.toggle('open'); - var isOpen = document.getElementById('navigation') - if (isOpen.style.display === "block") { - isOpen.style.display = "none"; - } else { - isOpen.style.display = "block"; - } -}; \ No newline at end of file diff --git a/public/js/bundle.min.d26bada42aacabf0a605636aba0bce9543bb24ed6b0f215dfa05077278d571a26b3e2cea8da2843e8256ffc49825559c.js b/public/js/bundle.min.d26bada42aacabf0a605636aba0bce9543bb24ed6b0f215dfa05077278d571a26b3e2cea8da2843e8256ffc49825559c.js new file mode 100644 index 0000000..2784dac --- /dev/null +++ b/public/js/bundle.min.d26bada42aacabf0a605636aba0bce9543bb24ed6b0f215dfa05077278d571a26b3e2cea8da2843e8256ffc49825559c.js @@ -0,0 +1 @@ +function windowScroll(){const e=document.getElementById("topnav");e!=null&&(document.body.scrollTop>=50||document.documentElement.scrollTop>=50?e.classList.add("nav-sticky"):e.classList.remove("nav-sticky"))}window.addEventListener("scroll",e=>{e.preventDefault(),windowScroll()});function toggleMenu(){document.getElementById("isToggle").classList.toggle("open");var e=document.getElementById("navigation");e.style.display==="block"?e.style.display="none":e.style.display="block"} \ No newline at end of file diff --git a/public/js/image-compare.js b/public/js/image-compare.js deleted file mode 100644 index 5f6be01..0000000 --- a/public/js/image-compare.js +++ /dev/null @@ -1 +0,0 @@ -!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("ImageCompare",[],n):"object"==typeof exports?exports.ImageCompare=n():t.ImageCompare=n()}(self,(function(){return function(){var t={9662:function(t,n,e){var r=e(614),o=e(6330),i=TypeError;t.exports=function(t){if(r(t))return t;throw i(o(t)+" is not a function")}},6077:function(t,n,e){var r=e(614),o=String,i=TypeError;t.exports=function(t){if("object"==typeof t||r(t))return t;throw i("Can't set "+o(t)+" as a prototype")}},1223:function(t,n,e){var r=e(5112),o=e(30),i=e(3070).f,c=r("unscopables"),a=Array.prototype;null==a[c]&&i(a,c,{configurable:!0,value:o(null)}),t.exports=function(t){a[c][t]=!0}},9670:function(t,n,e){var r=e(111),o=String,i=TypeError;t.exports=function(t){if(r(t))return t;throw i(o(t)+" is not an object")}},8533:function(t,n,e){"use strict";var r=e(2092).forEach,o=e(9341)("forEach");t.exports=o?[].forEach:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}},8457:function(t,n,e){"use strict";var r=e(9974),o=e(6916),i=e(7908),c=e(3411),a=e(7659),s=e(4411),u=e(6244),f=e(6135),l=e(8554),d=e(1246),p=Array;t.exports=function(t){var n=i(t),e=s(this),v=arguments.length,h=v>1?arguments[1]:void 0,g=void 0!==h;g&&(h=r(h,v>2?arguments[2]:void 0));var y,m,b,x,w,S,O=d(n),E=0;if(!O||this===p&&a(O))for(y=u(n),m=e?new this(y):p(y);y>E;E++)S=g?h(n[E],E):n[E],f(m,E,S);else for(w=(x=l(n,O)).next,m=e?new this:[];!(b=o(w,x)).done;E++)S=g?c(x,h,[b.value,E],!0):b.value,f(m,E,S);return m.length=E,m}},1318:function(t,n,e){var r=e(5656),o=e(1400),i=e(6244),c=function(t){return function(n,e,c){var a,s=r(n),u=i(s),f=o(c,u);if(t&&e!=e){for(;u>f;)if((a=s[f++])!=a)return!0}else for(;u>f;f++)if((t||f in s)&&s[f]===e)return t||f||0;return!t&&-1}};t.exports={includes:c(!0),indexOf:c(!1)}},2092:function(t,n,e){var r=e(9974),o=e(1702),i=e(8361),c=e(7908),a=e(6244),s=e(5417),u=o([].push),f=function(t){var n=1==t,e=2==t,o=3==t,f=4==t,l=6==t,d=7==t,p=5==t||l;return function(v,h,g,y){for(var m,b,x=c(v),w=i(x),S=r(h,g),O=a(w),E=0,_=y||s,A=n?_(v,O):e||d?_(v,0):void 0;O>E;E++)if((p||E in w)&&(b=S(m=w[E],E,x),t))if(n)A[E]=b;else if(b)switch(t){case 3:return!0;case 5:return m;case 6:return E;case 2:u(A,m)}else switch(t){case 4:return!1;case 7:u(A,m)}return l?-1:o||f?f:A}};t.exports={forEach:f(0),map:f(1),filter:f(2),some:f(3),every:f(4),find:f(5),findIndex:f(6),filterReject:f(7)}},1194:function(t,n,e){var r=e(7293),o=e(5112),i=e(7392),c=o("species");t.exports=function(t){return i>=51||!r((function(){var n=[];return(n.constructor={})[c]=function(){return{foo:1}},1!==n[t](Boolean).foo}))}},9341:function(t,n,e){"use strict";var r=e(7293);t.exports=function(t,n){var e=[][t];return!!e&&r((function(){e.call(null,n||function(){return 1},1)}))}},1589:function(t,n,e){var r=e(1400),o=e(6244),i=e(6135),c=Array,a=Math.max;t.exports=function(t,n,e){for(var s=o(t),u=r(n,s),f=r(void 0===e?s:e,s),l=c(a(f-u,0)),d=0;u9007199254740991)throw n("Maximum allowed index exceeded");return t}},8324:function(t){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},8509:function(t,n,e){var r=e(317)("span").classList,o=r&&r.constructor&&r.constructor.prototype;t.exports=o===Object.prototype?void 0:o},8113:function(t,n,e){var r=e(5005);t.exports=r("navigator","userAgent")||""},7392:function(t,n,e){var r,o,i=e(7854),c=e(8113),a=i.process,s=i.Deno,u=a&&a.versions||s&&s.version,f=u&&u.v8;f&&(o=(r=f.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&c&&(!(r=c.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=c.match(/Chrome\/(\d+)/))&&(o=+r[1]),t.exports=o},748:function(t){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(t,n,e){var r=e(7854),o=e(1236).f,i=e(8880),c=e(8052),a=e(3072),s=e(9920),u=e(4705);t.exports=function(t,n){var e,f,l,d,p,v=t.target,h=t.global,g=t.stat;if(e=h?r:g?r[v]||a(v,{}):(r[v]||{}).prototype)for(f in n){if(d=n[f],l=t.dontCallGetSet?(p=o(e,f))&&p.value:e[f],!u(h?f:v+(g?".":"#")+f,t.forced)&&void 0!==l){if(typeof d==typeof l)continue;s(d,l)}(t.sham||l&&l.sham)&&i(d,"sham",!0),c(e,f,d,t)}}},7293:function(t){t.exports=function(t){try{return!!t()}catch(t){return!0}}},2104:function(t,n,e){var r=e(4374),o=Function.prototype,i=o.apply,c=o.call;t.exports="object"==typeof Reflect&&Reflect.apply||(r?c.bind(i):function(){return c.apply(i,arguments)})},9974:function(t,n,e){var r=e(1702),o=e(9662),i=e(4374),c=r(r.bind);t.exports=function(t,n){return o(t),void 0===n?t:i?c(t,n):function(){return t.apply(n,arguments)}}},4374:function(t,n,e){var r=e(7293);t.exports=!r((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},6916:function(t,n,e){var r=e(4374),o=Function.prototype.call;t.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},6530:function(t,n,e){var r=e(9781),o=e(2597),i=Function.prototype,c=r&&Object.getOwnPropertyDescriptor,a=o(i,"name"),s=a&&"something"===function(){}.name,u=a&&(!r||r&&c(i,"name").configurable);t.exports={EXISTS:a,PROPER:s,CONFIGURABLE:u}},1702:function(t,n,e){var r=e(4374),o=Function.prototype,i=o.bind,c=o.call,a=r&&i.bind(c,c);t.exports=r?function(t){return t&&a(t)}:function(t){return t&&function(){return c.apply(t,arguments)}}},5005:function(t,n,e){var r=e(7854),o=e(614),i=function(t){return o(t)?t:void 0};t.exports=function(t,n){return arguments.length<2?i(r[t]):r[t]&&r[t][n]}},1246:function(t,n,e){var r=e(648),o=e(8173),i=e(7497),c=e(5112)("iterator");t.exports=function(t){if(null!=t)return o(t,c)||o(t,"@@iterator")||i[r(t)]}},8554:function(t,n,e){var r=e(6916),o=e(9662),i=e(9670),c=e(6330),a=e(1246),s=TypeError;t.exports=function(t,n){var e=arguments.length<2?a(t):n;if(o(e))return i(r(e,t));throw s(c(t)+" is not iterable")}},8173:function(t,n,e){var r=e(9662);t.exports=function(t,n){var e=t[n];return null==e?void 0:r(e)}},7854:function(t,n,e){var r=function(t){return t&&t.Math==Math&&t};t.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof e.g&&e.g)||function(){return this}()||Function("return this")()},2597:function(t,n,e){var r=e(1702),o=e(7908),i=r({}.hasOwnProperty);t.exports=Object.hasOwn||function(t,n){return i(o(t),n)}},3501:function(t){t.exports={}},490:function(t,n,e){var r=e(5005);t.exports=r("document","documentElement")},4664:function(t,n,e){var r=e(9781),o=e(7293),i=e(317);t.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},8361:function(t,n,e){var r=e(1702),o=e(7293),i=e(4326),c=Object,a=r("".split);t.exports=o((function(){return!c("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?a(t,""):c(t)}:c},2788:function(t,n,e){var r=e(1702),o=e(614),i=e(5465),c=r(Function.toString);o(i.inspectSource)||(i.inspectSource=function(t){return c(t)}),t.exports=i.inspectSource},9909:function(t,n,e){var r,o,i,c=e(8536),a=e(7854),s=e(1702),u=e(111),f=e(8880),l=e(2597),d=e(5465),p=e(6200),v=e(3501),h="Object already initialized",g=a.TypeError,y=a.WeakMap;if(c||d.state){var m=d.state||(d.state=new y),b=s(m.get),x=s(m.has),w=s(m.set);r=function(t,n){if(x(m,t))throw new g(h);return n.facade=t,w(m,t,n),n},o=function(t){return b(m,t)||{}},i=function(t){return x(m,t)}}else{var S=p("state");v[S]=!0,r=function(t,n){if(l(t,S))throw new g(h);return n.facade=t,f(t,S,n),n},o=function(t){return l(t,S)?t[S]:{}},i=function(t){return l(t,S)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(n){var e;if(!u(n)||(e=o(n)).type!==t)throw g("Incompatible receiver, "+t+" required");return e}}}},7659:function(t,n,e){var r=e(5112),o=e(7497),i=r("iterator"),c=Array.prototype;t.exports=function(t){return void 0!==t&&(o.Array===t||c[i]===t)}},3157:function(t,n,e){var r=e(4326);t.exports=Array.isArray||function(t){return"Array"==r(t)}},614:function(t){t.exports=function(t){return"function"==typeof t}},4411:function(t,n,e){var r=e(1702),o=e(7293),i=e(614),c=e(648),a=e(5005),s=e(2788),u=function(){},f=[],l=a("Reflect","construct"),d=/^\s*(?:class|function)\b/,p=r(d.exec),v=!d.exec(u),h=function(t){if(!i(t))return!1;try{return l(u,f,t),!0}catch(t){return!1}},g=function(t){if(!i(t))return!1;switch(c(t)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return v||!!p(d,s(t))}catch(t){return!0}};g.sham=!0,t.exports=!l||o((function(){var t;return h(h.call)||!h(Object)||!h((function(){t=!0}))||t}))?g:h},4705:function(t,n,e){var r=e(7293),o=e(614),i=/#|\.prototype\./,c=function(t,n){var e=s[a(t)];return e==f||e!=u&&(o(n)?r(n):!!n)},a=c.normalize=function(t){return String(t).replace(i,".").toLowerCase()},s=c.data={},u=c.NATIVE="N",f=c.POLYFILL="P";t.exports=c},111:function(t,n,e){var r=e(614);t.exports=function(t){return"object"==typeof t?null!==t:r(t)}},1913:function(t){t.exports=!1},2190:function(t,n,e){var r=e(5005),o=e(614),i=e(7976),c=e(3307),a=Object;t.exports=c?function(t){return"symbol"==typeof t}:function(t){var n=r("Symbol");return o(n)&&i(n.prototype,a(t))}},9212:function(t,n,e){var r=e(6916),o=e(9670),i=e(8173);t.exports=function(t,n,e){var c,a;o(t);try{if(!(c=i(t,"return"))){if("throw"===n)throw e;return e}c=r(c,t)}catch(t){a=!0,c=t}if("throw"===n)throw e;if(a)throw c;return o(c),e}},3383:function(t,n,e){"use strict";var r,o,i,c=e(7293),a=e(614),s=e(30),u=e(9518),f=e(8052),l=e(5112),d=e(1913),p=l("iterator"),v=!1;[].keys&&("next"in(i=[].keys())?(o=u(u(i)))!==Object.prototype&&(r=o):v=!0),null==r||c((function(){var t={};return r[p].call(t)!==t}))?r={}:d&&(r=s(r)),a(r[p])||f(r,p,(function(){return this})),t.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:v}},7497:function(t){t.exports={}},6244:function(t,n,e){var r=e(7466);t.exports=function(t){return r(t.length)}},6339:function(t,n,e){var r=e(7293),o=e(614),i=e(2597),c=e(9781),a=e(6530).CONFIGURABLE,s=e(2788),u=e(9909),f=u.enforce,l=u.get,d=Object.defineProperty,p=c&&!r((function(){return 8!==d((function(){}),"length",{value:8}).length})),v=String(String).split("String"),h=t.exports=function(t,n,e){"Symbol("===String(n).slice(0,7)&&(n="["+String(n).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),e&&e.getter&&(n="get "+n),e&&e.setter&&(n="set "+n),(!i(t,"name")||a&&t.name!==n)&&d(t,"name",{value:n,configurable:!0}),p&&e&&i(e,"arity")&&t.length!==e.arity&&d(t,"length",{value:e.arity});try{e&&i(e,"constructor")&&e.constructor?c&&d(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(t){}var r=f(t);return i(r,"source")||(r.source=v.join("string"==typeof n?n:"")),t};Function.prototype.toString=h((function(){return o(this)&&l(this).source||s(this)}),"toString")},4758:function(t){var n=Math.ceil,e=Math.floor;t.exports=Math.trunc||function(t){var r=+t;return(r>0?e:n)(r)}},735:function(t,n,e){var r=e(133);t.exports=r&&!!Symbol.for&&!!Symbol.keyFor},133:function(t,n,e){var r=e(7392),o=e(7293);t.exports=!!Object.getOwnPropertySymbols&&!o((function(){var t=Symbol();return!String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},8536:function(t,n,e){var r=e(7854),o=e(614),i=e(2788),c=r.WeakMap;t.exports=o(c)&&/native code/.test(i(c))},1574:function(t,n,e){"use strict";var r=e(9781),o=e(1702),i=e(6916),c=e(7293),a=e(1956),s=e(5181),u=e(5296),f=e(7908),l=e(8361),d=Object.assign,p=Object.defineProperty,v=o([].concat);t.exports=!d||c((function(){if(r&&1!==d({b:1},d(p({},"a",{enumerable:!0,get:function(){p(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},n={},e=Symbol(),o="abcdefghijklmnopqrst";return t[e]=7,o.split("").forEach((function(t){n[t]=t})),7!=d({},t)[e]||a(d({},n)).join("")!=o}))?function(t,n){for(var e=f(t),o=arguments.length,c=1,d=s.f,p=u.f;o>c;)for(var h,g=l(arguments[c++]),y=d?v(a(g),d(g)):a(g),m=y.length,b=0;m>b;)h=y[b++],r&&!i(p,g,h)||(e[h]=g[h]);return e}:d},30:function(t,n,e){var r,o=e(9670),i=e(6048),c=e(748),a=e(3501),s=e(490),u=e(317),f=e(6200)("IE_PROTO"),l=function(){},d=function(t){return"

    @hN<}%W};+oazoZnNnZh-$DrGsn+=sn;0 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 diff --git a/public/images/screenshots/lotusdocs_google_font_demo_inter_screenshot.webp b/public/images/screenshots/lotusdocs_google_font_demo_inter_screenshot.webp deleted file mode 100644 index d93152b07c900fa2244490c632b460775d4afa39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45738 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 diff --git a/public/images/screenshots/lotusdocs_google_font_demo_lifesavers_screenshot.webp b/public/images/screenshots/lotusdocs_google_font_demo_lifesavers_screenshot.webp deleted file mode 100644 index 1dc7bf49c1d00dc1fa62a68376ac199f05ca40f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44350 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