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 cb2c455..0000000 Binary files a/public/images/lotus_docs_screenshot_hu_96a4be244a204161.webp and /dev/null differ diff --git a/public/images/screenshots/lotusdocs_blue_theme_colour.webp b/public/images/screenshots/lotusdocs_blue_theme_colour.webp deleted file mode 100644 index ae284e2..0000000 Binary files a/public/images/screenshots/lotusdocs_blue_theme_colour.webp and /dev/null differ diff --git a/public/images/screenshots/lotusdocs_cardinal_theme_colour.webp b/public/images/screenshots/lotusdocs_cardinal_theme_colour.webp deleted file mode 100644 index 4394c7d..0000000 Binary files a/public/images/screenshots/lotusdocs_cardinal_theme_colour.webp and /dev/null differ 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 d59570e..0000000 Binary files a/public/images/screenshots/lotusdocs_dark_v0.8.webp and /dev/null differ 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 d93152b..0000000 Binary files a/public/images/screenshots/lotusdocs_google_font_demo_inter_screenshot.webp and /dev/null differ 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 1dc7bf4..0000000 Binary files a/public/images/screenshots/lotusdocs_google_font_demo_lifesavers_screenshot.webp and /dev/null differ 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 3d06758..0000000 Binary files a/public/images/screenshots/lotusdocs_light_v0.8.webp and /dev/null differ diff --git a/public/index.html b/public/index.html index 91544ef..61eb46e 100644 --- a/public/index.html +++ b/public/index.html @@ -34,10 +34,9 @@ - + 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/IGVsZW0gOiBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0lOTkVSX0VMRU0sIGVsZW0pXG4gIH1cblxuICAvLyBUcnkgdG8gZ2V0IHRoZSBvdXRlciBlbGVtZW50ICh1c3VhbGx5IHRoZSAubmF2LWl0ZW0pXG4gIF9nZXRPdXRlckVsZW1lbnQoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLmNsb3Nlc3QoU0VMRUNUT1JfT1VURVIpIHx8IGVsZW1cbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGFbY29uZmlnXSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zdGFydHNXaXRoKCdfJykgfHwgY29uZmlnID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykuc2hvdygpXG59KVxuXG4vKipcbiAqIEluaXRpYWxpemUgb24gZm9jdXNcbiAqL1xuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRV9BQ1RJVkUpKSB7XG4gICAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudClcbiAgfVxufSlcbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRhYilcblxuZXhwb3J0IGRlZmF1bHQgVGFiXG4iLCAiLy8gSW1wb3J0IHRoZSBCb290c3RyYXAgY29tcG9uZW50cyB3ZSB3YW50IHRvIHVzZS5cbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL2pzL2luZGV4LnVtZC5qc1xuaW1wb3J0IFRhYiBmcm9tIFwiL2pzL2Jvb3RzdHJhcC9zcmMvdGFiXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBUYWJcbn0iXSwKICAibWFwcGluZ3MiOiAiOztBQVdBLE1BQU0sYUFBYSxvQkFBSSxJQUFJO0FBRTNCLE1BQU8sZUFBUTtBQUFBLElBQ2IsSUFBSSxTQUFTLEtBQUssVUFBVTtBQUMxQixVQUFJLENBQUMsV0FBVyxJQUFJLE9BQU8sR0FBRztBQUM1QixtQkFBVyxJQUFJLFNBQVMsb0JBQUksSUFBSSxDQUFDO0FBQUEsTUFDbkM7QUFFQSxZQUFNLGNBQWMsV0FBVyxJQUFJLE9BQU87QUFJMUMsVUFBSSxDQUFDLFlBQVksSUFBSSxHQUFHLEtBQUssWUFBWSxTQUFTLEdBQUc7QUFFbkQsZ0JBQVEsTUFBTSwrRUFBK0UsTUFBTSxLQUFLLFlBQVksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUc7QUFDakk7QUFBQSxNQUNGO0FBRUEsa0JBQVksSUFBSSxLQUFLLFFBQVE7QUFBQSxJQUMvQjtBQUFBLElBRUEsSUFBSSxTQUFTLEtBQUs7QUFDaEIsVUFBSSxXQUFXLElBQUksT0FBTyxHQUFHO0FBQzNCLGVBQU8sV0FBVyxJQUFJLE9BQU8sRUFBRSxJQUFJLEdBQUcsS0FBSztBQUFBLE1BQzdDO0FBRUEsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLE9BQU8sU0FBUyxLQUFLO0FBQ25CLFVBQUksQ0FBQyxXQUFXLElBQUksT0FBTyxHQUFHO0FBQzVCO0FBQUEsTUFDRjtBQUVBLFlBQU0sY0FBYyxXQUFXLElBQUksT0FBTztBQUUxQyxrQkFBWSxPQUFPLEdBQUc7QUFHdEIsVUFBSSxZQUFZLFNBQVMsR0FBRztBQUMxQixtQkFBVyxPQUFPLE9BQU87QUFBQSxNQUMzQjtBQUFBLElBQ0Y7QUFBQSxFQUNGOzs7QUM5Q0EsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSxpQkFBaUI7QUFPdkIsTUFBTSxnQkFBZ0IsY0FBWTtBQUNoQyxRQUFJLFlBQVksT0FBTyxPQUFPLE9BQU8sSUFBSSxRQUFRO0FBRS9DLGlCQUFXLFNBQVMsUUFBUSxpQkFBaUIsQ0FBQyxPQUFPLE9BQU8sSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUU7QUFBQSxJQUNsRjtBQUVBLFdBQU87QUFBQSxFQUNUO0FBR0EsTUFBTSxTQUFTLFlBQVU7QUFDdkIsUUFBSSxXQUFXLFFBQVEsV0FBVyxRQUFXO0FBQzNDLGFBQU8sR0FBRyxNQUFNO0FBQUEsSUFDbEI7QUFFQSxXQUFPLE9BQU8sVUFBVSxTQUFTLEtBQUssTUFBTSxFQUFFLE1BQU0sYUFBYSxFQUFFLENBQUMsRUFBRSxZQUFZO0FBQUEsRUFDcEY7QUFjQSxNQUFNLG1DQUFtQyxhQUFXO0FBQ2xELFFBQUksQ0FBQyxTQUFTO0FBQ1osYUFBTztBQUFBLElBQ1Q7QUFHQSxRQUFJLEVBQUUsb0JBQW9CLGdCQUFnQixJQUFJLE9BQU8saUJBQWlCLE9BQU87QUFFN0UsVUFBTSwwQkFBMEIsT0FBTyxXQUFXLGtCQUFrQjtBQUNwRSxVQUFNLHVCQUF1QixPQUFPLFdBQVcsZUFBZTtBQUc5RCxRQUFJLENBQUMsMkJBQTJCLENBQUMsc0JBQXNCO0FBQ3JELGFBQU87QUFBQSxJQUNUO0FBR0EseUJBQXFCLG1CQUFtQixNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3BELHNCQUFrQixnQkFBZ0IsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUU5QyxZQUFRLE9BQU8sV0FBVyxrQkFBa0IsSUFBSSxPQUFPLFdBQVcsZUFBZSxLQUFLO0FBQUEsRUFDeEY7QUFFQSxNQUFNLHVCQUF1QixhQUFXO0FBQ3RDLFlBQVEsY0FBYyxJQUFJLE1BQU0sY0FBYyxDQUFDO0FBQUEsRUFDakQ7QUFFQSxNQUFNLFlBQVksWUFBVTtBQUMxQixRQUFJLENBQUMsVUFBVSxPQUFPLFdBQVcsVUFBVTtBQUN6QyxhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUksT0FBTyxPQUFPLFdBQVcsYUFBYTtBQUN4QyxlQUFTLE9BQU8sQ0FBQztBQUFBLElBQ25CO0FBRUEsV0FBTyxPQUFPLE9BQU8sYUFBYTtBQUFBLEVBQ3BDO0FBRUEsTUFBTSxhQUFhLFlBQVU7QUFFM0IsUUFBSSxVQUFVLE1BQU0sR0FBRztBQUNyQixhQUFPLE9BQU8sU0FBUyxPQUFPLENBQUMsSUFBSTtBQUFBLElBQ3JDO0FBRUEsUUFBSSxPQUFPLFdBQVcsWUFBWSxPQUFPLFNBQVMsR0FBRztBQUNuRCxhQUFPLFNBQVMsY0FBYyxjQUFjLE1BQU0sQ0FBQztBQUFBLElBQ3JEO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFNLFlBQVksYUFBVztBQUMzQixRQUFJLENBQUMsVUFBVSxPQUFPLEtBQUssUUFBUSxlQUFlLEVBQUUsV0FBVyxHQUFHO0FBQ2hFLGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSxtQkFBbUIsaUJBQWlCLE9BQU8sRUFBRSxpQkFBaUIsWUFBWSxNQUFNO0FBRXRGLFVBQU0sZ0JBQWdCLFFBQVEsUUFBUSxxQkFBcUI7QUFFM0QsUUFBSSxDQUFDLGVBQWU7QUFDbEIsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFJLGtCQUFrQixTQUFTO0FBQzdCLFlBQU0sVUFBVSxRQUFRLFFBQVEsU0FBUztBQUN6QyxVQUFJLFdBQVcsUUFBUSxlQUFlLGVBQWU7QUFDbkQsZUFBTztBQUFBLE1BQ1Q7QUFFQSxVQUFJLFlBQVksTUFBTTtBQUNwQixlQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQU0sYUFBYSxhQUFXO0FBQzVCLFFBQUksQ0FBQyxXQUFXLFFBQVEsYUFBYSxLQUFLLGNBQWM7QUFDdEQsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFJLFFBQVEsVUFBVSxTQUFTLFVBQVUsR0FBRztBQUMxQyxhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUksT0FBTyxRQUFRLGFBQWEsYUFBYTtBQUMzQyxhQUFPLFFBQVE7QUFBQSxJQUNqQjtBQUVBLFdBQU8sUUFBUSxhQUFhLFVBQVUsS0FBSyxRQUFRLGFBQWEsVUFBVSxNQUFNO0FBQUEsRUFDbEY7QUF1Q0EsTUFBTSxZQUFZLE1BQU07QUFDdEIsUUFBSSxPQUFPLFVBQVUsQ0FBQyxTQUFTLEtBQUssYUFBYSxtQkFBbUIsR0FBRztBQUNyRSxhQUFPLE9BQU87QUFBQSxJQUNoQjtBQUVBLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBTSw0QkFBNEIsQ0FBQztBQUVuQyxNQUFNLHFCQUFxQixjQUFZO0FBQ3JDLFFBQUksU0FBUyxlQUFlLFdBQVc7QUFFckMsVUFBSSxDQUFDLDBCQUEwQixRQUFRO0FBQ3JDLGlCQUFTLGlCQUFpQixvQkFBb0IsTUFBTTtBQUNsRCxxQkFBV0EsYUFBWSwyQkFBMkI7QUFDaEQsWUFBQUEsVUFBUztBQUFBLFVBQ1g7QUFBQSxRQUNGLENBQUM7QUFBQSxNQUNIO0FBRUEsZ0NBQTBCLEtBQUssUUFBUTtBQUFBLElBQ3pDLE9BQU87QUFDTCxlQUFTO0FBQUEsSUFDWDtBQUFBLEVBQ0Y7QUFJQSxNQUFNLHFCQUFxQixZQUFVO0FBQ25DLHVCQUFtQixNQUFNO0FBQ3ZCLFlBQU0sSUFBSSxVQUFVO0FBRXBCLFVBQUksR0FBRztBQUNMLGNBQU0sT0FBTyxPQUFPO0FBQ3BCLGNBQU0scUJBQXFCLEVBQUUsR0FBRyxJQUFJO0FBQ3BDLFVBQUUsR0FBRyxJQUFJLElBQUksT0FBTztBQUNwQixVQUFFLEdBQUcsSUFBSSxFQUFFLGNBQWM7QUFDekIsVUFBRSxHQUFHLElBQUksRUFBRSxhQUFhLE1BQU07QUFDNUIsWUFBRSxHQUFHLElBQUksSUFBSTtBQUNiLGlCQUFPLE9BQU87QUFBQSxRQUNoQjtBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBRUEsTUFBTSxVQUFVLENBQUMsa0JBQWtCLE9BQU8sQ0FBQyxHQUFHLGVBQWUscUJBQXFCO0FBQ2hGLFdBQU8sT0FBTyxxQkFBcUIsYUFBYSxpQkFBaUIsR0FBRyxJQUFJLElBQUk7QUFBQSxFQUM5RTtBQUVBLE1BQU0seUJBQXlCLENBQUMsVUFBVSxtQkFBbUIsb0JBQW9CLFNBQVM7QUFDeEYsUUFBSSxDQUFDLG1CQUFtQjtBQUN0QixjQUFRLFFBQVE7QUFDaEI7QUFBQSxJQUNGO0FBRUEsVUFBTSxrQkFBa0I7QUFDeEIsVUFBTSxtQkFBbUIsaUNBQWlDLGlCQUFpQixJQUFJO0FBRS9FLFFBQUksU0FBUztBQUViLFVBQU0sVUFBVSxDQUFDLEVBQUUsT0FBTyxNQUFNO0FBQzlCLFVBQUksV0FBVyxtQkFBbUI7QUFDaEM7QUFBQSxNQUNGO0FBRUEsZUFBUztBQUNULHdCQUFrQixvQkFBb0IsZ0JBQWdCLE9BQU87QUFDN0QsY0FBUSxRQUFRO0FBQUEsSUFDbEI7QUFFQSxzQkFBa0IsaUJBQWlCLGdCQUFnQixPQUFPO0FBQzFELGVBQVcsTUFBTTtBQUNmLFVBQUksQ0FBQyxRQUFRO0FBQ1gsNkJBQXFCLGlCQUFpQjtBQUFBLE1BQ3hDO0FBQUEsSUFDRixHQUFHLGdCQUFnQjtBQUFBLEVBQ3JCO0FBV0EsTUFBTSx1QkFBdUIsQ0FBQyxNQUFNLGVBQWUsZUFBZSxtQkFBbUI7QUFDbkYsVUFBTSxhQUFhLEtBQUs7QUFDeEIsUUFBSSxRQUFRLEtBQUssUUFBUSxhQUFhO0FBSXRDLFFBQUksVUFBVSxJQUFJO0FBQ2hCLGFBQU8sQ0FBQyxpQkFBaUIsaUJBQWlCLEtBQUssYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDO0FBQUEsSUFDekU7QUFFQSxhQUFTLGdCQUFnQixJQUFJO0FBRTdCLFFBQUksZ0JBQWdCO0FBQ2xCLGVBQVMsUUFBUSxjQUFjO0FBQUEsSUFDakM7QUFFQSxXQUFPLEtBQUssS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLE9BQU8sYUFBYSxDQUFDLENBQUMsQ0FBQztBQUFBLEVBQzFEOzs7QUM5UUEsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxnQkFBZ0I7QUFDdEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QixNQUFJLFdBQVc7QUFDZixNQUFNLGVBQWU7QUFBQSxJQUNuQixZQUFZO0FBQUEsSUFDWixZQUFZO0FBQUEsRUFDZDtBQUVBLE1BQU0sZUFBZSxvQkFBSSxJQUFJO0FBQUEsSUFDM0I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFNRCxXQUFTLGFBQWEsU0FBUyxLQUFLO0FBQ2xDLFdBQVEsT0FBTyxHQUFHLEdBQUcsS0FBSyxVQUFVLE1BQU8sUUFBUSxZQUFZO0FBQUEsRUFDakU7QUFFQSxXQUFTLGlCQUFpQixTQUFTO0FBQ2pDLFVBQU0sTUFBTSxhQUFhLE9BQU87QUFFaEMsWUFBUSxXQUFXO0FBQ25CLGtCQUFjLEdBQUcsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO0FBRTVDLFdBQU8sY0FBYyxHQUFHO0FBQUEsRUFDMUI7QUFFQSxXQUFTLGlCQUFpQixTQUFTLElBQUk7QUFDckMsV0FBTyxTQUFTLFFBQVEsT0FBTztBQUM3QixpQkFBVyxPQUFPLEVBQUUsZ0JBQWdCLFFBQVEsQ0FBQztBQUU3QyxVQUFJLFFBQVEsUUFBUTtBQUNsQixxQkFBYSxJQUFJLFNBQVMsTUFBTSxNQUFNLEVBQUU7QUFBQSxNQUMxQztBQUVBLGFBQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLENBQUM7QUFBQSxJQUNsQztBQUFBLEVBQ0Y7QUFFQSxXQUFTLDJCQUEyQixTQUFTLFVBQVUsSUFBSTtBQUN6RCxXQUFPLFNBQVMsUUFBUSxPQUFPO0FBQzdCLFlBQU0sY0FBYyxRQUFRLGlCQUFpQixRQUFRO0FBRXJELGVBQVMsRUFBRSxPQUFPLElBQUksT0FBTyxVQUFVLFdBQVcsTUFBTSxTQUFTLE9BQU8sWUFBWTtBQUNsRixtQkFBVyxjQUFjLGFBQWE7QUFDcEMsY0FBSSxlQUFlLFFBQVE7QUFDekI7QUFBQSxVQUNGO0FBRUEscUJBQVcsT0FBTyxFQUFFLGdCQUFnQixPQUFPLENBQUM7QUFFNUMsY0FBSSxRQUFRLFFBQVE7QUFDbEIseUJBQWEsSUFBSSxTQUFTLE1BQU0sTUFBTSxVQUFVLEVBQUU7QUFBQSxVQUNwRDtBQUVBLGlCQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDO0FBQUEsUUFDakM7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxXQUFTLFlBQVksUUFBUSxVQUFVLHFCQUFxQixNQUFNO0FBQ2hFLFdBQU8sT0FBTyxPQUFPLE1BQU0sRUFDeEIsS0FBSyxXQUFTLE1BQU0sYUFBYSxZQUFZLE1BQU0sdUJBQXVCLGtCQUFrQjtBQUFBLEVBQ2pHO0FBRUEsV0FBUyxvQkFBb0IsbUJBQW1CLFNBQVMsb0JBQW9CO0FBQzNFLFVBQU0sY0FBYyxPQUFPLFlBQVk7QUFFdkMsVUFBTSxXQUFXLGNBQWMscUJBQXNCLFdBQVc7QUFDaEUsUUFBSSxZQUFZLGFBQWEsaUJBQWlCO0FBRTlDLFFBQUksQ0FBQyxhQUFhLElBQUksU0FBUyxHQUFHO0FBQ2hDLGtCQUFZO0FBQUEsSUFDZDtBQUVBLFdBQU8sQ0FBQyxhQUFhLFVBQVUsU0FBUztBQUFBLEVBQzFDO0FBRUEsV0FBUyxXQUFXLFNBQVMsbUJBQW1CLFNBQVMsb0JBQW9CLFFBQVE7QUFDbkYsUUFBSSxPQUFPLHNCQUFzQixZQUFZLENBQUMsU0FBUztBQUNyRDtBQUFBLElBQ0Y7QUFFQSxRQUFJLENBQUMsYUFBYSxVQUFVLFNBQVMsSUFBSSxvQkFBb0IsbUJBQW1CLFNBQVMsa0JBQWtCO0FBSTNHLFFBQUkscUJBQXFCLGNBQWM7QUFDckMsWUFBTSxlQUFlLENBQUFDLFFBQU07QUFDekIsZUFBTyxTQUFVLE9BQU87QUFDdEIsY0FBSSxDQUFDLE1BQU0saUJBQWtCLE1BQU0sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUMsTUFBTSxlQUFlLFNBQVMsTUFBTSxhQUFhLEdBQUk7QUFDakksbUJBQU9BLElBQUcsS0FBSyxNQUFNLEtBQUs7QUFBQSxVQUM1QjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBRUEsaUJBQVcsYUFBYSxRQUFRO0FBQUEsSUFDbEM7QUFFQSxVQUFNLFNBQVMsaUJBQWlCLE9BQU87QUFDdkMsVUFBTSxXQUFXLE9BQU8sU0FBUyxNQUFNLE9BQU8sU0FBUyxJQUFJLENBQUM7QUFDNUQsVUFBTSxtQkFBbUIsWUFBWSxVQUFVLFVBQVUsY0FBYyxVQUFVLElBQUk7QUFFckYsUUFBSSxrQkFBa0I7QUFDcEIsdUJBQWlCLFNBQVMsaUJBQWlCLFVBQVU7QUFFckQ7QUFBQSxJQUNGO0FBRUEsVUFBTSxNQUFNLGFBQWEsVUFBVSxrQkFBa0IsUUFBUSxnQkFBZ0IsRUFBRSxDQUFDO0FBQ2hGLFVBQU0sS0FBSyxjQUNULDJCQUEyQixTQUFTLFNBQVMsUUFBUSxJQUNyRCxpQkFBaUIsU0FBUyxRQUFRO0FBRXBDLE9BQUcscUJBQXFCLGNBQWMsVUFBVTtBQUNoRCxPQUFHLFdBQVc7QUFDZCxPQUFHLFNBQVM7QUFDWixPQUFHLFdBQVc7QUFDZCxhQUFTLEdBQUcsSUFBSTtBQUVoQixZQUFRLGlCQUFpQixXQUFXLElBQUksV0FBVztBQUFBLEVBQ3JEO0FBRUEsV0FBUyxjQUFjLFNBQVMsUUFBUSxXQUFXLFNBQVMsb0JBQW9CO0FBQzlFLFVBQU0sS0FBSyxZQUFZLE9BQU8sU0FBUyxHQUFHLFNBQVMsa0JBQWtCO0FBRXJFLFFBQUksQ0FBQyxJQUFJO0FBQ1A7QUFBQSxJQUNGO0FBRUEsWUFBUSxvQkFBb0IsV0FBVyxJQUFJLFFBQVEsa0JBQWtCLENBQUM7QUFDdEUsV0FBTyxPQUFPLFNBQVMsRUFBRSxHQUFHLFFBQVE7QUFBQSxFQUN0QztBQUVBLFdBQVMseUJBQXlCLFNBQVMsUUFBUSxXQUFXLFdBQVc7QUFDdkUsVUFBTSxvQkFBb0IsT0FBTyxTQUFTLEtBQUssQ0FBQztBQUVoRCxlQUFXLENBQUMsWUFBWSxLQUFLLEtBQUssT0FBTyxRQUFRLGlCQUFpQixHQUFHO0FBQ25FLFVBQUksV0FBVyxTQUFTLFNBQVMsR0FBRztBQUNsQyxzQkFBYyxTQUFTLFFBQVEsV0FBVyxNQUFNLFVBQVUsTUFBTSxrQkFBa0I7QUFBQSxNQUNwRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsV0FBUyxhQUFhLE9BQU87QUFFM0IsWUFBUSxNQUFNLFFBQVEsZ0JBQWdCLEVBQUU7QUFDeEMsV0FBTyxhQUFhLEtBQUssS0FBSztBQUFBLEVBQ2hDO0FBRUEsTUFBTSxlQUFlO0FBQUEsSUFDbkIsR0FBRyxTQUFTLE9BQU8sU0FBUyxvQkFBb0I7QUFDOUMsaUJBQVcsU0FBUyxPQUFPLFNBQVMsb0JBQW9CLEtBQUs7QUFBQSxJQUMvRDtBQUFBLElBRUEsSUFBSSxTQUFTLE9BQU8sU0FBUyxvQkFBb0I7QUFDL0MsaUJBQVcsU0FBUyxPQUFPLFNBQVMsb0JBQW9CLElBQUk7QUFBQSxJQUM5RDtBQUFBLElBRUEsSUFBSSxTQUFTLG1CQUFtQixTQUFTLG9CQUFvQjtBQUMzRCxVQUFJLE9BQU8sc0JBQXNCLFlBQVksQ0FBQyxTQUFTO0FBQ3JEO0FBQUEsTUFDRjtBQUVBLFlBQU0sQ0FBQyxhQUFhLFVBQVUsU0FBUyxJQUFJLG9CQUFvQixtQkFBbUIsU0FBUyxrQkFBa0I7QUFDN0csWUFBTSxjQUFjLGNBQWM7QUFDbEMsWUFBTSxTQUFTLGlCQUFpQixPQUFPO0FBQ3ZDLFlBQU0sb0JBQW9CLE9BQU8sU0FBUyxLQUFLLENBQUM7QUFDaEQsWUFBTSxjQUFjLGtCQUFrQixXQUFXLEdBQUc7QUFFcEQsVUFBSSxPQUFPLGFBQWEsYUFBYTtBQUVuQyxZQUFJLENBQUMsT0FBTyxLQUFLLGlCQUFpQixFQUFFLFFBQVE7QUFDMUM7QUFBQSxRQUNGO0FBRUEsc0JBQWMsU0FBUyxRQUFRLFdBQVcsVUFBVSxjQUFjLFVBQVUsSUFBSTtBQUNoRjtBQUFBLE1BQ0Y7QUFFQSxVQUFJLGFBQWE7QUFDZixtQkFBVyxnQkFBZ0IsT0FBTyxLQUFLLE1BQU0sR0FBRztBQUM5QyxtQ0FBeUIsU0FBUyxRQUFRLGNBQWMsa0JBQWtCLE1BQU0sQ0FBQyxDQUFDO0FBQUEsUUFDcEY7QUFBQSxNQUNGO0FBRUEsaUJBQVcsQ0FBQyxhQUFhLEtBQUssS0FBSyxPQUFPLFFBQVEsaUJBQWlCLEdBQUc7QUFDcEUsY0FBTSxhQUFhLFlBQVksUUFBUSxlQUFlLEVBQUU7QUFFeEQsWUFBSSxDQUFDLGVBQWUsa0JBQWtCLFNBQVMsVUFBVSxHQUFHO0FBQzFELHdCQUFjLFNBQVMsUUFBUSxXQUFXLE1BQU0sVUFBVSxNQUFNLGtCQUFrQjtBQUFBLFFBQ3BGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUVBLFFBQVEsU0FBUyxPQUFPLE1BQU07QUFDNUIsVUFBSSxPQUFPLFVBQVUsWUFBWSxDQUFDLFNBQVM7QUFDekMsZUFBTztBQUFBLE1BQ1Q7QUFFQSxZQUFNLElBQUksVUFBVTtBQUNwQixZQUFNLFlBQVksYUFBYSxLQUFLO0FBQ3BDLFlBQU0sY0FBYyxVQUFVO0FBRTlCLFVBQUksY0FBYztBQUNsQixVQUFJLFVBQVU7QUFDZCxVQUFJLGlCQUFpQjtBQUNyQixVQUFJLG1CQUFtQjtBQUV2QixVQUFJLGVBQWUsR0FBRztBQUNwQixzQkFBYyxFQUFFLE1BQU0sT0FBTyxJQUFJO0FBRWpDLFVBQUUsT0FBTyxFQUFFLFFBQVEsV0FBVztBQUM5QixrQkFBVSxDQUFDLFlBQVkscUJBQXFCO0FBQzVDLHlCQUFpQixDQUFDLFlBQVksOEJBQThCO0FBQzVELDJCQUFtQixZQUFZLG1CQUFtQjtBQUFBLE1BQ3BEO0FBRUEsWUFBTSxNQUFNLFdBQVcsSUFBSSxNQUFNLE9BQU8sRUFBRSxTQUFTLFlBQVksS0FBSyxDQUFDLEdBQUcsSUFBSTtBQUU1RSxVQUFJLGtCQUFrQjtBQUNwQixZQUFJLGVBQWU7QUFBQSxNQUNyQjtBQUVBLFVBQUksZ0JBQWdCO0FBQ2xCLGdCQUFRLGNBQWMsR0FBRztBQUFBLE1BQzNCO0FBRUEsVUFBSSxJQUFJLG9CQUFvQixhQUFhO0FBQ3ZDLG9CQUFZLGVBQWU7QUFBQSxNQUM3QjtBQUVBLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUVBLFdBQVMsV0FBVyxLQUFLLE9BQU8sQ0FBQyxHQUFHO0FBQ2xDLGVBQVcsQ0FBQyxLQUFLLEtBQUssS0FBSyxPQUFPLFFBQVEsSUFBSSxHQUFHO0FBQy9DLFVBQUk7QUFDRixZQUFJLEdBQUcsSUFBSTtBQUFBLE1BQ2IsU0FBUTtBQUNOLGVBQU8sZUFBZSxLQUFLLEtBQUs7QUFBQSxVQUM5QixjQUFjO0FBQUEsVUFDZCxNQUFNO0FBQ0osbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQU8sd0JBQVE7OztBQ3JUZixXQUFTLGNBQWMsT0FBTztBQUM1QixRQUFJLFVBQVUsUUFBUTtBQUNwQixhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUksVUFBVSxTQUFTO0FBQ3JCLGFBQU87QUFBQSxJQUNUO0FBRUEsUUFBSSxVQUFVLE9BQU8sS0FBSyxFQUFFLFNBQVMsR0FBRztBQUN0QyxhQUFPLE9BQU8sS0FBSztBQUFBLElBQ3JCO0FBRUEsUUFBSSxVQUFVLE1BQU0sVUFBVSxRQUFRO0FBQ3BDLGFBQU87QUFBQSxJQUNUO0FBRUEsUUFBSSxPQUFPLFVBQVUsVUFBVTtBQUM3QixhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUk7QUFDRixhQUFPLEtBQUssTUFBTSxtQkFBbUIsS0FBSyxDQUFDO0FBQUEsSUFDN0MsU0FBUTtBQUNOLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUVBLFdBQVMsaUJBQWlCLEtBQUs7QUFDN0IsV0FBTyxJQUFJLFFBQVEsVUFBVSxTQUFPLElBQUksSUFBSSxZQUFZLENBQUMsRUFBRTtBQUFBLEVBQzdEO0FBRUEsTUFBTSxjQUFjO0FBQUEsSUFDbEIsaUJBQWlCLFNBQVMsS0FBSyxPQUFPO0FBQ3BDLGNBQVEsYUFBYSxXQUFXLGlCQUFpQixHQUFHLENBQUMsSUFBSSxLQUFLO0FBQUEsSUFDaEU7QUFBQSxJQUVBLG9CQUFvQixTQUFTLEtBQUs7QUFDaEMsY0FBUSxnQkFBZ0IsV0FBVyxpQkFBaUIsR0FBRyxDQUFDLEVBQUU7QUFBQSxJQUM1RDtBQUFBLElBRUEsa0JBQWtCLFNBQVM7QUFDekIsVUFBSSxDQUFDLFNBQVM7QUFDWixlQUFPLENBQUM7QUFBQSxNQUNWO0FBRUEsWUFBTSxhQUFhLENBQUM7QUFDcEIsWUFBTSxTQUFTLE9BQU8sS0FBSyxRQUFRLE9BQU8sRUFBRSxPQUFPLFNBQU8sSUFBSSxXQUFXLElBQUksS0FBSyxDQUFDLElBQUksV0FBVyxVQUFVLENBQUM7QUFFN0csaUJBQVcsT0FBTyxRQUFRO0FBQ3hCLFlBQUksVUFBVSxJQUFJLFFBQVEsT0FBTyxFQUFFO0FBQ25DLGtCQUFVLFFBQVEsT0FBTyxDQUFDLEVBQUUsWUFBWSxJQUFJLFFBQVEsTUFBTSxHQUFHLFFBQVEsTUFBTTtBQUMzRSxtQkFBVyxPQUFPLElBQUksY0FBYyxRQUFRLFFBQVEsR0FBRyxDQUFDO0FBQUEsTUFDMUQ7QUFFQSxhQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsaUJBQWlCLFNBQVMsS0FBSztBQUM3QixhQUFPLGNBQWMsUUFBUSxhQUFhLFdBQVcsaUJBQWlCLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFBQSxJQUMvRTtBQUFBLEVBQ0Y7QUFFQSxNQUFPLHNCQUFROzs7QUN4RGYsTUFBTSxTQUFOLE1BQWE7QUFBQTtBQUFBLElBRVgsV0FBVyxVQUFVO0FBQ25CLGFBQU8sQ0FBQztBQUFBLElBQ1Y7QUFBQSxJQUVBLFdBQVcsY0FBYztBQUN2QixhQUFPLENBQUM7QUFBQSxJQUNWO0FBQUEsSUFFQSxXQUFXLE9BQU87QUFDaEIsWUFBTSxJQUFJLE1BQU0scUVBQXFFO0FBQUEsSUFDdkY7QUFBQSxJQUVBLFdBQVcsUUFBUTtBQUNqQixlQUFTLEtBQUssZ0JBQWdCLE1BQU07QUFDcEMsZUFBUyxLQUFLLGtCQUFrQixNQUFNO0FBQ3RDLFdBQUssaUJBQWlCLE1BQU07QUFDNUIsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLGtCQUFrQixRQUFRO0FBQ3hCLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxnQkFBZ0IsUUFBUSxTQUFTO0FBQy9CLFlBQU0sYUFBYSxVQUFVLE9BQU8sSUFBSSxvQkFBWSxpQkFBaUIsU0FBUyxRQUFRLElBQUksQ0FBQztBQUUzRixhQUFPO0FBQUEsUUFDTCxHQUFHLEtBQUssWUFBWTtBQUFBLFFBQ3BCLEdBQUksT0FBTyxlQUFlLFdBQVcsYUFBYSxDQUFDO0FBQUEsUUFDbkQsR0FBSSxVQUFVLE9BQU8sSUFBSSxvQkFBWSxrQkFBa0IsT0FBTyxJQUFJLENBQUM7QUFBQSxRQUNuRSxHQUFJLE9BQU8sV0FBVyxXQUFXLFNBQVMsQ0FBQztBQUFBLE1BQzdDO0FBQUEsSUFDRjtBQUFBLElBRUEsaUJBQWlCLFFBQVEsY0FBYyxLQUFLLFlBQVksYUFBYTtBQUNuRSxpQkFBVyxDQUFDLFVBQVUsYUFBYSxLQUFLLE9BQU8sUUFBUSxXQUFXLEdBQUc7QUFDbkUsY0FBTSxRQUFRLE9BQU8sUUFBUTtBQUM3QixjQUFNLFlBQVksVUFBVSxLQUFLLElBQUksWUFBWSxPQUFPLEtBQUs7QUFFN0QsWUFBSSxDQUFDLElBQUksT0FBTyxhQUFhLEVBQUUsS0FBSyxTQUFTLEdBQUc7QUFDOUMsZ0JBQU0sSUFBSTtBQUFBLFlBQ1IsR0FBRyxLQUFLLFlBQVksS0FBSyxZQUFZLENBQUMsYUFBYSxRQUFRLG9CQUFvQixTQUFTLHdCQUF3QixhQUFhO0FBQUEsVUFDL0g7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBTyxpQkFBUTs7O0FDaERmLE1BQU0sVUFBVTtBQU1oQixNQUFNLGdCQUFOLGNBQTRCLGVBQU87QUFBQSxJQUNqQyxZQUFZLFNBQVMsUUFBUTtBQUMzQixZQUFNO0FBRU4sZ0JBQVUsV0FBVyxPQUFPO0FBQzVCLFVBQUksQ0FBQyxTQUFTO0FBQ1o7QUFBQSxNQUNGO0FBRUEsV0FBSyxXQUFXO0FBQ2hCLFdBQUssVUFBVSxLQUFLLFdBQVcsTUFBTTtBQUVyQyxtQkFBSyxJQUFJLEtBQUssVUFBVSxLQUFLLFlBQVksVUFBVSxJQUFJO0FBQUEsSUFDekQ7QUFBQTtBQUFBLElBR0EsVUFBVTtBQUNSLG1CQUFLLE9BQU8sS0FBSyxVQUFVLEtBQUssWUFBWSxRQUFRO0FBQ3BELDRCQUFhLElBQUksS0FBSyxVQUFVLEtBQUssWUFBWSxTQUFTO0FBRTFELGlCQUFXLGdCQUFnQixPQUFPLG9CQUFvQixJQUFJLEdBQUc7QUFDM0QsYUFBSyxZQUFZLElBQUk7QUFBQSxNQUN2QjtBQUFBLElBQ0Y7QUFBQSxJQUVBLGVBQWUsVUFBVSxTQUFTLGFBQWEsTUFBTTtBQUNuRCw2QkFBdUIsVUFBVSxTQUFTLFVBQVU7QUFBQSxJQUN0RDtBQUFBLElBRUEsV0FBVyxRQUFRO0FBQ2pCLGVBQVMsS0FBSyxnQkFBZ0IsUUFBUSxLQUFLLFFBQVE7QUFDbkQsZUFBUyxLQUFLLGtCQUFrQixNQUFNO0FBQ3RDLFdBQUssaUJBQWlCLE1BQU07QUFDNUIsYUFBTztBQUFBLElBQ1Q7QUFBQTtBQUFBLElBR0EsT0FBTyxZQUFZLFNBQVM7QUFDMUIsYUFBTyxhQUFLLElBQUksV0FBVyxPQUFPLEdBQUcsS0FBSyxRQUFRO0FBQUEsSUFDcEQ7QUFBQSxJQUVBLE9BQU8sb0JBQW9CLFNBQVMsU0FBUyxDQUFDLEdBQUc7QUFDL0MsYUFBTyxLQUFLLFlBQVksT0FBTyxLQUFLLElBQUksS0FBSyxTQUFTLE9BQU8sV0FBVyxXQUFXLFNBQVMsSUFBSTtBQUFBLElBQ2xHO0FBQUEsSUFFQSxXQUFXLFVBQVU7QUFDbkIsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLFdBQVcsV0FBVztBQUNwQixhQUFPLE1BQU0sS0FBSyxJQUFJO0FBQUEsSUFDeEI7QUFBQSxJQUVBLFdBQVcsWUFBWTtBQUNyQixhQUFPLElBQUksS0FBSyxRQUFRO0FBQUEsSUFDMUI7QUFBQSxJQUVBLE9BQU8sVUFBVSxNQUFNO0FBQ3JCLGFBQU8sR0FBRyxJQUFJLEdBQUcsS0FBSyxTQUFTO0FBQUEsSUFDakM7QUFBQSxFQUNGO0FBRUEsTUFBTyx5QkFBUTs7O0FDM0VmLE1BQU0sY0FBYyxhQUFXO0FBQzdCLFFBQUksV0FBVyxRQUFRLGFBQWEsZ0JBQWdCO0FBRXBELFFBQUksQ0FBQyxZQUFZLGFBQWEsS0FBSztBQUNqQyxVQUFJLGdCQUFnQixRQUFRLGFBQWEsTUFBTTtBQU0vQyxVQUFJLENBQUMsaUJBQWtCLENBQUMsY0FBYyxTQUFTLEdBQUcsS0FBSyxDQUFDLGNBQWMsV0FBVyxHQUFHLEdBQUk7QUFDdEYsZUFBTztBQUFBLE1BQ1Q7QUFHQSxVQUFJLGNBQWMsU0FBUyxHQUFHLEtBQUssQ0FBQyxjQUFjLFdBQVcsR0FBRyxHQUFHO0FBQ2pFLHdCQUFnQixJQUFJLGNBQWMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQUEsTUFDakQ7QUFFQSxpQkFBVyxpQkFBaUIsa0JBQWtCLE1BQU0sY0FBYyxLQUFLLElBQUk7QUFBQSxJQUM3RTtBQUVBLFdBQU8sV0FBVyxTQUFTLE1BQU0sR0FBRyxFQUFFLElBQUksU0FBTyxjQUFjLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJO0FBQUEsRUFDbkY7QUFFQSxNQUFNLGlCQUFpQjtBQUFBLElBQ3JCLEtBQUssVUFBVSxVQUFVLFNBQVMsaUJBQWlCO0FBQ2pELGFBQU8sQ0FBQyxFQUFFLE9BQU8sR0FBRyxRQUFRLFVBQVUsaUJBQWlCLEtBQUssU0FBUyxRQUFRLENBQUM7QUFBQSxJQUNoRjtBQUFBLElBRUEsUUFBUSxVQUFVLFVBQVUsU0FBUyxpQkFBaUI7QUFDcEQsYUFBTyxRQUFRLFVBQVUsY0FBYyxLQUFLLFNBQVMsUUFBUTtBQUFBLElBQy9EO0FBQUEsSUFFQSxTQUFTLFNBQVMsVUFBVTtBQUMxQixhQUFPLENBQUMsRUFBRSxPQUFPLEdBQUcsUUFBUSxRQUFRLEVBQUUsT0FBTyxXQUFTLE1BQU0sUUFBUSxRQUFRLENBQUM7QUFBQSxJQUMvRTtBQUFBLElBRUEsUUFBUSxTQUFTLFVBQVU7QUFDekIsWUFBTSxVQUFVLENBQUM7QUFDakIsVUFBSSxXQUFXLFFBQVEsV0FBVyxRQUFRLFFBQVE7QUFFbEQsYUFBTyxVQUFVO0FBQ2YsZ0JBQVEsS0FBSyxRQUFRO0FBQ3JCLG1CQUFXLFNBQVMsV0FBVyxRQUFRLFFBQVE7QUFBQSxNQUNqRDtBQUVBLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxLQUFLLFNBQVMsVUFBVTtBQUN0QixVQUFJLFdBQVcsUUFBUTtBQUV2QixhQUFPLFVBQVU7QUFDZixZQUFJLFNBQVMsUUFBUSxRQUFRLEdBQUc7QUFDOUIsaUJBQU8sQ0FBQyxRQUFRO0FBQUEsUUFDbEI7QUFFQSxtQkFBVyxTQUFTO0FBQUEsTUFDdEI7QUFFQSxhQUFPLENBQUM7QUFBQSxJQUNWO0FBQUE7QUFBQSxJQUVBLEtBQUssU0FBUyxVQUFVO0FBQ3RCLFVBQUksT0FBTyxRQUFRO0FBRW5CLGFBQU8sTUFBTTtBQUNYLFlBQUksS0FBSyxRQUFRLFFBQVEsR0FBRztBQUMxQixpQkFBTyxDQUFDLElBQUk7QUFBQSxRQUNkO0FBRUEsZUFBTyxLQUFLO0FBQUEsTUFDZDtBQUVBLGFBQU8sQ0FBQztBQUFBLElBQ1Y7QUFBQSxJQUVBLGtCQUFrQixTQUFTO0FBQ3pCLFlBQU0sYUFBYTtBQUFBLFFBQ2pCO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0YsRUFBRSxJQUFJLGNBQVksR0FBRyxRQUFRLHVCQUF1QixFQUFFLEtBQUssR0FBRztBQUU5RCxhQUFPLEtBQUssS0FBSyxZQUFZLE9BQU8sRUFBRSxPQUFPLFFBQU0sQ0FBQyxXQUFXLEVBQUUsS0FBSyxVQUFVLEVBQUUsQ0FBQztBQUFBLElBQ3JGO0FBQUEsSUFFQSx1QkFBdUIsU0FBUztBQUM5QixZQUFNLFdBQVcsWUFBWSxPQUFPO0FBRXBDLFVBQUksVUFBVTtBQUNaLGVBQU8sZUFBZSxRQUFRLFFBQVEsSUFBSSxXQUFXO0FBQUEsTUFDdkQ7QUFFQSxhQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsdUJBQXVCLFNBQVM7QUFDOUIsWUFBTSxXQUFXLFlBQVksT0FBTztBQUVwQyxhQUFPLFdBQVcsZUFBZSxRQUFRLFFBQVEsSUFBSTtBQUFBLElBQ3ZEO0FBQUEsSUFFQSxnQ0FBZ0MsU0FBUztBQUN2QyxZQUFNLFdBQVcsWUFBWSxPQUFPO0FBRXBDLGFBQU8sV0FBVyxlQUFlLEtBQUssUUFBUSxJQUFJLENBQUM7QUFBQSxJQUNyRDtBQUFBLEVBQ0Y7QUFFQSxNQUFPLDBCQUFROzs7QUM3R2YsTUFBTSxPQUFPO0FBQ2IsTUFBTSxXQUFXO0FBQ2pCLE1BQU0sWUFBWSxJQUFJLFFBQVE7QUFFOUIsTUFBTSxhQUFhLE9BQU8sU0FBUztBQUNuQyxNQUFNLGVBQWUsU0FBUyxTQUFTO0FBQ3ZDLE1BQU0sYUFBYSxPQUFPLFNBQVM7QUFDbkMsTUFBTSxjQUFjLFFBQVEsU0FBUztBQUNyQyxNQUFNLHVCQUF1QixRQUFRLFNBQVM7QUFDOUMsTUFBTSxnQkFBZ0IsVUFBVSxTQUFTO0FBQ3pDLE1BQU0sc0JBQXNCLE9BQU8sU0FBUztBQUU1QyxNQUFNLGlCQUFpQjtBQUN2QixNQUFNLGtCQUFrQjtBQUN4QixNQUFNLGVBQWU7QUFDckIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxXQUFXO0FBQ2pCLE1BQU0sVUFBVTtBQUVoQixNQUFNLG9CQUFvQjtBQUMxQixNQUFNLGtCQUFrQjtBQUN4QixNQUFNLGtCQUFrQjtBQUN4QixNQUFNLGlCQUFpQjtBQUV2QixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLHlCQUF5QjtBQUMvQixNQUFNLCtCQUErQixRQUFRLHdCQUF3QjtBQUVyRSxNQUFNLHFCQUFxQjtBQUMzQixNQUFNLGlCQUFpQjtBQUN2QixNQUFNLGlCQUFpQixZQUFZLDRCQUE0QixxQkFBcUIsNEJBQTRCLGlCQUFpQiw0QkFBNEI7QUFDN0osTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSxzQkFBc0IsR0FBRyxjQUFjLEtBQUssb0JBQW9CO0FBRXRFLE1BQU0sOEJBQThCLElBQUksaUJBQWlCLDRCQUE0QixpQkFBaUIsNkJBQTZCLGlCQUFpQjtBQU1wSixNQUFNLE1BQU4sTUFBTSxhQUFZLHVCQUFjO0FBQUEsSUFDOUIsWUFBWSxTQUFTO0FBQ25CLFlBQU0sT0FBTztBQUNiLFdBQUssVUFBVSxLQUFLLFNBQVMsUUFBUSxrQkFBa0I7QUFFdkQsVUFBSSxDQUFDLEtBQUssU0FBUztBQUNqQjtBQUFBLE1BR0Y7QUFHQSxXQUFLLHNCQUFzQixLQUFLLFNBQVMsS0FBSyxhQUFhLENBQUM7QUFFNUQsNEJBQWEsR0FBRyxLQUFLLFVBQVUsZUFBZSxXQUFTLEtBQUssU0FBUyxLQUFLLENBQUM7QUFBQSxJQUM3RTtBQUFBO0FBQUEsSUFHQSxXQUFXLE9BQU87QUFDaEIsYUFBTztBQUFBLElBQ1Q7QUFBQTtBQUFBLElBR0EsT0FBTztBQUNMLFlBQU0sWUFBWSxLQUFLO0FBQ3ZCLFVBQUksS0FBSyxjQUFjLFNBQVMsR0FBRztBQUNqQztBQUFBLE1BQ0Y7QUFHQSxZQUFNLFNBQVMsS0FBSyxlQUFlO0FBRW5DLFlBQU0sWUFBWSxTQUNoQixzQkFBYSxRQUFRLFFBQVEsWUFBWSxFQUFFLGVBQWUsVUFBVSxDQUFDLElBQ3JFO0FBRUYsWUFBTSxZQUFZLHNCQUFhLFFBQVEsV0FBVyxZQUFZLEVBQUUsZUFBZSxPQUFPLENBQUM7QUFFdkYsVUFBSSxVQUFVLG9CQUFxQixhQUFhLFVBQVUsa0JBQW1CO0FBQzNFO0FBQUEsTUFDRjtBQUVBLFdBQUssWUFBWSxRQUFRLFNBQVM7QUFDbEMsV0FBSyxVQUFVLFdBQVcsTUFBTTtBQUFBLElBQ2xDO0FBQUE7QUFBQSxJQUdBLFVBQVUsU0FBUyxhQUFhO0FBQzlCLFVBQUksQ0FBQyxTQUFTO0FBQ1o7QUFBQSxNQUNGO0FBRUEsY0FBUSxVQUFVLElBQUksaUJBQWlCO0FBRXZDLFdBQUssVUFBVSx3QkFBZSx1QkFBdUIsT0FBTyxDQUFDO0FBRTdELFlBQU0sV0FBVyxNQUFNO0FBQ3JCLFlBQUksUUFBUSxhQUFhLE1BQU0sTUFBTSxPQUFPO0FBQzFDLGtCQUFRLFVBQVUsSUFBSSxlQUFlO0FBQ3JDO0FBQUEsUUFDRjtBQUVBLGdCQUFRLGdCQUFnQixVQUFVO0FBQ2xDLGdCQUFRLGFBQWEsaUJBQWlCLElBQUk7QUFDMUMsYUFBSyxnQkFBZ0IsU0FBUyxJQUFJO0FBQ2xDLDhCQUFhLFFBQVEsU0FBUyxhQUFhO0FBQUEsVUFDekMsZUFBZTtBQUFBLFFBQ2pCLENBQUM7QUFBQSxNQUNIO0FBRUEsV0FBSyxlQUFlLFVBQVUsU0FBUyxRQUFRLFVBQVUsU0FBUyxlQUFlLENBQUM7QUFBQSxJQUNwRjtBQUFBLElBRUEsWUFBWSxTQUFTLGFBQWE7QUFDaEMsVUFBSSxDQUFDLFNBQVM7QUFDWjtBQUFBLE1BQ0Y7QUFFQSxjQUFRLFVBQVUsT0FBTyxpQkFBaUI7QUFDMUMsY0FBUSxLQUFLO0FBRWIsV0FBSyxZQUFZLHdCQUFlLHVCQUF1QixPQUFPLENBQUM7QUFFL0QsWUFBTSxXQUFXLE1BQU07QUFDckIsWUFBSSxRQUFRLGFBQWEsTUFBTSxNQUFNLE9BQU87QUFDMUMsa0JBQVEsVUFBVSxPQUFPLGVBQWU7QUFDeEM7QUFBQSxRQUNGO0FBRUEsZ0JBQVEsYUFBYSxpQkFBaUIsS0FBSztBQUMzQyxnQkFBUSxhQUFhLFlBQVksSUFBSTtBQUNyQyxhQUFLLGdCQUFnQixTQUFTLEtBQUs7QUFDbkMsOEJBQWEsUUFBUSxTQUFTLGNBQWMsRUFBRSxlQUFlLFlBQVksQ0FBQztBQUFBLE1BQzVFO0FBRUEsV0FBSyxlQUFlLFVBQVUsU0FBUyxRQUFRLFVBQVUsU0FBUyxlQUFlLENBQUM7QUFBQSxJQUNwRjtBQUFBLElBRUEsU0FBUyxPQUFPO0FBQ2QsVUFBSSxDQUFFLENBQUMsZ0JBQWdCLGlCQUFpQixjQUFjLGdCQUFnQixVQUFVLE9BQU8sRUFBRSxTQUFTLE1BQU0sR0FBRyxHQUFJO0FBQzdHO0FBQUEsTUFDRjtBQUVBLFlBQU0sZ0JBQWdCO0FBQ3RCLFlBQU0sZUFBZTtBQUVyQixZQUFNLFdBQVcsS0FBSyxhQUFhLEVBQUUsT0FBTyxhQUFXLENBQUMsV0FBVyxPQUFPLENBQUM7QUFDM0UsVUFBSTtBQUVKLFVBQUksQ0FBQyxVQUFVLE9BQU8sRUFBRSxTQUFTLE1BQU0sR0FBRyxHQUFHO0FBQzNDLDRCQUFvQixTQUFTLE1BQU0sUUFBUSxXQUFXLElBQUksU0FBUyxTQUFTLENBQUM7QUFBQSxNQUMvRSxPQUFPO0FBQ0wsY0FBTSxTQUFTLENBQUMsaUJBQWlCLGNBQWMsRUFBRSxTQUFTLE1BQU0sR0FBRztBQUNuRSw0QkFBb0IscUJBQXFCLFVBQVUsTUFBTSxRQUFRLFFBQVEsSUFBSTtBQUFBLE1BQy9FO0FBRUEsVUFBSSxtQkFBbUI7QUFDckIsMEJBQWtCLE1BQU0sRUFBRSxlQUFlLEtBQUssQ0FBQztBQUMvQyxhQUFJLG9CQUFvQixpQkFBaUIsRUFBRSxLQUFLO0FBQUEsTUFDbEQ7QUFBQSxJQUNGO0FBQUEsSUFFQSxlQUFlO0FBQ2IsYUFBTyx3QkFBZSxLQUFLLHFCQUFxQixLQUFLLE9BQU87QUFBQSxJQUM5RDtBQUFBLElBRUEsaUJBQWlCO0FBQ2YsYUFBTyxLQUFLLGFBQWEsRUFBRSxLQUFLLFdBQVMsS0FBSyxjQUFjLEtBQUssQ0FBQyxLQUFLO0FBQUEsSUFDekU7QUFBQSxJQUVBLHNCQUFzQixRQUFRLFVBQVU7QUFDdEMsV0FBSyx5QkFBeUIsUUFBUSxRQUFRLFNBQVM7QUFFdkQsaUJBQVcsU0FBUyxVQUFVO0FBQzVCLGFBQUssNkJBQTZCLEtBQUs7QUFBQSxNQUN6QztBQUFBLElBQ0Y7QUFBQSxJQUVBLDZCQUE2QixPQUFPO0FBQ2xDLGNBQVEsS0FBSyxpQkFBaUIsS0FBSztBQUNuQyxZQUFNLFdBQVcsS0FBSyxjQUFjLEtBQUs7QUFDekMsWUFBTSxZQUFZLEtBQUssaUJBQWlCLEtBQUs7QUFDN0MsWUFBTSxhQUFhLGlCQUFpQixRQUFRO0FBRTVDLFVBQUksY0FBYyxPQUFPO0FBQ3ZCLGFBQUsseUJBQXlCLFdBQVcsUUFBUSxjQUFjO0FBQUEsTUFDakU7QUFFQSxVQUFJLENBQUMsVUFBVTtBQUNiLGNBQU0sYUFBYSxZQUFZLElBQUk7QUFBQSxNQUNyQztBQUVBLFdBQUsseUJBQXlCLE9BQU8sUUFBUSxLQUFLO0FBR2xELFdBQUssbUNBQW1DLEtBQUs7QUFBQSxJQUMvQztBQUFBLElBRUEsbUNBQW1DLE9BQU87QUFDeEMsWUFBTSxTQUFTLHdCQUFlLHVCQUF1QixLQUFLO0FBRTFELFVBQUksQ0FBQyxRQUFRO0FBQ1g7QUFBQSxNQUNGO0FBRUEsV0FBSyx5QkFBeUIsUUFBUSxRQUFRLFVBQVU7QUFFeEQsVUFBSSxNQUFNLElBQUk7QUFDWixhQUFLLHlCQUF5QixRQUFRLG1CQUFtQixHQUFHLE1BQU0sRUFBRSxFQUFFO0FBQUEsTUFDeEU7QUFBQSxJQUNGO0FBQUEsSUFFQSxnQkFBZ0IsU0FBUyxNQUFNO0FBQzdCLFlBQU0sWUFBWSxLQUFLLGlCQUFpQixPQUFPO0FBQy9DLFVBQUksQ0FBQyxVQUFVLFVBQVUsU0FBUyxjQUFjLEdBQUc7QUFDakQ7QUFBQSxNQUNGO0FBRUEsWUFBTSxTQUFTLENBQUMsVUFBVSxjQUFjO0FBQ3RDLGNBQU1DLFdBQVUsd0JBQWUsUUFBUSxVQUFVLFNBQVM7QUFDMUQsWUFBSUEsVUFBUztBQUNYLFVBQUFBLFNBQVEsVUFBVSxPQUFPLFdBQVcsSUFBSTtBQUFBLFFBQzFDO0FBQUEsTUFDRjtBQUVBLGFBQU8sMEJBQTBCLGlCQUFpQjtBQUNsRCxhQUFPLHdCQUF3QixlQUFlO0FBQzlDLGdCQUFVLGFBQWEsaUJBQWlCLElBQUk7QUFBQSxJQUM5QztBQUFBLElBRUEseUJBQXlCLFNBQVMsV0FBVyxPQUFPO0FBQ2xELFVBQUksQ0FBQyxRQUFRLGFBQWEsU0FBUyxHQUFHO0FBQ3BDLGdCQUFRLGFBQWEsV0FBVyxLQUFLO0FBQUEsTUFDdkM7QUFBQSxJQUNGO0FBQUEsSUFFQSxjQUFjLE1BQU07QUFDbEIsYUFBTyxLQUFLLFVBQVUsU0FBUyxpQkFBaUI7QUFBQSxJQUNsRDtBQUFBO0FBQUEsSUFHQSxpQkFBaUIsTUFBTTtBQUNyQixhQUFPLEtBQUssUUFBUSxtQkFBbUIsSUFBSSxPQUFPLHdCQUFlLFFBQVEscUJBQXFCLElBQUk7QUFBQSxJQUNwRztBQUFBO0FBQUEsSUFHQSxpQkFBaUIsTUFBTTtBQUNyQixhQUFPLEtBQUssUUFBUSxjQUFjLEtBQUs7QUFBQSxJQUN6QztBQUFBO0FBQUEsSUFHQSxPQUFPLGdCQUFnQixRQUFRO0FBQzdCLGFBQU8sS0FBSyxLQUFLLFdBQVk7QUFDM0IsY0FBTSxPQUFPLEtBQUksb0JBQW9CLElBQUk7QUFFekMsWUFBSSxPQUFPLFdBQVcsVUFBVTtBQUM5QjtBQUFBLFFBQ0Y7QUFFQSxZQUFJLEtBQUssTUFBTSxNQUFNLFVBQWEsT0FBTyxXQUFXLEdBQUcsS0FBSyxXQUFXLGVBQWU7QUFDcEYsZ0JBQU0sSUFBSSxVQUFVLG9CQUFvQixNQUFNLEdBQUc7QUFBQSxRQUNuRDtBQUVBLGFBQUssTUFBTSxFQUFFO0FBQUEsTUFDZixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFNQSx3QkFBYSxHQUFHLFVBQVUsc0JBQXNCLHNCQUFzQixTQUFVLE9BQU87QUFDckYsUUFBSSxDQUFDLEtBQUssTUFBTSxFQUFFLFNBQVMsS0FBSyxPQUFPLEdBQUc7QUFDeEMsWUFBTSxlQUFlO0FBQUEsSUFDdkI7QUFFQSxRQUFJLFdBQVcsSUFBSSxHQUFHO0FBQ3BCO0FBQUEsSUFDRjtBQUVBLFFBQUksb0JBQW9CLElBQUksRUFBRSxLQUFLO0FBQUEsRUFDckMsQ0FBQztBQUtELHdCQUFhLEdBQUcsUUFBUSxxQkFBcUIsTUFBTTtBQUNqRCxlQUFXLFdBQVcsd0JBQWUsS0FBSywyQkFBMkIsR0FBRztBQUN0RSxVQUFJLG9CQUFvQixPQUFPO0FBQUEsSUFDakM7QUFBQSxFQUNGLENBQUM7QUFLRCxxQkFBbUIsR0FBRztBQUV0QixNQUFPLGNBQVE7OztBQ3RUZixNQUFPLGdCQUFRO0FBQUEsSUFDWDtBQUFBLEVBQ0o7IiwKICAibmFtZXMiOiBbImNhbGxiYWNrIiwgImZuIiwgImVsZW1lbnQiXQp9Cg== 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"