master 857c61d65435 cached
293 files
1.6 MB
504.6k tokens
480 symbols
1 requests
Download .txt
Showing preview only (1,789K chars total). Download the full file or copy to clipboard to get everything.
Repository: app-generator/flask-volt-dashboard
Branch: master
Commit: 857c61d65435
Files: 293
Total size: 1.6 MB

Directory structure:
gitextract_h_druol2/

├── .dockerignore
├── .gitignore
├── CHANGELOG.md
├── Dockerfile
├── LICENSE.md
├── README.md
├── apps/
│   ├── __init__.py
│   ├── authentication/
│   │   ├── __init__.py
│   │   ├── forms.py
│   │   ├── models.py
│   │   ├── oauth.py
│   │   ├── routes.py
│   │   └── util.py
│   ├── charts/
│   │   ├── __init__.py
│   │   └── routes.py
│   ├── config.py
│   ├── dyn_dt/
│   │   ├── __init__.py
│   │   ├── routes.py
│   │   └── utils.py
│   ├── exceptions/
│   │   └── exception.py
│   ├── helpers.py
│   ├── home/
│   │   ├── __init__.py
│   │   └── routes.py
│   └── models.py
├── build.sh
├── docker-compose.yml
├── env.sample
├── gunicorn-cfg.py
├── nginx/
│   └── appseed-app.conf
├── package.json
├── postcss.config.js
├── render.yaml
├── requirements.txt
├── run.py
├── static/
│   └── assets/
│       ├── .gitkeep
│       ├── css/
│       │   └── volt.css
│       ├── gulpfile.js
│       ├── img/
│       │   └── favicon/
│       │       ├── browserconfig.xml
│       │       ├── manifest.json
│       │       └── site.webmanifest
│       ├── js/
│       │   └── volt.js
│       ├── package.json
│       ├── scss/
│       │   ├── custom/
│       │   │   └── _variables.scss
│       │   ├── volt/
│       │   │   ├── _components.scss
│       │   │   ├── _forms.scss
│       │   │   ├── _functions.scss
│       │   │   ├── _layout.scss
│       │   │   ├── _mixins.scss
│       │   │   ├── _utilities.scss
│       │   │   ├── _variables.scss
│       │   │   ├── _vendor.scss
│       │   │   ├── components/
│       │   │   │   ├── _accordions.scss
│       │   │   │   ├── _alerts.scss
│       │   │   │   ├── _animations.scss
│       │   │   │   ├── _avatars.scss
│       │   │   │   ├── _badge.scss
│       │   │   │   ├── _body.scss
│       │   │   │   ├── _breadcrumb.scss
│       │   │   │   ├── _buttons.scss
│       │   │   │   ├── _card.scss
│       │   │   │   ├── _carousel.scss
│       │   │   │   ├── _charts.scss
│       │   │   │   ├── _close.scss
│       │   │   │   ├── _custom-forms.scss
│       │   │   │   ├── _datepicker.scss
│       │   │   │   ├── _dropdown.scss
│       │   │   │   ├── _icons.scss
│       │   │   │   ├── _images.scss
│       │   │   │   ├── _list-group.scss
│       │   │   │   ├── _modal.scss
│       │   │   │   ├── _nav.scss
│       │   │   │   ├── _pagination.scss
│       │   │   │   ├── _popover.scss
│       │   │   │   ├── _progress.scss
│       │   │   │   ├── _scrollbar.scss
│       │   │   │   ├── _shapes.scss
│       │   │   │   ├── _steps.scss
│       │   │   │   ├── _tables.scss
│       │   │   │   ├── _timelines.scss
│       │   │   │   ├── _tooltip.scss
│       │   │   │   └── _type.scss
│       │   │   ├── forms/
│       │   │   │   ├── _form-check.scss
│       │   │   │   ├── _form-control.scss
│       │   │   │   ├── _form-select.scss
│       │   │   │   └── _input-group.scss
│       │   │   ├── layout/
│       │   │   │   ├── _footer.scss
│       │   │   │   ├── _navbar.scss
│       │   │   │   ├── _section.scss
│       │   │   │   ├── _sidebar.scss
│       │   │   │   └── _sidenav.scss
│       │   │   └── mixins/
│       │   │       ├── _animations.scss
│       │   │       ├── _background-variant.scss
│       │   │       ├── _icon.scss
│       │   │       ├── _modals.scss
│       │   │       ├── _popover.scss
│       │   │       ├── _transform.scss
│       │   │       └── _utilities.scss
│       │   └── volt.scss
│       └── vendor/
│           ├── @popperjs/
│           │   └── core/
│           │       └── dist/
│           │           ├── cjs/
│           │           │   ├── popper-base.js
│           │           │   ├── popper-base.js.flow
│           │           │   ├── popper-lite.js
│           │           │   ├── popper-lite.js.flow
│           │           │   ├── popper.js
│           │           │   └── popper.js.flow
│           │           ├── esm/
│           │           │   ├── createPopper.js
│           │           │   ├── dom-utils/
│           │           │   │   ├── contains.js
│           │           │   │   ├── getBoundingClientRect.js
│           │           │   │   ├── getClippingRect.js
│           │           │   │   ├── getCompositeRect.js
│           │           │   │   ├── getComputedStyle.js
│           │           │   │   ├── getDocumentElement.js
│           │           │   │   ├── getDocumentRect.js
│           │           │   │   ├── getHTMLElementScroll.js
│           │           │   │   ├── getLayoutRect.js
│           │           │   │   ├── getNodeName.js
│           │           │   │   ├── getNodeScroll.js
│           │           │   │   ├── getOffsetParent.js
│           │           │   │   ├── getParentNode.js
│           │           │   │   ├── getScrollParent.js
│           │           │   │   ├── getViewportRect.js
│           │           │   │   ├── getWindow.js
│           │           │   │   ├── getWindowScroll.js
│           │           │   │   ├── getWindowScrollBarX.js
│           │           │   │   ├── instanceOf.js
│           │           │   │   ├── isScrollParent.js
│           │           │   │   ├── isTableElement.js
│           │           │   │   └── listScrollParents.js
│           │           │   ├── enums.js
│           │           │   ├── index.js
│           │           │   ├── modifiers/
│           │           │   │   ├── applyStyles.js
│           │           │   │   ├── arrow.js
│           │           │   │   ├── computeStyles.js
│           │           │   │   ├── eventListeners.js
│           │           │   │   ├── flip.js
│           │           │   │   ├── hide.js
│           │           │   │   ├── index.js
│           │           │   │   ├── offset.js
│           │           │   │   ├── popperOffsets.js
│           │           │   │   └── preventOverflow.js
│           │           │   ├── popper-base.js
│           │           │   ├── popper-lite.js
│           │           │   ├── popper.js
│           │           │   ├── types.js
│           │           │   └── utils/
│           │           │       ├── computeAutoPlacement.js
│           │           │       ├── computeOffsets.js
│           │           │       ├── debounce.js
│           │           │       ├── detectOverflow.js
│           │           │       ├── expandToHashMap.js
│           │           │       ├── format.js
│           │           │       ├── getAltAxis.js
│           │           │       ├── getAltLen.js
│           │           │       ├── getBasePlacement.js
│           │           │       ├── getFreshSideObject.js
│           │           │       ├── getMainAxisFromPlacement.js
│           │           │       ├── getOppositePlacement.js
│           │           │       ├── getOppositeVariationPlacement.js
│           │           │       ├── getVariation.js
│           │           │       ├── math.js
│           │           │       ├── mergeByName.js
│           │           │       ├── mergePaddingObject.js
│           │           │       ├── orderModifiers.js
│           │           │       ├── rectToClientRect.js
│           │           │       ├── uniqueBy.js
│           │           │       ├── validateModifiers.js
│           │           │       └── within.js
│           │           └── umd/
│           │               ├── popper-base.min.js.flow
│           │               ├── popper-lite.min.js.flow
│           │               └── popper.min.js.flow
│           ├── chartist-plugin-tooltips/
│           │   └── dist/
│           │       └── chartist-plugin-tooltip.css
│           ├── notyf/
│           │   ├── notyf.es.js
│           │   └── notyf.umd.js
│           ├── nouislider/
│           │   └── distribute/
│           │       ├── nouislider.min.mjs
│           │       └── nouislider.mjs
│           ├── onscreen/
│           │   └── dist/
│           │       ├── index.js
│           │       └── on-screen.es6.js
│           ├── simplebar/
│           │   └── dist/
│           │       ├── simplebar-core.esm.js
│           │       ├── simplebar.esm.js
│           │       └── simplebar.umd.js
│           ├── vanillajs-datepicker/
│           │   └── dist/
│           │       └── js/
│           │           └── locales/
│           │               ├── ar-tn.js
│           │               ├── ar.js
│           │               ├── az.js
│           │               ├── bg.js
│           │               ├── bm.js
│           │               ├── bn.js
│           │               ├── br.js
│           │               ├── bs.js
│           │               ├── ca.js
│           │               ├── cs.js
│           │               ├── cy.js
│           │               ├── da.js
│           │               ├── de.js
│           │               ├── el.js
│           │               ├── en-AU.js
│           │               ├── en-CA.js
│           │               ├── en-GB.js
│           │               ├── en-IE.js
│           │               ├── en-NZ.js
│           │               ├── en-ZA.js
│           │               ├── eo.js
│           │               ├── es.js
│           │               ├── et.js
│           │               ├── eu.js
│           │               ├── fa.js
│           │               ├── fi.js
│           │               ├── fo.js
│           │               ├── fr-CH.js
│           │               ├── fr.js
│           │               ├── gl.js
│           │               ├── he.js
│           │               ├── hi.js
│           │               ├── hr.js
│           │               ├── hu.js
│           │               ├── hy.js
│           │               ├── id.js
│           │               ├── is.js
│           │               ├── it-CH.js
│           │               ├── it.js
│           │               ├── ja.js
│           │               ├── ka.js
│           │               ├── kk.js
│           │               ├── km.js
│           │               ├── ko.js
│           │               ├── lt.js
│           │               ├── lv.js
│           │               ├── me.js
│           │               ├── mk.js
│           │               ├── mn.js
│           │               ├── mr.js
│           │               ├── ms.js
│           │               ├── nl-BE.js
│           │               ├── nl.js
│           │               ├── no.js
│           │               ├── oc.js
│           │               ├── pl.js
│           │               ├── pt-BR.js
│           │               ├── pt.js
│           │               ├── ro.js
│           │               ├── ru.js
│           │               ├── si.js
│           │               ├── sk.js
│           │               ├── sl.js
│           │               ├── sq.js
│           │               ├── sr-latn.js
│           │               ├── sr.js
│           │               ├── sv.js
│           │               ├── sw.js
│           │               ├── ta.js
│           │               ├── tg.js
│           │               ├── th.js
│           │               ├── tk.js
│           │               ├── tr.js
│           │               ├── uk.js
│           │               ├── uz-cyrl.js
│           │               ├── uz-latn.js
│           │               ├── vi.js
│           │               ├── zh-CN.js
│           │               └── zh-TW.js
│           └── waypoints/
│               ├── lib/
│               │   └── waypoints.debug.js
│               ├── licenses.txt
│               └── testem.json
├── templates/
│   ├── .gitkeep
│   ├── accounts/
│   │   ├── login.html
│   │   └── register.html
│   ├── charts/
│   │   └── index.html
│   ├── dyn_dt/
│   │   ├── index.html
│   │   └── model.html
│   ├── home/
│   │   ├── components-buttons.html
│   │   ├── components-forms.html
│   │   ├── components-modals.html
│   │   ├── components-notifications.html
│   │   ├── components-typography.html
│   │   ├── dashboard.html
│   │   ├── index.html
│   │   ├── page-403.html
│   │   ├── page-404.html
│   │   ├── page-500.html
│   │   ├── page-forgot-password.html
│   │   ├── page-lock.html
│   │   ├── page-reset-password.html
│   │   ├── page-sign-in.html
│   │   ├── page-sign-up.html
│   │   ├── settings.html
│   │   ├── tables-bootstrap-tables.html
│   │   └── transactions.html
│   ├── includes/
│   │   ├── footer.html
│   │   ├── items-table.html
│   │   ├── navigation.html
│   │   ├── scripts.html
│   │   ├── settings-box.html
│   │   └── sidebar.html
│   └── layouts/
│       ├── base-fullscreen.html
│       └── base.html
└── vite.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
.git
__pycache__
*.pyc
*.pyo
*.pyd

================================================
FILE: .gitignore
================================================
# byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]

# tests and coverage
*.pytest_cache
.coverage

# database & logs
*.db
*.sqlite3
*.log

# venv
env
venv

# other
.DS_Store

# sphinx docs 
_build
_static
_templates

# javascript
package-lock.json
.vscode/symbols.json

apps/static/assets/node_modules
apps/static/assets/yarn.lock
apps/static/assets/.temp

migrations

README_bk.md


================================================
FILE: CHANGELOG.md
================================================
# Change Log

## [1.0.17] 2025-04-01
### Changes

- Update RM (minor)

## [1.0.16] 2024-05-18
### Changes

- Updated DOCS (readme)
  - [Custom Development](https://appseed.us/custom-development/) Section
  - [CI/CD Assistance for AWS, DO](https://appseed.us/terms/#section-ci-cd)

## [1.0.15] 2024-03-06
### Changes

- Update [Custom Development](https://appseed.us/custom-development/) Section
  - New Pricing: `$3,999`

## [1.0.14] 2023-10-07
### Changes

- Update Dependencies
- Silent fallback to SQLite

## [1.0.13] 2023-06-22
### Changes

- Print UserID on `index`
  - Via export in controller
  - Via `current_user` in view

## [1.0.12] 2023-03-15
### Changes

- DOCS Update
  - [Volt Dashboard Flask](https://docs.appseed.us/products/flask-dashboards/volt/) - `official help` 
- Links Curation (minor)

## [1.0.11] 2022-12-31
### Changes

- Added page compression for PRODUCTION env
  - `DEBUG=False`

## [1.0.10] 2022-12-31
### Changes

- Deployment-ready for Render (CI/CD)
  - `render.yaml`
  - `build.sh`

## [1.0.9] 2022-12-31
### Changes

- `DB Management` Improvement
  - `Silent fallback` to **SQLite**

## [1.0.8] 2022-09-07
### Improvements

- Added OAuth via Github
- Improved Auth Pages

## [1.0.7] 2022-05-25
### Improvements

- Built with [Volt Dashboard Generator](https://appseed.us/generator/volt-dashboard/)
  - Timestamp: `2022-05-25 22:26`
- Codebase refactoring
- Added CDN Support
  - via `.env` **ASSETS_ROOT**  

## [1.0.6] 2022-01-16
### Improvements

- Bump Flask Codebase to [v2stable.0.1](https://github.com/app-generator/boilerplate-code-flask-dashboard/releases)
- Dependencies update (all packages) 
  - Flask==2.0.2 (latest stable version)
  - flask_wtf==1.0.0
  - jinja2==3.0.3
  - flask-restx==0.5.1
- Forms Update:
  - Replace `TextField` (deprecated) with `StringField`

## Unreleased
### Fixes

- 2021-11-08 - `v1.0.6-rc1`
  - ImportError: cannot import name 'TextField' from 'wtforms'
    - Problem caused by `WTForms-3.0.0`
    - Fix: use **WTForms==2.3.3**
    
## [1.0.5] 2021-09-16
### Improvements & Fixes

- Bump Flask Codebase to [v2.0.0](https://github.com/app-generator/boilerplate-code-flask-dashboard/releases)
  - Dependencies update (all packages)
    - Use Flask==2.0.1 (latest stable version)
  - Better Code formatting
  - Improved Files organization
  - Optimize imports
  - Docker Scripts Update 

## [1.0.4] 2021-08-27
### Improvements

- Bump UI - [Volt Dashboard v1.4.1](https://github.com/themesberg/volt-bootstrap-5-dashboard/releases) 
  
## Unreleased 2021-05-26
### Tooling

- Added scripts to recompile the SCSS files
    - `app/base/static/assets/` - gulpfile.js
    - `app/base/static/assets/` - package.json
- `Update README` - [Recompile SCSS](https://github.com/app-generator/flask-dashboard-volt#recompile-css) (new section)

## [1.0.3] 2021-05-16
### Dependencies Update

- Bump Codebase: [Flask Dashboard](https://github.com/app-generator/boilerplate-code-flask-dashboard) v1.0.6
- Freeze used versions in `requirements.txt`
    - jinja2 = 2.11.3

## [1.0.2] 2021-03-30
### Improvements

- Bump UI: [Jinja Volt](https://github.com/app-generator/jinja-volt-dashboard/releases) v1.0.1
- [Volt Dashboard](https://github.com/themesberg/volt-bootstrap-5-dashboard/releases) v1.3.2

## [1.0.1] 2021-03-18
### Improvements

- Bump Codebase: [Flask Dashboard](https://github.com/app-generator/boilerplate-code-flask-dashboard) v1.0.5
- Freeze used versions in `requirements.txt`
    - flask_sqlalchemy = 2.4.4
    - sqlalchemy = 1.3.23

## [1.0.0] 2021-01-17

- Bump UI: [Jinja Volt](https://github.com/app-generator/jinja-volt-dashboard/releases) v1.0.0
- [Volt Dashboard](https://github.com/themesberg/volt-bootstrap-5-dashboard/releases/tag) v1.2.0 
- Codebase: [Flask Dashboard](https://github.com/app-generator/boilerplate-code-flask-dashboard/releases) v1.0.3



================================================
FILE: Dockerfile
================================================
FROM python:3.10

# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
ENV FLASK_APP run.py
ENV DEBUG True

COPY requirements.txt .

# install python dependencies
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt

COPY env.sample .env

COPY . .

RUN flask db init
RUN flask db migrate
RUN flask db upgrade

# gunicorn
CMD ["gunicorn", "--config", "gunicorn-cfg.py", "run:app"]


================================================
FILE: LICENSE.md
================================================
# MIT License

Copyright (c) 2019 - present [AppSeed](http://appseed.us/)

<br />

## Licensing Information

<br />

| Item | - |
| ---------------------------------- | --- |
| License Type | MIT  |
| Use for print | **YES** |
| Create single personal website/app | **YES** |
| Create single website/app for client | **YES** |
| Create multiple website/apps for clients | **YES** |
| Create multiple SaaS applications | **YES** |
| End-product paying users | **YES** |
| Product sale | **YES** |
| Remove footer credits | **YES** |
| --- | --- |
| Remove copyright mentions from source code | NO |
| Production deployment assistance | NO |
| Create HTML/CSS template for sale | NO |
| Create Theme/Template for CMS for sale | NO |
| Separate sale of our UI Elements | NO |

<br />

---
For more information regarding licensing, please contact the AppSeed Service < *support@appseed.us* >


================================================
FILE: README.md
================================================
# [Flask Volt Dashboard](https://app-generator.dev/product/volt-dashboard/flask/)

Open-source **Flask Starter with Volt Dashboard Design**, an open-source iconic `Bootstrap` design.
The product is designed to deliver the best possible user experience with highly customizable feature-rich pages. 

- 👉 [Flask Volt Dashboard](https://app-generator.dev/product/volt-dashboard/flask/) - `Product Page`
- 👉 [Flask Volt Dashboard](https://flask-volt-dashboard.appseed-srv1.com/) - `LIVE Demo` 
- 👉 [Flask Volt Dashboard](https://app-generator.dev/docs/products/flask/volt-dashboard/index.html) - `Complete Information` and Support Links
  - [Getting Started with Flask](https://app-generator.dev/docs/technologies/flask/index.html) - a `comprehensive tutorial`
  - `Configuration`: Install Tailwind/Flowbite, Prepare Environment, Setting up the Database 
  - `Start with Docker`
  - `Manual Build`
  - `Start the project`
  - `Deploy on Render`

<br />

## `PROMO` Domains for sale

- 👉 **[AppSeed.us - $49k](https://appseed.us/)**
- 👉 **[Admin-Dashboards.com - $15k](https://www.admin-dashboards.com/)**
- 👉 **[UI-Themes.com - $5k](https://ui-themes.com/)**
- 👉 **[Simpllo.com - $10k](https://www.simpllo.com/)**
- 👉 **[123SiteBuilder.net - $5k](https://www.123sitebuilder.net/)**

<br />

## Features

- Simple, Easy-to-Extend codebase, [Blueprint Pattern](https://app-generator.dev/blog/flask-blueprints-a-developers-guide/)
- Up-to-date Dependencies
- [Volt Dashboard](https://app-generator.dev/docs/templates/bootstrap/volt-dashboard.html) Full Integration
- [Bootstrap](https://app-generator.dev/docs/templates/bootstrap/index.html) 5 Styling
- Auth: Session Based, GitHub, Google
- Celery Beat 
- DB Persistence: SQLite (default), 
  - Easy switch to MySql/MariaDB, PgSql
- Dynamic DataTables - manage data without coding
- CI/CD integration for [Render](https://app-generator.dev/docs/deployment/render/index.html)
- Deployment: Docker, Flask-Minify

![Volt Dashboard - Full-Stack Starter generated by AppSeed.](https://user-images.githubusercontent.com/51070104/168843604-b026fd94-5969-4be7-81ac-5887cf0958e5.png)

<br />

## Deploy LIVE

> One-click deploy (requires already having an account).

[![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy)

<br /> 

## [Volt Dashboard PRO Version](https://app-generator.dev/product/volt-dashboard-pro/flask/)

> The premium version provides more features, priority on support, and is more often updated - [Live Demo](https://flask-volt-dashboard-enh.appseed-srv1.com/).

- **Simple, Easy-to-Extend** Codebase
- **Volt Dashboard** Design - PRO Version
- Bootstrap 4 CSS
- **Deployment-Ready** for Render 

![Volt Dashboard PRO - Starter generated by AppSeed.](https://user-images.githubusercontent.com/51070104/172672843-8c40a801-3438-4e9c-86db-38a34191fbdf.png)

<br />

## `Customize` with [Flask Generator](https://app-generator.dev/tools/flask-generator/)

- Access the [Flask Generator](https://app-generator.dev/tools/flask-generator/)
- Select the preferred design
- (Optional) Design Database: edit models and fields
- (Optional) Edit the fields for the extended user model
- (Optional) Enable OAuth for GitHub
- (Optional) Add Celery (async tasks)
- (Optional) Enable Dynamic Tables Module
- Docker Scripts
- Render CI/Cd Scripts

**The generated Flask project is available as a ZIP Archive and also uploaded to GitHub.**

![Flask Generator - Flask App Generator - User Interface for choosing the Design](https://github.com/user-attachments/assets/fbf73fc0-e9a1-4f01-86a8-aa8be55413b5) 

![Flask App Generator - User Interface for Edit the Extended User Model](https://github.com/user-attachments/assets/138b9816-4f2e-454f-84f2-7409969b8548) 

<br /> 

---
[Flask Volt Dashboard](https://app-generator.dev/product/volt-dashboard/flask/) - Open-Source **Flask** Starter provided by [App Generator](https://app-generator.dev)


================================================
FILE: apps/__init__.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

import os
from flask import Flask
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy
from importlib import import_module

db = SQLAlchemy()
login_manager = LoginManager()

def register_extensions(app):
    db.init_app(app)
    login_manager.init_app(app)

def register_blueprints(app):
    for module_name in ('authentication', 'home', 'dyn_dt', 'charts', ):
        module = import_module('apps.{}.routes'.format(module_name))
        app.register_blueprint(module.blueprint)

from apps.authentication.oauth import github_blueprint, google_blueprint

def create_app(config):

    # Contextual
    static_prefix = '/static'
    templates_dir = os.path.dirname(config.BASE_DIR)

    TEMPLATES_FOLDER = os.path.join(templates_dir,'templates')
    STATIC_FOLDER = os.path.join(templates_dir,'static')

    print(' > TEMPLATES_FOLDER: ' + TEMPLATES_FOLDER)
    print(' > STATIC_FOLDER:    ' + STATIC_FOLDER)

    app = Flask(__name__, static_url_path=static_prefix, template_folder=TEMPLATES_FOLDER, static_folder=STATIC_FOLDER)

    app.config.from_object(config)
    register_extensions(app)
    register_blueprints(app)
    app.register_blueprint(github_blueprint, url_prefix="/login")    
    app.register_blueprint(google_blueprint, url_prefix="/login")    
    return app


================================================
FILE: apps/authentication/__init__.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

from flask import Blueprint

blueprint = Blueprint(
    'authentication_blueprint',
    __name__,
    url_prefix=''
)


================================================
FILE: apps/authentication/forms.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import Email, DataRequired

# login and registration


class LoginForm(FlaskForm):
    username = StringField('Username',
                         id='username_login',
                         validators=[DataRequired()])
    password = PasswordField('Password',
                             id='pwd_login',
                             validators=[DataRequired()])


class CreateAccountForm(FlaskForm):
    username = StringField('Username',
                         id='username_create',
                         validators=[DataRequired()])
    email = StringField('Email',
                      id='email_create',
                      validators=[DataRequired(), Email()])
    password = PasswordField('Password',
                             id='pwd_create',
                             validators=[DataRequired()])


================================================
FILE: apps/authentication/models.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

from flask_login import UserMixin

from sqlalchemy.exc import SQLAlchemyError, IntegrityError
from flask_dance.consumer.storage.sqla import OAuthConsumerMixin

from apps import db, login_manager
from apps.authentication.util import hash_pass

class Users(db.Model, UserMixin):

    __tablename__ = 'users'

    id            = db.Column(db.Integer, primary_key=True)
    username      = db.Column(db.String(64), unique=True)
    email         = db.Column(db.String(64), unique=True)
    password      = db.Column(db.LargeBinary)
    bio           = db.Column(db.Text(), nullable=True)

    oauth_github  = db.Column(db.String(100), nullable=True)
    oauth_google  = db.Column(db.String(100), nullable=True)

    readonly_fields = ["id", "username", "email", "oauth_github", "oauth_google"]

    def __init__(self, **kwargs):
        for property, value in kwargs.items():
            # depending on whether value is an iterable or not, we must
            # unpack it's value (when **kwargs is request.form, some values
            # will be a 1-element list)
            if hasattr(value, '__iter__') and not isinstance(value, str):
                # the ,= unpack of a singleton fails PEP8 (travis flake8 test)
                value = value[0]

            if property == 'password':
                value = hash_pass(value)  # we need bytes here (not plain str)

            setattr(self, property, value)

    def __repr__(self):
        return str(self.username)

    @classmethod
    def find_by_email(cls, email: str) -> "Users":
        return cls.query.filter_by(email=email).first()

    @classmethod
    def find_by_username(cls, username: str) -> "Users":
        return cls.query.filter_by(username=username).first()
    
    @classmethod
    def find_by_id(cls, _id: int) -> "Users":
        return cls.query.filter_by(id=_id).first()
   
    def save(self) -> None:
        try:
            db.session.add(self)
            db.session.commit()
          
        except SQLAlchemyError as e:
            db.session.rollback()
            db.session.close()
            error = str(e.__dict__['orig'])
            raise IntegrityError(error, 422)
    
    def delete_from_db(self) -> None:
        try:
            db.session.delete(self)
            db.session.commit()
        except SQLAlchemyError as e:
            db.session.rollback()
            db.session.close()
            error = str(e.__dict__['orig'])
            raise IntegrityError(error, 422)
        return

@login_manager.user_loader
def user_loader(id):
    return Users.query.filter_by(id=id).first()

@login_manager.request_loader
def request_loader(request):
    username = request.form.get('username')
    user = Users.query.filter_by(username=username).first()
    return user if user else None

class OAuth(OAuthConsumerMixin, db.Model):
    user_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="cascade"), nullable=False)
    user = db.relationship(Users)


================================================
FILE: apps/authentication/oauth.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

import os
from flask import current_app as app 
from flask_login import current_user, login_user
from flask_dance.consumer import oauth_authorized
from flask_dance.contrib.github import github, make_github_blueprint
from flask_dance.contrib.google import google, make_google_blueprint
from flask_dance.consumer.storage.sqla import SQLAlchemyStorage
from sqlalchemy.orm.exc import NoResultFound
from apps.config import Config
from .models import Users, db, OAuth
from flask import redirect, url_for
from flask import flash

github_blueprint = make_github_blueprint(
    client_id=Config.GITHUB_ID,
    client_secret=Config.GITHUB_SECRET,
    scope = 'user',
    storage=SQLAlchemyStorage(
        OAuth,
        db.session,
        user=current_user,
        user_required=False,        
    ),   
)

@oauth_authorized.connect_via(github_blueprint)
def github_logged_in(blueprint, token):
    info = github.get("/user")

    if info.ok:

        account_info = info.json()
        username     = account_info["login"]

        query = Users.query.filter_by(oauth_github=username)
        try:

            user = query.one()
            login_user(user)

        except NoResultFound:

            # Save to db
            user              = Users()
            user.username     = '(gh)' + username
            user.oauth_github = username

            # Save current user
            db.session.add(user)
            db.session.commit()

            login_user(user)

# Google

google_blueprint = make_google_blueprint(
    client_id=Config.GOOGLE_ID,
    client_secret=Config.GOOGLE_SECRET,
    scope=[
        "openid",
        "https://www.googleapis.com/auth/userinfo.email",
        "https://www.googleapis.com/auth/userinfo.profile",
    ],
    storage=SQLAlchemyStorage(
        OAuth,
        db.session,
        user=current_user,
        user_required=False,        
    ),   
)

@oauth_authorized.connect_via(google_blueprint)
def google_logged_in(blueprint, token):
    info = google.get("/oauth2/v1/userinfo")

    if info.ok:
        account_info = info.json()
        username     = account_info["given_name"]
        email        = account_info["email"]

        query = Users.query.filter_by(oauth_google=username)
        try:

            user = query.one()
            login_user(user)

        except NoResultFound:
            # Save to db
            user              = Users()
            user.username     = '(google)' + username
            user.oauth_google = username
            user.email        = email

            # Save current user
            db.session.add(user)
            db.session.commit()

            login_user(user)


================================================
FILE: apps/authentication/routes.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

from flask import render_template, redirect, request, url_for
from flask_login import (
    current_user,
    login_user,
    logout_user
)

from flask_dance.contrib.github import github
from flask_dance.contrib.google import google

from apps import db, login_manager
from apps.authentication import blueprint
from apps.authentication.forms import LoginForm, CreateAccountForm
from apps.authentication.models import Users
from apps.config import Config
from apps.authentication.util import verify_pass

@blueprint.route('/')
def route_default():
    return redirect(url_for('authentication_blueprint.login'))

# Login & Registration

@blueprint.route("/github")
def login_github():
    """ Github login """
    if not github.authorized:
        return redirect(url_for("github.login"))

    res = github.get("/user")
    return redirect(url_for('home_blueprint.index'))


@blueprint.route("/google")
def login_google():
    """ Google login """
    if not google.authorized:
        return redirect(url_for("google.login"))

    res = google.get("/oauth2/v1/userinfo")
    return redirect(url_for('home_blueprint.index'))


@blueprint.route('/login', methods=['GET', 'POST'])
def login():
    login_form = LoginForm(request.form)
    if 'login' in request.form:

        # read form data
        username = request.form['username']
        password = request.form['password']

        # Locate user
        user = Users.query.filter_by(username=username).first()

        # Check the password
        if user and verify_pass(password, user.password):

            login_user(user)
            return redirect(url_for('authentication_blueprint.route_default'))

        # Something (user or pass) is not ok
        return render_template('accounts/login.html',
                               msg='Wrong user or password',
                               form=login_form)

    if not current_user.is_authenticated:
        return render_template('accounts/login.html',
                               form=login_form)
    return redirect(url_for('home_blueprint.index'))


@blueprint.route('/register', methods=['GET', 'POST'])
def register():
    create_account_form = CreateAccountForm(request.form)
    if 'register' in request.form:

        username = request.form['username']
        email = request.form['email']

        # Check usename exists
        user = Users.query.filter_by(username=username).first()
        if user:
            return render_template('accounts/register.html',
                                   msg='Username already registered',
                                   success=False,
                                   form=create_account_form)

        # Check email exists
        user = Users.query.filter_by(email=email).first()
        if user:
            return render_template('accounts/register.html',
                                   msg='Email already registered',
                                   success=False,
                                   form=create_account_form)

        # else we can create the user
        user = Users(**request.form)
        db.session.add(user)
        db.session.commit()

        # Delete user from session
        logout_user()
        
        return render_template('accounts/register.html',
                               msg='Account created successfully.',
                               success=True,
                               form=create_account_form)

    else:
        return render_template('accounts/register.html', form=create_account_form)


@blueprint.route('/logout')
def logout():
    logout_user()
    return redirect(url_for('authentication_blueprint.login'))


# Errors

@login_manager.unauthorized_handler
def unauthorized_handler():
    return render_template('home/page-403.html'), 403


@blueprint.errorhandler(403)
def access_forbidden(error):
    return render_template('home/page-403.html'), 403


@blueprint.errorhandler(404)
def not_found_error(error):
    return render_template('home/page-404.html'), 404


@blueprint.errorhandler(500)
def internal_error(error):
    return render_template('home/page-500.html'), 500


@blueprint.context_processor
def has_github():
    return {'has_github': bool(Config.GITHUB_ID) and bool(Config.GITHUB_SECRET)}

@blueprint.context_processor
def has_google():
    return {'has_google': bool(Config.GOOGLE_ID) and bool(Config.GOOGLE_SECRET)}

================================================
FILE: apps/authentication/util.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

import os
import hashlib
import binascii

# Inspiration -> https://www.vitoshacademy.com/hashing-passwords-in-python/


def hash_pass(password):
    """Hash a password for storing."""

    salt = hashlib.sha256(os.urandom(60)).hexdigest().encode('ascii')
    pwdhash = hashlib.pbkdf2_hmac('sha512', password.encode('utf-8'),
                                  salt, 100000)
    pwdhash = binascii.hexlify(pwdhash)
    return (salt + pwdhash)  # return bytes


def verify_pass(provided_password, stored_password):
    """Verify a stored password against one provided by user"""

    stored_password = stored_password.decode('ascii')
    salt = stored_password[:64]
    stored_password = stored_password[64:]
    pwdhash = hashlib.pbkdf2_hmac('sha512',
                                  provided_password.encode('utf-8'),
                                  salt.encode('ascii'),
                                  100000)
    pwdhash = binascii.hexlify(pwdhash).decode('ascii')
    return pwdhash == stored_password


================================================
FILE: apps/charts/__init__.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

from flask import Blueprint

blueprint = Blueprint(
    'charts_blueprint',
    __name__,
    url_prefix=''
)


================================================
FILE: apps/charts/routes.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

from apps.charts import blueprint
from flask import render_template
from apps.models import Product

@blueprint.route('/charts')
def charts():
    products = [{'name': product.name, 'price': product.price} for product in Product.get_list()]
    return render_template('charts/index.html', segment='charts', products=products)

================================================
FILE: apps/config.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

import os
from pathlib import Path

class Config(object):

    BASE_DIR = Path(__file__).resolve().parent
    
    USERS_ROLES  = { 'ADMIN'  :1 , 'USER'      : 2 }
    USERS_STATUS = { 'ACTIVE' :1 , 'SUSPENDED' : 2 }
    
    # celery 
    CELERY_BROKER_URL     = "redis://localhost:6379"
    CELERY_RESULT_BACKEND = "redis://localhost:6379"
    CELERY_HOSTMACHINE    = "celery@app-generator"

    # Set up the App SECRET_KEY
    SECRET_KEY  = os.getenv('SECRET_KEY', 'S3cret_999')

    # Social AUTH context
    SOCIAL_AUTH_GITHUB  = False

    GITHUB_ID      = os.getenv('GITHUB_ID'    , None)
    GITHUB_SECRET  = os.getenv('GITHUB_SECRET', None)

    # Enable/Disable Github Social Login    
    if GITHUB_ID and GITHUB_SECRET:
         SOCIAL_AUTH_GITHUB  = True    

    GOOGLE_ID      = os.getenv('GOOGLE_ID'    , None)
    GOOGLE_SECRET  = os.getenv('GOOGLE_SECRET', None)

    # Enable/Disable Google Social Login    
    if GOOGLE_ID and GOOGLE_SECRET:
         SOCIAL_AUTH_GOOGLE  = True    

    SQLALCHEMY_TRACK_MODIFICATIONS = False

    DB_ENGINE   = os.getenv('DB_ENGINE'   , None)
    DB_USERNAME = os.getenv('DB_USERNAME' , None)
    DB_PASS     = os.getenv('DB_PASS'     , None)
    DB_HOST     = os.getenv('DB_HOST'     , None)
    DB_PORT     = os.getenv('DB_PORT'     , None)
    DB_NAME     = os.getenv('DB_NAME'     , None)

    USE_SQLITE  = True 

    # try to set up a Relational DBMS
    if DB_ENGINE and DB_NAME and DB_USERNAME:

        try:
            
            # Relational DBMS: PSQL, MySql
            SQLALCHEMY_DATABASE_URI = '{}://{}:{}@{}:{}/{}'.format(
                DB_ENGINE,
                DB_USERNAME,
                DB_PASS,
                DB_HOST,
                DB_PORT,
                DB_NAME
            ) 

            USE_SQLITE  = False

        except Exception as e:

            print('> Error: DBMS Exception: ' + str(e) )
            print('> Fallback to SQLite ')    

    if USE_SQLITE:

        # This will create a file in <app> FOLDER
        SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(BASE_DIR, 'db.sqlite3')

    DYNAMIC_DATATB = {
        "products": "apps.models.Product"
    }

    CDN_DOMAIN = os.getenv('CDN_DOMAIN')
    CDN_HTTPS = os.getenv('CDN_HTTPS', True)

class ProductionConfig(Config):
    DEBUG = False

    # Security
    SESSION_COOKIE_HTTPONLY = True
    REMEMBER_COOKIE_HTTPONLY = True
    REMEMBER_COOKIE_DURATION = 3600

class DebugConfig(Config):
    DEBUG = True

# Load all possible configurations
config_dict = {
    'Production': ProductionConfig,
    'Debug'     : DebugConfig
}


================================================
FILE: apps/dyn_dt/__init__.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

from flask import Blueprint

blueprint = Blueprint(
    'table_blueprint',
    __name__,
    url_prefix=''
)


================================================
FILE: apps/dyn_dt/routes.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

import json, csv, io
from flask_login import login_required
from apps.dyn_dt import blueprint
from flask import render_template, request, redirect, url_for, jsonify, make_response
from apps.dyn_dt.utils import get_model_field_names, get_model_fk_values, name_to_class, user_filter, exclude_auto_gen_fields
from apps import db, config
from apps.dyn_dt.utils import *
from sqlalchemy import and_
from sqlalchemy import Integer, DateTime, String, Text
from datetime import datetime

@blueprint.route('/dynamic-dt')
def dynamic_dt():
    context = {
        'routes': config.Config.DYNAMIC_DATATB.keys(),
        'segment': 'dynamic_dt'
    }
    return render_template('dyn_dt/index.html', **context)

@blueprint.route('/create_filter/<model_name>', methods=["POST"])
def create_filter(model_name):
    model_name = model_name.lower()
    if request.method == "POST":
        keys = request.form.getlist('key')
        values = request.form.getlist('value')
        
        for key, value in zip(keys, values):
            filter_instance = ModelFilter.query.filter_by(parent=model_name, key=key).first()
            if filter_instance:
                filter_instance.value = value
            else:
                filter_instance = ModelFilter(parent=model_name, key=key, value=value)
            db.session.add(filter_instance)
        
        db.session.commit()
        return redirect(url_for('table_blueprint.model_dt', aPath=model_name))


@blueprint.route('/create_page_items/<model_name>', methods=["POST"])
def create_page_items(model_name):
    model_name = model_name.lower()
    if request.method == 'POST':
        items = request.form.get('items')
        page_items = PageItems.query.filter_by(parent=model_name).first()
        if page_items:
            page_items.items_per_page = items
        else:
            page_items = PageItems(parent=model_name, items_per_page=items)
        db.session.add(page_items)
        db.session.commit()
        return redirect(url_for('table_blueprint.model_dt', aPath=model_name))


@blueprint.route('/create_hide_show_filter/<model_name>', methods=["POST"])
def create_hide_show_filter(model_name):
    model_name = model_name.lower()
    if request.method == "POST":
        data_str = list(request.form.keys())[0]
        data = json.loads(data_str)

        filter_instance = HideShowFilter.query.filter_by(parent=model_name, key=data.get('key')).first()
        if filter_instance:
            filter_instance.value = data.get('value')
        else:
            filter_instance = HideShowFilter(parent=model_name, key=data.get('key'), value=data.get('value'))
        
        db.session.add(filter_instance)
        db.session.commit()

        return jsonify({'message': 'Model updated successfully'})


@blueprint.route('/delete_filter/<model_name>/<int:id>', methods=["GET"])
def delete_filter(model_name, id):
    model_name = model_name.lower()
    filter_instance = ModelFilter.query.filter_by(id=id, parent=model_name).first()
    if filter_instance:
        db.session.delete(filter_instance)
        db.session.commit()
        return redirect(url_for('table_blueprint.model_dt', aPath=model_name))
    return jsonify({'error': 'Filter not found'}), 404


@blueprint.route('/dynamic-dt/<aPath>', methods=['GET', 'POST'])
def model_dt(aPath):
    aModelName = None
    aModelClass = None

    if aPath in config.Config.DYNAMIC_DATATB.keys():
        aModelName = config.Config.DYNAMIC_DATATB[aPath]
        aModelClass = name_to_class(aModelName)

    if not aModelClass:
        return f'ERR: Getting ModelClass for path: {aPath}', 404

    # db_fields = [field.name for field in aModelClass.__table__.columns]
    db_fields = [field.name for field in aModelClass.__table__.columns if not field.foreign_keys]
    fk_fields = get_model_fk_values(aModelClass)
    db_filters = []
    for f in db_fields:
        if f not in fk_fields.keys():
            db_filters.append( f )

    choices_dict = {}
    for column in aModelClass.__table__.columns:
        if isinstance(column.type, db.Enum):
            choices_dict[column.name] = [(choice.name, choice.value) for choice in column.type.enum_class]

    field_names = []
    for field_name in db_fields:
        field = HideShowFilter.query.filter_by(parent=aPath.lower(), key=field_name).first()
        if field:
            field_names.append(field)
        else:
            field = HideShowFilter(parent=aPath.lower(), key=field_name)
            db.session.add(field)
            db.session.commit()

            field_names.append(field)

    filter_string = []
    filter_instance = ModelFilter.query.filter_by(parent=aPath.lower()).all()
    for filter_data in filter_instance:
        if filter_data.key in db_fields:
            filter_string.append(getattr(aModelClass, filter_data.key).like(f"%{filter_data.value}%"))

    order_by = request.args.get('order_by', 'id')
    if order_by not in db_fields:
        order_by = 'id'

    queryset = aModelClass.query.filter(and_(*filter_string)).order_by(order_by)

    # Pagination
    page_items = PageItems.query.filter_by(parent=aPath.lower()).order_by(PageItems.id.desc()).first()
    p_items = 25
    if page_items:
        p_items = page_items.items_per_page

    page = request.args.get('page', 1, type=int)
    queryset = user_filter(request, queryset, db_fields, fk_fields.keys())
    pagination = queryset.paginate(page=page, per_page=p_items, error_out=False)
    items = pagination.items

    # Read-only and field types
    read_only_fields = ('id', 'user_id', 'date_created', 'date_modified', )
    integer_fields = get_model_field_names(aModelClass, Integer)
    date_time_fields = get_model_field_names(aModelClass, DateTime)
    text_fields = get_model_field_names(aModelClass, Text)
    email_fields = []

    # Context
    context = {
        'page_title': f'Dynamic DataTable - {aPath.lower().title()}',
        'link': aPath,
        'field_names': field_names,
        'db_field_names': db_fields,
        'db_filters': db_filters,
        'items': items,
        'pagination': pagination,
        'page_items': p_items,
        'filter_instance': filter_instance,
        'read_only_fields': read_only_fields,
        'integer_fields': integer_fields,
        'date_time_fields': date_time_fields,
        'email_fields': email_fields,
        'text_fields': text_fields,
        'fk_fields_keys': fk_fields.keys(),
        'fk_fields': fk_fields,
        'segment': 'dynamic_dt',
        'choices_dict': choices_dict,
        'exclude_auto_gen_fields': exclude_auto_gen_fields(aModelClass)
    }
    return render_template('dyn_dt/model.html', **context)


@blueprint.route('/create/<aPath>', methods=["POST"])
@login_required
def create(aPath):
    aModelClass = None

    if aPath in config.Config.DYNAMIC_DATATB:
        aModelName = config.Config.DYNAMIC_DATATB[aPath]
        aModelClass = name_to_class(aModelName)

    if not aModelClass:
        return ' > ERR: Getting ModelClass for path: ' + aPath

    if request.method == 'POST':
        data = {}
        fk_fields = get_model_fk_values(aModelClass)

        for attribute, value in request.form.items():
            if attribute in fk_fields.keys():
                table_name = None
                for product in fk_fields[attribute]:
                    table_name = product.__class__.__tablename__
                if table_name:
                    model_name = config.Config.DYNAMIC_DATATB[table_name]
                    value = name_to_class(model_name).query.filter_by(id=value).first()

            data[attribute] = value if value else ''

        new_item = aModelClass(**data)
        db.session.add(new_item)
        db.session.commit()

    return redirect(request.referrer) 


@blueprint.route('/delete/<aPath>/<id>', methods=["GET"])
@login_required
def delete(aPath, id):
    aModelClass = None

    if aPath in config.Config.DYNAMIC_DATATB:
        aModelName = config.Config.DYNAMIC_DATATB[aPath]
        aModelClass = name_to_class(aModelName)

    if not aModelClass:
        return ' > ERR: Getting ModelClass for path: ' + aPath
    
    item = aModelClass.query.get(id)
    if item:
        db.session.delete(item)
        db.session.commit()

    return redirect(request.referrer)


@blueprint.route('/update/<aPath>/<int:id>', methods=["POST"])
@login_required
def update(aPath, id):
    aModelClass = None

    if aPath in config.Config.DYNAMIC_DATATB:
        aModelName = config.Config.DYNAMIC_DATATB[aPath]
        aModelClass = name_to_class(aModelName)

    if not aModelClass:
        return ' > ERR: Getting ModelClass for path: ' + aPath

    item = aModelClass.query.get(id)
    if not item:
        return 'Item not found', 404

    fk_fields = get_model_fk_values(aModelClass)

    if request.method == 'POST':
        for attribute, value in request.form.items():
            if hasattr(item, attribute) and getattr(item, attribute, value) is not None:
                if attribute in fk_fields.keys():
                    table_name = None
                    for product in fk_fields[attribute]:
                        table_name = product.__class__.__tablename__
                    if table_name:
                        model_name = config.Config.DYNAMIC_DATATB[table_name]
                        value = name_to_class(model_name).query.filter_by(id=value).first()

                setattr(item, attribute, value)
        
        db.session.commit()

    return redirect(request.referrer)


@blueprint.route('/export/<aPath>', methods=['GET'])
def export_csv(aPath):
    aModelName = None
    aModelClass = None

    if aPath in config.Config.DYNAMIC_DATATB:
        aModelName = config.Config.DYNAMIC_DATATB[aPath]
        aModelClass = name_to_class(aModelName)

    if not aModelClass:
        return ' > ERR: Getting ModelClass for path: ' + aPath, 400

    db_field_names = [column.name for column in aModelClass.__table__.columns]
    fk_fields = get_model_fk_values(aModelClass)

    fields = []
    show_fields = HideShowFilter.query.filter_by(value=False, parent=aPath.lower()).all()
    for field in show_fields:
        if field.key in db_field_names:
            fields.append(field.key)
        else:
            print(f"Field {field.key} does not exist in {aModelClass} model.")


    output = io.StringIO()
    writer = csv.writer(output)
    writer.writerow(fields)

    # Filtering
    filter_string = {}
    filter_instance = ModelFilter.query.filter_by(parent=aPath.lower()).all()
    for filter_data in filter_instance:
        filter_string[f'{filter_data.key}__icontains'] = filter_data.value

    # Ordering
    order_by = request.args.get('order_by', 'id')
    query = aModelClass.query.filter_by(**filter_string).order_by(order_by)
    items = user_filter(request, query, db_field_names, fk_fields)

    # Write rows to CSV
    for item in items:
        row_data = []
        for field in fields:
            try:
                row_data.append(getattr(item, field))
            except AttributeError:
                row_data.append('')
        writer.writerow(row_data)

    # Prepare response with CSV content
    response = make_response(output.getvalue())
    response.headers['Content-Type'] = 'text/csv'
    response.headers['Content-Disposition'] = f'attachment; filename="{aPath.lower()}.csv"'

    return response


# Template filter

@blueprint.app_template_filter('getattribute')
def getattribute(value, arg):
    try:
        attr_value = getattr(value, arg)
        
        if isinstance(attr_value, datetime):
            return attr_value.strftime("%Y-%m-%d %H:%M:%S")
        
        return attr_value
    except AttributeError:
        return ''
    

@blueprint.app_template_filter('getenumattribute')
def getenumattribute(value, arg):
    try:
        attr_value = getattr(value, arg)
        return attr_value.value
    except AttributeError:
        return ''


@blueprint.app_template_filter('get')
def get(dict_data, key):
    return dict_data.get(key, [])


================================================
FILE: apps/dyn_dt/utils.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

import importlib
from sqlalchemy import or_
from sqlalchemy import DateTime, func
from apps import db 

class PageItems(db.Model):
    __tablename__ = 'page_items'
    id = db.Column(db.Integer, primary_key=True)
    parent = db.Column(db.String(255), nullable=True)
    items_per_page = db.Column(db.Integer, default=25)


class HideShowFilter(db.Model):
    __tablename__ = 'hide_show_filter'
    id = db.Column(db.Integer, primary_key=True)
    parent = db.Column(db.String(255), nullable=True)
    key = db.Column(db.String(255), nullable=False)
    value = db.Column(db.Boolean, default=False)


class ModelFilter(db.Model):
    __tablename__ = 'model_filter'
    id = db.Column(db.Integer, primary_key=True)
    parent = db.Column(db.String(255), nullable=True)
    key = db.Column(db.String(255), nullable=False)
    value = db.Column(db.String(255), nullable=False)


def get_model_fk_values(aModelClass):
    fk_values = {}

    current_table_name = aModelClass.__tablename__

    for relationship in aModelClass.__mapper__.relationships:
        if relationship.direction.name == 'MANYTOONE':
            related_model = relationship.mapper.class_
            foreign_key_column = list(relationship.local_columns)[0]
            referenced_table_name = list(foreign_key_column.foreign_keys)[0].column.table.name

            if referenced_table_name != current_table_name:
                field_name = relationship.key
                related_instances = related_model.query.all()
                fk_values[field_name] = related_instances

    return fk_values


def get_model_field_names(model, field_type):
    """Returns a list of field names based on the given field type in SQLAlchemy."""
    return [
        column.name for column in model.__table__.columns
        if isinstance(column.type, field_type)
    ]


def name_to_class(name: str):
    try:
        module_name = '.'.join(name.split('.')[:-1])
        class_name = name.split('.')[-1]

        module = importlib.import_module(module_name)
        return getattr(module, class_name)
    except Exception as e:
        print(f"Error importing {name}: {e}")
        return None


def user_filter(request, query, fields, fk_fields=[]):
    value = request.args.get('search')

    if value:
        dynamic_filter = []

        for field in fields:
            if field not in fk_fields:
                dynamic_filter.append(getattr(query.column_descriptions[0]['entity'], field).ilike(f"%{value}%"))

        query = query.filter(or_(*dynamic_filter))

    return query


def exclude_auto_gen_fields(aModelClass):
    exclude_fields = [
        field.name for field in aModelClass.__table__.columns 
        if isinstance(field.type, DateTime) and (
            field.default is not None or
            field.server_default is not None or
            field.onupdate is not None or
            isinstance(field.default, func) or
            isinstance(field.onupdate, func)
        )
    ]
    return exclude_fields


================================================
FILE: apps/exceptions/exception.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

class InvalidUsage(Exception):
    status_code = 400

    def __init__(self, message, status_code=None, payload=None):
        Exception.__init__(self)
        self.message = message
        if status_code is not None:
            self.status_code = status_code
        self.payload = payload

    def to_dict(self):
        rv = dict(self.payload or ())
        rv['message'] = self.message

        return rv

================================================
FILE: apps/helpers.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

import os, re, uuid
from colorama import Fore, Style
from apps.authentication.models import Users
from apps.config import Config
from marshmallow import ValidationError
from apps.messages import Messages
from functools import wraps
from flask import request
from uuid import uuid4
import datetime, time
message = Messages.message

Currency = Config.CURRENCY
PAYMENT_TYPE = Config.PAYMENT_TYPE
STATE = Config.STATE


regex = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+')

def get_ts():
    return int(time.time())

def password_validate(password):
    """ password validate """
    msg = ''
    while True:
        if len(password) < 6:
           msg = "Make sure your password is at lest 6 letters"
           return msg
        elif re.search('[0-9]',password) is None:
            msg = "Make sure your password has a number in it"
            return msg
        elif re.search('[A-Z]',password) is None: 
            msg = "Make sure your password has a capital letter in it"
            return msg
        else:
            msg = True
            break
        
    return True

def emailValidate(email):
    """ validate email  """
    if re.fullmatch(regex, email):
        return True
    else:
        return False

# santise file name
def sanitise_fille_name(value):
    """ remove special char  """
    return value.strip().lower().replace(' ', '_').replace('(', '').replace(')', '').replace(',', '').replace('=','_').replace('-', '_').replace('#', '')

def createFolder(folder_name):
    """ create folder for save csv """
    if not os.path.exists(f'{folder_name}'):
        os.makedirs(f'{folder_name}')

    return folder_name


def uniqueFileName(file_name):
    """ for Unique file name"""
    file_uuid = uuid.uuid4()
    IMAGE_NAME = f'{file_uuid}-{file_name}'
    return IMAGE_NAME

def serverImageUrl(file_name):
    """ for Unique file name"""
    url = f'{FTP_IMAGE_URL}{file_name}'
    return url

def errorColor(error):
    """ for terminal input error color """
    print(Fore.RED + f'{error}')
    print(Style.RESET_ALL)
    return True

def splitUrlGetFilename(url):
    """ image url split and get file name  """
    return url.split('/')[-1]

def validateCurrency(currency):
    """ check currency  """
    # if check currency validate or not
    if currency not in list(Currency.keys()):
        raise ValidationError(
            f"{message['invalid_currency']}, expected {','.join(Currency.keys())}", 422)

def validatePaymentMethod(payment):
    """ check valid payment methods  """
    # if check PAYMENT_TYPE validate or not
    if payment not in list(PAYMENT_TYPE.keys()):
        raise ValidationError(
            f"{message['invalid_payment_method']}, expected {expectedValue(PAYMENT_TYPE)}", 422)
        
    else:
        value = 0
        if payment == "cc":
            value =  1
        elif payment == "paypal":
            value = 2
        else:
            value = 3

    return value 

def validateState(state):
    """ check valid state methods  """
    # if check state  validate or not
    if state not in list(STATE.keys()):
        raise ValidationError(
            f"{message['invalid_state']}, expected {expectedValue(STATE)}", 422)
        
    else:
        value = 0
        if state == "completed":
            value =  1
        elif state == "pending":
            value = 2
        else:
            value = 3

    return value 

 
def expectedValue(data):
    """ key get values """
    values = []
    for k,v in data.items():
        values.append(f'{v}.({k})')

    return ",".join(values)


def createAccessToken():
    """ create access token w"""
    rand_token = uuid4()

    return f"{str(rand_token)}"


# token validate
def token_required(f):
    """ check token """
    @wraps(f)
    def decorated(*args, **kwargs):
        token = None
        if "Authorization" in request.headers:
            token = request.headers["Authorization"]
        if not token:
            return {
                "message": "Authentication Token is missing!",
                "error": "Unauthorized"
            }, 401
        try:
            current_user = Users.find_by_api_token(token)
            if current_user is None:
                return {
                "message": "Invalid Authentication token!",
                "error": "Unauthorized"
            }, 401
            # if not current_user["active"]:
            #     abort(403)
        except Exception as e:
            return {
                "message": "Something went wrong",
                "error": str(e)
            }, 500

        return f(current_user, **kwargs)

    return decorated


================================================
FILE: apps/home/__init__.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

from flask import Blueprint

blueprint = Blueprint(
    'home_blueprint',
    __name__,
    url_prefix=''
)


================================================
FILE: apps/home/routes.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

from apps.home import blueprint
from flask import render_template, request
from flask_login import login_required, current_user
from jinja2 import TemplateNotFound


@blueprint.route('/index')
@login_required
def index():

    return render_template('home/index.html', 
                           segment='index', 
                           user_id=current_user.id)

@blueprint.route('/<template>')
@login_required
def route_template(template):

    try:

        if not template.endswith('.html'):
            template += '.html'

        # Detect the current page
        segment = get_segment(request)

        # Serve the file (if exists) from app/templates/home/FILE.html
        return render_template("home/" + template, segment=segment)

    except TemplateNotFound:
        return render_template('home/page-404.html'), 404

    except:
        return render_template('home/page-500.html'), 500


# Helper - Extract current page name from request
def get_segment(request):

    try:

        segment = request.path.split('/')[-1]

        if segment == '':
            segment = 'index'

        return segment

    except:
        return None


================================================
FILE: apps/models.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

from email.policy import default
from apps import db
from sqlalchemy.exc import SQLAlchemyError
from apps.exceptions.exception import InvalidUsage
import datetime as dt
from sqlalchemy.orm import relationship
from enum import Enum

class CURRENCY_TYPE(Enum):
    usd = 'usd'
    eur = 'eur'

class Product(db.Model):

    __tablename__ = 'products'

    id            = db.Column(db.Integer,      primary_key=True)
    name          = db.Column(db.String(128),  nullable=False)
    info          = db.Column(db.Text,         nullable=True)
    price         = db.Column(db.Integer,      nullable=False)
    currency      = db.Column(db.Enum(CURRENCY_TYPE), default=CURRENCY_TYPE.usd, nullable=False)

    date_created  = db.Column(db.DateTime,     default=dt.datetime.utcnow())
    date_modified = db.Column(db.DateTime,     default=db.func.current_timestamp(),
                                               onupdate=db.func.current_timestamp())
    
    def __init__(self, **kwargs):
        super(Product, self).__init__(**kwargs)

    def __repr__(self):
        return f"{self.name} / ${self.price}"

    @classmethod
    def find_by_id(cls, _id: int) -> "Product":
        return cls.query.filter_by(id=_id).first() 

    @classmethod
    def get_list(cls):
        return cls.query.all()

    def save(self) -> None:
        try:
            db.session.add(self)
            db.session.commit()
        except SQLAlchemyError as e:
            db.session.rollback()
            db.session.close()
            error = str(e.__dict__['orig'])
            raise InvalidUsage(error, 422)

    def delete(self) -> None:
        try:
            db.session.delete(self)
            db.session.commit()
        except SQLAlchemyError as e:
            db.session.rollback()
            db.session.close()
            error = str(e.__dict__['orig'])
            raise InvalidUsage(error, 422)
        return


================================================
FILE: build.sh
================================================
#!/usr/bin/env bash
# exit on error
set -o errexit

python -m pip install --upgrade pip

pip install -r requirements.txt


================================================
FILE: docker-compose.yml
================================================
version: '3.8'
services:
  appseed-app:
    container_name: appseed_app
    restart: always
    build: .
    networks:
      - db_network
      - web_network
  nginx:
    container_name: nginx
    restart: always
    image: "nginx:latest"
    ports:
      - "5085:5085"
    volumes:
      - ./nginx:/etc/nginx/conf.d
    networks:
      - web_network
    depends_on: 
      - appseed-app
networks:
  db_network:
    driver: bridge
  web_network:
    driver: bridge
 

================================================
FILE: env.sample
================================================
# True in development, False in production
DEBUG=True

FLASK_APP=run.py
FLASK_ENV=development

# If not provided, a random one is generated 
# SECRET_KEY=<YOUR_SUPER_KEY_HERE>

# If DB credentials (if NOT provided, or wrong values SQLite is used) 
# DB_ENGINE=mysql
# DB_HOST=localhost
# DB_NAME=appseed_db
# DB_USERNAME=appseed_db_usr
# DB_PASS=pass
# DB_PORT=3306

# Used for CDN (in production)
# No Slash at the end
ASSETS_ROOT=/static/assets

# SOCIAL AUTH Github
# GITHUB_ID=YOUR_GITHUB_ID
# GITHUB_SECRET=YOUR_GITHUB_SECRET


================================================
FILE: gunicorn-cfg.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

bind = '0.0.0.0:5005'
workers = 1
accesslog = '-'
loglevel = 'debug'
capture_output = True
enable_stdio_inheritance = True


================================================
FILE: nginx/appseed-app.conf
================================================
upstream webapp {
    server appseed_app:5005;
}

server {
    listen 5085;
    server_name localhost;

    location / {
        proxy_pass http://webapp;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}


================================================
FILE: package.json
================================================
{
  "name": "flask-datta-able",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "vite build --watch --mode development",
    "build": "vite build --mode production && npm run minify-css",
    "minify-css": "postcss static/assets/css/*.css --dir static/assets/css --no-map --ext .min.css"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "autoprefixer": "^10.4.20",
    "cssnano": "^7.0.6",
    "postcss": "^8.5.3",
    "postcss-cli": "^11.0.0",
    "sass": "^1.85.1",
    "vite": "^6.2.0"
  }
}

================================================
FILE: postcss.config.js
================================================
module.exports = {
    plugins: [
        require('cssnano')({
            preset: 'default',
        }),
    ],
};


================================================
FILE: render.yaml
================================================
services:
  - type: web
    name: flask-volt
    plan: starter
    env: python
    region: frankfurt  # region should be same as your database region.
    buildCommand: "./build.sh"
    startCommand: "gunicorn run:app"
    envVars:
      - key: SECRET_KEY
        generateValue: true
      - key: WEB_CONCURRENCY
        value: 4


================================================
FILE: requirements.txt
================================================
# core
flask==3.1.0
Werkzeug==3.1.3
jinja2==3.1.6
WTForms==3.2.1
flask_wtf==1.2.2

# DB
flask_migrate==4.1.0
flask_sqlalchemy==3.1.1
sqlalchemy==2.0.38

# tools
flask_login==0.6.3
flask-dance==7.1.0
celery==5.4.0
redis==5.2.1
colorama==0.4.6
PyJWT~=2.10.1
WTForms-Alchemy==0.19.0

# utils
email_validator==2.2.0
blinker==1.9.0

# env
python-dotenv==1.0.1

# deployment
gunicorn==23.0.0
Flask-Minify==0.49
Flask-CDN==1.5.3

# flask_mysqldb
# psycopg2-binary


================================================
FILE: run.py
================================================
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

import os
from   flask_migrate import Migrate
from   flask_minify  import Minify
from   sys import exit

from apps.config import config_dict
from apps import create_app, db

# WARNING: Don't run with debug turned on in production!
DEBUG = (os.getenv('DEBUG', 'False') == 'True')

# The configuration
get_config_mode = 'Debug' if DEBUG else 'Production'

try:

    # Load the configuration using the default values
    app_config = config_dict[get_config_mode.capitalize()]

except KeyError:
    exit('Error: Invalid <config_mode>. Expected values [Debug, Production] ')

app = create_app(app_config)

# Create tables & Fallback to SQLite
with app.app_context():
    
    try:
        db.create_all()
    except Exception as e:

        print('> Error: DBMS Exception: ' + str(e) )

        # fallback to SQLite
        basedir = os.path.abspath(os.path.dirname(__file__))
        app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'db.sqlite3')

        print('> Fallback to SQLite ')
        db.create_all()

# Apply all changes
Migrate(app, db)

if not DEBUG:
    Minify(app=app, html=True, js=False, cssless=False)
    
if DEBUG:
    app.logger.info('DEBUG            = ' + str(DEBUG)             )
    app.logger.info('Page Compression = ' + 'FALSE' if DEBUG else 'TRUE' )
    app.logger.info('DBMS             = ' + app_config.SQLALCHEMY_DATABASE_URI)

if __name__ == "__main__":
    app.run()


================================================
FILE: static/assets/.gitkeep
================================================


================================================
FILE: static/assets/css/volt.css
================================================
/*

=========================================================
* Volt - Free Bootstrap 5 Dashboard
=========================================================

* Product Page: https://themesberg.com/product/admin-dashboard/volt-bootstrap-5-dashboard
* Copyright 2021 Themesberg (https://www.themesberg.com)

* Designed and coded by https://themesberg.com

=========================================================

* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Please contact us to request a removal. Contact us if you want to remove it.

*/
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap");
.datepicker {
  display: none; }
  .datepicker.active {
    display: block; }

.datepicker-dropdown {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 20;
  padding-top: 4px; }
  .datepicker-dropdown.datepicker-orient-top {
    padding-top: 0;
    padding-bottom: 4px; }

.datepicker-picker {
  display: inline-block;
  border-radius: 4px;
  background-color: #ffffff; }
  .datepicker-dropdown .datepicker-picker {
    box-shadow: 0 2px 3px rgba(17, 24, 39, 0.1), 0 0 0 1px rgba(17, 24, 39, 0.1); }
  .datepicker-picker span {
    display: block;
    flex: 1;
    border: 0;
    border-radius: 4px;
    cursor: default;
    text-align: center;
    -webkit-touch-callout: none;
    -webkit-user-select: none;
            user-select: none; }

.datepicker-main {
  padding: 2px; }

.datepicker-footer {
  box-shadow: inset 0 1px 1px rgba(17, 24, 39, 0.1);
  background-color: #9CA3AF; }

.datepicker-controls, .datepicker-view, .datepicker-view .days-of-week, .datepicker-grid {
  display: flex; }

.datepicker-grid {
  flex-wrap: wrap; }

.datepicker-view .dow, .datepicker-view .days .datepicker-cell {
  flex-basis: 14.28571%; }

.datepicker-view.datepicker-grid .datepicker-cell {
  flex-basis: 25%; }

.datepicker-view .week, .datepicker-cell {
  height: 2.25rem;
  line-height: 2.25rem; }

.datepicker-title {
  box-shadow: inset 0 -1px 1px rgba(17, 24, 39, 0.1);
  background-color: #9CA3AF;
  padding: 0.375rem 0.75rem;
  text-align: center;
  font-weight: 700; }

.datepicker-header .datepicker-controls {
  padding: 2px 2px 0; }

.datepicker-controls .button {
  display: inline-flex;
  position: relative;
  align-items: center;
  justify-content: center;
  margin: 0;
  border: 1px solid #808998;
  border-radius: 4px;
  box-shadow: none;
  background-color: #ffffff;
  cursor: pointer;
  padding: calc(0.375em - 1px) 0.75em;
  height: 2.25em;
  vertical-align: top;
  text-align: center;
  line-height: 1.5;
  white-space: nowrap;
  color: #1F2937;
  font-size: 1rem; }
  .datepicker-controls .button:focus, .datepicker-controls .button:active {
    outline: none; }
  .datepicker-controls .button:hover {
    border-color: #5b6371;
    color: #1F2937; }
  .datepicker-controls .button:focus {
    border-color: #3273dc;
    color: #1F2937; }
    .datepicker-controls .button:focus:not(:active) {
      box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); }
  .datepicker-controls .button:active {
    border-color: #384f80;
    color: #1F2937; }
  .datepicker-controls .button[disabled] {
    cursor: not-allowed; }
  .datepicker-header .datepicker-controls .button {
    border-color: transparent;
    font-weight: bold; }
    .datepicker-header .datepicker-controls .button:hover {
      background-color: #f9f9f9; }
    .datepicker-header .datepicker-controls .button:focus:not(:active) {
      box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); }
    .datepicker-header .datepicker-controls .button:active {
      background-color: #f2f2f2; }
    .datepicker-header .datepicker-controls .button[disabled] {
      box-shadow: none; }
  .datepicker-footer .datepicker-controls .button {
    margin: calc(0.375rem - 1px) 0.375rem;
    border-radius: 2px;
    width: 100%;
    font-size: 0.75rem; }

.datepicker-controls .view-switch {
  flex: auto; }

.datepicker-controls .prev-btn,
.datepicker-controls .next-btn {
  padding-right: 0.375rem;
  padding-left: 0.375rem;
  width: 2.25rem; }
  .datepicker-controls .prev-btn.disabled,
  .datepicker-controls .next-btn.disabled {
    visibility: hidden; }

.datepicker-view .dow {
  height: 1.5rem;
  line-height: 1.5rem;
  font-size: 0.875rem;
  font-weight: 700; }

.datepicker-view .week {
  width: 2.25rem;
  color: #5b6371;
  font-size: 0.75rem; }
  @media (max-width: 22.5rem) {
    .datepicker-view .week {
      width: 1.96875rem; } }

.datepicker-grid {
  width: 15.75rem; }
  @media (max-width: 22.5rem) {
    .calendar-weeks + .days .datepicker-grid {
      width: 13.78125rem; } }

.datepicker-cell:not(.disabled):hover {
  background-color: #f9f9f9;
  cursor: pointer; }

.datepicker-cell.focused:not(.selected) {
  background-color: #8e96a4; }

.datepicker-cell.selected, .datepicker-cell.selected:hover {
  background-color: #3273dc;
  color: #fff;
  font-weight: 600; }

.datepicker-cell.disabled {
  color: #808998; }

.datepicker-cell.prev:not(.disabled), .datepicker-cell.next:not(.disabled) {
  color: #7a7a7a; }

.datepicker-cell.prev.selected, .datepicker-cell.next.selected {
  color: #e6e6e6; }

.datepicker-cell.highlighted:not(.selected):not(.range):not(.today) {
  border-radius: 0;
  background-color: #9CA3AF; }
  .datepicker-cell.highlighted:not(.selected):not(.range):not(.today):not(.disabled):hover {
    background-color: #959ca9; }
  .datepicker-cell.highlighted:not(.selected):not(.range):not(.today).focused {
    background-color: #8e96a4; }

.datepicker-cell.today:not(.selected) {
  background-color: #00d1b2; }
  .datepicker-cell.today:not(.selected):not(.disabled) {
    color: #fff; }

.datepicker-cell.today.focused:not(.selected) {
  background-color: #00c4a7; }

.datepicker-cell.range-start:not(.selected), .datepicker-cell.range-end:not(.selected) {
  background-color: #5b6371;
  color: #fff; }

.datepicker-cell.range-start.focused:not(.selected), .datepicker-cell.range-end.focused:not(.selected) {
  background-color: #555d69; }

.datepicker-cell.range-start {
  border-radius: 4px 0 0 4px; }

.datepicker-cell.range-end {
  border-radius: 0 4px 4px 0; }

.datepicker-cell.range {
  border-radius: 0;
  background-color: #808998; }
  .datepicker-cell.range:not(.disabled):not(.focused):not(.today):hover {
    background-color: #798293; }
  .datepicker-cell.range.disabled {
    color: #666f7f; }
  .datepicker-cell.range.focused {
    background-color: #727c8d; }

.datepicker-view.datepicker-grid .datepicker-cell {
  height: 4.5rem;
  line-height: 4.5rem; }

.datepicker-input.in-edit {
  border-color: #2366d1; }
  .datepicker-input.in-edit:focus, .datepicker-input.in-edit:active {
    box-shadow: 0 0 0.25em 0.25em rgba(35, 102, 209, 0.2); }

.ct-label {
  fill: rgba(0, 0, 0, 0.4);
  color: rgba(0, 0, 0, 0.4);
  font-size: 0.75rem;
  line-height: 1; }

.ct-chart-line .ct-label,
.ct-chart-bar .ct-label {
  display: block;
  display: flex; }

.ct-chart-pie .ct-label,
.ct-chart-donut .ct-label {
  dominant-baseline: central; }

.ct-label.ct-horizontal.ct-start {
  align-items: flex-end;
  justify-content: flex-start;
  text-align: left;
  text-anchor: start; }

.ct-label.ct-horizontal.ct-end {
  align-items: flex-start;
  justify-content: flex-start;
  text-align: left;
  text-anchor: start; }

.ct-label.ct-vertical.ct-start {
  align-items: flex-end;
  justify-content: flex-end;
  text-align: right;
  text-anchor: end; }

.ct-label.ct-vertical.ct-end {
  align-items: flex-end;
  justify-content: flex-start;
  text-align: left;
  text-anchor: start; }

.ct-chart-bar .ct-label.ct-horizontal.ct-start {
  align-items: flex-end;
  justify-content: center;
  text-align: center;
  text-anchor: start; }

.ct-chart-bar .ct-label.ct-horizontal.ct-end {
  align-items: flex-start;
  justify-content: center;
  text-align: center;
  text-anchor: start; }

.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start {
  align-items: flex-end;
  justify-content: flex-start;
  text-align: left;
  text-anchor: start; }

.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end {
  align-items: flex-start;
  justify-content: flex-start;
  text-align: left;
  text-anchor: start; }

.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start {
  align-items: center;
  justify-content: flex-end;
  text-align: right;
  text-anchor: end; }

.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end {
  align-items: center;
  justify-content: flex-start;
  text-align: left;
  text-anchor: end; }

.ct-grid {
  stroke: rgba(0, 0, 0, 0.2);
  stroke-width: 1px;
  stroke-dasharray: 2px; }

.ct-grid-background {
  fill: none; }

.ct-point {
  stroke-width: 10px;
  stroke-linecap: round; }

.ct-line {
  fill: none;
  stroke-width: 4px; }

.ct-area {
  stroke: none;
  fill-opacity: 0.1; }

.ct-bar {
  fill: none;
  stroke-width: 10px; }

.ct-slice-donut {
  fill: none;
  stroke-width: 60px; }

.ct-series-a .ct-point, .ct-series-a .ct-line, .ct-series-a .ct-bar, .ct-series-a .ct-slice-donut {
  stroke: #262B40; }

.ct-series-a .ct-slice-pie, .ct-series-a .ct-slice-donut-solid, .ct-series-a .ct-area {
  fill: #262B40; }

.ct-series-b .ct-point, .ct-series-b .ct-line, .ct-series-b .ct-bar, .ct-series-b .ct-slice-donut {
  stroke: #F8BD7A; }

.ct-series-b .ct-slice-pie, .ct-series-b .ct-slice-donut-solid, .ct-series-b .ct-area {
  fill: #F8BD7A; }

.ct-series-c .ct-point, .ct-series-c .ct-line, .ct-series-c .ct-bar, .ct-series-c .ct-slice-donut {
  stroke: #2CA58D; }

.ct-series-c .ct-slice-pie, .ct-series-c .ct-slice-donut-solid, .ct-series-c .ct-area {
  fill: #2CA58D; }

.ct-series-d .ct-point, .ct-series-d .ct-line, .ct-series-d .ct-bar, .ct-series-d .ct-slice-donut {
  stroke: #31316A; }

.ct-series-d .ct-slice-pie, .ct-series-d .ct-slice-donut-solid, .ct-series-d .ct-area {
  fill: #31316A; }

.ct-series-e .ct-point, .ct-series-e .ct-line, .ct-series-e .ct-bar, .ct-series-e .ct-slice-donut {
  stroke: #C96480; }

.ct-series-e .ct-slice-pie, .ct-series-e .ct-slice-donut-solid, .ct-series-e .ct-area {
  fill: #C96480; }

.ct-series-f .ct-point, .ct-series-f .ct-line, .ct-series-f .ct-bar, .ct-series-f .ct-slice-donut {
  stroke: #ffffff; }

.ct-series-f .ct-slice-pie, .ct-series-f .ct-slice-donut-solid, .ct-series-f .ct-area {
  fill: #ffffff; }

.ct-series-g .ct-point, .ct-series-g .ct-line, .ct-series-g .ct-bar, .ct-series-g .ct-slice-donut {
  stroke: #F8BD7A; }

.ct-series-g .ct-slice-pie, .ct-series-g .ct-slice-donut-solid, .ct-series-g .ct-area {
  fill: #F8BD7A; }

.ct-square {
  display: block;
  position: relative;
  width: 100%; }
  .ct-square:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 100%; }
  .ct-square:after {
    content: "";
    display: table;
    clear: both; }
  .ct-square > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-minor-second {
  display: block;
  position: relative;
  width: 100%; }
  .ct-minor-second:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 93.75%; }
  .ct-minor-second:after {
    content: "";
    display: table;
    clear: both; }
  .ct-minor-second > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-major-second {
  display: block;
  position: relative;
  width: 100%; }
  .ct-major-second:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 88.88889%; }
  .ct-major-second:after {
    content: "";
    display: table;
    clear: both; }
  .ct-major-second > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-minor-third {
  display: block;
  position: relative;
  width: 100%; }
  .ct-minor-third:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 83.33333%; }
  .ct-minor-third:after {
    content: "";
    display: table;
    clear: both; }
  .ct-minor-third > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-major-third {
  display: block;
  position: relative;
  width: 100%; }
  .ct-major-third:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 80%; }
  .ct-major-third:after {
    content: "";
    display: table;
    clear: both; }
  .ct-major-third > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-perfect-fourth {
  display: block;
  position: relative;
  width: 100%; }
  .ct-perfect-fourth:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 75%; }
  .ct-perfect-fourth:after {
    content: "";
    display: table;
    clear: both; }
  .ct-perfect-fourth > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-perfect-fifth {
  display: block;
  position: relative;
  width: 100%; }
  .ct-perfect-fifth:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 66.66667%; }
  .ct-perfect-fifth:after {
    content: "";
    display: table;
    clear: both; }
  .ct-perfect-fifth > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-minor-sixth {
  display: block;
  position: relative;
  width: 100%; }
  .ct-minor-sixth:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 62.5%; }
  .ct-minor-sixth:after {
    content: "";
    display: table;
    clear: both; }
  .ct-minor-sixth > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-golden-section {
  display: block;
  position: relative;
  width: 100%; }
  .ct-golden-section:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 61.8047%; }
  .ct-golden-section:after {
    content: "";
    display: table;
    clear: both; }
  .ct-golden-section > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-major-sixth {
  display: block;
  position: relative;
  width: 100%; }
  .ct-major-sixth:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 60%; }
  .ct-major-sixth:after {
    content: "";
    display: table;
    clear: both; }
  .ct-major-sixth > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-minor-seventh {
  display: block;
  position: relative;
  width: 100%; }
  .ct-minor-seventh:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 56.25%; }
  .ct-minor-seventh:after {
    content: "";
    display: table;
    clear: both; }
  .ct-minor-seventh > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-major-seventh {
  display: block;
  position: relative;
  width: 100%; }
  .ct-major-seventh:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 53.33333%; }
  .ct-major-seventh:after {
    content: "";
    display: table;
    clear: both; }
  .ct-major-seventh > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-octave {
  display: block;
  position: relative;
  width: 100%; }
  .ct-octave:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 50%; }
  .ct-octave:after {
    content: "";
    display: table;
    clear: both; }
  .ct-octave > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-major-tenth {
  display: block;
  position: relative;
  width: 100%; }
  .ct-major-tenth:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 40%; }
  .ct-major-tenth:after {
    content: "";
    display: table;
    clear: both; }
  .ct-major-tenth > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-major-eleventh {
  display: block;
  position: relative;
  width: 100%; }
  .ct-major-eleventh:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 37.5%; }
  .ct-major-eleventh:after {
    content: "";
    display: table;
    clear: both; }
  .ct-major-eleventh > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-major-twelfth {
  display: block;
  position: relative;
  width: 100%; }
  .ct-major-twelfth:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 33.33333%; }
  .ct-major-twelfth:after {
    content: "";
    display: table;
    clear: both; }
  .ct-major-twelfth > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

.ct-double-octave {
  display: block;
  position: relative;
  width: 100%; }
  .ct-double-octave:before {
    display: block;
    float: left;
    content: "";
    width: 0;
    height: 0;
    padding-bottom: 25%; }
  .ct-double-octave:after {
    content: "";
    display: table;
    clear: both; }
  .ct-double-octave > svg {
    display: block;
    position: absolute;
    top: 0;
    left: 0; }

:root {
  --bs-blue: #2361ce;
  --bs-indigo: #4F46E5;
  --bs-purple: #7C3AED;
  --bs-pink: #EF4683;
  --bs-red: #E11D48;
  --bs-orange: #FBA918;
  --bs-yellow: #f3c78e;
  --bs-green: #10B981;
  --bs-teal: #1E90FF;
  --bs-cyan: #63b1bd;
  --bs-white: #ffffff;
  --bs-gray: #4B5563;
  --bs-gray-dark: #1F2937;
  --bs-gray-100: #F2F4F6;
  --bs-gray-200: #E5E7EB;
  --bs-gray-300: #D1D5DB;
  --bs-gray-400: #9CA3AF;
  --bs-gray-500: #6B7280;
  --bs-gray-600: #4B5563;
  --bs-gray-700: #374151;
  --bs-gray-800: #1F2937;
  --bs-gray-900: #111827;
  --bs-primary: #1F2937;
  --bs-secondary: #f0bc74;
  --bs-tertiary: #31316A;
  --bs-success: #10B981;
  --bs-info: #2361ce;
  --bs-warning: #f3c78e;
  --bs-danger: #E11D48;
  --bs-white: #ffffff;
  --bs-indigo: #4F46E5;
  --bs-purple: #7C3AED;
  --bs-yellow-100: #ffeed6;
  --bs-yellow-200: #f5dbb8;
  --bs-gray-50: #F9FAFB;
  --bs-gray-100: #F2F4F6;
  --bs-gray-200: #E5E7EB;
  --bs-gray-300: #D1D5DB;
  --bs-gray-400: #9CA3AF;
  --bs-gray-500: #6B7280;
  --bs-gray-600: #4B5563;
  --bs-gray-700: #374151;
  --bs-gray-800: #1F2937;
  --bs-gray-900: #111827;
  --bs-primary-rgb: 31, 41, 55;
  --bs-secondary-rgb: 240, 188, 116;
  --bs-tertiary-rgb: 49, 49, 106;
  --bs-success-rgb: 16, 185, 129;
  --bs-info-rgb: 35, 97, 206;
  --bs-warning-rgb: 243, 199, 142;
  --bs-danger-rgb: 225, 29, 72;
  --bs-white-rgb: 255, 255, 255;
  --bs-indigo-rgb: 79, 70, 229;
  --bs-purple-rgb: 124, 58, 237;
  --bs-yellow-100-rgb: 255, 238, 214;
  --bs-yellow-200-rgb: 245, 219, 184;
  --bs-gray-50-rgb: 249, 250, 251;
  --bs-gray-100-rgb: 242, 244, 246;
  --bs-gray-200-rgb: 229, 231, 235;
  --bs-gray-300-rgb: 209, 213, 219;
  --bs-gray-400-rgb: 156, 163, 175;
  --bs-gray-500-rgb: 107, 114, 128;
  --bs-gray-600-rgb: 75, 85, 99;
  --bs-gray-700-rgb: 55, 65, 81;
  --bs-gray-800-rgb: 31, 41, 55;
  --bs-gray-900-rgb: 17, 24, 39;
  --bs-white-rgb: 255, 255, 255;
  --bs-black-rgb: 17, 24, 39;
  --bs-body-color-rgb: 55, 65, 81;
  --bs-body-bg-rgb: 242, 244, 246;
  --bs-font-sans-serif: "Inter", sans-serif;
  --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
  --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
  --bs-body-font-family: var(--bs-font-sans-serif);
  --bs-body-font-size: 1rem;
  --bs-body-font-weight: 400;
  --bs-body-line-height: 1.5;
  --bs-body-color: #374151;
  --bs-body-bg: #F2F4F6; }

*,
*::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(17, 24, 39, 0); }

hr {
  margin: 1rem 0;
  color: inherit;
  background-color: currentColor;
  border: 0;
  opacity: 0.25; }

hr:not([size]) {
  height: 0.0625rem; }

h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 {
  margin-top: 0;
  margin-bottom: 0.5rem;
  font-weight: 500;
  line-height: 1.3;
  color: #1F2937; }

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],
abbr[data-bs-original-title] {
  -webkit-text-decoration: underline dotted;
          text-decoration: underline dotted;
  cursor: help;
  -webkit-text-decoration-skip-ink: none;
          text-decoration-skip-ink: none; }

address {
  margin-bottom: 1rem;
  font-style: normal;
  line-height: inherit; }

ol,
ul {
  padding-left: 2rem; }

ol,
ul,
dl {
  margin-top: 0;
  margin-bottom: 1rem; }

ol ol,
ul ul,
ol ul,
ul ol {
  margin-bottom: 0; }

dt {
  font-weight: 500; }

dd {
  margin-bottom: .5rem;
  margin-left: 0; }

blockquote {
  margin: 0 0 1rem; }

b,
strong {
  font-weight: 600; }

small, .small {
  font-size: 0.875em; }

mark, .mark {
  padding: 0.2em;
  background-color: #fcf8e3; }

sub,
sup {
  position: relative;
  font-size: 0.75em;
  line-height: 0;
  vertical-align: baseline; }

sub {
  bottom: -.25em; }

sup {
  top: -.5em; }

a {
  color: #1F2937;
  text-decoration: none; }
  a:hover {
    color: black;
    text-decoration: none; }

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;
  direction: ltr /* rtl:ignore */;
  unicode-bidi: bidi-override; }

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: #EF4683;
  word-wrap: break-word; }
  a > code {
    color: inherit; }

kbd {
  padding: 0.2rem 0.4rem;
  font-size: 0.875em;
  color: #ffffff;
  background-color: #111827;
  border-radius: 0.35rem; }
  kbd kbd {
    padding: 0;
    font-size: 1em;
    font-weight: 500; }

figure {
  margin: 0 0 1rem; }

img,
svg {
  vertical-align: middle; }

table {
  caption-side: bottom;
  border-collapse: collapse; }

caption {
  padding-top: 0.75rem;
  padding-bottom: 0.75rem;
  color: #58677d;
  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]::-webkit-calendar-picker-indicator {
  display: none; }

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"] {
  outline-offset: -2px;
  -webkit-appearance: textfield; }

/* rtl:raw:
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
  direction: ltr;
}
*/
::-webkit-search-decoration {
  -webkit-appearance: none; }

::-webkit-color-swatch-wrapper {
  padding: 0; }

::-webkit-file-upload-button {
  font: inherit; }

::file-selector-button {
  font: inherit; }

::-webkit-file-upload-button {
  font: inherit;
  -webkit-appearance: button; }

output {
  display: inline-block; }

iframe {
  border: 0; }

summary {
  display: list-item;
  cursor: pointer; }

progress {
  vertical-align: baseline; }

[hidden] {
  display: none !important; }

.lead {
  font-size: 1.25rem;
  font-weight: 300; }

.display-1 {
  font-size: calc(1.625rem + 4.5vw);
  font-weight: 500;
  line-height: 1.3; }
  @media (min-width: 1200px) {
    .display-1 {
      font-size: 5rem; } }

.display-2 {
  font-size: calc(1.475rem + 2.7vw);
  font-weight: 500;
  line-height: 1.3; }
  @media (min-width: 1200px) {
    .display-2 {
      font-size: 3.5rem; } }

.display-3 {
  font-size: calc(1.375rem + 1.5vw);
  font-weight: 500;
  line-height: 1.3; }
  @media (min-width: 1200px) {
    .display-3 {
      font-size: 2.5rem; } }

.display-4 {
  font-size: calc(1.3125rem + 0.75vw);
  font-weight: 500;
  line-height: 1.3; }
  @media (min-width: 1200px) {
    .display-4 {
      font-size: 1.875rem; } }

.display-5 {
  font-size: 1.2rem;
  font-weight: 500;
  line-height: 1.3; }

.display-6 {
  font-size: 1rem;
  font-weight: 500;
  line-height: 1.3; }

.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: #4B5563; }
  .blockquote-footer::before {
    content: "\2014\00A0"; }

.img-fluid {
  max-width: 100%;
  height: auto; }

.img-thumbnail {
  padding: 0.25rem;
  background-color: #F2F4F6;
  border: 0.0625rem solid #D1D5DB;
  border-radius: 0.5rem;
  box-shadow: 0 2px 5px rgba(140, 152, 164, 0.2);
  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: #4B5563; }

.container,
.container-fluid,
.container-sm,
.container-md,
.container-lg,
.container-xl {
  width: 100%;
  padding-right: var(--bs-gutter-x, 1rem);
  padding-left: var(--bs-gutter-x, 1rem);
  margin-right: auto;
  margin-left: auto; }

@media (min-width: 576px) {
  .container, .container-sm {
    max-width: 540px; } }

@media (min-width: 768px) {
  .container, .container-sm, .container-md {
    max-width: 720px; } }

@media (min-width: 992px) {
  .container, .container-sm, .container-md, .container-lg {
    max-width: 960px; } }

@media (min-width: 1200px) {
  .container, .container-sm, .container-md, .container-lg, .container-xl {
    max-width: 1140px; } }

.row {
  --bs-gutter-x: 1.5rem;
  --bs-gutter-y: 0;
  display: flex;
  flex-wrap: wrap;
  margin-top: calc(var(--bs-gutter-y) * -1);
  margin-right: calc(var(--bs-gutter-x) * -.5);
  margin-left: calc(var(--bs-gutter-x) * -.5); }
  .row > * {
    flex-shrink: 0;
    width: 100%;
    max-width: 100%;
    padding-right: calc(var(--bs-gutter-x) * .5);
    padding-left: calc(var(--bs-gutter-x) * .5);
    margin-top: var(--bs-gutter-y); }

.col {
  flex: 1 0 0%; }

.row-cols-auto > * {
  flex: 0 0 auto;
  width: auto; }

.row-cols-1 > * {
  flex: 0 0 auto;
  width: 100%; }

.row-cols-2 > * {
  flex: 0 0 auto;
  width: 50%; }

.row-cols-3 > * {
  flex: 0 0 auto;
  width: 33.33333%; }

.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.66667%; }

.col-auto {
  flex: 0 0 auto;
  width: auto; }

.col-1 {
  flex: 0 0 auto;
  width: 8.33333%; }

.col-2 {
  flex: 0 0 auto;
  width: 16.66667%; }

.col-3 {
  flex: 0 0 auto;
  width: 25%; }

.col-4 {
  flex: 0 0 auto;
  width: 33.33333%; }

.col-5 {
  flex: 0 0 auto;
  width: 41.66667%; }

.col-6 {
  flex: 0 0 auto;
  width: 50%; }

.col-7 {
  flex: 0 0 auto;
  width: 58.33333%; }

.col-8 {
  flex: 0 0 auto;
  width: 66.66667%; }

.col-9 {
  flex: 0 0 auto;
  width: 75%; }

.col-10 {
  flex: 0 0 auto;
  width: 83.33333%; }

.col-11 {
  flex: 0 0 auto;
  width: 91.66667%; }

.col-12 {
  flex: 0 0 auto;
  width: 100%; }

.offset-1 {
  margin-left: 8.33333%; }

.offset-2 {
  margin-left: 16.66667%; }

.offset-3 {
  margin-left: 25%; }

.offset-4 {
  margin-left: 33.33333%; }

.offset-5 {
  margin-left: 41.66667%; }

.offset-6 {
  margin-left: 50%; }

.offset-7 {
  margin-left: 58.33333%; }

.offset-8 {
  margin-left: 66.66667%; }

.offset-9 {
  margin-left: 75%; }

.offset-10 {
  margin-left: 83.33333%; }

.offset-11 {
  margin-left: 91.66667%; }

.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; }

.g-6,
.gx-6 {
  --bs-gutter-x: 5rem; }

.g-6,
.gy-6 {
  --bs-gutter-y: 5rem; }

.g-7,
.gx-7 {
  --bs-gutter-x: 8rem; }

.g-7,
.gy-7 {
  --bs-gutter-y: 8rem; }

.g-8,
.gx-8 {
  --bs-gutter-x: 10rem; }

.g-8,
.gy-8 {
  --bs-gutter-y: 10rem; }

.g-9,
.gx-9 {
  --bs-gutter-x: 11rem; }

.g-9,
.gy-9 {
  --bs-gutter-y: 11rem; }

.g-10,
.gx-10 {
  --bs-gutter-x: 14rem; }

.g-10,
.gy-10 {
  --bs-gutter-y: 14rem; }

.g-11,
.gx-11 {
  --bs-gutter-x: 16rem; }

.g-11,
.gy-11 {
  --bs-gutter-y: 16rem; }

.g-12,
.gx-12 {
  --bs-gutter-x: 20rem; }

.g-12,
.gy-12 {
  --bs-gutter-y: 20rem; }

.g-sm,
.gx-sm {
  --bs-gutter-x: 1rem; }

.g-sm,
.gy-sm {
  --bs-gutter-y: 1rem; }

.g-md,
.gx-md {
  --bs-gutter-x: 2rem; }

.g-md,
.gy-md {
  --bs-gutter-y: 2rem; }

.g-lg,
.gx-lg {
  --bs-gutter-x: 4rem; }

.g-lg,
.gy-lg {
  --bs-gutter-y: 4rem; }

.g-xl,
.gx-xl {
  --bs-gutter-x: 8rem; }

.g-xl,
.gy-xl {
  --bs-gutter-y: 8rem; }

@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.33333%; }
  .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.66667%; }
  .col-sm-auto {
    flex: 0 0 auto;
    width: auto; }
  .col-sm-1 {
    flex: 0 0 auto;
    width: 8.33333%; }
  .col-sm-2 {
    flex: 0 0 auto;
    width: 16.66667%; }
  .col-sm-3 {
    flex: 0 0 auto;
    width: 25%; }
  .col-sm-4 {
    flex: 0 0 auto;
    width: 33.33333%; }
  .col-sm-5 {
    flex: 0 0 auto;
    width: 41.66667%; }
  .col-sm-6 {
    flex: 0 0 auto;
    width: 50%; }
  .col-sm-7 {
    flex: 0 0 auto;
    width: 58.33333%; }
  .col-sm-8 {
    flex: 0 0 auto;
    width: 66.66667%; }
  .col-sm-9 {
    flex: 0 0 auto;
    width: 75%; }
  .col-sm-10 {
    flex: 0 0 auto;
    width: 83.33333%; }
  .col-sm-11 {
    flex: 0 0 auto;
    width: 91.66667%; }
  .col-sm-12 {
    flex: 0 0 auto;
    width: 100%; }
  .offset-sm-0 {
    margin-left: 0; }
  .offset-sm-1 {
    margin-left: 8.33333%; }
  .offset-sm-2 {
    margin-left: 16.66667%; }
  .offset-sm-3 {
    margin-left: 25%; }
  .offset-sm-4 {
    margin-left: 33.33333%; }
  .offset-sm-5 {
    margin-left: 41.66667%; }
  .offset-sm-6 {
    margin-left: 50%; }
  .offset-sm-7 {
    margin-left: 58.33333%; }
  .offset-sm-8 {
    margin-left: 66.66667%; }
  .offset-sm-9 {
    margin-left: 75%; }
  .offset-sm-10 {
    margin-left: 83.33333%; }
  .offset-sm-11 {
    margin-left: 91.66667%; }
  .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; }
  .g-sm-6,
  .gx-sm-6 {
    --bs-gutter-x: 5rem; }
  .g-sm-6,
  .gy-sm-6 {
    --bs-gutter-y: 5rem; }
  .g-sm-7,
  .gx-sm-7 {
    --bs-gutter-x: 8rem; }
  .g-sm-7,
  .gy-sm-7 {
    --bs-gutter-y: 8rem; }
  .g-sm-8,
  .gx-sm-8 {
    --bs-gutter-x: 10rem; }
  .g-sm-8,
  .gy-sm-8 {
    --bs-gutter-y: 10rem; }
  .g-sm-9,
  .gx-sm-9 {
    --bs-gutter-x: 11rem; }
  .g-sm-9,
  .gy-sm-9 {
    --bs-gutter-y: 11rem; }
  .g-sm-10,
  .gx-sm-10 {
    --bs-gutter-x: 14rem; }
  .g-sm-10,
  .gy-sm-10 {
    --bs-gutter-y: 14rem; }
  .g-sm-11,
  .gx-sm-11 {
    --bs-gutter-x: 16rem; }
  .g-sm-11,
  .gy-sm-11 {
    --bs-gutter-y: 16rem; }
  .g-sm-12,
  .gx-sm-12 {
    --bs-gutter-x: 20rem; }
  .g-sm-12,
  .gy-sm-12 {
    --bs-gutter-y: 20rem; }
  .g-sm-sm,
  .gx-sm-sm {
    --bs-gutter-x: 1rem; }
  .g-sm-sm,
  .gy-sm-sm {
    --bs-gutter-y: 1rem; }
  .g-sm-md,
  .gx-sm-md {
    --bs-gutter-x: 2rem; }
  .g-sm-md,
  .gy-sm-md {
    --bs-gutter-y: 2rem; }
  .g-sm-lg,
  .gx-sm-lg {
    --bs-gutter-x: 4rem; }
  .g-sm-lg,
  .gy-sm-lg {
    --bs-gutter-y: 4rem; }
  .g-sm-xl,
  .gx-sm-xl {
    --bs-gutter-x: 8rem; }
  .g-sm-xl,
  .gy-sm-xl {
    --bs-gutter-y: 8rem; } }

@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.33333%; }
  .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.66667%; }
  .col-md-auto {
    flex: 0 0 auto;
    width: auto; }
  .col-md-1 {
    flex: 0 0 auto;
    width: 8.33333%; }
  .col-md-2 {
    flex: 0 0 auto;
    width: 16.66667%; }
  .col-md-3 {
    flex: 0 0 auto;
    width: 25%; }
  .col-md-4 {
    flex: 0 0 auto;
    width: 33.33333%; }
  .col-md-5 {
    flex: 0 0 auto;
    width: 41.66667%; }
  .col-md-6 {
    flex: 0 0 auto;
    width: 50%; }
  .col-md-7 {
    flex: 0 0 auto;
    width: 58.33333%; }
  .col-md-8 {
    flex: 0 0 auto;
    width: 66.66667%; }
  .col-md-9 {
    flex: 0 0 auto;
    width: 75%; }
  .col-md-10 {
    flex: 0 0 auto;
    width: 83.33333%; }
  .col-md-11 {
    flex: 0 0 auto;
    width: 91.66667%; }
  .col-md-12 {
    flex: 0 0 auto;
    width: 100%; }
  .offset-md-0 {
    margin-left: 0; }
  .offset-md-1 {
    margin-left: 8.33333%; }
  .offset-md-2 {
    margin-left: 16.66667%; }
  .offset-md-3 {
    margin-left: 25%; }
  .offset-md-4 {
    margin-left: 33.33333%; }
  .offset-md-5 {
    margin-left: 41.66667%; }
  .offset-md-6 {
    margin-left: 50%; }
  .offset-md-7 {
    margin-left: 58.33333%; }
  .offset-md-8 {
    margin-left: 66.66667%; }
  .offset-md-9 {
    margin-left: 75%; }
  .offset-md-10 {
    margin-left: 83.33333%; }
  .offset-md-11 {
    margin-left: 91.66667%; }
  .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; }
  .g-md-6,
  .gx-md-6 {
    --bs-gutter-x: 5rem; }
  .g-md-6,
  .gy-md-6 {
    --bs-gutter-y: 5rem; }
  .g-md-7,
  .gx-md-7 {
    --bs-gutter-x: 8rem; }
  .g-md-7,
  .gy-md-7 {
    --bs-gutter-y: 8rem; }
  .g-md-8,
  .gx-md-8 {
    --bs-gutter-x: 10rem; }
  .g-md-8,
  .gy-md-8 {
    --bs-gutter-y: 10rem; }
  .g-md-9,
  .gx-md-9 {
    --bs-gutter-x: 11rem; }
  .g-md-9,
  .gy-md-9 {
    --bs-gutter-y: 11rem; }
  .g-md-10,
  .gx-md-10 {
    --bs-gutter-x: 14rem; }
  .g-md-10,
  .gy-md-10 {
    --bs-gutter-y: 14rem; }
  .g-md-11,
  .gx-md-11 {
    --bs-gutter-x: 16rem; }
  .g-md-11,
  .gy-md-11 {
    --bs-gutter-y: 16rem; }
  .g-md-12,
  .gx-md-12 {
    --bs-gutter-x: 20rem; }
  .g-md-12,
  .gy-md-12 {
    --bs-gutter-y: 20rem; }
  .g-md-sm,
  .gx-md-sm {
    --bs-gutter-x: 1rem; }
  .g-md-sm,
  .gy-md-sm {
    --bs-gutter-y: 1rem; }
  .g-md-md,
  .gx-md-md {
    --bs-gutter-x: 2rem; }
  .g-md-md,
  .gy-md-md {
    --bs-gutter-y: 2rem; }
  .g-md-lg,
  .gx-md-lg {
    --bs-gutter-x: 4rem; }
  .g-md-lg,
  .gy-md-lg {
    --bs-gutter-y: 4rem; }
  .g-md-xl,
  .gx-md-xl {
    --bs-gutter-x: 8rem; }
  .g-md-xl,
  .gy-md-xl {
    --bs-gutter-y: 8rem; } }

@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.33333%; }
  .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.66667%; }
  .col-lg-auto {
    flex: 0 0 auto;
    width: auto; }
  .col-lg-1 {
    flex: 0 0 auto;
    width: 8.33333%; }
  .col-lg-2 {
    flex: 0 0 auto;
    width: 16.66667%; }
  .col-lg-3 {
    flex: 0 0 auto;
    width: 25%; }
  .col-lg-4 {
    flex: 0 0 auto;
    width: 33.33333%; }
  .col-lg-5 {
    flex: 0 0 auto;
    width: 41.66667%; }
  .col-lg-6 {
    flex: 0 0 auto;
    width: 50%; }
  .col-lg-7 {
    flex: 0 0 auto;
    width: 58.33333%; }
  .col-lg-8 {
    flex: 0 0 auto;
    width: 66.66667%; }
  .col-lg-9 {
    flex: 0 0 auto;
    width: 75%; }
  .col-lg-10 {
    flex: 0 0 auto;
    width: 83.33333%; }
  .col-lg-11 {
    flex: 0 0 auto;
    width: 91.66667%; }
  .col-lg-12 {
    flex: 0 0 auto;
    width: 100%; }
  .offset-lg-0 {
    margin-left: 0; }
  .offset-lg-1 {
    margin-left: 8.33333%; }
  .offset-lg-2 {
    margin-left: 16.66667%; }
  .offset-lg-3 {
    margin-left: 25%; }
  .offset-lg-4 {
    margin-left: 33.33333%; }
  .offset-lg-5 {
    margin-left: 41.66667%; }
  .offset-lg-6 {
    margin-left: 50%; }
  .offset-lg-7 {
    margin-left: 58.33333%; }
  .offset-lg-8 {
    margin-left: 66.66667%; }
  .offset-lg-9 {
    margin-left: 75%; }
  .offset-lg-10 {
    margin-left: 83.33333%; }
  .offset-lg-11 {
    margin-left: 91.66667%; }
  .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; }
  .g-lg-6,
  .gx-lg-6 {
    --bs-gutter-x: 5rem; }
  .g-lg-6,
  .gy-lg-6 {
    --bs-gutter-y: 5rem; }
  .g-lg-7,
  .gx-lg-7 {
    --bs-gutter-x: 8rem; }
  .g-lg-7,
  .gy-lg-7 {
    --bs-gutter-y: 8rem; }
  .g-lg-8,
  .gx-lg-8 {
    --bs-gutter-x: 10rem; }
  .g-lg-8,
  .gy-lg-8 {
    --bs-gutter-y: 10rem; }
  .g-lg-9,
  .gx-lg-9 {
    --bs-gutter-x: 11rem; }
  .g-lg-9,
  .gy-lg-9 {
    --bs-gutter-y: 11rem; }
  .g-lg-10,
  .gx-lg-10 {
    --bs-gutter-x: 14rem; }
  .g-lg-10,
  .gy-lg-10 {
    --bs-gutter-y: 14rem; }
  .g-lg-11,
  .gx-lg-11 {
    --bs-gutter-x: 16rem; }
  .g-lg-11,
  .gy-lg-11 {
    --bs-gutter-y: 16rem; }
  .g-lg-12,
  .gx-lg-12 {
    --bs-gutter-x: 20rem; }
  .g-lg-12,
  .gy-lg-12 {
    --bs-gutter-y: 20rem; }
  .g-lg-sm,
  .gx-lg-sm {
    --bs-gutter-x: 1rem; }
  .g-lg-sm,
  .gy-lg-sm {
    --bs-gutter-y: 1rem; }
  .g-lg-md,
  .gx-lg-md {
    --bs-gutter-x: 2rem; }
  .g-lg-md,
  .gy-lg-md {
    --bs-gutter-y: 2rem; }
  .g-lg-lg,
  .gx-lg-lg {
    --bs-gutter-x: 4rem; }
  .g-lg-lg,
  .gy-lg-lg {
    --bs-gutter-y: 4rem; }
  .g-lg-xl,
  .gx-lg-xl {
    --bs-gutter-x: 8rem; }
  .g-lg-xl,
  .gy-lg-xl {
    --bs-gutter-y: 8rem; } }

@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.33333%; }
  .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.66667%; }
  .col-xl-auto {
    flex: 0 0 auto;
    width: auto; }
  .col-xl-1 {
    flex: 0 0 auto;
    width: 8.33333%; }
  .col-xl-2 {
    flex: 0 0 auto;
    width: 16.66667%; }
  .col-xl-3 {
    flex: 0 0 auto;
    width: 25%; }
  .col-xl-4 {
    flex: 0 0 auto;
    width: 33.33333%; }
  .col-xl-5 {
    flex: 0 0 auto;
    width: 41.66667%; }
  .col-xl-6 {
    flex: 0 0 auto;
    width: 50%; }
  .col-xl-7 {
    flex: 0 0 auto;
    width: 58.33333%; }
  .col-xl-8 {
    flex: 0 0 auto;
    width: 66.66667%; }
  .col-xl-9 {
    flex: 0 0 auto;
    width: 75%; }
  .col-xl-10 {
    flex: 0 0 auto;
    width: 83.33333%; }
  .col-xl-11 {
    flex: 0 0 auto;
    width: 91.66667%; }
  .col-xl-12 {
    flex: 0 0 auto;
    width: 100%; }
  .offset-xl-0 {
    margin-left: 0; }
  .offset-xl-1 {
    margin-left: 8.33333%; }
  .offset-xl-2 {
    margin-left: 16.66667%; }
  .offset-xl-3 {
    margin-left: 25%; }
  .offset-xl-4 {
    margin-left: 33.33333%; }
  .offset-xl-5 {
    margin-left: 41.66667%; }
  .offset-xl-6 {
    margin-left: 50%; }
  .offset-xl-7 {
    margin-left: 58.33333%; }
  .offset-xl-8 {
    margin-left: 66.66667%; }
  .offset-xl-9 {
    margin-left: 75%; }
  .offset-xl-10 {
    margin-left: 83.33333%; }
  .offset-xl-11 {
    margin-left: 91.66667%; }
  .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; }
  .g-xl-6,
  .gx-xl-6 {
    --bs-gutter-x: 5rem; }
  .g-xl-6,
  .gy-xl-6 {
    --bs-gutter-y: 5rem; }
  .g-xl-7,
  .gx-xl-7 {
    --bs-gutter-x: 8rem; }
  .g-xl-7,
  .gy-xl-7 {
    --bs-gutter-y: 8rem; }
  .g-xl-8,
  .gx-xl-8 {
    --bs-gutter-x: 10rem; }
  .g-xl-8,
  .gy-xl-8 {
    --bs-gutter-y: 10rem; }
  .g-xl-9,
  .gx-xl-9 {
    --bs-gutter-x: 11rem; }
  .g-xl-9,
  .gy-xl-9 {
    --bs-gutter-y: 11rem; }
  .g-xl-10,
  .gx-xl-10 {
    --bs-gutter-x: 14rem; }
  .g-xl-10,
  .gy-xl-10 {
    --bs-gutter-y: 14rem; }
  .g-xl-11,
  .gx-xl-11 {
    --bs-gutter-x: 16rem; }
  .g-xl-11,
  .gy-xl-11 {
    --bs-gutter-y: 16rem; }
  .g-xl-12,
  .gx-xl-12 {
    --bs-gutter-x: 20rem; }
  .g-xl-12,
  .gy-xl-12 {
    --bs-gutter-y: 20rem; }
  .g-xl-sm,
  .gx-xl-sm {
    --bs-gutter-x: 1rem; }
  .g-xl-sm,
  .gy-xl-sm {
    --bs-gutter-y: 1rem; }
  .g-xl-md,
  .gx-xl-md {
    --bs-gutter-x: 2rem; }
  .g-xl-md,
  .gy-xl-md {
    --bs-gutter-y: 2rem; }
  .g-xl-lg,
  .gx-xl-lg {
    --bs-gutter-x: 4rem; }
  .g-xl-lg,
  .gy-xl-lg {
    --bs-gutter-y: 4rem; }
  .g-xl-xl,
  .gx-xl-xl {
    --bs-gutter-x: 8rem; }
  .g-xl-xl,
  .gy-xl-xl {
    --bs-gutter-y: 8rem; } }

@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.33333%; }
  .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.66667%; }
  .col-xxl-auto {
    flex: 0 0 auto;
    width: auto; }
  .col-xxl-1 {
    flex: 0 0 auto;
    width: 8.33333%; }
  .col-xxl-2 {
    flex: 0 0 auto;
    width: 16.66667%; }
  .col-xxl-3 {
    flex: 0 0 auto;
    width: 25%; }
  .col-xxl-4 {
    flex: 0 0 auto;
    width: 33.33333%; }
  .col-xxl-5 {
    flex: 0 0 auto;
    width: 41.66667%; }
  .col-xxl-6 {
    flex: 0 0 auto;
    width: 50%; }
  .col-xxl-7 {
    flex: 0 0 auto;
    width: 58.33333%; }
  .col-xxl-8 {
    flex: 0 0 auto;
    width: 66.66667%; }
  .col-xxl-9 {
    flex: 0 0 auto;
    width: 75%; }
  .col-xxl-10 {
    flex: 0 0 auto;
    width: 83.33333%; }
  .col-xxl-11 {
    flex: 0 0 auto;
    width: 91.66667%; }
  .col-xxl-12 {
    flex: 0 0 auto;
    width: 100%; }
  .offset-xxl-0 {
    margin-left: 0; }
  .offset-xxl-1 {
    margin-left: 8.33333%; }
  .offset-xxl-2 {
    margin-left: 16.66667%; }
  .offset-xxl-3 {
    margin-left: 25%; }
  .offset-xxl-4 {
    margin-left: 33.33333%; }
  .offset-xxl-5 {
    margin-left: 41.66667%; }
  .offset-xxl-6 {
    margin-left: 50%; }
  .offset-xxl-7 {
    margin-left: 58.33333%; }
  .offset-xxl-8 {
    margin-left: 66.66667%; }
  .offset-xxl-9 {
    margin-left: 75%; }
  .offset-xxl-10 {
    margin-left: 83.33333%; }
  .offset-xxl-11 {
    margin-left: 91.66667%; }
  .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; }
  .g-xxl-6,
  .gx-xxl-6 {
    --bs-gutter-x: 5rem; }
  .g-xxl-6,
  .gy-xxl-6 {
    --bs-gutter-y: 5rem; }
  .g-xxl-7,
  .gx-xxl-7 {
    --bs-gutter-x: 8rem; }
  .g-xxl-7,
  .gy-xxl-7 {
    --bs-gutter-y: 8rem; }
  .g-xxl-8,
  .gx-xxl-8 {
    --bs-gutter-x: 10rem; }
  .g-xxl-8,
  .gy-xxl-8 {
    --bs-gutter-y: 10rem; }
  .g-xxl-9,
  .gx-xxl-9 {
    --bs-gutter-x: 11rem; }
  .g-xxl-9,
  .gy-xxl-9 {
    --bs-gutter-y: 11rem; }
  .g-xxl-10,
  .gx-xxl-10 {
    --bs-gutter-x: 14rem; }
  .g-xxl-10,
  .gy-xxl-10 {
    --bs-gutter-y: 14rem; }
  .g-xxl-11,
  .gx-xxl-11 {
    --bs-gutter-x: 16rem; }
  .g-xxl-11,
  .gy-xxl-11 {
    --bs-gutter-y: 16rem; }
  .g-xxl-12,
  .gx-xxl-12 {
    --bs-gutter-x: 20rem; }
  .g-xxl-12,
  .gy-xxl-12 {
    --bs-gutter-y: 20rem; }
  .g-xxl-sm,
  .gx-xxl-sm {
    --bs-gutter-x: 1rem; }
  .g-xxl-sm,
  .gy-xxl-sm {
    --bs-gutter-y: 1rem; }
  .g-xxl-md,
  .gx-xxl-md {
    --bs-gutter-x: 2rem; }
  .g-xxl-md,
  .gy-xxl-md {
    --bs-gutter-y: 2rem; }
  .g-xxl-lg,
  .gx-xxl-lg {
    --bs-gutter-x: 4rem; }
  .g-xxl-lg,
  .gy-xxl-lg {
    --bs-gutter-y: 4rem; }
  .g-xxl-xl,
  .gx-xxl-xl {
    --bs-gutter-x: 8rem; }
  .g-xxl-xl,
  .gy-xxl-xl {
    --bs-gutter-y: 8rem; } }

.table {
  --bs-table-bg: transparent;
  --bs-table-accent-bg: transparent;
  --bs-table-striped-color: #374151;
  --bs-table-striped-bg: rgba(17, 24, 39, 0.05);
  --bs-table-active-color: #374151;
  --bs-table-active-bg: rgba(17, 24, 39, 0.1);
  --bs-table-hover-color: #374151;
  --bs-table-hover-bg: rgba(17, 24, 39, 0.075);
  width: 100%;
  margin-bottom: 1rem;
  color: #374151;
  vertical-align: top;
  border-color: #E5E7EB; }
  .table > :not(caption) > * > * {
    padding: 0.75rem 0.5rem;
    background-color: var(--bs-table-bg);
    border-bottom-width: 0.0625rem;
    box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); }
  .table > tbody {
    vertical-align: inherit; }
  .table > thead {
    vertical-align: bottom; }
  .table > :not(:last-child) > :last-child > * {
    border-bottom-color: currentColor; }

.caption-top {
  caption-side: top; }

.table-sm > :not(caption) > * > * {
  padding: 0.25rem 0.25rem; }

.table-bordered > :not(caption) > * {
  border-width: 0.0625rem 0; }
  .table-bordered > :not(caption) > * > * {
    border-width: 0 0.0625rem; }

.table-borderless > :not(caption) > * > * {
  border-bottom-width: 0; }

.table-striped > tbody > tr:nth-of-type(odd) {
  --bs-table-accent-bg: var(--bs-table-striped-bg);
  color: var(--bs-table-striped-color); }

.table-active {
  --bs-table-accent-bg: var(--bs-table-active-bg);
  color: var(--bs-table-active-color); }

.table-hover > tbody > tr:hover {
  --bs-table-accent-bg: var(--bs-table-hover-bg);
  color: var(--bs-table-hover-color); }

.table-primary {
  --bs-table-bg: #d2d4d7;
  --bs-table-striped-bg: #c9cbcf;
  --bs-table-striped-color: #1F2937;
  --bs-table-active-bg: #c0c3c7;
  --bs-table-active-color: #1F2937;
  --bs-table-hover-bg: #c5c7cb;
  --bs-table-hover-color: #1F2937;
  color: #1F2937;
  border-color: #c0c3c7; }

.table-secondary {
  --bs-table-bg: #fcf2e3;
  --bs-table-striped-bg: #f1e8da;
  --bs-table-striped-color: #1F2937;
  --bs-table-active-bg: #e6ded2;
  --bs-table-active-color: #1F2937;
  --bs-table-hover-bg: #ebe3d6;
  --bs-table-hover-color: #1F2937;
  color: #1F2937;
  border-color: #e6ded2; }

.table-success {
  --bs-table-bg: #cff1e6;
  --bs-table-striped-bg: #c6e7dd;
  --bs-table-striped-color: #1F2937;
  --bs-table-active-bg: #bdddd5;
  --bs-table-active-color: #1F2937;
  --bs-table-hover-bg: #c2e2d9;
  --bs-table-hover-color: #1F2937;
  color: #1F2937;
  border-color: #bdddd5; }

.table-info {
  --bs-table-bg: #d3dff5;
  --bs-table-striped-bg: #cad6ec;
  --bs-table-striped-color: #1F2937;
  --bs-table-active-bg: #c1cde2;
  --bs-table-active-color: #1F2937;
  --bs-table-hover-bg: #c6d1e7;
  --bs-table-hover-color: #1F2937;
  color: #1F2937;
  border-color: #c1cde2; }

.table-warning {
  --bs-table-bg: #fdf4e8;
  --bs-table-striped-bg: #f2eadf;
  --bs-table-striped-color: #1F2937;
  --bs-table-active-bg: #e7e0d6;
  --bs-table-active-color: #1F2937;
  --bs-table-hover-bg: #ece5db;
  --bs-table-hover-color: #1F2937;
  color: #1F2937;
  border-color: #e7e0d6; }

.table-danger {
  --bs-table-bg: #f9d2da;
  --bs-table-striped-bg: #eecad2;
  --bs-table-striped-color: #1F2937;
  --bs-table-active-bg: #e3c1ca;
  --bs-table-active-color: #1F2937;
  --bs-table-hover-bg: #e9c5ce;
  --bs-table-hover-color: #1F2937;
  color: #1F2937;
  border-color: #e3c1ca; }

.table-light {
  --bs-table-bg: #9CA3AF;
  --bs-table-striped-bg: #969da9;
  --bs-table-striped-color: #1F2937;
  --bs-table-active-bg: #9097a3;
  --bs-table-active-color: #1F2937;
  --bs-table-hover-bg: #939aa6;
  --bs-table-hover-color: #1F2937;
  color: #1F2937;
  border-color: #9097a3; }

.table-dark {
  --bs-table-bg: #1F2937;
  --bs-table-striped-bg: #2a3441;
  --bs-table-striped-color: #ffffff;
  --bs-table-active-bg: #353e4b;
  --bs-table-active-color: #ffffff;
  --bs-table-hover-bg: #303946;
  --bs-table-hover-color: #ffffff;
  color: #ffffff;
  border-color: #353e4b; }

.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: 0.5625rem;
  padding-bottom: 0.5625rem;
  margin-bottom: 0;
  font-size: inherit;
  line-height: 1.5; }

.col-form-label-lg {
  padding-top: 0.5625rem;
  padding-bottom: 0.5625rem;
  font-size: 1.25rem; }

.col-form-label-sm {
  padding-top: 0.4375rem;
  padding-bottom: 0.4375rem;
  font-size: 0.875rem; }

.form-text {
  margin-top: 0.25rem;
  font-size: 0.875em;
  color: #58677d; }

.form-control {
  display: block;
  width: 100%;
  padding: 0.5rem 1rem;
  font-size: 0.875rem;
  font-weight: 400;
  line-height: 1.5;
  color: #6B7280;
  background-color: #ffffff;
  background-clip: padding-box;
  border: 0.0625rem solid #D1D5DB;
  -webkit-appearance: none;
          appearance: none;
  border-radius: 0.5rem;
  box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.07);
  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: #6B7280;
    background-color: #ffffff;
    border-color: #4d6689;
    outline: 0;
    box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.07), 0 0 0 0.18rem rgba(31, 41, 55, 0.25); }
  .form-control::-webkit-date-and-time-value {
    height: 1.5em; }
  .form-control::placeholder {
    color: #4B5563;
    opacity: 1; }
  .form-control:disabled, .form-control[readonly] {
    background-color: #E5E7EB;
    opacity: 1; }
  .form-control::-webkit-file-upload-button {
    padding: 0.5rem 1rem;
    margin: -0.5rem -1rem;
    -webkit-margin-end: 1rem;
            margin-inline-end: 1rem;
    color: #6B7280;
    background-color: #ffffff;
    pointer-events: none;
    border-color: inherit;
    border-style: solid;
    border-width: 0;
    border-inline-end-width: 0.0625rem;
    border-radius: 0;
    -webkit-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;
    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; }
  .form-control::file-selector-button {
    padding: 0.5rem 1rem;
    margin: -0.5rem -1rem;
    -webkit-margin-end: 1rem;
            margin-inline-end: 1rem;
    color: #6B7280;
    background-color: #ffffff;
    pointer-events: none;
    border-color: inherit;
    border-style: solid;
    border-width: 0;
    border-inline-end-width: 0.0625rem;
    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::-webkit-file-upload-button {
        -webkit-transition: none;
        transition: none; }
      .form-control::file-selector-button {
        transition: none; } }
  .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {
    background-color: #f2f2f2; }
  .form-control:hover:not(:disabled):not([readonly])::file-selector-button {
    background-color: #f2f2f2; }
  .form-control::-webkit-file-upload-button {
    padding: 0.5rem 1rem;
    margin: -0.5rem -1rem;
    -webkit-margin-end: 1rem;
            margin-inline-end: 1rem;
    color: #6B7280;
    background-color: #ffffff;
    pointer-events: none;
    border-color: inherit;
    border-style: solid;
    border-width: 0;
    border-inline-end-width: 0.0625rem;
    border-radius: 0;
    -webkit-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;
    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::-webkit-file-upload-button {
        -webkit-transition: none;
        transition: none; } }
  .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {
    background-color: #f2f2f2; }

.form-control-plaintext {
  display: block;
  width: 100%;
  padding: 0.5rem 0;
  margin-bottom: 0;
  line-height: 1.5;
  color: #374151;
  background-color: transparent;
  border: solid transparent;
  border-width: 0.0625rem 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.875rem);
  padding: 0.375rem 0.625rem;
  font-size: 0.875rem;
  border-radius: 0.5rem; }
  .form-control-sm::-webkit-file-upload-button {
    padding: 0.375rem 0.625rem;
    margin: -0.375rem -0.625rem;
    -webkit-margin-end: 0.625rem;
            margin-inline-end: 0.625rem; }
  .form-control-sm::file-selector-button {
    padding: 0.375rem 0.625rem;
    margin: -0.375rem -0.625rem;
    -webkit-margin-end: 0.625rem;
            margin-inline-end: 0.625rem; }
  .form-control-sm::-webkit-file-upload-button {
    padding: 0.375rem 0.625rem;
    margin: -0.375rem -0.625rem;
    -webkit-margin-end: 0.625rem;
            margin-inline-end: 0.625rem; }

.form-control-lg {
  min-height: calc(1.5em + 1.125rem);
  padding: 0.5rem 1rem;
  font-size: 1.25rem;
  border-radius: 0.5rem; }
  .form-control-lg::-webkit-file-upload-button {
    padding: 0.5rem 1rem;
    margin: -0.5rem -1rem;
    -webkit-margin-end: 1rem;
            margin-inline-end: 1rem; }
  .form-control-lg::file-selector-button {
    padding: 0.5rem 1rem;
    margin: -0.5rem -1rem;
    -webkit-margin-end: 1rem;
            margin-inline-end: 1rem; }
  .form-control-lg::-webkit-file-upload-button {
    padding: 0.5rem 1rem;
    margin: -0.5rem -1rem;
    -webkit-margin-end: 1rem;
            margin-inline-end: 1rem; }

textarea.form-control {
  min-height: calc(1.5em + 1.125rem); }

textarea.form-control-sm {
  min-height: calc(1.5em + 0.875rem); }

textarea.form-control-lg {
  min-height: calc(1.5em + 1.125rem); }

.form-control-color {
  width: 3rem;
  height: auto;
  padding: 0.5rem; }
  .form-control-color:not(:disabled):not([readonly]) {
    cursor: pointer; }
  .form-control-color::-moz-color-swatch {
    height: 1.5em;
    border-radius: 0.5rem; }
  .form-control-color::-webkit-color-swatch {
    height: 1.5em;
    border-radius: 0.5rem; }

.form-select {
  display: block;
  width: 100%;
  padding: 0.5rem 1rem 0.5rem 1rem;
  -moz-padding-start: calc(1rem - 3px);
  font-size: 0.875rem;
  font-weight: 400;
  line-height: 1.5;
  color: #6B7280;
  background-color: #ffffff;
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%231F2937' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
  background-repeat: no-repeat;
  background-position: right 1rem center;
  background-size: 16px 12px;
  border: 0.0625rem solid #D1D5DB;
  border-radius: 0.5rem;
  box-shadow: inset 0 1px 2px rgba(17, 24, 39, 0.0125);
  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
  -webkit-appearance: none;
          appearance: none; }
  @media (prefers-reduced-motion: reduce) {
    .form-select {
      transition: none; } }
  .form-select:focus {
    border-color: #4d6689;
    outline: 0;
    box-shadow: inset 0 1px 2px rgba(17, 24, 39, 0.0125), 0 0 0 0.18rem rgba(31, 41, 55, 0.25); }
  .form-select[multiple], .form-select[size]:not([size="1"]) {
    padding-right: 1rem;
    background-image: none; }
  .form-select:disabled {
    color: #4B5563;
    background-color: #E5E7EB; }
  .form-select:-moz-focusring {
    color: transparent;
    text-shadow: 0 0 0 #6B7280; }

.form-select-sm {
  padding-top: 0.375rem;
  padding-bottom: 0.375rem;
  padding-left: 0.625rem;
  font-size: 0.875rem; }

.form-select-lg {
  padding-top: 0.5rem;
  padding-bottom: 0.5rem;
  padding-left: 1rem;
  font-size: 1.25rem; }

.form-check {
  display: block;
  min-height: 1.5rem;
  padding-left: 1.625em;
  margin-bottom: 0.125rem; }
  .form-check .form-check-input {
    float: left;
    margin-left: -1.625em; }

.form-check-input {
  width: 1.125em;
  height: 1.125em;
  margin-top: 0.1875em;
  vertical-align: top;
  background-color: #F2F4F6;
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  border: 1px solid #D1D5DB;
  -webkit-appearance: none;
          appearance: none;
  -webkit-print-color-adjust: exact;
          color-adjust: exact;
  transition: background-color 0.2s ease-in-out, background-position 0.2s ease-in-out, border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out; }
  @media (prefers-reduced-motion: reduce) {
    .form-check-input {
      transition: none; } }
  .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: #4d6689;
    outline: 0;
    box-shadow: 0 0 0 0.18rem rgba(31, 41, 55, 0.25); }
  .form-check-input:checked {
    background-color: #1F2937;
    border-color: #1F2937; }
    .form-check-input:checked[type="checkbox"] {
      background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e"); }
    .form-check-input:checked[type="radio"] {
      background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23ffffff'/%3e%3c/svg%3e"); }
  .form-check-input[type="checkbox"]:indeterminate {
    background-color: #1F2937;
    border-color: #1F2937;
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' 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 {
    opacity: 0.5; }

.form-switch {
  padding-left: 2.75em; }
  .form-switch .form-check-input {
    width: 2.25em;
    margin-left: -2.75em;
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%234B5563'/%3e%3c/svg%3e");
    background-position: left center;
    border-radius: 2.25em;
    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 {
      background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%234d6689'/%3e%3c/svg%3e"); }
    .form-switch .form-check-input:checked {
      background-position: right center;
      background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e"); }

.form-check-inline {
  display: inline-block;
  margin-right: 1rem; }

.btn-check {
  position: absolute;
  clip: rect(0, 0, 0, 0);
  pointer-events: none; }
  .btn-check[disabled] + .btn, .btn-check:disabled + .btn {
    pointer-events: none;
    filter: none;
    opacity: 0.65; }

.form-range {
  width: 100%;
  height: 1.36rem;
  padding: 0;
  background-color: transparent;
  -webkit-appearance: none;
          appearance: none; }
  .form-range:focus {
    outline: 0; }
    .form-range:focus::-webkit-slider-thumb {
      box-shadow: 0 0 0 1px #F2F4F6, 0 0 0 0.18rem rgba(31, 41, 55, 0.25); }
    .form-range:focus::-moz-range-thumb {
      box-shadow: 0 0 0 1px #F2F4F6, 0 0 0 0.18rem rgba(31, 41, 55, 0.25); }
  .form-range::-moz-focus-outer {
    border: 0; }
  .form-range::-webkit-slider-thumb {
    width: 1rem;
    height: 1rem;
    margin-top: -0.25rem;
    background-color: #1F2937;
    border: 0;
    border-radius: 1rem;
    box-shadow: 0 0.1rem 0.25rem rgba(17, 24, 39, 0.1);
    -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
    transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
    -webkit-appearance: none;
            appearance: none; }
    @media (prefers-reduced-motion: reduce) {
      .form-range::-webkit-slider-thumb {
        -webkit-transition: none;
        transition: none; } }
    .form-range::-webkit-slider-thumb:active {
      background-color: #627fa7; }
  .form-range::-webkit-slider-runnable-track {
    width: 100%;
    height: 0.5rem;
    color: transparent;
    cursor: pointer;
    background-color: #D1D5DB;
    border-color: transparent;
    border-radius: 1rem;
    box-shadow: inset 0 1px 2px rgba(17, 24, 39, 0.0125); }
  .form-range::-moz-range-thumb {
    width: 1rem;
    height: 1rem;
    background-color: #1F2937;
    border: 0;
    border-radius: 1rem;
    box-shadow: 0 0.1rem 0.25rem rgba(17, 24, 39, 0.1);
    -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
    transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
    appearance: none; }
    @media (prefers-reduced-motion: reduce) {
      .form-range::-moz-range-thumb {
        -moz-transition: none;
        transition: none; } }
    .form-range::-moz-range-thumb:active {
      background-color: #627fa7; }
  .form-range::-moz-range-track {
    width: 100%;
    height: 0.5rem;
    color: transparent;
    cursor: pointer;
    background-color: #D1D5DB;
    border-color: transparent;
    border-radius: 1rem;
    box-shadow: inset 0 1px 2px rgba(17, 24, 39, 0.0125); }
  .form-range:disabled {
    pointer-events: none; }
    .form-range:disabled::-webkit-slider-thumb {
      background-color: #6B7280; }
    .form-range:disabled::-moz-range-thumb {
      background-color: #6B7280; }

.form-floating {
  position: relative; }
  .form-floating > .form-control,
  .form-floating > .form-select {
    height: 3.625rem;
    line-height: 1.25; }
  .form-floating > label {
    position: absolute;
    top: 0;
    left: 0;
    height: 100%;
    padding: 1rem 1rem;
    pointer-events: none;
    border: 0.0625rem 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 {
    padding: 1rem 1rem; }
    .form-floating > .form-control::placeholder {
      color: transparent; }
    .form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown) {
      padding-top: 1.625rem;
      padding-bottom: 0.625rem; }
    .form-floating > .form-control:-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-select ~ label {
    opacity: 0.65;
    transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); }
  .form-floating > .form-control:-webkit-autofill ~ label {
    opacity: 0.65;
    transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); }

.input-group {
  position: relative;
  display: flex;
  flex-wrap: wrap;
  align-items: stretch;
  width: 100%; }
  .input-group > .form-control,
  .input-group > .form-select {
    position: relative;
    flex: 1 1 auto;
    width: 1%;
    min-width: 0; }
  .input-group > .form-control:focus,
  .input-group > .form-select:focus {
    z-index: 3; }
  .input-group .btn {
    position: relative;
    z-index: 2; }
    .input-group .btn:focus {
      z-index: 3; }

.input-group-text {
  display: flex;
  align-items: center;
  padding: 0.5rem 0.625rem;
  font-size: 0.875rem;
  font-weight: 400;
  line-height: 1.5;
  color: #6B7280;
  text-align: center;
  white-space: nowrap;
  background-color: #ffffff;
  border: 0.0625rem solid #D1D5DB;
  border-radius: 0.5rem; }

.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: 0.5rem; }

.input-group-sm > .form-control,
.input-group-sm > .form-select,
.input-group-sm > .input-group-text,
.input-group-sm > .btn {
  padding: 0.375rem 0.625rem;
  font-size: 0.875rem;
  border-radius: 0.5rem; }

.input-group-lg > .form-select,
.input-group-sm > .form-select {
  padding-right: 2rem; }

.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),
.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n + 3) {
  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),
.input-group.has-validation > .dropdown-toggle:nth-last-child(n + 4) {
  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: -0.0625rem;
  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: #10B981; }

.valid-tooltip {
  position: absolute;
  top: 100%;
  z-index: 5;
  display: none;
  max-width: 100%;
  padding: 0.5rem 0.55rem;
  margin-top: .1rem;
  font-size: 0.875rem;
  color: #1F2937;
  background-color: rgba(16, 185, 129, 0.99);
  border-radius: 0.5rem; }

.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: #10B981;
  padding-right: calc(1.5em + 1rem);
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2310B981' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
  background-repeat: no-repeat;
  background-position: right calc(0.375em + 0.25rem) center;
  background-size: calc(0.75em + 0.5rem) calc(0.75em + 0.5rem); }
  .was-validated .form-control:valid:focus, .form-control.is-valid:focus {
    border-color: #10B981;
    box-shadow: 0 0 0 0.18rem rgba(16, 185, 129, 0.25); }

.was-validated textarea.form-control:valid, textarea.form-control.is-valid {
  padding-right: calc(1.5em + 1rem);
  background-position: top calc(0.375em + 0.25rem) right calc(0.375em + 0.25rem); }

.was-validated .form-select:valid, .form-select.is-valid {
  border-color: #10B981; }
  .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"] {
    padding-right: 3.5rem;
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%231F2937' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2310B981' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
    background-position: right 1rem center, center right 2rem;
    background-size: 16px 12px, calc(0.75em + 0.5rem) calc(0.75em + 0.5rem); }
  .was-validated .form-select:valid:focus, .form-select.is-valid:focus {
    border-color: #10B981;
    box-shadow: 0 0 0 0.18rem rgba(16, 185, 129, 0.25); }

.was-validated .form-check-input:valid, .form-check-input.is-valid {
  border-color: #10B981; }
  .was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked {
    background-color: #10B981; }
  .was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus {
    box-shadow: 0 0 0 0.18rem rgba(16, 185, 129, 0.25); }
  .was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
    color: #10B981; }

.form-check-inline .form-check-input ~ .valid-feedback {
  margin-left: .5em; }

.was-validated .input-group .form-control:valid, .input-group .form-control.is-valid, .was-validated
.input-group .form-select:valid,
.input-group .form-select.is-valid {
  z-index: 1; }
  .was-validated .input-group .form-control:valid:focus, .input-group .form-control.is-valid:focus, .was-validated
  .input-group .form-select:valid:focus,
  .input-group .form-select.is-valid:focus {
    z-index: 3; }

.invalid-feedback {
  display: none;
  width: 100%;
  margin-top: 0.25rem;
  font-size: 0.875em;
  color: #E11D48; }

.invalid-tooltip {
  position: absolute;
  top: 100%;
  z-index: 5;
  display: none;
  max-width: 100%;
  padding: 0.5rem 0.55rem;
  margin-top: .1rem;
  font-size: 0.875rem;
  color: #ffffff;
  background-color: rgba(225, 29, 72, 0.99);
  border-radius: 0.5rem; }

.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: #E11D48;
  padding-right: calc(1.5em + 1rem);
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23E11D48' viewBox='0 0 12 12'%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='%23E11D48' stroke='none'/%3e%3c/svg%3e");
  background-repeat: no-repeat;
  background-position: right calc(0.375em + 0.25rem) center;
  background-size: calc(0.75em + 0.5rem) calc(0.75em + 0.5rem); }
  .was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {
    border-color: #E11D48;
    box-shadow: 0 0 0 0.18rem rgba(225, 29, 72, 0.25); }

.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {
  padding-right: calc(1.5em + 1rem);
  background-position: top calc(0.375em + 0.25rem) right calc(0.375em + 0.25rem); }

.was-validated .form-select:invalid, .form-select.is-invalid {
  border-color: #E11D48; }
  .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"] {
    padding-right: 3.5rem;
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%231F2937' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23E11D48' viewBox='0 0 12 12'%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='%23E11D48' stroke='none'/%3e%3c/svg%3e");
    background-position: right 1rem center, center right 2rem;
    background-size: 16px 12px, calc(0.75em + 0.5rem) calc(0.75em + 0.5rem); }
  .was-validated .form-select:invalid:focus, .form-select.is-invalid:focus {
    border-color: #E11D48;
    box-shadow: 0 0 0 0.18rem rgba(225, 29, 72, 0.25); }

.was-validated .form-check-input:invalid, .form-check-input.is-invalid {
  border-color: #E11D48; }
  .was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked {
    background-color: #E11D48; }
  .was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus {
    box-shadow: 0 0 0 0.18rem rgba(225, 29, 72, 0.25); }
  .was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
    color: #E11D48; }

.form-check-inline .form-check-input ~ .invalid-feedback {
  margin-left: .5em; }

.was-validated .input-group .form-control:invalid, .input-group .form-control.is-invalid, .was-validated
.input-group .form-select:invalid,
.input-group .form-select.is-invalid {
  z-index: 2; }
  .was-validated .input-group .form-control:invalid:focus, .input-group .form-control.is-invalid:focus, .was-validated
  .input-group .form-select:invalid:focus,
  .input-group .form-select.is-invalid:focus {
    z-index: 3; }

.btn {
  display: inline-block;
  font-weight: 500;
  line-height: 1.5;
  color: #374151;
  text-align: center;
  vertical-align: middle;
  cursor: pointer;
  -webkit-user-select: none;
          user-select: none;
  background-color: transparent;
  border: 0.0625rem solid transparent;
  padding: 0.5rem 1rem;
  font-size: 0.875rem;
  border-radius: 0.5rem;
  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: #374151; }
  .btn-check:focus + .btn, .btn:focus {
    outline: 0;
    box-shadow: 0 0 0 0.18rem rgba(31, 41, 55, 0.25); }
  .btn-check:checked + .btn,
  .btn-check:active + .btn, .btn:active, .btn.active {
    box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125); }
    .btn-check:checked + .btn:focus,
    .btn-check:active + .btn:focus, .btn:active:focus, .btn.active:focus {
      box-shadow: 0 0 0 0.18rem rgba(31, 41, 55, 0.25), inset 0 3px 5px rgba(17, 24, 39, 0.125); }
  .btn:disabled, .btn.disabled,
  fieldset:disabled .btn {
    pointer-events: none;
    opacity: 0.65;
    box-shadow: none; }

.btn-primary {
  color: #ffffff;
  background-color: #1F2937;
  border-color: #1F2937;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-primary:hover {
    color: #ffffff;
    background-color: #1a232f;
    border-color: #19212c; }
  .btn-check:focus + .btn-primary, .btn-primary:focus {
    color: #ffffff;
    background-color: #1a232f;
    border-color: #19212c;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(65, 73, 85, 0.5); }
  .btn-check:checked + .btn-primary,
  .btn-check:active + .btn-primary, .btn-primary:active, .btn-primary.active,
  .show > .btn-primary.dropdown-toggle {
    color: #ffffff;
    background-color: #19212c;
    border-color: #171f29; }
    .btn-check:checked + .btn-primary:focus,
    .btn-check:active + .btn-primary:focus, .btn-primary:active:focus, .btn-primary.active:focus,
    .show > .btn-primary.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(65, 73, 85, 0.5); }
  .btn-primary:disabled, .btn-primary.disabled {
    color: #ffffff;
    background-color: #1F2937;
    border-color: #1F2937; }

.btn-secondary {
  color: #1F2937;
  background-color: #f0bc74;
  border-color: #f0bc74;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-secondary:hover {
    color: #1F2937;
    background-color: #f2c689;
    border-color: #f2c382; }
  .btn-check:focus + .btn-secondary, .btn-secondary:focus {
    color: #1F2937;
    background-color: #f2c689;
    border-color: #f2c382;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(209, 166, 107, 0.5); }
  .btn-check:checked + .btn-secondary,
  .btn-check:active + .btn-secondary, .btn-secondary:active, .btn-secondary.active,
  .show > .btn-secondary.dropdown-toggle {
    color: #1F2937;
    background-color: #f3c990;
    border-color: #f2c382; }
    .btn-check:checked + .btn-secondary:focus,
    .btn-check:active + .btn-secondary:focus, .btn-secondary:active:focus, .btn-secondary.active:focus,
    .show > .btn-secondary.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(209, 166, 107, 0.5); }
  .btn-secondary:disabled, .btn-secondary.disabled {
    color: #1F2937;
    background-color: #f0bc74;
    border-color: #f0bc74; }

.btn-tertiary {
  color: #ffffff;
  background-color: #31316A;
  border-color: #31316A;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-tertiary:hover {
    color: #ffffff;
    background-color: #2a2a5a;
    border-color: #272755; }
  .btn-check:focus + .btn-tertiary, .btn-tertiary:focus {
    color: #ffffff;
    background-color: #2a2a5a;
    border-color: #272755;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(80, 80, 128, 0.5); }
  .btn-check:checked + .btn-tertiary,
  .btn-check:active + .btn-tertiary, .btn-tertiary:active, .btn-tertiary.active,
  .show > .btn-tertiary.dropdown-toggle {
    color: #ffffff;
    background-color: #272755;
    border-color: #252550; }
    .btn-check:checked + .btn-tertiary:focus,
    .btn-check:active + .btn-tertiary:focus, .btn-tertiary:active:focus, .btn-tertiary.active:focus,
    .show > .btn-tertiary.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(80, 80, 128, 0.5); }
  .btn-tertiary:disabled, .btn-tertiary.disabled {
    color: #ffffff;
    background-color: #31316A;
    border-color: #31316A; }

.btn-success {
  color: #1F2937;
  background-color: #10B981;
  border-color: #10B981;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-success:hover {
    color: #1F2937;
    background-color: #34c494;
    border-color: #28c08e; }
  .btn-check:focus + .btn-success, .btn-success:focus {
    color: #1F2937;
    background-color: #34c494;
    border-color: #28c08e;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(18, 163, 118, 0.5); }
  .btn-check:checked + .btn-success,
  .btn-check:active + .btn-success, .btn-success:active, .btn-success.active,
  .show > .btn-success.dropdown-toggle {
    color: #1F2937;
    background-color: #40c79a;
    border-color: #28c08e; }
    .btn-check:checked + .btn-success:focus,
    .btn-check:active + .btn-success:focus, .btn-success:active:focus, .btn-success.active:focus,
    .show > .btn-success.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(18, 163, 118, 0.5); }
  .btn-success:disabled, .btn-success.disabled {
    color: #1F2937;
    background-color: #10B981;
    border-color: #10B981; }

.btn-info {
  color: #ffffff;
  background-color: #2361ce;
  border-color: #2361ce;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-info:hover {
    color: #ffffff;
    background-color: #1e52af;
    border-color: #1c4ea5; }
  .btn-check:focus + .btn-info, .btn-info:focus {
    color: #ffffff;
    background-color: #1e52af;
    border-color: #1c4ea5;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(68, 121, 213, 0.5); }
  .btn-check:checked + .btn-info,
  .btn-check:active + .btn-info, .btn-info:active, .btn-info.active,
  .show > .btn-info.dropdown-toggle {
    color: #ffffff;
    background-color: #1c4ea5;
    border-color: #1a499b; }
    .btn-check:checked + .btn-info:focus,
    .btn-check:active + .btn-info:focus, .btn-info:active:focus, .btn-info.active:focus,
    .show > .btn-info.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(68, 121, 213, 0.5); }
  .btn-info:disabled, .btn-info.disabled {
    color: #ffffff;
    background-color: #2361ce;
    border-color: #2361ce; }

.btn-warning {
  color: #1F2937;
  background-color: #f3c78e;
  border-color: #f3c78e;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-warning:hover {
    color: #1F2937;
    background-color: #f5cf9f;
    border-color: #f4cd99; }
  .btn-check:focus + .btn-warning, .btn-warning:focus {
    color: #1F2937;
    background-color: #f5cf9f;
    border-color: #f4cd99;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(211, 175, 129, 0.5); }
  .btn-check:checked + .btn-warning,
  .btn-check:active + .btn-warning, .btn-warning:active, .btn-warning.active,
  .show > .btn-warning.dropdown-toggle {
    color: #1F2937;
    background-color: #f5d2a5;
    border-color: #f4cd99; }
    .btn-check:checked + .btn-warning:focus,
    .btn-check:active + .btn-warning:focus, .btn-warning:active:focus, .btn-warning.active:focus,
    .show > .btn-warning.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(211, 175, 129, 0.5); }
  .btn-warning:disabled, .btn-warning.disabled {
    color: #1F2937;
    background-color: #f3c78e;
    border-color: #f3c78e; }

.btn-danger {
  color: #ffffff;
  background-color: #E11D48;
  border-color: #E11D48;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-danger:hover {
    color: #ffffff;
    background-color: #bf193d;
    border-color: #b4173a; }
  .btn-check:focus + .btn-danger, .btn-danger:focus {
    color: #ffffff;
    background-color: #bf193d;
    border-color: #b4173a;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(230, 63, 99, 0.5); }
  .btn-check:checked + .btn-danger,
  .btn-check:active + .btn-danger, .btn-danger:active, .btn-danger.active,
  .show > .btn-danger.dropdown-toggle {
    color: #ffffff;
    background-color: #b4173a;
    border-color: #a91636; }
    .btn-check:checked + .btn-danger:focus,
    .btn-check:active + .btn-danger:focus, .btn-danger:active:focus, .btn-danger.active:focus,
    .show > .btn-danger.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(230, 63, 99, 0.5); }
  .btn-danger:disabled, .btn-danger.disabled {
    color: #ffffff;
    background-color: #E11D48;
    border-color: #E11D48; }

.btn-white {
  color: #1F2937;
  background-color: #ffffff;
  border-color: #ffffff;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-white:hover {
    color: #1F2937;
    background-color: white;
    border-color: white; }
  .btn-check:focus + .btn-white, .btn-white:focus {
    color: #1F2937;
    background-color: white;
    border-color: white;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(221, 223, 225, 0.5); }
  .btn-check:checked + .btn-white,
  .btn-check:active + .btn-white, .btn-white:active, .btn-white.active,
  .show > .btn-white.dropdown-toggle {
    color: #1F2937;
    background-color: white;
    border-color: white; }
    .btn-check:checked + .btn-white:focus,
    .btn-check:active + .btn-white:focus, .btn-white:active:focus, .btn-white.active:focus,
    .show > .btn-white.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(221, 223, 225, 0.5); }
  .btn-white:disabled, .btn-white.disabled {
    color: #1F2937;
    background-color: #ffffff;
    border-color: #ffffff; }

.btn-indigo {
  color: #ffffff;
  background-color: #4F46E5;
  border-color: #4F46E5;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-indigo:hover {
    color: #ffffff;
    background-color: #433cc3;
    border-color: #3f38b7; }
  .btn-check:focus + .btn-indigo, .btn-indigo:focus {
    color: #ffffff;
    background-color: #433cc3;
    border-color: #3f38b7;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(105, 98, 233, 0.5); }
  .btn-check:checked + .btn-indigo,
  .btn-check:active + .btn-indigo, .btn-indigo:active, .btn-indigo.active,
  .show > .btn-indigo.dropdown-toggle {
    color: #ffffff;
    background-color: #3f38b7;
    border-color: #3b35ac; }
    .btn-check:checked + .btn-indigo:focus,
    .btn-check:active + .btn-indigo:focus, .btn-indigo:active:focus, .btn-indigo.active:focus,
    .show > .btn-indigo.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(105, 98, 233, 0.5); }
  .btn-indigo:disabled, .btn-indigo.disabled {
    color: #ffffff;
    background-color: #4F46E5;
    border-color: #4F46E5; }

.btn-purple {
  color: #ffffff;
  background-color: #7C3AED;
  border-color: #7C3AED;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-purple:hover {
    color: #ffffff;
    background-color: #6931c9;
    border-color: #632ebe; }
  .btn-check:focus + .btn-purple, .btn-purple:focus {
    color: #ffffff;
    background-color: #6931c9;
    border-color: #632ebe;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(144, 88, 240, 0.5); }
  .btn-check:checked + .btn-purple,
  .btn-check:active + .btn-purple, .btn-purple:active, .btn-purple.active,
  .show > .btn-purple.dropdown-toggle {
    color: #ffffff;
    background-color: #632ebe;
    border-color: #5d2cb2; }
    .btn-check:checked + .btn-purple:focus,
    .btn-check:active + .btn-purple:focus, .btn-purple:active:focus, .btn-purple.active:focus,
    .show > .btn-purple.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(144, 88, 240, 0.5); }
  .btn-purple:disabled, .btn-purple.disabled {
    color: #ffffff;
    background-color: #7C3AED;
    border-color: #7C3AED; }

.btn-yellow-100 {
  color: #1F2937;
  background-color: #ffeed6;
  border-color: #ffeed6;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-yellow-100:hover {
    color: #1F2937;
    background-color: #fff1dc;
    border-color: #fff0da; }
  .btn-check:focus + .btn-yellow-100, .btn-yellow-100:focus {
    color: #1F2937;
    background-color: #fff1dc;
    border-color: #fff0da;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(221, 208, 190, 0.5); }
  .btn-check:checked + .btn-yellow-100,
  .btn-check:active + .btn-yellow-100, .btn-yellow-100:active, .btn-yellow-100.active,
  .show > .btn-yellow-100.dropdown-toggle {
    color: #1F2937;
    background-color: #fff1de;
    border-color: #fff0da; }
    .btn-check:checked + .btn-yellow-100:focus,
    .btn-check:active + .btn-yellow-100:focus, .btn-yellow-100:active:focus, .btn-yellow-100.active:focus,
    .show > .btn-yellow-100.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(221, 208, 190, 0.5); }
  .btn-yellow-100:disabled, .btn-yellow-100.disabled {
    color: #1F2937;
    background-color: #ffeed6;
    border-color: #ffeed6; }

.btn-yellow-200 {
  color: #1F2937;
  background-color: #f5dbb8;
  border-color: #f5dbb8;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-yellow-200:hover {
    color: #1F2937;
    background-color: #f7e0c3;
    border-color: #f6dfbf; }
  .btn-check:focus + .btn-yellow-200, .btn-yellow-200:focus {
    color: #1F2937;
    background-color: #f7e0c3;
    border-color: #f6dfbf;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(213, 192, 165, 0.5); }
  .btn-check:checked + .btn-yellow-200,
  .btn-check:active + .btn-yellow-200, .btn-yellow-200:active, .btn-yellow-200.active,
  .show > .btn-yellow-200.dropdown-toggle {
    color: #1F2937;
    background-color: #f7e2c6;
    border-color: #f6dfbf; }
    .btn-check:checked + .btn-yellow-200:focus,
    .btn-check:active + .btn-yellow-200:focus, .btn-yellow-200:active:focus, .btn-yellow-200.active:focus,
    .show > .btn-yellow-200.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(213, 192, 165, 0.5); }
  .btn-yellow-200:disabled, .btn-yellow-200.disabled {
    color: #1F2937;
    background-color: #f5dbb8;
    border-color: #f5dbb8; }

.btn-gray-50 {
  color: #1F2937;
  background-color: #F9FAFB;
  border-color: #F9FAFB;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-gray-50:hover {
    color: #1F2937;
    background-color: #fafbfc;
    border-color: #fafbfb; }
  .btn-check:focus + .btn-gray-50, .btn-gray-50:focus {
    color: #1F2937;
    background-color: #fafbfc;
    border-color: #fafbfb;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(216, 219, 222, 0.5); }
  .btn-check:checked + .btn-gray-50,
  .btn-check:active + .btn-gray-50, .btn-gray-50:active, .btn-gray-50.active,
  .show > .btn-gray-50.dropdown-toggle {
    color: #1F2937;
    background-color: #fafbfc;
    border-color: #fafbfb; }
    .btn-check:checked + .btn-gray-50:focus,
    .btn-check:active + .btn-gray-50:focus, .btn-gray-50:active:focus, .btn-gray-50.active:focus,
    .show > .btn-gray-50.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(216, 219, 222, 0.5); }
  .btn-gray-50:disabled, .btn-gray-50.disabled {
    color: #1F2937;
    background-color: #F9FAFB;
    border-color: #F9FAFB; }

.btn-gray-100 {
  color: #1F2937;
  background-color: #F2F4F6;
  border-color: #F2F4F6;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-gray-100:hover {
    color: #1F2937;
    background-color: #f4f6f7;
    border-color: #f3f5f7; }
  .btn-check:focus + .btn-gray-100, .btn-gray-100:focus {
    color: #1F2937;
    background-color: #f4f6f7;
    border-color: #f3f5f7;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(210, 214, 217, 0.5); }
  .btn-check:checked + .btn-gray-100,
  .btn-check:active + .btn-gray-100, .btn-gray-100:active, .btn-gray-100.active,
  .show > .btn-gray-100.dropdown-toggle {
    color: #1F2937;
    background-color: #f5f6f8;
    border-color: #f3f5f7; }
    .btn-check:checked + .btn-gray-100:focus,
    .btn-check:active + .btn-gray-100:focus, .btn-gray-100:active:focus, .btn-gray-100.active:focus,
    .show > .btn-gray-100.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(210, 214, 217, 0.5); }
  .btn-gray-100:disabled, .btn-gray-100.disabled {
    color: #1F2937;
    background-color: #F2F4F6;
    border-color: #F2F4F6; }

.btn-gray-200 {
  color: #1F2937;
  background-color: #E5E7EB;
  border-color: #E5E7EB;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-gray-200:hover {
    color: #1F2937;
    background-color: #e9ebee;
    border-color: #e8e9ed; }
  .btn-check:focus + .btn-gray-200, .btn-gray-200:focus {
    color: #1F2937;
    background-color: #e9ebee;
    border-color: #e8e9ed;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(199, 203, 208, 0.5); }
  .btn-check:checked + .btn-gray-200,
  .btn-check:active + .btn-gray-200, .btn-gray-200:active, .btn-gray-200.active,
  .show > .btn-gray-200.dropdown-toggle {
    color: #1F2937;
    background-color: #eaecef;
    border-color: #e8e9ed; }
    .btn-check:checked + .btn-gray-200:focus,
    .btn-check:active + .btn-gray-200:focus, .btn-gray-200:active:focus, .btn-gray-200.active:focus,
    .show > .btn-gray-200.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(199, 203, 208, 0.5); }
  .btn-gray-200:disabled, .btn-gray-200.disabled {
    color: #1F2937;
    background-color: #E5E7EB;
    border-color: #E5E7EB; }

.btn-gray-300 {
  color: #1F2937;
  background-color: #D1D5DB;
  border-color: #D1D5DB;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-gray-300:hover {
    color: #1F2937;
    background-color: #d8dbe0;
    border-color: #d6d9df; }
  .btn-check:focus + .btn-gray-300, .btn-gray-300:focus {
    color: #1F2937;
    background-color: #d8dbe0;
    border-color: #d6d9df;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(182, 187, 194, 0.5); }
  .btn-check:checked + .btn-gray-300,
  .btn-check:active + .btn-gray-300, .btn-gray-300:active, .btn-gray-300.active,
  .show > .btn-gray-300.dropdown-toggle {
    color: #1F2937;
    background-color: #dadde2;
    border-color: #d6d9df; }
    .btn-check:checked + .btn-gray-300:focus,
    .btn-check:active + .btn-gray-300:focus, .btn-gray-300:active:focus, .btn-gray-300.active:focus,
    .show > .btn-gray-300.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(182, 187, 194, 0.5); }
  .btn-gray-300:disabled, .btn-gray-300.disabled {
    color: #1F2937;
    background-color: #D1D5DB;
    border-color: #D1D5DB; }

.btn-gray-400 {
  color: #1F2937;
  background-color: #9CA3AF;
  border-color: #9CA3AF;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-gray-400:hover {
    color: #1F2937;
    background-color: #abb1bb;
    border-color: #a6acb7; }
  .btn-check:focus + .btn-gray-400, .btn-gray-400:focus {
    color: #1F2937;
    background-color: #abb1bb;
    border-color: #a6acb7;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(137, 145, 157, 0.5); }
  .btn-check:checked + .btn-gray-400,
  .btn-check:active + .btn-gray-400, .btn-gray-400:active, .btn-gray-400.active,
  .show > .btn-gray-400.dropdown-toggle {
    color: #1F2937;
    background-color: #b0b5bf;
    border-color: #a6acb7; }
    .btn-check:checked + .btn-gray-400:focus,
    .btn-check:active + .btn-gray-400:focus, .btn-gray-400:active:focus, .btn-gray-400.active:focus,
    .show > .btn-gray-400.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(137, 145, 157, 0.5); }
  .btn-gray-400:disabled, .btn-gray-400.disabled {
    color: #1F2937;
    background-color: #9CA3AF;
    border-color: #9CA3AF; }

.btn-gray-500 {
  color: #ffffff;
  background-color: #6B7280;
  border-color: #6B7280;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-gray-500:hover {
    color: #ffffff;
    background-color: #5b616d;
    border-color: #565b66; }
  .btn-check:focus + .btn-gray-500, .btn-gray-500:focus {
    color: #ffffff;
    background-color: #5b616d;
    border-color: #565b66;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(129, 135, 147, 0.5); }
  .btn-check:checked + .btn-gray-500,
  .btn-check:active + .btn-gray-500, .btn-gray-500:active, .btn-gray-500.active,
  .show > .btn-gray-500.dropdown-toggle {
    color: #ffffff;
    background-color: #565b66;
    border-color: #505660; }
    .btn-check:checked + .btn-gray-500:focus,
    .btn-check:active + .btn-gray-500:focus, .btn-gray-500:active:focus, .btn-gray-500.active:focus,
    .show > .btn-gray-500.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(129, 135, 147, 0.5); }
  .btn-gray-500:disabled, .btn-gray-500.disabled {
    color: #ffffff;
    background-color: #6B7280;
    border-color: #6B7280; }

.btn-gray-600 {
  color: #ffffff;
  background-color: #4B5563;
  border-color: #4B5563;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-gray-600:hover {
    color: #ffffff;
    background-color: #404854;
    border-color: #3c444f; }
  .btn-check:focus + .btn-gray-600, .btn-gray-600:focus {
    color: #ffffff;
    background-color: #404854;
    border-color: #3c444f;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(102, 111, 122, 0.5); }
  .btn-check:checked + .btn-gray-600,
  .btn-check:active + .btn-gray-600, .btn-gray-600:active, .btn-gray-600.active,
  .show > .btn-gray-600.dropdown-toggle {
    color: #ffffff;
    background-color: #3c444f;
    border-color: #38404a; }
    .btn-check:checked + .btn-gray-600:focus,
    .btn-check:active + .btn-gray-600:focus, .btn-gray-600:active:focus, .btn-gray-600.active:focus,
    .show > .btn-gray-600.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(102, 111, 122, 0.5); }
  .btn-gray-600:disabled, .btn-gray-600.disabled {
    color: #ffffff;
    background-color: #4B5563;
    border-color: #4B5563; }

.btn-gray-700 {
  color: #ffffff;
  background-color: #374151;
  border-color: #374151;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-gray-700:hover {
    color: #ffffff;
    background-color: #2f3745;
    border-color: #2c3441; }
  .btn-check:focus + .btn-gray-700, .btn-gray-700:focus {
    color: #ffffff;
    background-color: #2f3745;
    border-color: #2c3441;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(85, 94, 107, 0.5); }
  .btn-check:checked + .btn-gray-700,
  .btn-check:active + .btn-gray-700, .btn-gray-700:active, .btn-gray-700.active,
  .show > .btn-gray-700.dropdown-toggle {
    color: #ffffff;
    background-color: #2c3441;
    border-color: #29313d; }
    .btn-check:checked + .btn-gray-700:focus,
    .btn-check:active + .btn-gray-700:focus, .btn-gray-700:active:focus, .btn-gray-700.active:focus,
    .show > .btn-gray-700.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(85, 94, 107, 0.5); }
  .btn-gray-700:disabled, .btn-gray-700.disabled {
    color: #ffffff;
    background-color: #374151;
    border-color: #374151; }

.btn-gray-800 {
  color: #ffffff;
  background-color: #1F2937;
  border-color: #1F2937;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-gray-800:hover {
    color: #ffffff;
    background-color: #1a232f;
    border-color: #19212c; }
  .btn-check:focus + .btn-gray-800, .btn-gray-800:focus {
    color: #ffffff;
    background-color: #1a232f;
    border-color: #19212c;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(65, 73, 85, 0.5); }
  .btn-check:checked + .btn-gray-800,
  .btn-check:active + .btn-gray-800, .btn-gray-800:active, .btn-gray-800.active,
  .show > .btn-gray-800.dropdown-toggle {
    color: #ffffff;
    background-color: #19212c;
    border-color: #171f29; }
    .btn-check:checked + .btn-gray-800:focus,
    .btn-check:active + .btn-gray-800:focus, .btn-gray-800:active:focus, .btn-gray-800.active:focus,
    .show > .btn-gray-800.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(65, 73, 85, 0.5); }
  .btn-gray-800:disabled, .btn-gray-800.disabled {
    color: #ffffff;
    background-color: #1F2937;
    border-color: #1F2937; }

.btn-gray-900 {
  color: #ffffff;
  background-color: #111827;
  border-color: #111827;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075); }
  .btn-gray-900:hover {
    color: #ffffff;
    background-color: #0e1421;
    border-color: #0e131f; }
  .btn-check:focus + .btn-gray-900, .btn-gray-900:focus {
    color: #ffffff;
    background-color: #0e1421;
    border-color: #0e131f;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(17, 24, 39, 0.075), 0 0 0 0.18rem rgba(53, 59, 71, 0.5); }
  .btn-check:checked + .btn-gray-900,
  .btn-check:active + .btn-gray-900, .btn-gray-900:active, .btn-gray-900.active,
  .show > .btn-gray-900.dropdown-toggle {
    color: #ffffff;
    background-color: #0e131f;
    border-color: #0d121d; }
    .btn-check:checked + .btn-gray-900:focus,
    .btn-check:active + .btn-gray-900:focus, .btn-gray-900:active:focus, .btn-gray-900.active:focus,
    .show > .btn-gray-900.dropdown-toggle:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(53, 59, 71, 0.5); }
  .btn-gray-900:disabled, .btn-gray-900.disabled {
    color: #ffffff;
    background-color: #111827;
    border-color: #111827; }

.btn-outline-primary {
  color: #1F2937;
  border-color: #1F2937; }
  .btn-outline-primary:hover {
    color: #ffffff;
    background-color: #1F2937;
    border-color: #1F2937; }
  .btn-check:focus + .btn-outline-primary, .btn-outline-primary:focus {
    box-shadow: 0 0 0 0.18rem rgba(31, 41, 55, 0.5); }
  .btn-check:checked + .btn-outline-primary,
  .btn-check:active + .btn-outline-primary, .btn-outline-primary:active, .btn-outline-primary.active, .btn-outline-primary.dropdown-toggle.show {
    color: #ffffff;
    background-color: #1F2937;
    border-color: #1F2937; }
    .btn-check:checked + .btn-outline-primary:focus,
    .btn-check:active + .btn-outline-primary:focus, .btn-outline-primary:active:focus, .btn-outline-primary.active:focus, .btn-outline-primary.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(31, 41, 55, 0.5); }
  .btn-outline-primary:disabled, .btn-outline-primary.disabled {
    color: #1F2937;
    background-color: transparent; }

.btn-outline-secondary {
  color: #f0bc74;
  border-color: #f0bc74; }
  .btn-outline-secondary:hover {
    color: #1F2937;
    background-color: #f0bc74;
    border-color: #f0bc74; }
  .btn-check:focus + .btn-outline-secondary, .btn-outline-secondary:focus {
    box-shadow: 0 0 0 0.18rem rgba(240, 188, 116, 0.5); }
  .btn-check:checked + .btn-outline-secondary,
  .btn-check:active + .btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show {
    color: #1F2937;
    background-color: #f0bc74;
    border-color: #f0bc74; }
    .btn-check:checked + .btn-outline-secondary:focus,
    .btn-check:active + .btn-outline-secondary:focus, .btn-outline-secondary:active:focus, .btn-outline-secondary.active:focus, .btn-outline-secondary.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(240, 188, 116, 0.5); }
  .btn-outline-secondary:disabled, .btn-outline-secondary.disabled {
    color: #f0bc74;
    background-color: transparent; }

.btn-outline-tertiary {
  color: #31316A;
  border-color: #31316A; }
  .btn-outline-tertiary:hover {
    color: #ffffff;
    background-color: #31316A;
    border-color: #31316A; }
  .btn-check:focus + .btn-outline-tertiary, .btn-outline-tertiary:focus {
    box-shadow: 0 0 0 0.18rem rgba(49, 49, 106, 0.5); }
  .btn-check:checked + .btn-outline-tertiary,
  .btn-check:active + .btn-outline-tertiary, .btn-outline-tertiary:active, .btn-outline-tertiary.active, .btn-outline-tertiary.dropdown-toggle.show {
    color: #ffffff;
    background-color: #31316A;
    border-color: #31316A; }
    .btn-check:checked + .btn-outline-tertiary:focus,
    .btn-check:active + .btn-outline-tertiary:focus, .btn-outline-tertiary:active:focus, .btn-outline-tertiary.active:focus, .btn-outline-tertiary.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(49, 49, 106, 0.5); }
  .btn-outline-tertiary:disabled, .btn-outline-tertiary.disabled {
    color: #31316A;
    background-color: transparent; }

.btn-outline-success {
  color: #10B981;
  border-color: #10B981; }
  .btn-outline-success:hover {
    color: #1F2937;
    background-color: #10B981;
    border-color: #10B981; }
  .btn-check:focus + .btn-outline-success, .btn-outline-success:focus {
    box-shadow: 0 0 0 0.18rem rgba(16, 185, 129, 0.5); }
  .btn-check:checked + .btn-outline-success,
  .btn-check:active + .btn-outline-success, .btn-outline-success:active, .btn-outline-success.active, .btn-outline-success.dropdown-toggle.show {
    color: #1F2937;
    background-color: #10B981;
    border-color: #10B981; }
    .btn-check:checked + .btn-outline-success:focus,
    .btn-check:active + .btn-outline-success:focus, .btn-outline-success:active:focus, .btn-outline-success.active:focus, .btn-outline-success.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(16, 185, 129, 0.5); }
  .btn-outline-success:disabled, .btn-outline-success.disabled {
    color: #10B981;
    background-color: transparent; }

.btn-outline-info {
  color: #2361ce;
  border-color: #2361ce; }
  .btn-outline-info:hover {
    color: #ffffff;
    background-color: #2361ce;
    border-color: #2361ce; }
  .btn-check:focus + .btn-outline-info, .btn-outline-info:focus {
    box-shadow: 0 0 0 0.18rem rgba(35, 97, 206, 0.5); }
  .btn-check:checked + .btn-outline-info,
  .btn-check:active + .btn-outline-info, .btn-outline-info:active, .btn-outline-info.active, .btn-outline-info.dropdown-toggle.show {
    color: #ffffff;
    background-color: #2361ce;
    border-color: #2361ce; }
    .btn-check:checked + .btn-outline-info:focus,
    .btn-check:active + .btn-outline-info:focus, .btn-outline-info:active:focus, .btn-outline-info.active:focus, .btn-outline-info.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(35, 97, 206, 0.5); }
  .btn-outline-info:disabled, .btn-outline-info.disabled {
    color: #2361ce;
    background-color: transparent; }

.btn-outline-warning {
  color: #f3c78e;
  border-color: #f3c78e; }
  .btn-outline-warning:hover {
    color: #1F2937;
    background-color: #f3c78e;
    border-color: #f3c78e; }
  .btn-check:focus + .btn-outline-warning, .btn-outline-warning:focus {
    box-shadow: 0 0 0 0.18rem rgba(243, 199, 142, 0.5); }
  .btn-check:checked + .btn-outline-warning,
  .btn-check:active + .btn-outline-warning, .btn-outline-warning:active, .btn-outline-warning.active, .btn-outline-warning.dropdown-toggle.show {
    color: #1F2937;
    background-color: #f3c78e;
    border-color: #f3c78e; }
    .btn-check:checked + .btn-outline-warning:focus,
    .btn-check:active + .btn-outline-warning:focus, .btn-outline-warning:active:focus, .btn-outline-warning.active:focus, .btn-outline-warning.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(243, 199, 142, 0.5); }
  .btn-outline-warning:disabled, .btn-outline-warning.disabled {
    color: #f3c78e;
    background-color: transparent; }

.btn-outline-danger {
  color: #E11D48;
  border-color: #E11D48; }
  .btn-outline-danger:hover {
    color: #ffffff;
    background-color: #E11D48;
    border-color: #E11D48; }
  .btn-check:focus + .btn-outline-danger, .btn-outline-danger:focus {
    box-shadow: 0 0 0 0.18rem rgba(225, 29, 72, 0.5); }
  .btn-check:checked + .btn-outline-danger,
  .btn-check:active + .btn-outline-danger, .btn-outline-danger:active, .btn-outline-danger.active, .btn-outline-danger.dropdown-toggle.show {
    color: #ffffff;
    background-color: #E11D48;
    border-color: #E11D48; }
    .btn-check:checked + .btn-outline-danger:focus,
    .btn-check:active + .btn-outline-danger:focus, .btn-outline-danger:active:focus, .btn-outline-danger.active:focus, .btn-outline-danger.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(225, 29, 72, 0.5); }
  .btn-outline-danger:disabled, .btn-outline-danger.disabled {
    color: #E11D48;
    background-color: transparent; }

.btn-outline-white {
  color: #ffffff;
  border-color: #ffffff; }
  .btn-outline-white:hover {
    color: #1F2937;
    background-color: #ffffff;
    border-color: #ffffff; }
  .btn-check:focus + .btn-outline-white, .btn-outline-white:focus {
    box-shadow: 0 0 0 0.18rem rgba(255, 255, 255, 0.5); }
  .btn-check:checked + .btn-outline-white,
  .btn-check:active + .btn-outline-white, .btn-outline-white:active, .btn-outline-white.active, .btn-outline-white.dropdown-toggle.show {
    color: #1F2937;
    background-color: #ffffff;
    border-color: #ffffff; }
    .btn-check:checked + .btn-outline-white:focus,
    .btn-check:active + .btn-outline-white:focus, .btn-outline-white:active:focus, .btn-outline-white.active:focus, .btn-outline-white.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(255, 255, 255, 0.5); }
  .btn-outline-white:disabled, .btn-outline-white.disabled {
    color: #ffffff;
    background-color: transparent; }

.btn-outline-indigo {
  color: #4F46E5;
  border-color: #4F46E5; }
  .btn-outline-indigo:hover {
    color: #ffffff;
    background-color: #4F46E5;
    border-color: #4F46E5; }
  .btn-check:focus + .btn-outline-indigo, .btn-outline-indigo:focus {
    box-shadow: 0 0 0 0.18rem rgba(79, 70, 229, 0.5); }
  .btn-check:checked + .btn-outline-indigo,
  .btn-check:active + .btn-outline-indigo, .btn-outline-indigo:active, .btn-outline-indigo.active, .btn-outline-indigo.dropdown-toggle.show {
    color: #ffffff;
    background-color: #4F46E5;
    border-color: #4F46E5; }
    .btn-check:checked + .btn-outline-indigo:focus,
    .btn-check:active + .btn-outline-indigo:focus, .btn-outline-indigo:active:focus, .btn-outline-indigo.active:focus, .btn-outline-indigo.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(79, 70, 229, 0.5); }
  .btn-outline-indigo:disabled, .btn-outline-indigo.disabled {
    color: #4F46E5;
    background-color: transparent; }

.btn-outline-purple {
  color: #7C3AED;
  border-color: #7C3AED; }
  .btn-outline-purple:hover {
    color: #ffffff;
    background-color: #7C3AED;
    border-color: #7C3AED; }
  .btn-check:focus + .btn-outline-purple, .btn-outline-purple:focus {
    box-shadow: 0 0 0 0.18rem rgba(124, 58, 237, 0.5); }
  .btn-check:checked + .btn-outline-purple,
  .btn-check:active + .btn-outline-purple, .btn-outline-purple:active, .btn-outline-purple.active, .btn-outline-purple.dropdown-toggle.show {
    color: #ffffff;
    background-color: #7C3AED;
    border-color: #7C3AED; }
    .btn-check:checked + .btn-outline-purple:focus,
    .btn-check:active + .btn-outline-purple:focus, .btn-outline-purple:active:focus, .btn-outline-purple.active:focus, .btn-outline-purple.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(124, 58, 237, 0.5); }
  .btn-outline-purple:disabled, .btn-outline-purple.disabled {
    color: #7C3AED;
    background-color: transparent; }

.btn-outline-yellow-100 {
  color: #ffeed6;
  border-color: #ffeed6; }
  .btn-outline-yellow-100:hover {
    color: #1F2937;
    background-color: #ffeed6;
    border-color: #ffeed6; }
  .btn-check:focus + .btn-outline-yellow-100, .btn-outline-yellow-100:focus {
    box-shadow: 0 0 0 0.18rem rgba(255, 238, 214, 0.5); }
  .btn-check:checked + .btn-outline-yellow-100,
  .btn-check:active + .btn-outline-yellow-100, .btn-outline-yellow-100:active, .btn-outline-yellow-100.active, .btn-outline-yellow-100.dropdown-toggle.show {
    color: #1F2937;
    background-color: #ffeed6;
    border-color: #ffeed6; }
    .btn-check:checked + .btn-outline-yellow-100:focus,
    .btn-check:active + .btn-outline-yellow-100:focus, .btn-outline-yellow-100:active:focus, .btn-outline-yellow-100.active:focus, .btn-outline-yellow-100.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(255, 238, 214, 0.5); }
  .btn-outline-yellow-100:disabled, .btn-outline-yellow-100.disabled {
    color: #ffeed6;
    background-color: transparent; }

.btn-outline-yellow-200 {
  color: #f5dbb8;
  border-color: #f5dbb8; }
  .btn-outline-yellow-200:hover {
    color: #1F2937;
    background-color: #f5dbb8;
    border-color: #f5dbb8; }
  .btn-check:focus + .btn-outline-yellow-200, .btn-outline-yellow-200:focus {
    box-shadow: 0 0 0 0.18rem rgba(245, 219, 184, 0.5); }
  .btn-check:checked + .btn-outline-yellow-200,
  .btn-check:active + .btn-outline-yellow-200, .btn-outline-yellow-200:active, .btn-outline-yellow-200.active, .btn-outline-yellow-200.dropdown-toggle.show {
    color: #1F2937;
    background-color: #f5dbb8;
    border-color: #f5dbb8; }
    .btn-check:checked + .btn-outline-yellow-200:focus,
    .btn-check:active + .btn-outline-yellow-200:focus, .btn-outline-yellow-200:active:focus, .btn-outline-yellow-200.active:focus, .btn-outline-yellow-200.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(245, 219, 184, 0.5); }
  .btn-outline-yellow-200:disabled, .btn-outline-yellow-200.disabled {
    color: #f5dbb8;
    background-color: transparent; }

.btn-outline-gray-50 {
  color: #F9FAFB;
  border-color: #F9FAFB; }
  .btn-outline-gray-50:hover {
    color: #1F2937;
    background-color: #F9FAFB;
    border-color: #F9FAFB; }
  .btn-check:focus + .btn-outline-gray-50, .btn-outline-gray-50:focus {
    box-shadow: 0 0 0 0.18rem rgba(249, 250, 251, 0.5); }
  .btn-check:checked + .btn-outline-gray-50,
  .btn-check:active + .btn-outline-gray-50, .btn-outline-gray-50:active, .btn-outline-gray-50.active, .btn-outline-gray-50.dropdown-toggle.show {
    color: #1F2937;
    background-color: #F9FAFB;
    border-color: #F9FAFB; }
    .btn-check:checked + .btn-outline-gray-50:focus,
    .btn-check:active + .btn-outline-gray-50:focus, .btn-outline-gray-50:active:focus, .btn-outline-gray-50.active:focus, .btn-outline-gray-50.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(249, 250, 251, 0.5); }
  .btn-outline-gray-50:disabled, .btn-outline-gray-50.disabled {
    color: #F9FAFB;
    background-color: transparent; }

.btn-outline-gray-100 {
  color: #F2F4F6;
  border-color: #F2F4F6; }
  .btn-outline-gray-100:hover {
    color: #1F2937;
    background-color: #F2F4F6;
    border-color: #F2F4F6; }
  .btn-check:focus + .btn-outline-gray-100, .btn-outline-gray-100:focus {
    box-shadow: 0 0 0 0.18rem rgba(242, 244, 246, 0.5); }
  .btn-check:checked + .btn-outline-gray-100,
  .btn-check:active + .btn-outline-gray-100, .btn-outline-gray-100:active, .btn-outline-gray-100.active, .btn-outline-gray-100.dropdown-toggle.show {
    color: #1F2937;
    background-color: #F2F4F6;
    border-color: #F2F4F6; }
    .btn-check:checked + .btn-outline-gray-100:focus,
    .btn-check:active + .btn-outline-gray-100:focus, .btn-outline-gray-100:active:focus, .btn-outline-gray-100.active:focus, .btn-outline-gray-100.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(242, 244, 246, 0.5); }
  .btn-outline-gray-100:disabled, .btn-outline-gray-100.disabled {
    color: #F2F4F6;
    background-color: transparent; }

.btn-outline-gray-200 {
  color: #E5E7EB;
  border-color: #E5E7EB; }
  .btn-outline-gray-200:hover {
    color: #1F2937;
    background-color: #E5E7EB;
    border-color: #E5E7EB; }
  .btn-check:focus + .btn-outline-gray-200, .btn-outline-gray-200:focus {
    box-shadow: 0 0 0 0.18rem rgba(229, 231, 235, 0.5); }
  .btn-check:checked + .btn-outline-gray-200,
  .btn-check:active + .btn-outline-gray-200, .btn-outline-gray-200:active, .btn-outline-gray-200.active, .btn-outline-gray-200.dropdown-toggle.show {
    color: #1F2937;
    background-color: #E5E7EB;
    border-color: #E5E7EB; }
    .btn-check:checked + .btn-outline-gray-200:focus,
    .btn-check:active + .btn-outline-gray-200:focus, .btn-outline-gray-200:active:focus, .btn-outline-gray-200.active:focus, .btn-outline-gray-200.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(229, 231, 235, 0.5); }
  .btn-outline-gray-200:disabled, .btn-outline-gray-200.disabled {
    color: #E5E7EB;
    background-color: transparent; }

.btn-outline-gray-300 {
  color: #D1D5DB;
  border-color: #D1D5DB; }
  .btn-outline-gray-300:hover {
    color: #1F2937;
    background-color: #D1D5DB;
    border-color: #D1D5DB; }
  .btn-check:focus + .btn-outline-gray-300, .btn-outline-gray-300:focus {
    box-shadow: 0 0 0 0.18rem rgba(209, 213, 219, 0.5); }
  .btn-check:checked + .btn-outline-gray-300,
  .btn-check:active + .btn-outline-gray-300, .btn-outline-gray-300:active, .btn-outline-gray-300.active, .btn-outline-gray-300.dropdown-toggle.show {
    color: #1F2937;
    background-color: #D1D5DB;
    border-color: #D1D5DB; }
    .btn-check:checked + .btn-outline-gray-300:focus,
    .btn-check:active + .btn-outline-gray-300:focus, .btn-outline-gray-300:active:focus, .btn-outline-gray-300.active:focus, .btn-outline-gray-300.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(209, 213, 219, 0.5); }
  .btn-outline-gray-300:disabled, .btn-outline-gray-300.disabled {
    color: #D1D5DB;
    background-color: transparent; }

.btn-outline-gray-400 {
  color: #9CA3AF;
  border-color: #9CA3AF; }
  .btn-outline-gray-400:hover {
    color: #1F2937;
    background-color: #9CA3AF;
    border-color: #9CA3AF; }
  .btn-check:focus + .btn-outline-gray-400, .btn-outline-gray-400:focus {
    box-shadow: 0 0 0 0.18rem rgba(156, 163, 175, 0.5); }
  .btn-check:checked + .btn-outline-gray-400,
  .btn-check:active + .btn-outline-gray-400, .btn-outline-gray-400:active, .btn-outline-gray-400.active, .btn-outline-gray-400.dropdown-toggle.show {
    color: #1F2937;
    background-color: #9CA3AF;
    border-color: #9CA3AF; }
    .btn-check:checked + .btn-outline-gray-400:focus,
    .btn-check:active + .btn-outline-gray-400:focus, .btn-outline-gray-400:active:focus, .btn-outline-gray-400.active:focus, .btn-outline-gray-400.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(156, 163, 175, 0.5); }
  .btn-outline-gray-400:disabled, .btn-outline-gray-400.disabled {
    color: #9CA3AF;
    background-color: transparent; }

.btn-outline-gray-500 {
  color: #6B7280;
  border-color: #6B7280; }
  .btn-outline-gray-500:hover {
    color: #ffffff;
    background-color: #6B7280;
    border-color: #6B7280; }
  .btn-check:focus + .btn-outline-gray-500, .btn-outline-gray-500:focus {
    box-shadow: 0 0 0 0.18rem rgba(107, 114, 128, 0.5); }
  .btn-check:checked + .btn-outline-gray-500,
  .btn-check:active + .btn-outline-gray-500, .btn-outline-gray-500:active, .btn-outline-gray-500.active, .btn-outline-gray-500.dropdown-toggle.show {
    color: #ffffff;
    background-color: #6B7280;
    border-color: #6B7280; }
    .btn-check:checked + .btn-outline-gray-500:focus,
    .btn-check:active + .btn-outline-gray-500:focus, .btn-outline-gray-500:active:focus, .btn-outline-gray-500.active:focus, .btn-outline-gray-500.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(107, 114, 128, 0.5); }
  .btn-outline-gray-500:disabled, .btn-outline-gray-500.disabled {
    color: #6B7280;
    background-color: transparent; }

.btn-outline-gray-600 {
  color: #4B5563;
  border-color: #4B5563; }
  .btn-outline-gray-600:hover {
    color: #ffffff;
    background-color: #4B5563;
    border-color: #4B5563; }
  .btn-check:focus + .btn-outline-gray-600, .btn-outline-gray-600:focus {
    box-shadow: 0 0 0 0.18rem rgba(75, 85, 99, 0.5); }
  .btn-check:checked + .btn-outline-gray-600,
  .btn-check:active + .btn-outline-gray-600, .btn-outline-gray-600:active, .btn-outline-gray-600.active, .btn-outline-gray-600.dropdown-toggle.show {
    color: #ffffff;
    background-color: #4B5563;
    border-color: #4B5563; }
    .btn-check:checked + .btn-outline-gray-600:focus,
    .btn-check:active + .btn-outline-gray-600:focus, .btn-outline-gray-600:active:focus, .btn-outline-gray-600.active:focus, .btn-outline-gray-600.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(75, 85, 99, 0.5); }
  .btn-outline-gray-600:disabled, .btn-outline-gray-600.disabled {
    color: #4B5563;
    background-color: transparent; }

.btn-outline-gray-700 {
  color: #374151;
  border-color: #374151; }
  .btn-outline-gray-700:hover {
    color: #ffffff;
    background-color: #374151;
    border-color: #374151; }
  .btn-check:focus + .btn-outline-gray-700, .btn-outline-gray-700:focus {
    box-shadow: 0 0 0 0.18rem rgba(55, 65, 81, 0.5); }
  .btn-check:checked + .btn-outline-gray-700,
  .btn-check:active + .btn-outline-gray-700, .btn-outline-gray-700:active, .btn-outline-gray-700.active, .btn-outline-gray-700.dropdown-toggle.show {
    color: #ffffff;
    background-color: #374151;
    border-color: #374151; }
    .btn-check:checked + .btn-outline-gray-700:focus,
    .btn-check:active + .btn-outline-gray-700:focus, .btn-outline-gray-700:active:focus, .btn-outline-gray-700.active:focus, .btn-outline-gray-700.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(55, 65, 81, 0.5); }
  .btn-outline-gray-700:disabled, .btn-outline-gray-700.disabled {
    color: #374151;
    background-color: transparent; }

.btn-outline-gray-800 {
  color: #1F2937;
  border-color: #1F2937; }
  .btn-outline-gray-800:hover {
    color: #ffffff;
    background-color: #1F2937;
    border-color: #1F2937; }
  .btn-check:focus + .btn-outline-gray-800, .btn-outline-gray-800:focus {
    box-shadow: 0 0 0 0.18rem rgba(31, 41, 55, 0.5); }
  .btn-check:checked + .btn-outline-gray-800,
  .btn-check:active + .btn-outline-gray-800, .btn-outline-gray-800:active, .btn-outline-gray-800.active, .btn-outline-gray-800.dropdown-toggle.show {
    color: #ffffff;
    background-color: #1F2937;
    border-color: #1F2937; }
    .btn-check:checked + .btn-outline-gray-800:focus,
    .btn-check:active + .btn-outline-gray-800:focus, .btn-outline-gray-800:active:focus, .btn-outline-gray-800.active:focus, .btn-outline-gray-800.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(31, 41, 55, 0.5); }
  .btn-outline-gray-800:disabled, .btn-outline-gray-800.disabled {
    color: #1F2937;
    background-color: transparent; }

.btn-outline-gray-900 {
  color: #111827;
  border-color: #111827; }
  .btn-outline-gray-900:hover {
    color: #ffffff;
    background-color: #111827;
    border-color: #111827; }
  .btn-check:focus + .btn-outline-gray-900, .btn-outline-gray-900:focus {
    box-shadow: 0 0 0 0.18rem rgba(17, 24, 39, 0.5); }
  .btn-check:checked + .btn-outline-gray-900,
  .btn-check:active + .btn-outline-gray-900, .btn-outline-gray-900:active, .btn-outline-gray-900.active, .btn-outline-gray-900.dropdown-toggle.show {
    color: #ffffff;
    background-color: #111827;
    border-color: #111827; }
    .btn-check:checked + .btn-outline-gray-900:focus,
    .btn-check:active + .btn-outline-gray-900:focus, .btn-outline-gray-900:active:focus, .btn-outline-gray-900.active:focus, .btn-outline-gray-900.dropdown-toggle.show:focus {
      box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125), 0 0 0 0.18rem rgba(17, 24, 39, 0.5); }
  .btn-outline-gray-900:disabled, .btn-outline-gray-900.disabled {
    color: #111827;
    background-color: transparent; }

.btn-link {
  font-weight: 400;
  color: #1F2937;
  text-decoration: none; }
  .btn-link:hover {
    color: black;
    text-decoration: none; }
  .btn-link:focus {
    text-decoration: none; }
  .btn-link:disabled, .btn-link.disabled {
    color: #4B5563; }

.btn-lg, .btn-group-lg > .btn {
  padding: 0.5rem 1rem;
  font-size: 1.25rem;
  border-radius: 0.5rem; }

.btn-sm, .btn-group-sm > .btn {
  padding: 0.375rem 0.625rem;
  font-size: 0.875rem;
  border-radius: 0.5rem; }

.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 {
  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 {
  position: absolute;
  z-index: 1000;
  display: none;
  min-width: 12rem;
  padding: 0.5rem 0;
  margin: 0;
  font-size: 0.875rem;
  color: #374151;
  text-align: left;
  list-style: none;
  background-color: #ffffff;
  background-clip: padding-box;
  border: 0.0625rem solid #E5E7EB;
  border-radius: 0.35rem;
  box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); }
  .dropdown-menu[data-bs-popper] {
    top: 100%;
    left: 0;
    margin-top: 0.125rem; }

.dropdown-menu-start {
  --bs-position: start; }
  .dropdown-menu-start[data-bs-popper] {
    right: auto;
    left: 0; }

.dropdown-menu-end {
  --bs-position: end; }
  .dropdown-menu-end[data-bs-popper] {
    right: 0;
    left: auto; }

@media (min-width: 576px) {
  .dropdown-menu-sm-start {
    --bs-position: start; }
    .dropdown-menu-sm-start[data-bs-popper] {
      right: auto;
      left: 0; }
  .dropdown-menu-sm-end {
    --bs-position: end; }
    .dropdown-menu-sm-end[data-bs-popper] {
      right: 0;
      left: auto; } }

@media (min-width: 768px) {
  .dropdown-menu-md-start {
    --bs-position: start; }
    .dropdown-menu-md-start[data-bs-popper] {
      right: auto;
      left: 0; }
  .dropdown-menu-md-end {
    --bs-position: end; }
    .dropdown-menu-md-end[data-bs-popper] {
      right: 0;
      left: auto; } }

@media (min-width: 992px) {
  .dropdown-menu-lg-start {
    --bs-position: start; }
    .dropdown-menu-lg-start[data-bs-popper] {
      right: auto;
      left: 0; }
  .dropdown-menu-lg-end {
    --bs-position: end; }
    .dropdown-menu-lg-end[data-bs-popper] {
      right: 0;
      left: auto; } }

@media (min-width: 1200px) {
  .dropdown-menu-xl-start {
    --bs-position: start; }
    .dropdown-menu-xl-start[data-bs-popper] {
      right: auto;
      left: 0; }
  .dropdown-menu-xl-end {
    --bs-position: end; }
    .dropdown-menu-xl-end[data-bs-popper] {
      right: 0;
      left: auto; } }

@media (min-width: 1400px) {
  .dropdown-menu-xxl-start {
    --bs-position: start; }
    .dropdown-menu-xxl-start[data-bs-popper] {
      right: auto;
      left: 0; }
  .dropdown-menu-xxl-end {
    --bs-position: end; }
    .dropdown-menu-xxl-end[data-bs-popper] {
      right: 0;
      left: auto; } }

.dropup .dropdown-menu[data-bs-popper] {
  top: auto;
  bottom: 100%;
  margin-top: 0;
  margin-bottom: 0.125rem; }

.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: 0.125rem; }

.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: 0.125rem; }

.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: 0.5rem 0;
  overflow: hidden;
  border-top: 1px solid #E5E7EB; }

.dropdown-item {
  display: block;
  width: 100%;
  padding: 0.25rem 1rem;
  clear: both;
  font-weight: 400;
  color: #111827;
  text-align: inherit;
  white-space: nowrap;
  background-color: transparent;
  border: 0; }
  .dropdown-item:hover, .dropdown-item:focus {
    color: #090d15;
    background-color: #F2F4F6; }
  .dropdown-item.active, .dropdown-item:active {
    color: #111827;
    text-decoration: none;
    background-color: #E5E7EB; }
  .dropdown-item.disabled, .dropdown-item:disabled {
    color: #4B5563;
    pointer-events: none;
    background-color: transparent; }

.dropdown-menu.show {
  display: block; }

.dropdown-header {
  display: block;
  padding: 0.5rem 1rem;
  margin-bottom: 0;
  font-size: 0.875rem;
  color: #111827;
  white-space: nowrap; }

.dropdown-item-text {
  display: block;
  padding: 0.25rem 1rem;
  color: #111827; }

.dropdown-menu-dark {
  color: #D1D5DB;
  background-color: #1F2937;
  border-color: #E5E7EB; }
  .dropdown-menu-dark .dropdown-item {
    color: #D1D5DB; }
    .dropdown-menu-dark .dropdown-item:hover, .dropdown-menu-dark .dropdown-item:focus {
      color: #ffffff;
      background-color: rgba(255, 255, 255, 0.15); }
    .dropdown-menu-dark .dropdown-item.active, .dropdown-menu-dark .dropdown-item:active {
      color: #111827;
      background-color: #E5E7EB; }
    .dropdown-menu-dark .dropdown-item.disabled, .dropdown-menu-dark .dropdown-item:disabled {
      color: #6B7280; }
  .dropdown-menu-dark .dropdown-divider {
    border-color: #E5E7EB; }
  .dropdown-menu-dark .dropdown-item-text {
    color: #D1D5DB; }
  .dropdown-menu-dark .dropdown-header {
    color: #6B7280; }

.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 > .btn:not(:first-child),
.btn-group > .btn-group:not(:first-child) {
  margin-left: -0.0625rem; }

.btn-group > .btn:not(:last-child):not(.dropdown-toggle),
.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.75rem;
  padding-left: 0.75rem; }
  .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.46875rem;
  padding-left: 0.46875rem; }

.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {
  padding-right: 0.75rem;
  padding-left: 0.75rem; }

.btn-group.show .dropdown-toggle {
  box-shadow: inset 0 3px 5px rgba(17, 24, 39, 0.125); }
  .btn-group.show .dropdown-toggle.btn-link {
    box-shadow: none; }

.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: -0.0625rem; }
  .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 {
  display: flex;
  flex-wrap: wrap;
  padding-left: 0;
  margin-bottom: 0;
  list-style: none; }

.nav-link {
  display: block;
  padding: 0.5rem 1rem;
  color: #1F2937;
  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: #1F2937; }
  .nav-link.disabled {
    color: #4B5563;
    pointer-events: none;
    cursor: default; }

.nav-tabs {
  border-bottom: 0.0625rem solid #9CA3AF; }
  .nav-tabs .nav-link {
    margin-bottom: -0.0625rem;
    background: none;
    border: 0.0625rem solid transparent;
    border-top-left-radius: 0.5rem;
    border-top-right-radius: 0.5rem; }
    .nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {
      border-color: #E5E7EB #E5E7EB #9CA3AF;
   
Download .txt
gitextract_h_druol2/

├── .dockerignore
├── .gitignore
├── CHANGELOG.md
├── Dockerfile
├── LICENSE.md
├── README.md
├── apps/
│   ├── __init__.py
│   ├── authentication/
│   │   ├── __init__.py
│   │   ├── forms.py
│   │   ├── models.py
│   │   ├── oauth.py
│   │   ├── routes.py
│   │   └── util.py
│   ├── charts/
│   │   ├── __init__.py
│   │   └── routes.py
│   ├── config.py
│   ├── dyn_dt/
│   │   ├── __init__.py
│   │   ├── routes.py
│   │   └── utils.py
│   ├── exceptions/
│   │   └── exception.py
│   ├── helpers.py
│   ├── home/
│   │   ├── __init__.py
│   │   └── routes.py
│   └── models.py
├── build.sh
├── docker-compose.yml
├── env.sample
├── gunicorn-cfg.py
├── nginx/
│   └── appseed-app.conf
├── package.json
├── postcss.config.js
├── render.yaml
├── requirements.txt
├── run.py
├── static/
│   └── assets/
│       ├── .gitkeep
│       ├── css/
│       │   └── volt.css
│       ├── gulpfile.js
│       ├── img/
│       │   └── favicon/
│       │       ├── browserconfig.xml
│       │       ├── manifest.json
│       │       └── site.webmanifest
│       ├── js/
│       │   └── volt.js
│       ├── package.json
│       ├── scss/
│       │   ├── custom/
│       │   │   └── _variables.scss
│       │   ├── volt/
│       │   │   ├── _components.scss
│       │   │   ├── _forms.scss
│       │   │   ├── _functions.scss
│       │   │   ├── _layout.scss
│       │   │   ├── _mixins.scss
│       │   │   ├── _utilities.scss
│       │   │   ├── _variables.scss
│       │   │   ├── _vendor.scss
│       │   │   ├── components/
│       │   │   │   ├── _accordions.scss
│       │   │   │   ├── _alerts.scss
│       │   │   │   ├── _animations.scss
│       │   │   │   ├── _avatars.scss
│       │   │   │   ├── _badge.scss
│       │   │   │   ├── _body.scss
│       │   │   │   ├── _breadcrumb.scss
│       │   │   │   ├── _buttons.scss
│       │   │   │   ├── _card.scss
│       │   │   │   ├── _carousel.scss
│       │   │   │   ├── _charts.scss
│       │   │   │   ├── _close.scss
│       │   │   │   ├── _custom-forms.scss
│       │   │   │   ├── _datepicker.scss
│       │   │   │   ├── _dropdown.scss
│       │   │   │   ├── _icons.scss
│       │   │   │   ├── _images.scss
│       │   │   │   ├── _list-group.scss
│       │   │   │   ├── _modal.scss
│       │   │   │   ├── _nav.scss
│       │   │   │   ├── _pagination.scss
│       │   │   │   ├── _popover.scss
│       │   │   │   ├── _progress.scss
│       │   │   │   ├── _scrollbar.scss
│       │   │   │   ├── _shapes.scss
│       │   │   │   ├── _steps.scss
│       │   │   │   ├── _tables.scss
│       │   │   │   ├── _timelines.scss
│       │   │   │   ├── _tooltip.scss
│       │   │   │   └── _type.scss
│       │   │   ├── forms/
│       │   │   │   ├── _form-check.scss
│       │   │   │   ├── _form-control.scss
│       │   │   │   ├── _form-select.scss
│       │   │   │   └── _input-group.scss
│       │   │   ├── layout/
│       │   │   │   ├── _footer.scss
│       │   │   │   ├── _navbar.scss
│       │   │   │   ├── _section.scss
│       │   │   │   ├── _sidebar.scss
│       │   │   │   └── _sidenav.scss
│       │   │   └── mixins/
│       │   │       ├── _animations.scss
│       │   │       ├── _background-variant.scss
│       │   │       ├── _icon.scss
│       │   │       ├── _modals.scss
│       │   │       ├── _popover.scss
│       │   │       ├── _transform.scss
│       │   │       └── _utilities.scss
│       │   └── volt.scss
│       └── vendor/
│           ├── @popperjs/
│           │   └── core/
│           │       └── dist/
│           │           ├── cjs/
│           │           │   ├── popper-base.js
│           │           │   ├── popper-base.js.flow
│           │           │   ├── popper-lite.js
│           │           │   ├── popper-lite.js.flow
│           │           │   ├── popper.js
│           │           │   └── popper.js.flow
│           │           ├── esm/
│           │           │   ├── createPopper.js
│           │           │   ├── dom-utils/
│           │           │   │   ├── contains.js
│           │           │   │   ├── getBoundingClientRect.js
│           │           │   │   ├── getClippingRect.js
│           │           │   │   ├── getCompositeRect.js
│           │           │   │   ├── getComputedStyle.js
│           │           │   │   ├── getDocumentElement.js
│           │           │   │   ├── getDocumentRect.js
│           │           │   │   ├── getHTMLElementScroll.js
│           │           │   │   ├── getLayoutRect.js
│           │           │   │   ├── getNodeName.js
│           │           │   │   ├── getNodeScroll.js
│           │           │   │   ├── getOffsetParent.js
│           │           │   │   ├── getParentNode.js
│           │           │   │   ├── getScrollParent.js
│           │           │   │   ├── getViewportRect.js
│           │           │   │   ├── getWindow.js
│           │           │   │   ├── getWindowScroll.js
│           │           │   │   ├── getWindowScrollBarX.js
│           │           │   │   ├── instanceOf.js
│           │           │   │   ├── isScrollParent.js
│           │           │   │   ├── isTableElement.js
│           │           │   │   └── listScrollParents.js
│           │           │   ├── enums.js
│           │           │   ├── index.js
│           │           │   ├── modifiers/
│           │           │   │   ├── applyStyles.js
│           │           │   │   ├── arrow.js
│           │           │   │   ├── computeStyles.js
│           │           │   │   ├── eventListeners.js
│           │           │   │   ├── flip.js
│           │           │   │   ├── hide.js
│           │           │   │   ├── index.js
│           │           │   │   ├── offset.js
│           │           │   │   ├── popperOffsets.js
│           │           │   │   └── preventOverflow.js
│           │           │   ├── popper-base.js
│           │           │   ├── popper-lite.js
│           │           │   ├── popper.js
│           │           │   ├── types.js
│           │           │   └── utils/
│           │           │       ├── computeAutoPlacement.js
│           │           │       ├── computeOffsets.js
│           │           │       ├── debounce.js
│           │           │       ├── detectOverflow.js
│           │           │       ├── expandToHashMap.js
│           │           │       ├── format.js
│           │           │       ├── getAltAxis.js
│           │           │       ├── getAltLen.js
│           │           │       ├── getBasePlacement.js
│           │           │       ├── getFreshSideObject.js
│           │           │       ├── getMainAxisFromPlacement.js
│           │           │       ├── getOppositePlacement.js
│           │           │       ├── getOppositeVariationPlacement.js
│           │           │       ├── getVariation.js
│           │           │       ├── math.js
│           │           │       ├── mergeByName.js
│           │           │       ├── mergePaddingObject.js
│           │           │       ├── orderModifiers.js
│           │           │       ├── rectToClientRect.js
│           │           │       ├── uniqueBy.js
│           │           │       ├── validateModifiers.js
│           │           │       └── within.js
│           │           └── umd/
│           │               ├── popper-base.min.js.flow
│           │               ├── popper-lite.min.js.flow
│           │               └── popper.min.js.flow
│           ├── chartist-plugin-tooltips/
│           │   └── dist/
│           │       └── chartist-plugin-tooltip.css
│           ├── notyf/
│           │   ├── notyf.es.js
│           │   └── notyf.umd.js
│           ├── nouislider/
│           │   └── distribute/
│           │       ├── nouislider.min.mjs
│           │       └── nouislider.mjs
│           ├── onscreen/
│           │   └── dist/
│           │       ├── index.js
│           │       └── on-screen.es6.js
│           ├── simplebar/
│           │   └── dist/
│           │       ├── simplebar-core.esm.js
│           │       ├── simplebar.esm.js
│           │       └── simplebar.umd.js
│           ├── vanillajs-datepicker/
│           │   └── dist/
│           │       └── js/
│           │           └── locales/
│           │               ├── ar-tn.js
│           │               ├── ar.js
│           │               ├── az.js
│           │               ├── bg.js
│           │               ├── bm.js
│           │               ├── bn.js
│           │               ├── br.js
│           │               ├── bs.js
│           │               ├── ca.js
│           │               ├── cs.js
│           │               ├── cy.js
│           │               ├── da.js
│           │               ├── de.js
│           │               ├── el.js
│           │               ├── en-AU.js
│           │               ├── en-CA.js
│           │               ├── en-GB.js
│           │               ├── en-IE.js
│           │               ├── en-NZ.js
│           │               ├── en-ZA.js
│           │               ├── eo.js
│           │               ├── es.js
│           │               ├── et.js
│           │               ├── eu.js
│           │               ├── fa.js
│           │               ├── fi.js
│           │               ├── fo.js
│           │               ├── fr-CH.js
│           │               ├── fr.js
│           │               ├── gl.js
│           │               ├── he.js
│           │               ├── hi.js
│           │               ├── hr.js
│           │               ├── hu.js
│           │               ├── hy.js
│           │               ├── id.js
│           │               ├── is.js
│           │               ├── it-CH.js
│           │               ├── it.js
│           │               ├── ja.js
│           │               ├── ka.js
│           │               ├── kk.js
│           │               ├── km.js
│           │               ├── ko.js
│           │               ├── lt.js
│           │               ├── lv.js
│           │               ├── me.js
│           │               ├── mk.js
│           │               ├── mn.js
│           │               ├── mr.js
│           │               ├── ms.js
│           │               ├── nl-BE.js
│           │               ├── nl.js
│           │               ├── no.js
│           │               ├── oc.js
│           │               ├── pl.js
│           │               ├── pt-BR.js
│           │               ├── pt.js
│           │               ├── ro.js
│           │               ├── ru.js
│           │               ├── si.js
│           │               ├── sk.js
│           │               ├── sl.js
│           │               ├── sq.js
│           │               ├── sr-latn.js
│           │               ├── sr.js
│           │               ├── sv.js
│           │               ├── sw.js
│           │               ├── ta.js
│           │               ├── tg.js
│           │               ├── th.js
│           │               ├── tk.js
│           │               ├── tr.js
│           │               ├── uk.js
│           │               ├── uz-cyrl.js
│           │               ├── uz-latn.js
│           │               ├── vi.js
│           │               ├── zh-CN.js
│           │               └── zh-TW.js
│           └── waypoints/
│               ├── lib/
│               │   └── waypoints.debug.js
│               ├── licenses.txt
│               └── testem.json
├── templates/
│   ├── .gitkeep
│   ├── accounts/
│   │   ├── login.html
│   │   └── register.html
│   ├── charts/
│   │   └── index.html
│   ├── dyn_dt/
│   │   ├── index.html
│   │   └── model.html
│   ├── home/
│   │   ├── components-buttons.html
│   │   ├── components-forms.html
│   │   ├── components-modals.html
│   │   ├── components-notifications.html
│   │   ├── components-typography.html
│   │   ├── dashboard.html
│   │   ├── index.html
│   │   ├── page-403.html
│   │   ├── page-404.html
│   │   ├── page-500.html
│   │   ├── page-forgot-password.html
│   │   ├── page-lock.html
│   │   ├── page-reset-password.html
│   │   ├── page-sign-in.html
│   │   ├── page-sign-up.html
│   │   ├── settings.html
│   │   ├── tables-bootstrap-tables.html
│   │   └── transactions.html
│   ├── includes/
│   │   ├── footer.html
│   │   ├── items-table.html
│   │   ├── navigation.html
│   │   ├── scripts.html
│   │   ├── settings-box.html
│   │   └── sidebar.html
│   └── layouts/
│       ├── base-fullscreen.html
│       └── base.html
└── vite.config.js
Download .txt
SYMBOL INDEX (480 symbols across 79 files)

FILE: apps/__init__.py
  function register_extensions (line 15) | def register_extensions(app):
  function register_blueprints (line 19) | def register_blueprints(app):
  function create_app (line 26) | def create_app(config):

FILE: apps/authentication/forms.py
  class LoginForm (line 13) | class LoginForm(FlaskForm):
  class CreateAccountForm (line 22) | class CreateAccountForm(FlaskForm):

FILE: apps/authentication/models.py
  class Users (line 14) | class Users(db.Model, UserMixin):
    method __init__ (line 29) | def __init__(self, **kwargs):
    method __repr__ (line 43) | def __repr__(self):
    method find_by_email (line 47) | def find_by_email(cls, email: str) -> "Users":
    method find_by_username (line 51) | def find_by_username(cls, username: str) -> "Users":
    method find_by_id (line 55) | def find_by_id(cls, _id: int) -> "Users":
    method save (line 58) | def save(self) -> None:
    method delete_from_db (line 69) | def delete_from_db(self) -> None:
  function user_loader (line 81) | def user_loader(id):
  function request_loader (line 85) | def request_loader(request):
  class OAuth (line 90) | class OAuth(OAuthConsumerMixin, db.Model):

FILE: apps/authentication/oauth.py
  function github_logged_in (line 32) | def github_logged_in(blueprint, token):
  function google_logged_in (line 78) | def google_logged_in(blueprint, token):

FILE: apps/authentication/routes.py
  function route_default (line 24) | def route_default():
  function login_github (line 30) | def login_github():
  function login_google (line 40) | def login_google():
  function login (line 50) | def login():
  function register (line 79) | def register():
  function logout (line 120) | def logout():
  function unauthorized_handler (line 128) | def unauthorized_handler():
  function access_forbidden (line 133) | def access_forbidden(error):
  function not_found_error (line 138) | def not_found_error(error):
  function internal_error (line 143) | def internal_error(error):
  function has_github (line 148) | def has_github():
  function has_google (line 152) | def has_google():

FILE: apps/authentication/util.py
  function hash_pass (line 13) | def hash_pass(password):
  function verify_pass (line 23) | def verify_pass(provided_password, stored_password):

FILE: apps/charts/routes.py
  function charts (line 11) | def charts():

FILE: apps/config.py
  class Config (line 9) | class Config(object):
  class ProductionConfig (line 86) | class ProductionConfig(Config):
  class DebugConfig (line 94) | class DebugConfig(Config):

FILE: apps/dyn_dt/routes.py
  function dynamic_dt (line 18) | def dynamic_dt():
  function create_filter (line 26) | def create_filter(model_name):
  function create_page_items (line 45) | def create_page_items(model_name):
  function create_hide_show_filter (line 60) | def create_hide_show_filter(model_name):
  function delete_filter (line 79) | def delete_filter(model_name, id):
  function model_dt (line 90) | def model_dt(aPath):
  function create (line 183) | def create(aPath):
  function delete (line 217) | def delete(aPath, id):
  function update (line 237) | def update(aPath, id):
  function export_csv (line 272) | def export_csv(aPath):
  function getattribute (line 331) | def getattribute(value, arg):
  function getenumattribute (line 344) | def getenumattribute(value, arg):
  function get (line 353) | def get(dict_data, key):

FILE: apps/dyn_dt/utils.py
  class PageItems (line 11) | class PageItems(db.Model):
  class HideShowFilter (line 18) | class HideShowFilter(db.Model):
  class ModelFilter (line 26) | class ModelFilter(db.Model):
  function get_model_fk_values (line 34) | def get_model_fk_values(aModelClass):
  function get_model_field_names (line 53) | def get_model_field_names(model, field_type):
  function name_to_class (line 61) | def name_to_class(name: str):
  function user_filter (line 73) | def user_filter(request, query, fields, fk_fields=[]):
  function exclude_auto_gen_fields (line 88) | def exclude_auto_gen_fields(aModelClass):

FILE: apps/exceptions/exception.py
  class InvalidUsage (line 6) | class InvalidUsage(Exception):
    method __init__ (line 9) | def __init__(self, message, status_code=None, payload=None):
    method to_dict (line 16) | def to_dict(self):

FILE: apps/helpers.py
  function get_ts (line 25) | def get_ts():
  function password_validate (line 28) | def password_validate(password):
  function emailValidate (line 47) | def emailValidate(email):
  function sanitise_fille_name (line 55) | def sanitise_fille_name(value):
  function createFolder (line 59) | def createFolder(folder_name):
  function uniqueFileName (line 67) | def uniqueFileName(file_name):
  function serverImageUrl (line 73) | def serverImageUrl(file_name):
  function errorColor (line 78) | def errorColor(error):
  function splitUrlGetFilename (line 84) | def splitUrlGetFilename(url):
  function validateCurrency (line 88) | def validateCurrency(currency):
  function validatePaymentMethod (line 95) | def validatePaymentMethod(payment):
  function validateState (line 113) | def validateState(state):
  function expectedValue (line 132) | def expectedValue(data):
  function createAccessToken (line 141) | def createAccessToken():
  function token_required (line 149) | def token_required(f):

FILE: apps/home/routes.py
  function index (line 14) | def index():
  function route_template (line 22) | def route_template(template):
  function get_segment (line 43) | def get_segment(request):

FILE: apps/models.py
  class CURRENCY_TYPE (line 14) | class CURRENCY_TYPE(Enum):
  class Product (line 18) | class Product(db.Model):
    method __init__ (line 32) | def __init__(self, **kwargs):
    method __repr__ (line 35) | def __repr__(self):
    method find_by_id (line 39) | def find_by_id(cls, _id: int) -> "Product":
    method get_list (line 43) | def get_list(cls):
    method save (line 46) | def save(self) -> None:
    method delete (line 56) | def delete(self) -> None:

FILE: static/assets/vendor/@popperjs/core/dist/cjs/popper-base.js
  function getWindow (line 9) | function getWindow(node) {
  function isElement (line 22) | function isElement(node) {
  function isHTMLElement (line 27) | function isHTMLElement(node) {
  function isShadowRoot (line 32) | function isShadowRoot(node) {
  function getBoundingClientRect (line 43) | function getBoundingClientRect(element, includeScale) {
  function getWindowScroll (line 70) | function getWindowScroll(node) {
  function getHTMLElementScroll (line 80) | function getHTMLElementScroll(element) {
  function getNodeScroll (line 87) | function getNodeScroll(node) {
  function getNodeName (line 95) | function getNodeName(element) {
  function getDocumentElement (line 99) | function getDocumentElement(element) {
  function getWindowScrollBarX (line 105) | function getWindowScrollBarX(element) {
  function getComputedStyle (line 116) | function getComputedStyle(element) {
  function isScrollParent (line 120) | function isScrollParent(element) {
  function isElementScaled (line 130) | function isElementScaled(element) {
  function getCompositeRect (line 139) | function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
  function getLayoutRect (line 182) | function getLayoutRect(element) {
  function getParentNode (line 205) | function getParentNode(element) {
  function getScrollParent (line 222) | function getScrollParent(node) {
  function listScrollParents (line 242) | function listScrollParents(element, list) {
  function isTableElement (line 258) | function isTableElement(element) {
  function getTrueOffsetParent (line 262) | function getTrueOffsetParent(element) {
  function getContainingBlock (line 273) | function getContainingBlock(element) {
  function getOffsetParent (line 305) | function getOffsetParent(element) {
  function order (line 346) | function order(modifiers) {
  function orderModifiers (line 378) | function orderModifiers(modifiers) {
  function debounce (line 389) | function debounce(fn) {
  function format (line 405) | function format(str) {
  function validateModifiers (line 418) | function validateModifiers(modifiers) {
  function uniqueBy (line 490) | function uniqueBy(arr, fn) {
  function getBasePlacement (line 502) | function getBasePlacement(placement) {
  function mergeByName (line 506) | function mergeByName(modifiers) {
  function getViewportRect (line 521) | function getViewportRect(element) {
  function getDocumentRect (line 564) | function getDocumentRect(element) {
  function contains (line 587) | function contains(parent, child) {
  function rectToClientRect (line 610) | function rectToClientRect(rect) {
  function getInnerBoundingClientRect (line 619) | function getInnerBoundingClientRect(element) {
  function getClientRectFromMixedType (line 632) | function getClientRectFromMixedType(element, clippingParent) {
  function getClippingParents (line 639) | function getClippingParents(element) {
  function getClippingRect (line 656) | function getClippingRect(element, boundary, rootBoundary) {
  function getVariation (line 675) | function getVariation(placement) {
  function getMainAxisFromPlacement (line 679) | function getMainAxisFromPlacement(placement) {
  function computeOffsets (line 683) | function computeOffsets(_ref) {
  function getFreshSideObject (line 748) | function getFreshSideObject() {
  function mergePaddingObject (line 757) | function mergePaddingObject(paddingObject) {
  function expandToHashMap (line 761) | function expandToHashMap(value, keys) {
  function detectOverflow (line 768) | function detectOverflow(state, options) {
  function areValidElements (line 831) | function areValidElements() {
  function popperGenerator (line 841) | function popperGenerator(generatorOptions) {

FILE: static/assets/vendor/@popperjs/core/dist/cjs/popper-lite.js
  function getWindow (line 9) | function getWindow(node) {
  function isElement (line 22) | function isElement(node) {
  function isHTMLElement (line 27) | function isHTMLElement(node) {
  function isShadowRoot (line 32) | function isShadowRoot(node) {
  function getBoundingClientRect (line 43) | function getBoundingClientRect(element, includeScale) {
  function getWindowScroll (line 70) | function getWindowScroll(node) {
  function getHTMLElementScroll (line 80) | function getHTMLElementScroll(element) {
  function getNodeScroll (line 87) | function getNodeScroll(node) {
  function getNodeName (line 95) | function getNodeName(element) {
  function getDocumentElement (line 99) | function getDocumentElement(element) {
  function getWindowScrollBarX (line 105) | function getWindowScrollBarX(element) {
  function getComputedStyle (line 116) | function getComputedStyle(element) {
  function isScrollParent (line 120) | function isScrollParent(element) {
  function isElementScaled (line 130) | function isElementScaled(element) {
  function getCompositeRect (line 139) | function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
  function getLayoutRect (line 182) | function getLayoutRect(element) {
  function getParentNode (line 205) | function getParentNode(element) {
  function getScrollParent (line 222) | function getScrollParent(node) {
  function listScrollParents (line 242) | function listScrollParents(element, list) {
  function isTableElement (line 258) | function isTableElement(element) {
  function getTrueOffsetParent (line 262) | function getTrueOffsetParent(element) {
  function getContainingBlock (line 273) | function getContainingBlock(element) {
  function getOffsetParent (line 305) | function getOffsetParent(element) {
  function order (line 346) | function order(modifiers) {
  function orderModifiers (line 378) | function orderModifiers(modifiers) {
  function debounce (line 389) | function debounce(fn) {
  function format (line 405) | function format(str) {
  function validateModifiers (line 418) | function validateModifiers(modifiers) {
  function uniqueBy (line 490) | function uniqueBy(arr, fn) {
  function getBasePlacement (line 502) | function getBasePlacement(placement) {
  function mergeByName (line 506) | function mergeByName(modifiers) {
  function getViewportRect (line 521) | function getViewportRect(element) {
  function getDocumentRect (line 565) | function getDocumentRect(element) {
  function contains (line 588) | function contains(parent, child) {
  function rectToClientRect (line 611) | function rectToClientRect(rect) {
  function getInnerBoundingClientRect (line 620) | function getInnerBoundingClientRect(element) {
  function getClientRectFromMixedType (line 633) | function getClientRectFromMixedType(element, clippingParent) {
  function getClippingParents (line 640) | function getClippingParents(element) {
  function getClippingRect (line 657) | function getClippingRect(element, boundary, rootBoundary) {
  function getVariation (line 676) | function getVariation(placement) {
  function getMainAxisFromPlacement (line 680) | function getMainAxisFromPlacement(placement) {
  function computeOffsets (line 684) | function computeOffsets(_ref) {
  function getFreshSideObject (line 749) | function getFreshSideObject() {
  function mergePaddingObject (line 758) | function mergePaddingObject(paddingObject) {
  function expandToHashMap (line 762) | function expandToHashMap(value, keys) {
  function detectOverflow (line 769) | function detectOverflow(state, options) {
  function areValidElements (line 832) | function areValidElements() {
  function popperGenerator (line 842) | function popperGenerator(generatorOptions) {
  function effect$1 (line 1070) | function effect$1(_ref) {
  function popperOffsets (line 1114) | function popperOffsets(_ref) {
  function roundOffsetsByDPR (line 1147) | function roundOffsetsByDPR(_ref) {
  function mapToStyles (line 1158) | function mapToStyles(_ref2) {
  function computeStyles (line 1227) | function computeStyles(_ref4) {
  function applyStyles (line 1288) | function applyStyles(_ref) {
  function effect (line 1315) | function effect(_ref2) {

FILE: static/assets/vendor/@popperjs/core/dist/cjs/popper.js
  function getWindow (line 9) | function getWindow(node) {
  function isElement (line 22) | function isElement(node) {
  function isHTMLElement (line 27) | function isHTMLElement(node) {
  function isShadowRoot (line 32) | function isShadowRoot(node) {
  function getBoundingClientRect (line 43) | function getBoundingClientRect(element, includeScale) {
  function getWindowScroll (line 70) | function getWindowScroll(node) {
  function getHTMLElementScroll (line 80) | function getHTMLElementScroll(element) {
  function getNodeScroll (line 87) | function getNodeScroll(node) {
  function getNodeName (line 95) | function getNodeName(element) {
  function getDocumentElement (line 99) | function getDocumentElement(element) {
  function getWindowScrollBarX (line 105) | function getWindowScrollBarX(element) {
  function getComputedStyle (line 116) | function getComputedStyle(element) {
  function isScrollParent (line 120) | function isScrollParent(element) {
  function isElementScaled (line 130) | function isElementScaled(element) {
  function getCompositeRect (line 139) | function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
  function getLayoutRect (line 182) | function getLayoutRect(element) {
  function getParentNode (line 205) | function getParentNode(element) {
  function getScrollParent (line 222) | function getScrollParent(node) {
  function listScrollParents (line 242) | function listScrollParents(element, list) {
  function isTableElement (line 258) | function isTableElement(element) {
  function getTrueOffsetParent (line 262) | function getTrueOffsetParent(element) {
  function getContainingBlock (line 273) | function getContainingBlock(element) {
  function getOffsetParent (line 305) | function getOffsetParent(element) {
  function order (line 352) | function order(modifiers) {
  function orderModifiers (line 384) | function orderModifiers(modifiers) {
  function debounce (line 395) | function debounce(fn) {
  function format (line 411) | function format(str) {
  function validateModifiers (line 424) | function validateModifiers(modifiers) {
  function uniqueBy (line 496) | function uniqueBy(arr, fn) {
  function getBasePlacement (line 508) | function getBasePlacement(placement) {
  function mergeByName (line 512) | function mergeByName(modifiers) {
  function getViewportRect (line 527) | function getViewportRect(element) {
  function getDocumentRect (line 571) | function getDocumentRect(element) {
  function contains (line 594) | function contains(parent, child) {
  function rectToClientRect (line 617) | function rectToClientRect(rect) {
  function getInnerBoundingClientRect (line 626) | function getInnerBoundingClientRect(element) {
  function getClientRectFromMixedType (line 639) | function getClientRectFromMixedType(element, clippingParent) {
  function getClippingParents (line 646) | function getClippingParents(element) {
  function getClippingRect (line 663) | function getClippingRect(element, boundary, rootBoundary) {
  function getVariation (line 682) | function getVariation(placement) {
  function getMainAxisFromPlacement (line 686) | function getMainAxisFromPlacement(placement) {
  function computeOffsets (line 690) | function computeOffsets(_ref) {
  function getFreshSideObject (line 755) | function getFreshSideObject() {
  function mergePaddingObject (line 764) | function mergePaddingObject(paddingObject) {
  function expandToHashMap (line 768) | function expandToHashMap(value, keys) {
  function detectOverflow (line 775) | function detectOverflow(state, options) {
  function areValidElements (line 838) | function areValidElements() {
  function popperGenerator (line 848) | function popperGenerator(generatorOptions) {
  function effect$2 (line 1076) | function effect$2(_ref) {
  function popperOffsets (line 1120) | function popperOffsets(_ref) {
  function roundOffsetsByDPR (line 1153) | function roundOffsetsByDPR(_ref) {
  function mapToStyles (line 1164) | function mapToStyles(_ref2) {
  function computeStyles (line 1233) | function computeStyles(_ref4) {
  function applyStyles (line 1294) | function applyStyles(_ref) {
  function effect$1 (line 1321) | function effect$1(_ref2) {
  function distanceAndSkiddingToXY (line 1375) | function distanceAndSkiddingToXY(placement, rects, offset) {
  function offset (line 1396) | function offset(_ref2) {
  function getOppositePlacement (line 1433) | function getOppositePlacement(placement) {
  function getOppositeVariationPlacement (line 1443) | function getOppositeVariationPlacement(placement) {
  function computeAutoPlacement (line 1449) | function computeAutoPlacement(state, options) {
  function getExpandedFallbackPlacements (line 1493) | function getExpandedFallbackPlacements(placement) {
  function flip (line 1502) | function flip(_ref) {
  function getAltAxis (line 1633) | function getAltAxis(axis) {
  function within (line 1637) | function within(min$1, value, max$1) {
  function preventOverflow (line 1641) | function preventOverflow(_ref) {
  function arrow (line 1760) | function arrow(_ref) {
  function effect (line 1797) | function effect(_ref2) {
  function getSideOffsets (line 1844) | function getSideOffsets(overflow, rect, preventedOffsets) {
  function isAnySideFullyClipped (line 1860) | function isAnySideFullyClipped(overflow) {
  function hide (line 1866) | function hide(_ref) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/createPopper.js
  function areValidElements (line 23) | function areValidElements() {
  function popperGenerator (line 33) | function popperGenerator(generatorOptions) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/contains.js
  function contains (line 2) | function contains(parent, child) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getBoundingClientRect.js
  function getBoundingClientRect (line 3) | function getBoundingClientRect(element, includeScale) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getClippingRect.js
  function getInnerBoundingClientRect (line 16) | function getInnerBoundingClientRect(element) {
  function getClientRectFromMixedType (line 29) | function getClientRectFromMixedType(element, clippingParent) {
  function getClippingParents (line 36) | function getClippingParents(element) {
  function getClippingRect (line 53) | function getClippingRect(element, boundary, rootBoundary) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getCompositeRect.js
  function isElementScaled (line 9) | function isElementScaled(element) {
  function getCompositeRect (line 18) | function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getComputedStyle.js
  function getComputedStyle (line 2) | function getComputedStyle(element) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getDocumentElement.js
  function getDocumentElement (line 2) | function getDocumentElement(element) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getDocumentRect.js
  function getDocumentRect (line 8) | function getDocumentRect(element) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getHTMLElementScroll.js
  function getHTMLElementScroll (line 1) | function getHTMLElementScroll(element) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getLayoutRect.js
  function getLayoutRect (line 4) | function getLayoutRect(element) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getNodeName.js
  function getNodeName (line 1) | function getNodeName(element) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getNodeScroll.js
  function getNodeScroll (line 5) | function getNodeScroll(node) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getOffsetParent.js
  function getTrueOffsetParent (line 8) | function getTrueOffsetParent(element) {
  function getContainingBlock (line 19) | function getContainingBlock(element) {
  function getOffsetParent (line 51) | function getOffsetParent(element) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getParentNode.js
  function getParentNode (line 4) | function getParentNode(element) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getScrollParent.js
  function getScrollParent (line 5) | function getScrollParent(node) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getViewportRect.js
  function getViewportRect (line 4) | function getViewportRect(element) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getWindow.js
  function getWindow (line 1) | function getWindow(node) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getWindowScroll.js
  function getWindowScroll (line 2) | function getWindowScroll(node) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getWindowScrollBarX.js
  function getWindowScrollBarX (line 4) | function getWindowScrollBarX(element) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/instanceOf.js
  function isElement (line 3) | function isElement(node) {
  function isHTMLElement (line 8) | function isHTMLElement(node) {
  function isShadowRoot (line 13) | function isShadowRoot(node) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/isScrollParent.js
  function isScrollParent (line 2) | function isScrollParent(element) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/isTableElement.js
  function isTableElement (line 2) | function isTableElement(element) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/dom-utils/listScrollParents.js
  function listScrollParents (line 12) | function listScrollParents(element, list) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/modifiers/applyStyles.js
  function applyStyles (line 5) | function applyStyles(_ref) {
  function effect (line 32) | function effect(_ref2) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/modifiers/arrow.js
  function arrow (line 19) | function arrow(_ref) {
  function effect (line 56) | function effect(_ref2) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/modifiers/computeStyles.js
  function roundOffsetsByDPR (line 18) | function roundOffsetsByDPR(_ref) {
  function mapToStyles (line 29) | function mapToStyles(_ref2) {
  function computeStyles (line 98) | function computeStyles(_ref4) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/modifiers/eventListeners.js
  function effect (line 7) | function effect(_ref) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/modifiers/flip.js
  function getExpandedFallbackPlacements (line 9) | function getExpandedFallbackPlacements(placement) {
  function flip (line 18) | function flip(_ref) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/modifiers/hide.js
  function getSideOffsets (line 4) | function getSideOffsets(overflow, rect, preventedOffsets) {
  function isAnySideFullyClipped (line 20) | function isAnySideFullyClipped(overflow) {
  function hide (line 26) | function hide(_ref) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/modifiers/offset.js
  function distanceAndSkiddingToXY (line 3) | function distanceAndSkiddingToXY(placement, rects, offset) {
  function offset (line 24) | function offset(_ref2) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/modifiers/popperOffsets.js
  function popperOffsets (line 3) | function popperOffsets(_ref) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/modifiers/preventOverflow.js
  function preventOverflow (line 13) | function preventOverflow(_ref) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/computeAutoPlacement.js
  function computeAutoPlacement (line 5) | function computeAutoPlacement(state, options) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/computeOffsets.js
  function computeOffsets (line 5) | function computeOffsets(_ref) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/debounce.js
  function debounce (line 1) | function debounce(fn) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/detectOverflow.js
  function detectOverflow (line 11) | function detectOverflow(state, options) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/expandToHashMap.js
  function expandToHashMap (line 1) | function expandToHashMap(value, keys) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/format.js
  function format (line 1) | function format(str) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/getAltAxis.js
  function getAltAxis (line 1) | function getAltAxis(axis) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/getAltLen.js
  function getAltLen (line 1) | function getAltLen(len) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/getBasePlacement.js
  function getBasePlacement (line 2) | function getBasePlacement(placement) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/getFreshSideObject.js
  function getFreshSideObject (line 1) | function getFreshSideObject() {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/getMainAxisFromPlacement.js
  function getMainAxisFromPlacement (line 1) | function getMainAxisFromPlacement(placement) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/getOppositePlacement.js
  function getOppositePlacement (line 7) | function getOppositePlacement(placement) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/getOppositeVariationPlacement.js
  function getOppositeVariationPlacement (line 5) | function getOppositeVariationPlacement(placement) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/getVariation.js
  function getVariation (line 1) | function getVariation(placement) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/mergeByName.js
  function mergeByName (line 1) | function mergeByName(modifiers) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/mergePaddingObject.js
  function mergePaddingObject (line 2) | function mergePaddingObject(paddingObject) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/orderModifiers.js
  function order (line 3) | function order(modifiers) {
  function orderModifiers (line 35) | function orderModifiers(modifiers) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/rectToClientRect.js
  function rectToClientRect (line 1) | function rectToClientRect(rect) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/uniqueBy.js
  function uniqueBy (line 1) | function uniqueBy(arr, fn) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/validateModifiers.js
  function validateModifiers (line 6) | function validateModifiers(modifiers) {

FILE: static/assets/vendor/@popperjs/core/dist/esm/utils/within.js
  function within (line 2) | function within(min, value, max) {

FILE: static/assets/vendor/notyf/notyf.es.js
  function NotyfNotification (line 28) | function NotyfNotification(options) {
  function NotyfArray (line 49) | function NotyfArray() {
  function NotyfView (line 106) | function NotyfView() {
  function Notyf (line 337) | function Notyf(opts) {

FILE: static/assets/vendor/notyf/notyf.umd.js
  function NotyfNotification (line 34) | function NotyfNotification(options) {
  function NotyfArray (line 55) | function NotyfArray() {
  function NotyfView (line 112) | function NotyfView() {
  function Notyf (line 343) | function Notyf(opts) {

FILE: static/assets/vendor/nouislider/distribute/nouislider.min.mjs
  function isValidFormatter (line 1) | function isValidFormatter(t){return isValidPartialFormatter(t)&&"functio...
  function isValidPartialFormatter (line 1) | function isValidPartialFormatter(t){return"object"==typeof t&&"function"...
  function removeElement (line 1) | function removeElement(t){t.parentElement.removeChild(t)}
  function isSet (line 1) | function isSet(t){return null!=t}
  function preventDefault (line 1) | function preventDefault(t){t.preventDefault()}
  function unique (line 1) | function unique(t){return t.filter(function(t){return!this[t]&&(this[t]=...
  function closest (line 1) | function closest(t,e){return Math.round(t/e)*e}
  function offset (line 1) | function offset(t,e){var r=t.getBoundingClientRect(),n=t.ownerDocument,t...
  function isNumeric (line 1) | function isNumeric(t){return"number"==typeof t&&!isNaN(t)&&isFinite(t)}
  function addClassFor (line 1) | function addClassFor(t,e,r){0<r&&(addClass(t,e),setTimeout(function(){re...
  function limit (line 1) | function limit(t){return Math.max(Math.min(t,100),0)}
  function asArray (line 1) | function asArray(t){return Array.isArray(t)?t:[t]}
  function countDecimals (line 1) | function countDecimals(t){t=(t=String(t)).split(".");return 1<t.length?t...
  function addClass (line 1) | function addClass(t,e){t.classList&&!/\s/.test(e)?t.classList.add(e):t.c...
  function removeClass (line 1) | function removeClass(t,e){t.classList&&!/\s/.test(e)?t.classList.remove(...
  function hasClass (line 1) | function hasClass(t,e){return t.classList?t.classList.contains(e):new Re...
  function getPageOffset (line 1) | function getPageOffset(t){var e=void 0!==window.pageXOffset,r="CSS1Compa...
  function getActions (line 1) | function getActions(){return window.navigator.pointerEnabled?{start:"poi...
  function getSupportsPassive (line 1) | function getSupportsPassive(){var t=!1;try{var e=Object.defineProperty({...
  function getSupportsTouchActionNone (line 1) | function getSupportsTouchActionNone(){return window.CSS&&CSS.supports&&C...
  function subRangeRatio (line 1) | function subRangeRatio(t,e){return 100/(e-t)}
  function fromPercentage (line 1) | function fromPercentage(t,e,r){return 100*e/(t[r+1]-t[r])}
  function toPercentage (line 1) | function toPercentage(t,e){return fromPercentage(t,t[0]<0?e+Math.abs(t[0...
  function isPercentage (line 1) | function isPercentage(t,e){return e*(t[1]-t[0])/100+t[0]}
  function getJ (line 1) | function getJ(t,e){for(var r=1;t>=e[r];)r+=1;return r}
  function toStepping (line 1) | function toStepping(t,e,r){if(r>=t.slice(-1)[0])return 100;var n=getJ(r,...
  function fromStepping (line 1) | function fromStepping(t,e,r){if(100<=r)return t.slice(-1)[0];var n=getJ(...
  function getStep (line 1) | function getStep(t,e,r,n){if(100===n)return n;var i=getJ(n,t),s=t[i-1],o...
  function t (line 1) | function t(e,t,r){var n;this.xPct=[],this.xVal=[],this.xSteps=[],this.xN...
  function testStep (line 1) | function testStep(t,e){if(!isNumeric(e))throw new Error("noUiSlider: 'st...
  function testKeyboardPageMultiplier (line 1) | function testKeyboardPageMultiplier(t,e){if(!isNumeric(e))throw new Erro...
  function testKeyboardMultiplier (line 1) | function testKeyboardMultiplier(t,e){if(!isNumeric(e))throw new Error("n...
  function testKeyboardDefaultStep (line 1) | function testKeyboardDefaultStep(t,e){if(!isNumeric(e))throw new Error("...
  function testRange (line 1) | function testRange(t,e){if("object"!=typeof e||Array.isArray(e))throw ne...
  function testStart (line 1) | function testStart(t,e){if(e=asArray(e),!Array.isArray(e)||!e.length)thr...
  function testSnap (line 1) | function testSnap(t,e){if("boolean"!=typeof e)throw new Error("noUiSlide...
  function testAnimate (line 1) | function testAnimate(t,e){if("boolean"!=typeof e)throw new Error("noUiSl...
  function testAnimationDuration (line 1) | function testAnimationDuration(t,e){if("number"!=typeof e)throw new Erro...
  function testConnect (line 1) | function testConnect(t,e){var r,n=[!1];if("lower"===e?e=[!0,!1]:"upper"=...
  function testOrientation (line 1) | function testOrientation(t,e){switch(e){case"horizontal":t.ort=0;break;c...
  function testMargin (line 1) | function testMargin(t,e){if(!isNumeric(e))throw new Error("noUiSlider: '...
  function testLimit (line 1) | function testLimit(t,e){if(!isNumeric(e))throw new Error("noUiSlider: 'l...
  function testPadding (line 1) | function testPadding(t,e){var r;if(!isNumeric(e)&&!Array.isArray(e))thro...
  function testDirection (line 1) | function testDirection(t,e){switch(e){case"ltr":t.dir=0;break;case"rtl":...
  function testBehaviour (line 1) | function testBehaviour(t,e){if("string"!=typeof e)throw new Error("noUiS...
  function testTooltips (line 1) | function testTooltips(t,e){if(!1!==e)if(!0===e||isValidPartialFormatter(...
  function testHandleAttributes (line 1) | function testHandleAttributes(t,e){if(e.length!==t.handles)throw new Err...
  function testAriaFormat (line 1) | function testAriaFormat(t,e){if(!isValidPartialFormatter(e))throw new Er...
  function testFormat (line 1) | function testFormat(t,e){if(!isValidFormatter(e))throw new Error("noUiSl...
  function testKeyboardSupport (line 1) | function testKeyboardSupport(t,e){if("boolean"!=typeof e)throw new Error...
  function testDocumentElement (line 1) | function testDocumentElement(t,e){t.documentElement=e}
  function testCssPrefix (line 1) | function testCssPrefix(t,e){if("string"!=typeof e&&!1!==e)throw new Erro...
  function testCssClasses (line 1) | function testCssClasses(e,r){if("object"!=typeof r)throw new Error("noUi...
  function testOptions (line 1) | function testOptions(e){var r={margin:null,limit:null,padding:null,anima...
  function scope (line 1) | function scope(t,d,s){var r,a,l,n,i,e,u,c=getActions(),p=getSupportsTouc...
  function initialize (line 1) | function initialize(t,e){if(!t||!t.nodeName)throw new Error("noUiSlider:...

FILE: static/assets/vendor/nouislider/distribute/nouislider.mjs
  function isValidFormatter (line 18) | function isValidFormatter(entry) {
  function isValidPartialFormatter (line 21) | function isValidPartialFormatter(entry) {
  function removeElement (line 25) | function removeElement(el) {
  function isSet (line 28) | function isSet(value) {
  function preventDefault (line 32) | function preventDefault(e) {
  function unique (line 36) | function unique(array) {
  function closest (line 42) | function closest(value, to) {
  function offset (line 46) | function offset(elem, orientation) {
  function isNumeric (line 60) | function isNumeric(a) {
  function addClassFor (line 64) | function addClassFor(element, className, duration) {
  function limit (line 73) | function limit(a) {
  function asArray (line 78) | function asArray(a) {
  function countDecimals (line 82) | function countDecimals(numStr) {
  function addClass (line 88) | function addClass(el, className) {
  function removeClass (line 97) | function removeClass(el, className) {
  function hasClass (line 106) | function hasClass(el, className) {
  function getPageOffset (line 110) | function getPageOffset(doc) {
  function getActions (line 131) | function getActions() {
  function getSupportsPassive (line 154) | function getSupportsPassive() {
  function getSupportsTouchActionNone (line 170) | function getSupportsTouchActionNone() {
  function subRangeRatio (line 176) | function subRangeRatio(pa, pb) {
  function fromPercentage (line 180) | function fromPercentage(range, value, startRange) {
  function toPercentage (line 184) | function toPercentage(range, value) {
  function isPercentage (line 188) | function isPercentage(range, value) {
  function getJ (line 191) | function getJ(value, arr) {
  function toStepping (line 199) | function toStepping(xVal, xPct, value) {
  function fromStepping (line 211) | function fromStepping(xVal, xPct, value) {
  function getStep (line 224) | function getStep(xPct, xSteps, snap, value) {
  function Spectrum (line 247) | function Spectrum(entry, snap, singleStep) {
  function testStep (line 534) | function testStep(parsed, entry) {
  function testKeyboardPageMultiplier (line 542) | function testKeyboardPageMultiplier(parsed, entry) {
  function testKeyboardMultiplier (line 548) | function testKeyboardMultiplier(parsed, entry) {
  function testKeyboardDefaultStep (line 554) | function testKeyboardDefaultStep(parsed, entry) {
  function testRange (line 560) | function testRange(parsed, entry) {
  function testStart (line 571) | function testStart(parsed, entry) {
  function testSnap (line 584) | function testSnap(parsed, entry) {
  function testAnimate (line 591) | function testAnimate(parsed, entry) {
  function testAnimationDuration (line 598) | function testAnimationDuration(parsed, entry) {
  function testConnect (line 604) | function testConnect(parsed, entry) {
  function testOrientation (line 630) | function testOrientation(parsed, entry) {
  function testMargin (line 644) | function testMargin(parsed, entry) {
  function testLimit (line 654) | function testLimit(parsed, entry) {
  function testPadding (line 663) | function testPadding(parsed, entry) {
  function testDirection (line 692) | function testDirection(parsed, entry) {
  function testBehaviour (line 707) | function testBehaviour(parsed, entry) {
  function testTooltips (line 741) | function testTooltips(parsed, entry) {
  function testHandleAttributes (line 764) | function testHandleAttributes(parsed, entry) {
  function testAriaFormat (line 770) | function testAriaFormat(parsed, entry) {
  function testFormat (line 776) | function testFormat(parsed, entry) {
  function testKeyboardSupport (line 782) | function testKeyboardSupport(parsed, entry) {
  function testDocumentElement (line 788) | function testDocumentElement(parsed, entry) {
  function testCssPrefix (line 792) | function testCssPrefix(parsed, entry) {
  function testCssClasses (line 798) | function testCssClasses(parsed, entry) {
  function testOptions (line 813) | function testOptions(options) {
  function scope (line 901) | function scope(target, options, originalOptions) {
  function initialize (line 2215) | function initialize(target, originalOptions) {

FILE: static/assets/vendor/onscreen/dist/index.js
  function f (line 1) | function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequi...
  function e (line 2) | function e(e,t){var r=window.MutationObserver;if(r){var n=new r(t);retur...
  function s (line 4) | function s(){var e=this,s=this.options.container;s instanceof HTMLElemen...
  function e (line 6) | function e(e,t){if(!e)throw new Error("You should specify the element yo...
  function e (line 8) | function e(e,t){if(!e)throw new Error("You should specify the element yo...
  function t (line 10) | function t(e,t){void 0===e&&(e={}),void 0===t&&(t={container:window,tole...
  function r (line 12) | function r(){var e,r=this;return function(){clearTimeout(e),e=setTimeout...
  function e (line 14) | function e(){this._observer instanceof MutationObserver&&this._observer....
  function e (line 16) | function e(e,t,s){var l=Object.keys(this.trackedElements[t].enter||{}),n...
  function e (line 18) | function e(e,t,r){if(!e)throw new Error("No event given. Choose either e...
  function a (line 20) | function a(e){void 0===e&&(e={tolerance:0,debounce:100,container:window}...

FILE: static/assets/vendor/onscreen/dist/on-screen.es6.js
  function observeDOM (line 9) | function observeDOM(obj, callback) {
  function attach (line 35) | function attach() {
  function inViewport (line 68) | function inViewport(el) {
  function inContainer (line 103) | function inContainer(el) {
  function eventHandler (line 151) | function eventHandler() {
  function debouncedScroll (line 202) | function debouncedScroll() {
  function destroy (line 227) | function destroy() {
  function off (line 245) | function off(event, selector, handler) {
  function on (line 273) | function on(event, selector, callback) {
  function OnScreen (line 311) | function OnScreen() {

FILE: static/assets/vendor/simplebar/dist/simplebar-core.esm.js
  function getElementWindow (line 30) | function getElementWindow(element) {
  function getElementDocument (line 37) | function getElementDocument(element) {
  function scrollbarWidth (line 57) | function scrollbarWidth(el) {
  function SimpleBar (line 81) | function SimpleBar(element, options) {

FILE: static/assets/vendor/simplebar/dist/simplebar.esm.js
  function getElementWindow (line 63) | function getElementWindow(element) {
  function getElementDocument (line 70) | function getElementDocument(element) {
  function scrollbarWidth (line 90) | function scrollbarWidth(el) {
  function SimpleBar (line 114) | function SimpleBar(element, options) {

FILE: static/assets/vendor/waypoints/lib/waypoints.debug.js
  function checkWaypointStyles (line 21) | function checkWaypointStyles() {
Condensed preview — 293 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,821K chars).
[
  {
    "path": ".dockerignore",
    "chars": 34,
    "preview": ".git\n__pycache__\n*.pyc\n*.pyo\n*.pyd"
  },
  {
    "path": ".gitignore",
    "chars": 394,
    "preview": "# byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n\n# tests and coverage\n*.pytest_cache\n.coverage\n\n# databas"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 3840,
    "preview": "# Change Log\n\n## [1.0.17] 2025-04-01\n### Changes\n\n- Update RM (minor)\n\n## [1.0.16] 2024-05-18\n### Changes\n\n- Updated DOC"
  },
  {
    "path": "Dockerfile",
    "chars": 436,
    "preview": "FROM python:3.10\n\n# set environment variables\nENV PYTHONDONTWRITEBYTECODE 1\nENV PYTHONUNBUFFERED 1\nENV FLASK_APP run.py\n"
  },
  {
    "path": "LICENSE.md",
    "chars": 888,
    "preview": "# MIT License\n\nCopyright (c) 2019 - present [AppSeed](http://appseed.us/)\n\n<br />\n\n## Licensing Information\n\n<br />\n\n| I"
  },
  {
    "path": "README.md",
    "chars": 3932,
    "preview": "# [Flask Volt Dashboard](https://app-generator.dev/product/volt-dashboard/flask/)\n\nOpen-source **Flask Starter with Volt"
  },
  {
    "path": "apps/__init__.py",
    "chars": 1375,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nimport os\nfrom flask import Flask\nfrom flask_"
  },
  {
    "path": "apps/authentication/__init__.py",
    "chars": 193,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nfrom flask import Blueprint\n\nblueprint = Blue"
  },
  {
    "path": "apps/authentication/forms.py",
    "chars": 1001,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nfrom flask_wtf import FlaskForm\nfrom wtforms "
  },
  {
    "path": "apps/authentication/models.py",
    "chars": 3039,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nfrom flask_login import UserMixin\n\nfrom sqlal"
  },
  {
    "path": "apps/authentication/oauth.py",
    "chars": 2740,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nimport os\nfrom flask import current_app as ap"
  },
  {
    "path": "apps/authentication/routes.py",
    "chars": 4464,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nfrom flask import render_template, redirect, "
  },
  {
    "path": "apps/authentication/util.py",
    "chars": 1086,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nimport os\nimport hashlib\nimport binascii\n\n# I"
  },
  {
    "path": "apps/charts/__init__.py",
    "chars": 185,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nfrom flask import Blueprint\n\nblueprint = Blue"
  },
  {
    "path": "apps/charts/routes.py",
    "chars": 400,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nfrom apps.charts import blueprint\nfrom flask "
  },
  {
    "path": "apps/config.py",
    "chars": 2666,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nimport os\nfrom pathlib import Path\n\nclass Con"
  },
  {
    "path": "apps/dyn_dt/__init__.py",
    "chars": 184,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nfrom flask import Blueprint\n\nblueprint = Blue"
  },
  {
    "path": "apps/dyn_dt/routes.py",
    "chars": 12102,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nimport json, csv, io\nfrom flask_login import "
  },
  {
    "path": "apps/dyn_dt/utils.py",
    "chars": 3066,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nimport importlib\nfrom sqlalchemy import or_\nf"
  },
  {
    "path": "apps/exceptions/exception.py",
    "chars": 485,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nclass InvalidUsage(Exception):\n    status_cod"
  },
  {
    "path": "apps/helpers.py",
    "chars": 4734,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nimport os, re, uuid\nfrom colorama import Fore"
  },
  {
    "path": "apps/home/__init__.py",
    "chars": 183,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nfrom flask import Blueprint\n\nblueprint = Blue"
  },
  {
    "path": "apps/home/routes.py",
    "chars": 1229,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nfrom apps.home import blueprint\nfrom flask im"
  },
  {
    "path": "apps/models.py",
    "chars": 1982,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nfrom email.policy import default\nfrom apps im"
  },
  {
    "path": "build.sh",
    "chars": 121,
    "preview": "#!/usr/bin/env bash\n# exit on error\nset -o errexit\n\npython -m pip install --upgrade pip\n\npip install -r requirements.txt"
  },
  {
    "path": "docker-compose.yml",
    "chars": 466,
    "preview": "version: '3.8'\nservices:\n  appseed-app:\n    container_name: appseed_app\n    restart: always\n    build: .\n    networks:\n "
  },
  {
    "path": "env.sample",
    "chars": 531,
    "preview": "# True in development, False in production\nDEBUG=True\n\nFLASK_APP=run.py\nFLASK_ENV=development\n\n# If not provided, a rand"
  },
  {
    "path": "gunicorn-cfg.py",
    "chars": 198,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nbind = '0.0.0.0:5005'\nworkers = 1\naccesslog ="
  },
  {
    "path": "nginx/appseed-app.conf",
    "chars": 283,
    "preview": "upstream webapp {\n    server appseed_app:5005;\n}\n\nserver {\n    listen 5085;\n    server_name localhost;\n\n    location / {"
  },
  {
    "path": "package.json",
    "chars": 574,
    "preview": "{\n  \"name\": \"flask-datta-able\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"dev"
  },
  {
    "path": "postcss.config.js",
    "chars": 116,
    "preview": "module.exports = {\n    plugins: [\n        require('cssnano')({\n            preset: 'default',\n        }),\n    ],\n};\n"
  },
  {
    "path": "render.yaml",
    "chars": 330,
    "preview": "services:\n  - type: web\n    name: flask-volt\n    plan: starter\n    env: python\n    region: frankfurt  # region should be"
  },
  {
    "path": "requirements.txt",
    "chars": 457,
    "preview": "# core\nflask==3.1.0\nWerkzeug==3.1.3\njinja2==3.1.6\nWTForms==3.2.1\nflask_wtf==1.2.2\n\n# DB\nflask_migrate==4.1.0\nflask_sqlal"
  },
  {
    "path": "run.py",
    "chars": 1526,
    "preview": "# -*- encoding: utf-8 -*-\n\"\"\"\nCopyright (c) 2019 - present AppSeed.us\n\"\"\"\n\nimport os\nfrom   flask_migrate import Migrate"
  },
  {
    "path": "static/assets/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "static/assets/css/volt.css",
    "chars": 517158,
    "preview": "/*\n\n=========================================================\n* Volt - Free Bootstrap 5 Dashboard\n======================"
  },
  {
    "path": "static/assets/gulpfile.js",
    "chars": 3042,
    "preview": "/*\n\n=========================================================\n* Volt Free - Bootstrap 5 Dashboard\n======================"
  },
  {
    "path": "static/assets/img/favicon/browserconfig.xml",
    "chars": 246,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<browserconfig>\n    <msapplication>\n        <tile>\n            <square150x150logo"
  },
  {
    "path": "static/assets/img/favicon/manifest.json",
    "chars": 472,
    "preview": "{\n  \"name\": \"Bootstrap\",\n  \"short_name\": \"Bootstrap\",\n  \"icons\": [\n    {\n      \"src\": \"/docs/4.3/assets/img/favicons/and"
  },
  {
    "path": "static/assets/img/favicon/site.webmanifest",
    "chars": 446,
    "preview": "{\n    \"name\": \"Themesberg\",\n    \"short_name\": \"Themesberg\",\n    \"icons\": [\n        {\n            \"src\": \"/android-chrome"
  },
  {
    "path": "static/assets/js/volt.js",
    "chars": 11740,
    "preview": "/*\n\n=========================================================\n* Volt Pro - Premium Bootstrap 5 Dashboard\n==============="
  },
  {
    "path": "static/assets/package.json",
    "chars": 2067,
    "preview": "{\n    \"name\": \"@themesberg/volt-bootstrap-5-dashboard\",\n    \"version\": \"1.4.1\",\n    \"description\": \"Volt - Bootstrap 5 D"
  },
  {
    "path": "static/assets/scss/custom/_variables.scss",
    "chars": 19,
    "preview": "// $primary: blue;\n"
  },
  {
    "path": "static/assets/scss/volt/_components.scss",
    "chars": 902,
    "preview": "@import \"components/body\";\n@import \"components/accordions\";\n@import \"components/animations\";\n@import \"components/alerts\""
  },
  {
    "path": "static/assets/scss/volt/_forms.scss",
    "chars": 115,
    "preview": "@import \"forms/form-control\";\n@import \"forms/form-check\";\n@import \"forms/input-group\";\n@import \"forms/form-select\";"
  },
  {
    "path": "static/assets/scss/volt/_functions.scss",
    "chars": 568,
    "preview": "// Retrieve color Sass maps\n\n@function section-color($key: \"primary\") {\n\t@return map-get($section-colors, $key);\n}\n\n// L"
  },
  {
    "path": "static/assets/scss/volt/_layout.scss",
    "chars": 128,
    "preview": "@import \"layout/navbar\";\n@import \"layout/section\";\n@import \"layout/footer\";\n@import \"layout/sidebar\";\n@import \"layout/si"
  },
  {
    "path": "static/assets/scss/volt/_mixins.scss",
    "chars": 199,
    "preview": "@import \"mixins/animations\"; \n@import \"mixins/background-variant\";\n@import \"mixins/icon\"; \n@import \"mixins/modals\";\n@imp"
  },
  {
    "path": "static/assets/scss/volt/_utilities.scss",
    "chars": 1825,
    "preview": "// check docs https://v5.getbootstrap.com/docs/5.0/utilities/api/\n\n$utilities: map-merge(\n  $utilities,\n  (\n    \"blur\": "
  },
  {
    "path": "static/assets/scss/volt/_variables.scss",
    "chars": 64673,
    "preview": "// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $n"
  },
  {
    "path": "static/assets/scss/volt/_vendor.scss",
    "chars": 155,
    "preview": "// Vendor\n@import \"vendor/headroom\";\n@import \"vendor/nouislider\";\n@import \"vendor/prism\";\n@import \"vendor/chartist/chart"
  },
  {
    "path": "static/assets/scss/volt/components/_accordions.scss",
    "chars": 884,
    "preview": "/**\n * = Accordions\n*/\n\n\n.accordion-button {\n    text-align: left;\n    &:not(.collapsed) {\n        &::after {\n          "
  },
  {
    "path": "static/assets/scss/volt/components/_alerts.scss",
    "chars": 153,
    "preview": ".alert-heading{\n    font-weight: $font-weight-bold;\n}\n\n.alert-icon{\n    margin-bottom: .5rem;\n    span{\n        font-siz"
  },
  {
    "path": "static/assets/scss/volt/components/_animations.scss",
    "chars": 4629,
    "preview": "\n/**\n * = Animations\n */\n\n @for $size from 1 to 10 {\n    .animate-up-#{$size},\n    .animate-right-#{$size},\n    .animate"
  },
  {
    "path": "static/assets/scss/volt/components/_avatars.scss",
    "chars": 1512,
    "preview": "/**\n * = Avatars\n */\n\n .avatar + .avatar-content {\n    display: inline-block;\n    margin-left: 0.75rem;\n}\n\n.avatar-sm {\n"
  },
  {
    "path": "static/assets/scss/volt/components/_badge.scss",
    "chars": 1702,
    "preview": "/**\n * = Badges\n */\n\n.badge {\n    font-size:$badge-font-size;\n    font-weight: $badge-font-weight;\n\n    a {\n        colo"
  },
  {
    "path": "static/assets/scss/volt/components/_body.scss",
    "chars": 302,
    "preview": "iframe {\n    border: 0;\n}\n\nfigcaption,\nfigure,\nmain {\n    display: block;\n    margin: 0;\n}\n\nmain {\n\toverflow: hidden;\n}\n"
  },
  {
    "path": "static/assets/scss/volt/components/_breadcrumb.scss",
    "chars": 955,
    "preview": "/**\n * = Breadcrumbs\n */\n\n.breadcrumb-item {\n  font-size: $font-size-xs;\n  &, a {\n    color: $breadcrumb-item-color;\n   "
  },
  {
    "path": "static/assets/scss/volt/components/_buttons.scss",
    "chars": 1544,
    "preview": "/*\n* = Buttons\n*/\n\n.btn {\n    &.btn-circle {\n        border-radius: $circle-radius;\n    }\n\t&.btn-md{\n        padding: 0."
  },
  {
    "path": "static/assets/scss/volt/components/_card.scss",
    "chars": 2621,
    "preview": "/**\n * = Cards\n */\n\n.card {\n    position: relative;\n    .card-header{\n        background: transparent;\n    }\n\n    &.hove"
  },
  {
    "path": "static/assets/scss/volt/components/_carousel.scss",
    "chars": 860,
    "preview": "/**\n * = Bootstrap carousels\n */\n\n.carousel-caption {\n    &, h5 {\n        color: $white;\n    }\n}\n\n//Indicators\n\n.carouse"
  },
  {
    "path": "static/assets/scss/volt/components/_charts.scss",
    "chars": 940,
    "preview": ".ct-bar {\n    stroke-linecap: round;\n    stroke-width: 10px;\n}\n.ct-label {\n    fill: $body-color;\n    color: $body-color"
  },
  {
    "path": "static/assets/scss/volt/components/_close.scss",
    "chars": 681,
    "preview": "/**\n * = Close\n */\n\n.close { \n    @if $enable-transitions {\n        transition: $transition-base;\n    } \n    &>span:not("
  },
  {
    "path": "static/assets/scss/volt/components/_custom-forms.scss",
    "chars": 1650,
    "preview": "/**\n * = Custom forms\n */\n\n .custom-control-label {\n    // Background-color and (when enabled) gradient\n    &:before {\n "
  },
  {
    "path": "static/assets/scss/volt/components/_datepicker.scss",
    "chars": 154,
    "preview": "/**\n * = Datepickers\n */\n\n .datepicker {\n\n    .datepicker-cell.selected,\n    .datepicker-cell.selected:hover {\n      bac"
  },
  {
    "path": "static/assets/scss/volt/components/_dropdown.scss",
    "chars": 1274,
    "preview": ".dropdown-menu {\n    .dropdown-header,\n    .dropdown-item {\n        padding: .5rem 1rem;\n        font-size: $dropdown-fo"
  },
  {
    "path": "static/assets/scss/volt/components/_icons.scss",
    "chars": 2881,
    "preview": "/**\n * = Icon boxes\n */\n\n .icon {\n\theight: $icon-size;\n\n\t&.icon-xxs {\n\t\theight: $icon-size-xxs;\n\t}\n\n\t&.icon-xs {\n\t\theigh"
  },
  {
    "path": "static/assets/scss/volt/components/_images.scss",
    "chars": 758,
    "preview": "/**\n * = Images\n */\n .image-xl {\n    height: 20rem;\n    img{\n        height: 20rem;\n    }\n}\n\n.image-lg {\n    height: 12r"
  },
  {
    "path": "static/assets/scss/volt/components/_list-group.scss",
    "chars": 1581,
    "preview": "/**\n * = List groups\n */\n\n// Space list items\n.list-group-space {\n    .list-group-item {\n        margin-bottom: 1.5rem;\n"
  },
  {
    "path": "static/assets/scss/volt/components/_modal.scss",
    "chars": 530,
    "preview": "/**\n * = Modals\n */\n\n.modal{\n    &.static-example{\n        position: relative;\n        display: block;\n    }\n}\n\n.modal-c"
  },
  {
    "path": "static/assets/scss/volt/components/_nav.scss",
    "chars": 4674,
    "preview": "/**\n * = Navs\n */\n\n.nav-link {\n    color: $nav-link-color;\n\n    &:hover,\n    &.active {\n        color: $nav-link-hover-c"
  },
  {
    "path": "static/assets/scss/volt/components/_pagination.scss",
    "chars": 287,
    "preview": "/**\n * = Paginations\n */\n .circle-pagination{\n    .page-link,\n    span{\n        @include display-flex();\n        align-i"
  },
  {
    "path": "static/assets/scss/volt/components/_popover.scss",
    "chars": 243,
    "preview": "/**\n * = Popovers\n */\n\n.popover {\n    border: 0;\n}\n\n\n.popover-header {\n\tfont-weight: $font-weight-bold;\n}\n\n// Alternativ"
  },
  {
    "path": "static/assets/scss/volt/components/_progress.scss",
    "chars": 2160,
    "preview": "/**\n * = Progress bars\n */\n\n.progress-wrapper {\n    position: relative;\n}\n\n.progress-bar {\n    box-shadow: none;\n    bor"
  },
  {
    "path": "static/assets/scss/volt/components/_scrollbar.scss",
    "chars": 4675,
    "preview": "[data-simplebar] {\n    position: fixed;\n    flex-direction: column;\n    flex-wrap: wrap;\n    justify-content: flex-start"
  },
  {
    "path": "static/assets/scss/volt/components/_shapes.scss",
    "chars": 221,
    "preview": "/**\n * = Shapes\n */\n\n.avatar-sm {\n    width: $avatar-sm-y;\n    height: $avatar-sm-x;\n}\n\n.avatar-md {\n    width: $avatar-"
  },
  {
    "path": "static/assets/scss/volt/components/_steps.scss",
    "chars": 1251,
    "preview": "/**steps\n * = Accordions\n */\n\n.step{\n    position: relative;\n    margin-bottom: 4rem;\n    border-radius: 6px;\n\n    .step"
  },
  {
    "path": "static/assets/scss/volt/components/_tables.scss",
    "chars": 9675,
    "preview": "// General styles\n\n.table {\n\n  thead th {\n      padding-top: $table-head-spacer-y;\n      padding-bottom: $table-head-spa"
  },
  {
    "path": "static/assets/scss/volt/components/_timelines.scss",
    "chars": 436,
    "preview": "/**\n * = Timelines\n */\n\n.list-group-timeline {\n    .list-group-item {\n        position: relative;\n        .col-auto{\n   "
  },
  {
    "path": "static/assets/scss/volt/components/_tooltip.scss",
    "chars": 800,
    "preview": "// Wrapper for the tooltip content\n\n.tooltip-inner {\n    @include box-shadow($box-shadow);\n}\n\n.chartist-tooltip {\n    po"
  },
  {
    "path": "static/assets/scss/volt/components/_type.scss",
    "chars": 2634,
    "preview": "/**\n * = Typography\n */\n\nh1,h2,h3,h4,h5,h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n\tfont-family: $font-family-sans-serif;\n\tfont-"
  },
  {
    "path": "static/assets/scss/volt/forms/_form-check.scss",
    "chars": 278,
    "preview": ".form-check-input {\n    &.round-check{\n        &[type=\"checkbox\"] {\n            @include border-radius($form-check-radio"
  },
  {
    "path": "static/assets/scss/volt/forms/_form-control.scss",
    "chars": 417,
    "preview": ".form-control{\n\n    @include media-breakpoint-up(lg) {\n        &.form-control-lg{\n            padding: $inpu-lg-padding-"
  },
  {
    "path": "static/assets/scss/volt/forms/_form-select.scss",
    "chars": 479,
    "preview": ".form-select {\n    .form-select-lg{\n        padding: $form-select-padding-y ($form-select-padding-x + $form-select-indic"
  },
  {
    "path": "static/assets/scss/volt/forms/_input-group.scss",
    "chars": 248,
    "preview": ".input-group {\n    .form-control:focus {\n        border-color: $input-border-color;\n\n        & + .input-group-text {\n   "
  },
  {
    "path": "static/assets/scss/volt/layout/_footer.scss",
    "chars": 1874,
    "preview": "/**\n * = Footers\n */\n\n .footer{\n\n    ul{\n        margin-bottom: 0;\n        padding: 0;\n        list-style: none;\n\n      "
  },
  {
    "path": "static/assets/scss/volt/layout/_navbar.scss",
    "chars": 8142,
    "preview": "/**\n * = Navigation bars\n */\n\n .navbar-main {\n    position: absolute;\n    top: 0;\n    width: 100%;\n    z-index: 100;\n\n  "
  },
  {
    "path": "static/assets/scss/volt/layout/_section.scss",
    "chars": 3190,
    "preview": "/**\n * = Sections\n */\n\n.section {\n    position: relative;\n    padding-top: $spacer * 3;\n    padding-bottom: $spacer * 3;"
  },
  {
    "path": "static/assets/scss/volt/layout/_sidebar.scss",
    "chars": 640,
    "preview": "/**\n * = Sidebars\n */\n\n #doc-index:not(.collapse.show), .doc-sidebar {\n    display: none;\n}\n\n@include media-breakpoint-u"
  },
  {
    "path": "static/assets/scss/volt/layout/_sidenav.scss",
    "chars": 2596,
    "preview": "/*\n * Sidebar\n*/\n.sidebar {\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 100;\n\tmax-height"
  },
  {
    "path": "static/assets/scss/volt/mixins/_animations.scss",
    "chars": 1296,
    "preview": "@mixin perspective($value){\n    -webkit-perspective: $value;\n    -moz-perspective: $value;\n    -o-perspective: $value;\n "
  },
  {
    "path": "static/assets/scss/volt/mixins/_background-variant.scss",
    "chars": 633,
    "preview": "// Contextual backgrounds\n@mixin bg-variant($parent, $color) {\n    #{$parent} {\n        background-color: $color !import"
  },
  {
    "path": "static/assets/scss/volt/mixins/_icon.scss",
    "chars": 620,
    "preview": "@mixin icon-shape-variant($color) {\n    color: $color;\n    background-color: rgba( $color, .3 );\n}\n\n@mixin icon-parallax"
  },
  {
    "path": "static/assets/scss/volt/mixins/_modals.scss",
    "chars": 379,
    "preview": "@mixin modal-variant($background) {\n\t.modal-title {\n\t\tcolor: color-yiq($background);\n\t}\n\t.modal-header,\n\t.modal-footer {"
  },
  {
    "path": "static/assets/scss/volt/mixins/_popover.scss",
    "chars": 603,
    "preview": "@mixin popover-variant($background) {\n\n\tbackground-color: $background;\n\n\t.popover-header {\n\t\tbackground-color: $backgrou"
  },
  {
    "path": "static/assets/scss/volt/mixins/_transform.scss",
    "chars": 343,
    "preview": "\n@mixin transform($transforms) {\n\t-moz-transform: $transforms;\n\t-o-transform: $transforms;\n\t-ms-transform: $transforms;\n"
  },
  {
    "path": "static/assets/scss/volt/mixins/_utilities.scss",
    "chars": 2644,
    "preview": "@mixin filter($filter) {\n    -webkit-filter: #{$filter};\n\t-moz-filter: #{$filter};\n\t-ms-filter: #{$filter};\n\t-o-filter: "
  },
  {
    "path": "static/assets/scss/volt.scss",
    "chars": 3073,
    "preview": "/*\n\n=========================================================\n* Volt - Free Bootstrap 5 Dashboard\n======================"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/cjs/popper-base.js",
    "chars": 36049,
    "preview": "/**\n * @popperjs/core v2.9.3 - MIT License\n */\n\n'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: tru"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/cjs/popper-base.js.flow",
    "chars": 51,
    "preview": "// @flow\n\nexport * from '../../lib/popper-base.js'\n"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/cjs/popper-lite.js",
    "chars": 45865,
    "preview": "/**\n * @popperjs/core v2.9.3 - MIT License\n */\n\n'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: tru"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/cjs/popper-lite.js.flow",
    "chars": 51,
    "preview": "// @flow\n\nexport * from '../../lib/popper-lite.js'\n"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/cjs/popper.js",
    "chars": 65092,
    "preview": "/**\n * @popperjs/core v2.9.3 - MIT License\n */\n\n'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: tru"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/cjs/popper.js.flow",
    "chars": 46,
    "preview": "// @flow\n\nexport * from '../../lib/popper.js'\n"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/createPopper.js",
    "chars": 9879,
    "preview": "import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\""
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/contains.js",
    "chars": 677,
    "preview": "import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n  var rootNode = child"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getBoundingClientRect.js",
    "chars": 814,
    "preview": "import { isHTMLElement } from \"./instanceOf.js\";\nvar round = Math.round;\nexport default function getBoundingClientRect(e"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getClippingRect.js",
    "chars": 3305,
    "preview": "import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from "
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getCompositeRect.js",
    "chars": 2007,
    "preview": "import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport g"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getComputedStyle.js",
    "chars": 148,
    "preview": "import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n  return getWindow(element)."
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getDocumentElement.js",
    "chars": 311,
    "preview": "import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n  // $FlowFixMe[incom"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getDocumentRect.js",
    "chars": 1227,
    "preview": "import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport g"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getHTMLElementScroll.js",
    "chars": 142,
    "preview": "export default function getHTMLElementScroll(element) {\n  return {\n    scrollLeft: element.scrollLeft,\n    scrollTop: el"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getLayoutRect.js",
    "chars": 767,
    "preview": "import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getNodeName.js",
    "chars": 114,
    "preview": "export default function getNodeName(element) {\n  return element ? (element.nodeName || '').toLowerCase() : null;\n}"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getNodeScroll.js",
    "chars": 396,
    "preview": "import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } fro"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getOffsetParent.js",
    "chars": 2518,
    "preview": "import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getC"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getParentNode.js",
    "chars": 759,
    "preview": "import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowR"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getScrollParent.js",
    "chars": 546,
    "preview": "import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName fro"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getViewportRect.js",
    "chars": 1593,
    "preview": "import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getWindow.js",
    "chars": 273,
    "preview": "export default function getWindow(node) {\n  if (node == null) {\n    return window;\n  }\n\n  if (node.toString() !== '[obje"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getWindowScroll.js",
    "chars": 258,
    "preview": "import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n  var win = getWindow(node);\n  v"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/getWindowScrollBarX.js",
    "chars": 721,
    "preview": "import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\""
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/instanceOf.js",
    "chars": 621,
    "preview": "import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n  var OwnElement = getWindow(node).Element;\n  return"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/isScrollParent.js",
    "chars": 440,
    "preview": "import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n  // Firefox wan"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/isTableElement.js",
    "chars": 162,
    "preview": "import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n  return ['table', 'td', '"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/dom-utils/listScrollParents.js",
    "chars": 1177,
    "preview": "import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow fro"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/enums.js",
    "chars": 1335,
    "preview": "export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var a"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/index.js",
    "chars": 443,
    "preview": "export * from \"./enums.js\";\nexport * from \"./modifiers/index.js\"; // eslint-disable-next-line import/no-unused-modules\n\n"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/modifiers/applyStyles.js",
    "chars": 2527,
    "preview": "import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // Th"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/modifiers/arrow.js",
    "chars": 3874,
    "preview": "import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\n"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/modifiers/computeStyles.js",
    "chars": 5787,
    "preview": "import { top, left, right, bottom } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\ni"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/modifiers/eventListeners.js",
    "chars": 1330,
    "preview": "import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/modifiers/flip.js",
    "chars": 4908,
    "preview": "import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlace"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/modifiers/hide.js",
    "chars": 1954,
    "preview": "import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfuncti"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/modifiers/index.js",
    "chars": 502,
    "preview": "export { default as applyStyles } from \"./applyStyles.js\";\nexport { default as arrow } from \"./arrow.js\";\nexport { defau"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/modifiers/offset.js",
    "chars": 1559,
    "preview": "import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\";"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/modifiers/popperOffsets.js",
    "chars": 706,
    "preview": "import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n  var state = _ref.state,\n     "
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/modifiers/preventOverflow.js",
    "chars": 5549,
    "preview": "import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.j"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/popper-base.js",
    "chars": 193,
    "preview": "import { createPopper, popperGenerator, detectOverflow } from \"./createPopper.js\";\n// eslint-disable-next-line import/no"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/popper-lite.js",
    "chars": 603,
    "preview": "import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListen"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/popper.js",
    "chars": 1090,
    "preview": "import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListen"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/types.js",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/computeAutoPlacement.js",
    "chars": 1991,
    "preview": "import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements "
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/computeOffsets.js",
    "chars": 1738,
    "preview": "import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFr"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/debounce.js",
    "chars": 302,
    "preview": "export default function debounce(fn) {\n  var pending;\n  return function () {\n    if (!pending) {\n      pending = new Pro"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/detectOverflow.js",
    "chars": 3432,
    "preview": "import getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport getClippingRect from \"../dom-utils/get"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/expandToHashMap.js",
    "chars": 159,
    "preview": "export default function expandToHashMap(value, keys) {\n  return keys.reduce(function (hashMap, key) {\n    hashMap[key] ="
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/format.js",
    "chars": 286,
    "preview": "export default function format(str) {\n  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _ke"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/getAltAxis.js",
    "chars": 79,
    "preview": "export default function getAltAxis(axis) {\n  return axis === 'x' ? 'y' : 'x';\n}"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/getAltLen.js",
    "chars": 89,
    "preview": "export default function getAltLen(len) {\n  return len === 'width' ? 'height' : 'width';\n}"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/getBasePlacement.js",
    "chars": 125,
    "preview": "import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n  return placement.split('-')["
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/getFreshSideObject.js",
    "chars": 117,
    "preview": "export default function getFreshSideObject() {\n  return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0\n  };\n}"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/getMainAxisFromPlacement.js",
    "chars": 127,
    "preview": "export default function getMainAxisFromPlacement(placement) {\n  return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' :"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/getOppositePlacement.js",
    "chars": 248,
    "preview": "var hash = {\n  left: 'right',\n  right: 'left',\n  bottom: 'top',\n  top: 'bottom'\n};\nexport default function getOppositePl"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/getOppositeVariationPlacement.js",
    "chars": 209,
    "preview": "var hash = {\n  start: 'end',\n  end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n  retu"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/getVariation.js",
    "chars": 85,
    "preview": "export default function getVariation(placement) {\n  return placement.split('-')[1];\n}"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/math.js",
    "chars": 84,
    "preview": "export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/mergeByName.js",
    "chars": 524,
    "preview": "export default function mergeByName(modifiers) {\n  var merged = modifiers.reduce(function (merged, current) {\n    var ex"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/mergePaddingObject.js",
    "chars": 184,
    "preview": "import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n  "
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/orderModifiers.js",
    "chars": 1240,
    "preview": "import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(mo"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/rectToClientRect.js",
    "chars": 191,
    "preview": "export default function rectToClientRect(rect) {\n  return Object.assign({}, rect, {\n    left: rect.x,\n    top: rect.y,\n "
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/uniqueBy.js",
    "chars": 252,
    "preview": "export default function uniqueBy(arr, fn) {\n  var identifiers = new Set();\n  return arr.filter(function (item) {\n    var"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/validateModifiers.js",
    "chars": 3008,
    "preview": "import format from \"./format.js\";\nimport { modifierPhases } from \"../enums.js\";\nvar INVALID_MODIFIER_ERROR = 'Popper: mo"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/esm/utils/within.js",
    "chars": 155,
    "preview": "import { max as mathMax, min as mathMin } from \"./math.js\";\nexport default function within(min, value, max) {\n  return m"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/umd/popper-base.min.js.flow",
    "chars": 51,
    "preview": "// @flow\n\nexport * from '../../lib/popper-base.js'\n"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/umd/popper-lite.min.js.flow",
    "chars": 51,
    "preview": "// @flow\n\nexport * from '../../lib/popper-lite.js'\n"
  },
  {
    "path": "static/assets/vendor/@popperjs/core/dist/umd/popper.min.js.flow",
    "chars": 46,
    "preview": "// @flow\n\nexport * from '../../lib/popper.js'\n"
  },
  {
    "path": "static/assets/vendor/chartist-plugin-tooltips/dist/chartist-plugin-tooltip.css",
    "chars": 821,
    "preview": ".chartist-tooltip {\n  position: absolute;\n  display: inline-block;\n  opacity: 0;\n  min-width: 5em;\n  padding: .5em;\n  ba"
  },
  {
    "path": "static/assets/vendor/notyf/notyf.es.js",
    "chars": 18811,
    "preview": "/*! *****************************************************************************\nCopyright (c) Microsoft Corporation.\n\n"
  },
  {
    "path": "static/assets/vendor/notyf/notyf.umd.js",
    "chars": 20746,
    "preview": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factor"
  },
  {
    "path": "static/assets/vendor/nouislider/distribute/nouislider.min.mjs",
    "chars": 28374,
    "preview": "\"use strict\";var PipsMode,PipsType;function isValidFormatter(t){return isValidPartialFormatter(t)&&\"function\"==typeof t."
  },
  {
    "path": "static/assets/vendor/nouislider/distribute/nouislider.mjs",
    "chars": 92437,
    "preview": "\"use strict\";\nexport var PipsMode;\n(function (PipsMode) {\n    PipsMode[\"Range\"] = \"range\";\n    PipsMode[\"Steps\"] = \"step"
  },
  {
    "path": "static/assets/vendor/onscreen/dist/index.js",
    "chars": 8207,
    "preview": "parcelRequire=function(e,r,t,n){var i,o=\"function\"==typeof parcelRequire&&parcelRequire,u=\"function\"==typeof require&&re"
  },
  {
    "path": "static/assets/vendor/onscreen/dist/on-screen.es6.js",
    "chars": 12011,
    "preview": "/**\n * Observes DOM mutations and runs a callback function when\n * detecting one.\n *\n * @param {node} obj The DOM node y"
  },
  {
    "path": "static/assets/vendor/simplebar/dist/simplebar-core.esm.js",
    "chars": 32398,
    "preview": "/**\n * SimpleBar.js - v5.3.5\n * Scrollbars, simpler.\n * https://grsmto.github.io/simplebar/\n *\n * Made by Adrien Denat f"
  },
  {
    "path": "static/assets/vendor/simplebar/dist/simplebar.esm.js",
    "chars": 36157,
    "preview": "/**\n * SimpleBar.js - v5.3.5\n * Scrollbars, simpler.\n * https://grsmto.github.io/simplebar/\n *\n * Made by Adrien Denat f"
  },
  {
    "path": "static/assets/vendor/simplebar/dist/simplebar.umd.js",
    "chars": 4604,
    "preview": "/**\n * simplebar - v6.0.0-beta.10\n * Scrollbars, simpler.\n * https://grsmto.github.io/simplebar/\n *\n * Made by Adrien De"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/ar-tn.js",
    "chars": 665,
    "preview": "/**\n * Arabic-Tunisia translation for bootstrap-datepicker\n * Souhaieb Besbes <besbes.souhaieb@gmail.com>\n */\n(function "
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/ar.js",
    "chars": 679,
    "preview": "/**\n * Arabic translation for bootstrap-datepicker\n * Mohammed Alshehri <alshehri866@gmail.com>\n */\n(function () {\n  Dat"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/az.js",
    "chars": 609,
    "preview": "// Azerbaijani\n(function () {\n  Datepicker.locales.az = {\n    days: [\"Bazar\", \"Bazar ertəsi\", \"Çərşənbə axşamı\", \"Çərşən"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/bg.js",
    "chars": 621,
    "preview": "/**\n * Bulgarian translation for bootstrap-datepicker\n * Apostol Apostolov <apostol.s.apostolov@gmail.com>\n */\n(function"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/bm.js",
    "chars": 716,
    "preview": "/**\n * Bamanankan (bm) translation for bootstrap-datepicker\n * Fatou Fall <fatou@medicmobile.org>\n */\n(function () {\n  D"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/bn.js",
    "chars": 807,
    "preview": "/**\n * Bengali (Bangla) translation for bootstrap-datepicker\n * Karim Khan <kkhancse91@gmail.com>\n * Orif N. Jr. <orif.z"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/br.js",
    "chars": 707,
    "preview": "/**\n * Breton translation for bootstrap-datepicker\n * Gwenn Meynier <tornoz@laposte.net>\n */\n(function () {\n  Datepicker"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/bs.js",
    "chars": 619,
    "preview": "/**\n * Bosnian translation for bootstrap-datepicker\n */\n(function () {\n  Datepicker.locales.bs = {\n    days: [\"Nedjelja\""
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/ca.js",
    "chars": 708,
    "preview": "/**\n * Catalan translation for bootstrap-datepicker\n * J. Garcia <jogaco.en@gmail.com>\n */\n(function () {\n  Datepicker.l"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/cs.js",
    "chars": 744,
    "preview": "/**\n * Czech translation for bootstrap-datepicker\n * Matěj Koubík <matej@koubik.name>\n * Fixes by Michal Remiš <michal.r"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/cy.js",
    "chars": 604,
    "preview": "/**\n * Welsh translation for bootstrap-datepicker\n * S. Morris <s.morris@bangor.ac.uk>\n */\n(function () {\n  Datepicker.l"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/da.js",
    "chars": 768,
    "preview": "/**\n * Danish translation for bootstrap-datepicker\n * Christian Pedersen <https: //github.com/chripede>\n * Ivan Mylyanyk"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/de.js",
    "chars": 698,
    "preview": "/**\n * German translation for bootstrap-datepicker\n * Sam Zurcher <sam@orelias.ch>\n */\n(function () {\n  Datepicker.local"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/el.js",
    "chars": 676,
    "preview": "/**\n * Greek translation for bootstrap-datepicker\n */\n(function () {\n  Datepicker.locales.el = {\n    days: [\"Κυριακή\", \""
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/en-AU.js",
    "chars": 734,
    "preview": "/**\n * Australian English translation for bootstrap-datepicker\n * Steve Chapman <steven.p.chapman@gmail.com>\n */\n(functi"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/en-CA.js",
    "chars": 720,
    "preview": "/**\n * Canadian English translation for bootstrap-datepicker\n * Mike Nacey <mnacey@gmail.com>\n */\n(function () {\n  Datep"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/en-GB.js",
    "chars": 727,
    "preview": "/**\n * British English translation for bootstrap-datepicker\n * Xavier Dutreilh <xavier@dutreilh.com>\n */\n(function () {\n"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/en-IE.js",
    "chars": 684,
    "preview": "/**\n * Irish English translation for bootstrap-datepicker\n */\n(function () {\n  Datepicker.locales['en-IE'] = {\n    days:"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/en-NZ.js",
    "chars": 689,
    "preview": "/**\n * New Zealand English translation for bootstrap-datepicker\n */\n(function () {\n  Datepicker.locales['en-NZ'] = {\n   "
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/en-ZA.js",
    "chars": 691,
    "preview": "/**\n * South African English translation for bootstrap-datepicker\n */\n(function () {\n  Datepicker.locales['en-ZA'] = {\n "
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/eo.js",
    "chars": 712,
    "preview": "/**\n * Esperanto translation for bootstrap-datepicker\n * Emmanuel Debanne <https: //github.com/debanne>\n */\n(function ()"
  },
  {
    "path": "static/assets/vendor/vanillajs-datepicker/dist/js/locales/es.js",
    "chars": 712,
    "preview": "/**\n * Spanish translation for bootstrap-datepicker\n * Bruno Bonamin <bruno.bonamin@gmail.com>\n */\n(function () {\n  Date"
  }
]

// ... and 93 more files (download for full content)

About this extraction

This page contains the full source code of the app-generator/flask-volt-dashboard GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 293 files (1.6 MB), approximately 504.6k tokens, and a symbol index with 480 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!