diff --git a/.flake8 b/.flake8 new file mode 100644 index 00000000..0e744493 --- /dev/null +++ b/.flake8 @@ -0,0 +1,14 @@ +[flake8] +max-line-length = 88 +# E203/W503 — conflicts with black's formatting style +# E501 — line length enforced by black instead +# E266 — block comment style (## allowed) +# F841 — local variable assigned but never used +extend-ignore = E203, W503, E501, E266, F841 +exclude = + .git, + __pycache__, + migrations, + venv, + staticfiles, + .pre-commit-config.yaml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..baa49437 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,71 @@ +name: CI + +on: + push: + branches: ["**"] + pull_request: + branches: ["**"] + +jobs: + pre-commit: + name: pre-commit checks + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Cache pre-commit environments + uses: actions/cache@v4 + with: + path: ~/.cache/pre-commit + key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }} + + - name: Install pre-commit + run: pip install pre-commit + + - name: Run pre-commit + run: pre-commit run --all-files + + test: + name: Django tests + runs-on: ubuntu-latest + + env: + SECRET_KEY: ci-secret-key-not-for-production + DEBUG: "True" + EMAIL_BACKEND: django.core.mail.backends.console.EmailBackend + EMAIL_HOST: localhost + EMAIL_PORT: "25" + EMAIL_USE_TLS: "False" + EMAIL_HOST_USER: "" + EMAIL_HOST_PASSWORD: "" + EMAIL_FROM_ADDRESS: ci@example.com + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Cache pip dependencies + uses: actions/cache@v4 + with: + path: ~/.cache/pip + key: pip-${{ hashFiles('requirements.txt') }} + restore-keys: pip- + + - name: Install dependencies + run: pip install -r requirements.txt + + - name: Run migrations + run: python manage.py migrate --no-input + + - name: Run tests + run: python manage.py test --verbosity=2 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..ce54dfce --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,17 @@ +repos: + - repo: https://github.com/psf/black + rev: 22.12.0 + hooks: + - id: black + language_version: python3 + + - repo: https://github.com/PyCQA/isort + rev: 5.13.2 + hooks: + - id: isort + args: ["--profile", "black"] + + - repo: https://github.com/PyCQA/flake8 + rev: 7.1.1 + hooks: + - id: flake8 diff --git a/Procfile.tailwind b/Procfile.tailwind new file mode 100644 index 00000000..bd986290 --- /dev/null +++ b/Procfile.tailwind @@ -0,0 +1,2 @@ +django: python manage.py runserver +tailwind: python manage.py tailwind start \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index e237583c..00000000 --- a/README.md +++ /dev/null @@ -1,97 +0,0 @@ -![Group 23](https://github.com/user-attachments/assets/4e84251a-27b0-462b-bd5e-fb0bcadc4694) - -### The world’s most high-end designed, lightweight, and feature-rich learning management system. - -# SkyLearn: Open source learning management system - -Learning management system using Django web framework. You might want to develop a learning management system (also known as a school/college management system) for a school/college organization, or simply for the purpose of learning the tech stack and enhancing your portfolio. In either case, this project would be a great way to get started. The aim is to create the world's most lightweight yet feature-rich learning management system. However, this is not possible without your support, so please give it a star ⭐️. - -_Documentation is under development_ - -Let's enhance the project by contributing! 👩‍💻👩‍💻 - -screenshot - -## Current features - -- Dashboard: School demographics and analytics. Restricted to only admins -- News And Events: All users can access this page -- Admin manages students(Add, Update, Delete) -- Admin manages lecturers(Add, Update, Delete) -- Students can Add and Drop courses -- Lecturers submit students' scores: _Attendance, Mid exam, Final exam, assignment_ -- The system calculates students' _Total, average, point, and grades automatically_ -- Grade comment for each student with a **pass**, **fail**, or **pass with a warning** -- Assessment result page for students -- Grade result page for students -- Session/year and semester management -- Assessments and grades will be grouped by semester -- Upload video and documentation for each course -- PDF generator for students' registration slip and grade result -- Page access restriction -- Storing of quiz results under each user -- Question order randomization -- Previous quiz scores can be viewed on the category page -- Correct answers can be shown after each question or all at once at the end -- Logged-in users can return to an incomplete quiz to finish it and non-logged-in users can complete a quiz if their session persists -- The quiz can be limited to one attempt per user -- Questions can be given a category -- Success rate for each category can be monitored on a progress page -- Explanation for each question result can be given -- Pass marks can be set -- Multiple choice question type -- True/False question type -- Essay question type................._Coming soon_ -- Custom message displayed for those that pass or fail a quiz -- Custom permission (view_sittings) added, allowing users with that permission to view quiz results from users -- A marking page which lists completed quizzes, can be filtered by quiz or user, and is used to mark essay questions - -# Quick note for future contributors - -If you would like to contribute, simply begin by implementing one from the list in the `TODO.md` file. - -# Requirements: - -> The following program(s) are required to run the project - -- [Python3.8+](https://www.python.org/downloads/) - -# Installation - -- Clone the repo with - -```bash -git clone https://github.com/SkyCascade/SkyLearn.git -``` - -- Create and activate a python virtual environment - -```bash -pip install -r requirements.txt -``` - -- Create `.env` file inside the root directory - -- Copy and paste everything in the `.env.example` file into the `.env` file. Don't forget to customize the variable values - -```bash -python manage.py migrate -``` - -```bash -python manage.py createsuperuser -``` - -```bash -python manage.py runserver -``` - -Last but not least, go to this address http://127.0.0.1:8000 - -#### _Check [this page](https://adilmohak.github.io/dj-lms-starter/) for more insight and support._ - -# References - -- Quiz part: https://github.com/tomwalker/django_quiz - -#### Show your support by ⭐️ this project! diff --git a/TODO.md b/TODO.md deleted file mode 100644 index 383f7ae3..00000000 --- a/TODO.md +++ /dev/null @@ -1,31 +0,0 @@ -# TODO - -- **School calendar** - - School calendar should be implemented displayed on the home page along with news and events - - Managed by admin/superadmin -- **News and events** - - News and events should be associated with the calendar -- **Add and Drop**: - - Department head - - The add and drop page should only include courses offered by the department head. - - Add and drop date should be restricted by the school calendar. -- **Payment integration**: - - Integrating PayPal and Stripe for students to pay their fees. -- **Integrate the dashboard with dynamic/live data**: - - Overall attendance - - School demographics - - Lecturer qualification - - Students' level - - Students average grade per course: - This helps to keep track of students' performance - - Overall Course Resources - - Total number of videos, courses, documentation - - Event calendar: - - A calendar that shows upcoming events - - Enrollments per course - - How many students enroll in each course - - Website traffic over a specific user type (Admin, Student, Lecturer, etc.) -- **Apply data exporting for all tables**: - - This can be done using jQuery libraries like `DataTables` -- **Using a template to PDF converter to generate reports**: - - This can be done using the popular package `xhtml2pdf` diff --git a/accounts/admin.py b/accounts/admin.py index e7f44f6e..70cff076 100644 --- a/accounts/admin.py +++ b/accounts/admin.py @@ -1,5 +1,6 @@ from django.contrib import admin -from .models import User, Student, Parent + +from .models import Parent, Student, User class UserAdmin(admin.ModelAdmin): diff --git a/accounts/apps.py b/accounts/apps.py index 5f932406..c678467e 100644 --- a/accounts/apps.py +++ b/accounts/apps.py @@ -6,6 +6,7 @@ class AccountsConfig(AppConfig): def ready(self) -> None: from django.db.models.signals import post_save + from .models import User from .signals import post_save_account_receiver diff --git a/accounts/authentication.py b/accounts/authentication.py new file mode 100644 index 00000000..8eafa72f --- /dev/null +++ b/accounts/authentication.py @@ -0,0 +1,29 @@ +""" +Custom JWT authentication using httpOnly cookies for better security +""" +from django.conf import settings +from rest_framework_simplejwt.authentication import JWTAuthentication + + +class JWTCookieAuthentication(JWTAuthentication): + """ + Custom authentication class that reads JWT from httpOnly cookies + instead of Authorization header + """ + + def authenticate(self, request): + # Try to get token from cookie first + raw_token = request.COOKIES.get(settings.SIMPLE_JWT_COOKIE_NAME) + + # If no cookie, fall back to header (for backwards compatibility during migration) + if raw_token is None: + header = self.get_header(request) + if header is None: + return None + raw_token = self.get_raw_token(header) + + if raw_token is None: + return None + + validated_token = self.get_validated_token(raw_token) + return self.get_user(validated_token), validated_token diff --git a/accounts/filters.py b/accounts/filters.py index b2652e42..d80ff94a 100644 --- a/accounts/filters.py +++ b/accounts/filters.py @@ -1,6 +1,7 @@ -from django.db.models import Q import django_filters -from .models import User, Student +from django.db.models import Q + +from .models import Student, User class LecturerFilter(django_filters.FilterSet): diff --git a/accounts/forms.py b/accounts/forms.py index 3958ee0d..25f1982d 100644 --- a/accounts/forms.py +++ b/accounts/forms.py @@ -1,12 +1,13 @@ +from course.models import Program from django import forms -from django.db import transaction from django.contrib.auth.forms import ( - UserCreationForm, + PasswordResetForm, UserChangeForm, + UserCreationForm, ) -from django.contrib.auth.forms import PasswordResetForm -from course.models import Program -from .models import User, Student, Parent, RELATION_SHIP, LEVEL, GENDERS +from django.db import transaction + +from .models import GENDERS, LEVEL, RELATION_SHIP, Parent, Student, User class StaffAddForm(UserCreationForm): diff --git a/accounts/migrations/0001_initial.py b/accounts/migrations/0001_initial.py index 453a42ba..3e49bc38 100644 --- a/accounts/migrations/0001_initial.py +++ b/accounts/migrations/0001_initial.py @@ -1,80 +1,292 @@ -# Generated by Django 4.0.8 on 2024-08-31 11:51 +# Generated by Django 4.2.20 on 2025-12-28 15:53 -import accounts.models +import django.contrib.auth.models import django.contrib.auth.validators -from django.db import migrations, models +import django.db.models.deletion import django.utils.timezone +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): initial = True - dependencies = [ - ] + dependencies = [] operations = [ migrations.CreateModel( - name='User', + name="User", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), - ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), - ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), - ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), - ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), - ('is_student', models.BooleanField(default=False)), - ('is_lecturer', models.BooleanField(default=False)), - ('is_parent', models.BooleanField(default=False)), - ('is_dep_head', models.BooleanField(default=False)), - ('gender', models.CharField(blank=True, choices=[('M', 'Male'), ('F', 'Female')], max_length=1, null=True)), - ('phone', models.CharField(blank=True, max_length=60, null=True)), - ('address', models.CharField(blank=True, max_length=60, null=True)), - ('picture', models.ImageField(default='default.png', null=True, upload_to='profile_pictures/%y/%m/%d/')), - ('email', models.EmailField(blank=True, max_length=254, null=True)), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("password", models.CharField(max_length=128, verbose_name="password")), + ( + "last_login", + models.DateTimeField( + blank=True, null=True, verbose_name="last login" + ), + ), + ( + "is_superuser", + models.BooleanField( + default=False, + help_text="Designates that this user has all permissions without explicitly assigning them.", + verbose_name="superuser status", + ), + ), + ( + "username", + models.CharField( + error_messages={ + "unique": "A user with that username already exists." + }, + help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", + max_length=150, + unique=True, + validators=[ + django.contrib.auth.validators.UnicodeUsernameValidator() + ], + verbose_name="username", + ), + ), + ( + "first_name", + models.CharField( + blank=True, max_length=150, verbose_name="first name" + ), + ), + ( + "last_name", + models.CharField( + blank=True, max_length=150, verbose_name="last name" + ), + ), + ( + "is_staff", + models.BooleanField( + default=False, + help_text="Designates whether the user can log into this admin site.", + verbose_name="staff status", + ), + ), + ( + "is_active", + models.BooleanField( + default=True, + help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.", + verbose_name="active", + ), + ), + ( + "date_joined", + models.DateTimeField( + default=django.utils.timezone.now, verbose_name="date joined" + ), + ), + ("is_student", models.BooleanField(default=False)), + ("is_lecturer", models.BooleanField(default=False)), + ("is_parent", models.BooleanField(default=False)), + ("is_dep_head", models.BooleanField(default=False)), + ( + "gender", + models.CharField( + blank=True, + choices=[("M", "Male"), ("F", "Female")], + max_length=1, + null=True, + ), + ), + ("phone", models.CharField(blank=True, max_length=60, null=True)), + ("address", models.CharField(blank=True, max_length=60, null=True)), + ( + "picture", + models.ImageField( + default="default.png", + null=True, + upload_to="profile_pictures/%y/%m/%d/", + ), + ), + ("email", models.EmailField(blank=True, max_length=254, null=True)), ], options={ - 'ordering': ('-date_joined',), + "verbose_name": "User", + "verbose_name_plural": "Users", }, managers=[ - ('objects', accounts.models.CustomUserManager()), + ("objects", django.contrib.auth.models.UserManager()), + ], + ), + migrations.CreateModel( + name="Group", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=100)), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_groups", + to=settings.AUTH_USER_MODEL, + ), + ), ], ), migrations.CreateModel( - name='DepartmentHead', + name="Student", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_students", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "group", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="students", + to="accounts.group", + ), + ), + ( + "student", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="student_profile", + to=settings.AUTH_USER_MODEL, + ), + ), ], options={ - 'ordering': ('-user__date_joined',), + "verbose_name": "Student", + "verbose_name_plural": "Students", }, ), migrations.CreateModel( - name='Parent', + name="Parent", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_name', models.CharField(max_length=120)), - ('last_name', models.CharField(max_length=120)), - ('phone', models.CharField(blank=True, max_length=60, null=True)), - ('email', models.EmailField(blank=True, max_length=254, null=True)), - ('relation_ship', models.TextField(blank=True, choices=[('Father', 'Father'), ('Mother', 'Mother'), ('Brother', 'Brother'), ('Sister', 'Sister'), ('Grand mother', 'Grand mother'), ('Grand father', 'Grand father'), ('Other', 'Other')])), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("first_name", models.CharField(max_length=120)), + ("last_name", models.CharField(max_length=120)), + ("phone", models.CharField(blank=True, max_length=60, null=True)), + ("email", models.EmailField(blank=True, max_length=254, null=True)), + ( + "relation_ship", + models.TextField( + blank=True, choices=[("Father", "Father"), ("Mother", "Mother")] + ), + ), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_parents", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "student", + models.OneToOneField( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="parent_profile", + to="accounts.student", + ), + ), + ( + "user", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="parent_profile", + to=settings.AUTH_USER_MODEL, + ), + ), ], options={ - 'ordering': ('-user__date_joined',), + "ordering": ("-user__date_joined",), }, ), migrations.CreateModel( - name='Student', + name="Lecturer", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('level', models.CharField(choices=[('Bachelor', 'Bachelor Degree'), ('Master', 'Master Degree')], max_length=25, null=True)), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_lecturers", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "lecturer", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="lecturer_profile", + to=settings.AUTH_USER_MODEL, + ), + ), ], options={ - 'ordering': ('-student__date_joined',), + "verbose_name": "Lecturer", + "verbose_name_plural": "Lecturers", }, ), ] diff --git a/accounts/migrations/0002_group_program_user_groups_user_user_permissions.py b/accounts/migrations/0002_group_program_user_groups_user_user_permissions.py new file mode 100644 index 00000000..5cabaaa5 --- /dev/null +++ b/accounts/migrations/0002_group_program_user_groups_user_user_permissions.py @@ -0,0 +1,51 @@ +# Generated by Django 5.2.8 on 2025-12-28 15:54 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("accounts", "0001_initial"), + ("auth", "0012_alter_user_first_name_max_length"), + ("core", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="group", + name="program", + field=models.ForeignKey( + default=1, + on_delete=django.db.models.deletion.CASCADE, + related_name="groups", + to="core.program", + ), + preserve_default=False, + ), + migrations.AddField( + model_name="user", + name="groups", + field=models.ManyToManyField( + blank=True, + help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.", + related_name="user_set", + related_query_name="user", + to="auth.group", + verbose_name="groups", + ), + ), + migrations.AddField( + model_name="user", + name="user_permissions", + field=models.ManyToManyField( + blank=True, + help_text="Specific permissions for this user.", + related_name="user_set", + related_query_name="user", + to="auth.permission", + verbose_name="user permissions", + ), + ), + ] diff --git a/accounts/migrations/0002_initial.py b/accounts/migrations/0002_initial.py deleted file mode 100644 index ab458685..00000000 --- a/accounts/migrations/0002_initial.py +++ /dev/null @@ -1,59 +0,0 @@ -# Generated by Django 4.0.8 on 2024-08-31 11:51 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('accounts', '0001_initial'), - ('auth', '0012_alter_user_first_name_max_length'), - ('course', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='student', - name='program', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='course.program'), - ), - migrations.AddField( - model_name='student', - name='student', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='parent', - name='student', - field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.SET_NULL, to='accounts.student'), - ), - migrations.AddField( - model_name='parent', - name='user', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='departmenthead', - name='department', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='course.program'), - ), - migrations.AddField( - model_name='departmenthead', - name='user', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='user', - name='groups', - field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups'), - ), - migrations.AddField( - model_name='user', - name='user_permissions', - field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions'), - ), - ] diff --git a/accounts/migrations/0003_alter_user_first_name_alter_user_last_name.py b/accounts/migrations/0003_alter_user_first_name_alter_user_last_name.py new file mode 100644 index 00000000..cdb794a0 --- /dev/null +++ b/accounts/migrations/0003_alter_user_first_name_alter_user_last_name.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.8 on 2025-12-29 03:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("accounts", "0002_group_program_user_groups_user_user_permissions"), + ] + + operations = [ + migrations.AlterField( + model_name="user", + name="first_name", + field=models.CharField(blank=True, max_length=120, null=True), + ), + migrations.AlterField( + model_name="user", + name="last_name", + field=models.CharField(blank=True, max_length=120, null=True), + ), + ] diff --git a/accounts/migrations/0004_add_lecturer_model.py b/accounts/migrations/0004_add_lecturer_model.py new file mode 100644 index 00000000..36eede13 --- /dev/null +++ b/accounts/migrations/0004_add_lecturer_model.py @@ -0,0 +1,52 @@ +# Generated by Django 5.2.8 on 2025-12-29 03:51 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("accounts", "0003_alter_user_first_name_alter_user_last_name"), + ] + + operations = [ + migrations.CreateModel( + name="Lecturer", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_lecturers", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "lecturer", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="lecturer_profile", + to="accounts.user", + ), + ), + ], + options={ + "verbose_name": "Lecturer", + "verbose_name_plural": "Lecturers", + }, + ), + ] diff --git a/accounts/models.py b/accounts/models.py index 7aa88992..af65a502 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -1,69 +1,18 @@ +from django.contrib.auth.models import AbstractUser from django.db import models from django.urls import reverse -from django.contrib.auth.models import AbstractUser, UserManager -from django.conf import settings from django.utils.translation import gettext_lazy as _ -from django.db.models import Q -from PIL import Image -from course.models import Program -from .validators import ASCIIUsernameValidator - - -# LEVEL_COURSE = "Level course" -BACHELOR_DEGREE = _("Bachelor") -MASTER_DEGREE = _("Master") - -LEVEL = ( - # (LEVEL_COURSE, "Level course"), - (BACHELOR_DEGREE, _("Bachelor Degree")), - (MASTER_DEGREE, _("Master Degree")), -) +from config import settings FATHER = _("Father") MOTHER = _("Mother") -BROTHER = _("Brother") -SISTER = _("Sister") -GRAND_MOTHER = _("Grand mother") -GRAND_FATHER = _("Grand father") -OTHER = _("Other") RELATION_SHIP = ( (FATHER, _("Father")), (MOTHER, _("Mother")), - (BROTHER, _("Brother")), - (SISTER, _("Sister")), - (GRAND_MOTHER, _("Grand mother")), - (GRAND_FATHER, _("Grand father")), - (OTHER, _("Other")), ) - -class CustomUserManager(UserManager): - def search(self, query=None): - queryset = self.get_queryset() - if query is not None: - or_lookup = ( - Q(username__icontains=query) - | Q(first_name__icontains=query) - | Q(last_name__icontains=query) - | Q(email__icontains=query) - ) - queryset = queryset.filter( - or_lookup - ).distinct() # distinct() is often necessary with Q lookups - return queryset - - def get_student_count(self): - return self.model.objects.filter(is_student=True).count() - - def get_lecturer_count(self): - return self.model.objects.filter(is_lecturer=True).count() - - def get_superuser_count(self): - return self.model.objects.filter(is_superuser=True).count() - - GENDERS = ((_("M"), _("Male")), (_("F"), _("Female"))) @@ -79,102 +28,97 @@ class User(AbstractUser): upload_to="profile_pictures/%y/%m/%d/", default="default.png", null=True ) email = models.EmailField(blank=True, null=True) + first_name = models.CharField(max_length=120, blank=True, null=True) + last_name = models.CharField(max_length=120, blank=True, null=True) - username_validator = ASCIIUsernameValidator() + class Meta: + verbose_name = "User" + verbose_name_plural = "Users" + + def get_full_name(self): + return f"{self.first_name} {self.last_name}" - objects = CustomUserManager() + +class Lecturer(models.Model): + lecturer = models.OneToOneField( + User, on_delete=models.CASCADE, related_name="lecturer_profile" + ) + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_lecturers", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + ) class Meta: - ordering = ("-date_joined",) + verbose_name = "Lecturer" + verbose_name_plural = "Lecturers" + + def __str__(self): + return self.lecturer.get_full_name() - @property def get_full_name(self): - full_name = self.username - if self.first_name and self.last_name: - full_name = self.first_name + " " + self.last_name - return full_name + """Return the full name of the lecturer""" + return self.lecturer.get_full_name() + + +class Group(models.Model): + name = models.CharField(max_length=100) + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_groups", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + ) + program = models.ForeignKey( + "core.Program", on_delete=models.CASCADE, related_name="groups" + ) def __str__(self): - return "{} ({})".format(self.username, self.get_full_name) - - @property - def get_user_role(self): - if self.is_superuser: - role = _("Admin") - elif self.is_student: - role = _("Student") - elif self.is_lecturer: - role = _("Lecturer") - elif self.is_parent: - role = _("Parent") - - return role - - def get_picture(self): - try: - return self.picture.url - except: - no_picture = settings.MEDIA_URL + "default.png" - return no_picture + return self.name def get_absolute_url(self): - return reverse("profile_single", kwargs={"user_id": self.id}) - - def save(self, *args, **kwargs): - super().save(*args, **kwargs) - try: - img = Image.open(self.picture.path) - if img.height > 300 or img.width > 300: - output_size = (300, 300) - img.thumbnail(output_size) - img.save(self.picture.path) - except: - pass - - def delete(self, *args, **kwargs): - if self.picture.url != settings.MEDIA_URL + "default.png": - self.picture.delete() - super().delete(*args, **kwargs) - - -class StudentManager(models.Manager): - def search(self, query=None): - qs = self.get_queryset() - if query is not None: - or_lookup = Q(level__icontains=query) | Q(program__icontains=query) - qs = qs.filter( - or_lookup - ).distinct() # distinct() is often necessary with Q lookups - return qs + return reverse("group_detail", kwargs={"pk": self.pk}) + + def get_students(self): + return self.students.all() class Student(models.Model): - student = models.OneToOneField(User, on_delete=models.CASCADE) + student = models.OneToOneField( + User, on_delete=models.CASCADE, related_name="student_profile" + ) # id_number = models.CharField(max_length=20, unique=True, blank=True) - level = models.CharField(max_length=25, choices=LEVEL, null=True) - program = models.ForeignKey(Program, on_delete=models.CASCADE, null=True) - - objects = StudentManager() + group = models.ForeignKey( + Group, + on_delete=models.SET_NULL, + null=True, + blank=True, + related_name="students", # Добавляем related_name для удобства + ) + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_students", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + ) class Meta: - ordering = ("-student__date_joined",) + verbose_name = "Student" + verbose_name_plural = "Students" def __str__(self): - return self.student.get_full_name + return self.student.get_full_name() - @classmethod - def get_gender_count(cls): - males_count = Student.objects.filter(student__gender="M").count() - females_count = Student.objects.filter(student__gender="F").count() - - return {"M": males_count, "F": females_count} - - def get_absolute_url(self): - return reverse("profile_single", kwargs={"user_id": self.id}) - - def delete(self, *args, **kwargs): - self.student.delete() - super().delete(*args, **kwargs) + def get_full_name(self): + """Return the full name of the student""" + return self.student.get_full_name() class Parent(models.Model): @@ -183,8 +127,12 @@ class Parent(models.Model): only view their connected students information """ - user = models.OneToOneField(User, on_delete=models.CASCADE) - student = models.OneToOneField(Student, null=True, on_delete=models.SET_NULL) + user = models.OneToOneField( + User, on_delete=models.CASCADE, related_name="parent_profile" + ) + student = models.OneToOneField( + Student, null=True, on_delete=models.SET_NULL, related_name="parent_profile" + ) first_name = models.CharField(max_length=120) last_name = models.CharField(max_length=120) phone = models.CharField(max_length=60, blank=True, null=True) @@ -193,20 +141,17 @@ class Parent(models.Model): # What is the relationship between the student and # the parent (i.e. father, mother, brother, sister) relation_ship = models.TextField(choices=RELATION_SHIP, blank=True) + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_parents", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + ) class Meta: ordering = ("-user__date_joined",) def __str__(self): return self.user.username - - -class DepartmentHead(models.Model): - user = models.OneToOneField(User, on_delete=models.CASCADE) - department = models.ForeignKey(Program, on_delete=models.CASCADE, null=True) - - class Meta: - ordering = ("-user__date_joined",) - - def __str__(self): - return "{}".format(self.user) diff --git a/accounts/serializers.py b/accounts/serializers.py new file mode 100644 index 00000000..4df9fff5 --- /dev/null +++ b/accounts/serializers.py @@ -0,0 +1,357 @@ +from rest_framework import serializers + +from core.models import Program + +from .models import Group, Lecturer, Parent, Student, User +from .utils import generate_password, send_new_account_email + +# ============================================================================ +# BASE SERIALIZERS +# ============================================================================ + + +class UserSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = [ + "username", + "first_name", + "last_name", + "email", + "phone", + "address", + "gender", + "date_joined", + "is_lecturer", + "is_student", + "is_superuser", + "is_parent", + "is_staff", + ] + + +# ============================================================================ +# Lecturer SERIALIZERS +# ============================================================================ + + +class LecturerListSerializer(serializers.ModelSerializer): + lecturer = UserSerializer() + lecturer_id = serializers.PrimaryKeyRelatedField(source="lecturer", read_only=True) + + class Meta: + model = Lecturer + fields = ["id", "lecturer", "lecturer_id"] + + +class LecturerWriteSerializer(serializers.ModelSerializer): + lecturer = serializers.DictField(write_only=True) + + class Meta: + model = Lecturer + fields = ["lecturer"] + + def create(self, validated_data): + """ + Создаем нового лектора с генерацией пароля и отправкой email + """ + lecturer_data = validated_data.pop("lecturer", {}) + # Генерируем username если не предоставлен + email = lecturer_data.get("email", "") + if not lecturer_data.get("username"): + lecturer_data["username"] = ( + email.split("@")[0] + "_" + str(int(__import__("time").time() * 1000)) + ) + + # Генерируем пароль + password = generate_password() + + # Создаем пользователя + user = User.objects.create_user(**lecturer_data, password=password) + user.is_lecturer = True + user.save() + + # Отправляем email с учетными данными + if user.email: + send_new_account_email(user, password) + + return Lecturer.objects.create(lecturer=user, admin=self.context["admin"]) + + +class LecturerUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ["first_name", "email", "address", "gender", "last_name"] + + def update(self, instance, validated_data): + """ + Обновляем данные лектора + """ + for attr, value in validated_data.items(): + setattr(instance, attr, value) + instance.save() + return instance + + +# ============================================================================ +# Student SERIALIZERS +# ============================================================================ + + +class ProgramSerializer(serializers.ModelSerializer): + class Meta: + model = Program + fields = ["id", "name"] + + +class GroupSerializer(serializers.ModelSerializer): + program = ProgramSerializer() + + class Meta: + model = Group + fields = ["id", "name", "program"] + + +class StudentListSerializer(serializers.ModelSerializer): + student = UserSerializer() + group = GroupSerializer() + + class Meta: + model = Student + fields = ["id", "student", "group"] + + +class StudentListByGroupSerializer(serializers.ModelSerializer): + student = UserSerializer() + + class Meta: + model = Student + fields = ["id", "student", "group"] + + +class StudentWriteSerializer(serializers.ModelSerializer): + student = serializers.DictField(write_only=True) + + class Meta: + model = Student + fields = ["student", "group"] + + def create(self, validated_data): + """ + Создаем нового студента с генерацией пароля и отправкой email + """ + student_data = validated_data.pop("student", {}) + # Извлекаем email для использования в username если username не предоставлен + email = student_data.get("email", "") + if not student_data.get("username"): + student_data["username"] = ( + email.split("@")[0] + "_" + str(int(__import__("time").time() * 1000)) + ) + + # Генерируем пароль + password = generate_password() + + # Создаем пользователя + user = User.objects.create_user(**student_data, password=password) + user.is_student = True + user.save() + + # Отправляем email с учетными данными + if user.email: + send_new_account_email(user, password) + + return Student.objects.create( + student=user, group=validated_data.get("group"), admin=self.context["admin"] + ) + + +class UserUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = [ + "email", + "first_name", + "last_name", + "gender", + "phone", + "address", + "picture", + ] + + +class StudentUpdateSerializer(serializers.ModelSerializer): + student = UserUpdateSerializer() + + class Meta: + model = Student + fields = ["id", "student", "group"] + read_only_fields = ["id"] + + def update(self, instance, validated_data): + user_data = validated_data.pop("student", {}) + + if user_data: + user_serializer = UserUpdateSerializer( + instance.student, data=user_data, partial=True + ) + user_serializer.is_valid(raise_exception=True) + user_serializer.save() + + return super().update(instance, validated_data) + + +# ============================================================================ +# Parent SERIALIZERS +# ============================================================================ + + +class UserForStudentSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ["id", "first_name", "last_name", "email"] + + +class StudentSerializer(serializers.ModelSerializer): + student = UserForStudentSerializer() + + class Meta: + model = Student + fields = ["id", "student", "group"] + + +class ParentListSerializer(serializers.ModelSerializer): + user = UserSerializer() + student = StudentSerializer() + + class Meta: + model = Parent + fields = ["id", "first_name", "last_name", "phone", "student", "user"] + + +class ParentWriteSerializer(serializers.ModelSerializer): + user = serializers.DictField(write_only=True, required=False) + + class Meta: + model = Parent + fields = ["user", "student", "first_name", "last_name", "phone", "email"] + + def create(self, validated_data): + """ + Создаем нового родителя с генерацией пароля и отправкой email + """ + user_data = validated_data.pop("user", {}) + + # Если данные пользователя не предоставлены, используем данные родителя + if not user_data: + user_data = { + "first_name": validated_data.get("first_name", ""), + "last_name": validated_data.get("last_name", ""), + "email": validated_data.get("email", ""), + "phone": validated_data.get("phone", ""), + } + + # Генерируем username если не предоставлен + email = user_data.get("email") or validated_data.get("email", "") + if not user_data.get("username"): + user_data["username"] = ( + email.split("@")[0] + + "_parent_" + + str(int(__import__("time").time() * 1000)) + ) + + # Генерируем пароль + password = generate_password() + + # Создаем пользователя + user = User.objects.create_user(**user_data, password=password) + user.is_parent = True + user.save() + + # Отправляем email с учетными данными + if user.email: + send_new_account_email(user, password) + + return Parent.objects.create( + user=user, + student=validated_data.get("student"), + first_name=validated_data.get("first_name", ""), + last_name=validated_data.get("last_name", ""), + phone=validated_data.get("phone", ""), + email=validated_data.get("email", ""), + admin=self.context.get("admin"), + ) + + def update(self, instance, validated_data): + """ + Автоматически устанавливаем не трогая админ + """ + validated_data.pop("user", None) # Удаляем user из update + for attr, value in validated_data.items(): + setattr(instance, attr, value) + instance.save() + return instance + + +class UserForParentSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ["email", "gender", "phone", "address", "picture"] + + +class ParentUpdateSerializer(serializers.ModelSerializer): + user = UserForParentSerializer() + + class Meta: + model = Parent + fields = [ + "id", + "first_name", + "last_name", + "phone", + "email", + "relation_ship", + "user", + "student", + ] + read_only_fields = ["id", "student"] + + def update(self, instance, validated_data): + user_data = validated_data.pop("user", {}) + + # Обновляем User + if user_data: + user_serializer = UserForParentSerializer( + instance.user, data=user_data, partial=True + ) + user_serializer.is_valid(raise_exception=True) + user_serializer.save() + + return super().update(instance, validated_data) + + +# ============================================================================ +# Group serializers +# ============================================================================ + + +class GroupListSerializer(serializers.ModelSerializer): + program = ProgramSerializer() + + class Meta: + model = Group + fields = ["id", "name", "program"] + + +class GroupWriteSerializer(serializers.ModelSerializer): + class Meta: + model = Group + fields = ["name", "program"] + + def update(self, instance, validated_data): + """ + Автоматически устанавливаем не трогая админ + """ + for attr, value in validated_data.items(): + setattr(instance, attr, value) + instance.save() + return instance diff --git a/accounts/signals.py b/accounts/signals.py index 6a4cfa08..17ad112a 100644 --- a/accounts/signals.py +++ b/accounts/signals.py @@ -1,6 +1,6 @@ from .utils import ( - generate_student_credentials, generate_lecturer_credentials, + generate_student_credentials, send_new_account_email, ) diff --git a/accounts/tests/test_decorators.py b/accounts/tests/test_decorators.py index 5882a8b7..3f11ea7c 100644 --- a/accounts/tests/test_decorators.py +++ b/accounts/tests/test_decorators.py @@ -1,6 +1,7 @@ from django.contrib.auth import get_user_model from django.http import HttpResponse -from django.test import TestCase, RequestFactory +from django.test import RequestFactory, TestCase + from accounts.decorators import admin_required, lecturer_required, student_required User = get_user_model() diff --git a/accounts/tests/test_filters.py b/accounts/tests/test_filters.py index fcca7558..bdba100d 100644 --- a/accounts/tests/test_filters.py +++ b/accounts/tests/test_filters.py @@ -1,7 +1,8 @@ +from course.models import Program from django.test import TestCase + from accounts.filters import LecturerFilter, StudentFilter -from accounts.models import User, Student -from course.models import Program +from accounts.models import Student, User class LecturerFilterTestCase(TestCase): diff --git a/accounts/urls.py b/accounts/urls.py index b83c77be..22993445 100644 --- a/accounts/urls.py +++ b/accounts/urls.py @@ -1,92 +1,82 @@ -from django.urls import path, include +from django.urls import path -# from django.contrib.auth.views import ( -# PasswordResetView, -# PasswordResetDoneView, -# PasswordResetConfirmView, -# PasswordResetCompleteView, -# LoginView, -# LogoutView, -# ) from .views import ( - profile, - profile_single, - admin_panel, - profile_update, - change_password, - LecturerFilterView, - StudentListView, - staff_add_view, - edit_staff, - delete_staff, - student_add_view, - edit_student, - delete_student, - edit_student_program, - ParentAdd, - validate_username, - register, - render_lecturer_pdf_list, # new - render_student_pdf_list, # new + CustomTokenObtainPairView, + GroupCreateView, + GroupListAPIView, + GroupRetrieveUpdateDestroyView, + LecturerCreateView, + LecturerListAPIView, + LecturerRetrieveDestroyView, + LecturerUpdateView, + ParentCreateView, + ParentListAPIView, + ParentRetrieveUpdateDestroyView, + ParentUpdateView, + SecureTokenRefreshView, + StudentCreateView, + StudentListAPIView, + StudentListGroupAPIView, + StudentRetrieveUpdateDestroyView, + StudentUpdateAPIView, + UserProfileView, ) -# from .forms import EmailValidationOnForgotPassword - - urlpatterns = [ - path("", include("django.contrib.auth.urls")), - path("admin_panel/", admin_panel, name="admin_panel"), - path("profile/", profile, name="profile"), - path("profile//detail/", profile_single, name="profile_single"), - path("setting/", profile_update, name="edit_profile"), - path("change_password/", change_password, name="change_password"), - path("lecturers/", LecturerFilterView.as_view(), name="lecturer_list"), - path("lecturer/add/", staff_add_view, name="add_lecturer"), - path("staff//edit/", edit_staff, name="staff_edit"), - path("lecturers//delete/", delete_staff, name="lecturer_delete"), - path("students/", StudentListView.as_view(), name="student_list"), - path("student/add/", student_add_view, name="add_student"), - path("student//edit/", edit_student, name="student_edit"), - path("students//delete/", delete_student, name="student_delete"), + path("token/", CustomTokenObtainPairView.as_view(), name="token_obtain_pair"), + path("token/refresh/", SecureTokenRefreshView.as_view(), name="token_refresh"), + path("profile/", UserProfileView.as_view(), name="user-profile"), + # Lecturer URLs + path("lecturers/", LecturerListAPIView.as_view(), name="lecturer-list"), + path("lecturers/create/", LecturerCreateView.as_view(), name="lecturer-create"), + path( + "lecturers//", + LecturerRetrieveDestroyView.as_view(), + name="lecturer-detail-delete", + ), + path( + "lecturers/update//", + LecturerUpdateView.as_view(), + name="lecturer-update", + ), + # Group URLs + path("groups/", GroupListAPIView.as_view(), name="group-list"), + path("groups/create/", GroupCreateView.as_view(), name="group-create"), + path( + "groups//", + GroupRetrieveUpdateDestroyView.as_view(), + name="group-detail-delete", + ), + path( + "groups/update//", + GroupRetrieveUpdateDestroyView.as_view(), + name="group-update", + ), + # Parent URLs + path("parents/", ParentListAPIView.as_view(), name="parent-list"), + path("parents/create/", ParentCreateView.as_view(), name="parent-create"), path( - "edit_student_program//", - edit_student_program, - name="student_program_edit", + "parents//", + ParentRetrieveUpdateDestroyView.as_view(), + name="parent-detail-delete", ), - path("parents/add/", ParentAdd.as_view(), name="add_parent"), - path("ajax/validate-username/", validate_username, name="validate_username"), - path("register/", register, name="register"), - # paths to pdf + path("parents/update//", ParentUpdateView.as_view(), name="parent-update"), + # Student URLs + path("students/create/", StudentCreateView.as_view(), name="student-create"), path( - "create_lecturers_pdf_list/", render_lecturer_pdf_list, name="lecturer_list_pdf" - ), # new + "students//", + StudentRetrieveUpdateDestroyView.as_view(), + name="student-detail-delete", + ), path( - "create_students_pdf_list/", render_student_pdf_list, name="student_list_pdf" - ), # new - # path('add-student/', StudentAddView.as_view(), name='add_student'), - # path('programs/course/delete//', course_delete, name='delete_course'), - # Setting urls - # path('profile//edit/', profileUpdateView, name='edit_profile'), - # path('profile//change-password/', changePasswordView, name='change_password'), - # ################################################################ - # path('login/', LoginView.as_view(), name='login'), - # path('logout/', LogoutView.as_view(), name='logout', kwargs={'next_page': '/'}), - # path('password-reset/', PasswordResetView.as_view( - # form_class=EmailValidationOnForgotPassword, - # template_name='registration/password_reset.html' - # ), - # name='password_reset'), - # path('password-reset/done/', PasswordResetDoneView.as_view( - # template_name='registration/password_reset_done.html' - # ), - # name='password_reset_done'), - # path('password-reset-confirm///', PasswordResetConfirmView.as_view( - # template_name='registration/password_reset_confirm.html' - # ), - # name='password_reset_confirm'), - # path('password-reset-complete/', PasswordResetCompleteView.as_view( - # template_name='registration/password_reset_complete.html' - # ), - # name='password_reset_complete') - # ################################################################ + "students/update//", + StudentUpdateAPIView.as_view(), + name="student-update", + ), + path("students/", StudentListAPIView.as_view(), name="student-list"), + path( + "students/by-group//", + StudentListGroupAPIView.as_view(), + name="student-by-group", + ), ] diff --git a/accounts/utils.py b/accounts/utils.py index ef5af434..7cb0c4ce 100644 --- a/accounts/utils.py +++ b/accounts/utils.py @@ -1,7 +1,9 @@ import threading from datetime import datetime -from django.contrib.auth import get_user_model + from django.conf import settings +from django.contrib.auth import get_user_model + from core.utils import send_html_email @@ -51,6 +53,8 @@ def run(self): def send_new_account_email(user, password): if user.is_student: template_name = "accounts/email/new_student_account_confirmation.html" + elif user.is_parent: + template_name = "accounts/email/new_parent_account_confirmation.html" else: template_name = "accounts/email/new_lecturer_account_confirmation.html" email = { diff --git a/accounts/views.py b/accounts/views.py index 910df567..26081f65 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -1,413 +1,379 @@ -from django.contrib import messages -from django.contrib.auth import update_session_auth_hash -from django.contrib.auth.decorators import login_required -from django.contrib.auth.forms import PasswordChangeForm -from django.http import HttpResponse, JsonResponse -from django.shortcuts import get_object_or_404, redirect, render -from django.template.loader import get_template, render_to_string -from django.utils.decorators import method_decorator -from django.views.generic import CreateView -from django_filters.views import FilterView -from xhtml2pdf import pisa - -from accounts.decorators import admin_required -from accounts.filters import LecturerFilter, StudentFilter -from accounts.forms import ( - ParentAddForm, - ProfileUpdateForm, - ProgramUpdateForm, - StaffAddForm, - StudentAddForm, +from rest_framework import generics, status +from rest_framework.permissions import IsAdminUser, IsAuthenticated +from rest_framework.response import Response +from rest_framework.views import APIView +from rest_framework_simplejwt.exceptions import InvalidToken, TokenError +from rest_framework_simplejwt.serializers import TokenObtainPairSerializer +from rest_framework_simplejwt.tokens import RefreshToken +from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView + +from attendance.permissions import IsLecturer +from config import settings + +from .models import Group, Lecturer, Parent, Student +from .serializers import ( + GroupListSerializer, + GroupWriteSerializer, + LecturerListSerializer, + LecturerUpdateSerializer, + LecturerWriteSerializer, + ParentListSerializer, + ParentUpdateSerializer, + ParentWriteSerializer, + StudentListByGroupSerializer, + StudentListSerializer, + StudentUpdateSerializer, + StudentWriteSerializer, + UserSerializer, ) -from accounts.models import Parent, Student, User -from core.models import Semester, Session -from course.models import Course -from result.models import TakenCourse - -# ######################################################## -# Utility Functions -# ######################################################## - - -def render_to_pdf(template_name, context): - """Render a given template to PDF format.""" - response = HttpResponse(content_type="application/pdf") - response["Content-Disposition"] = 'filename="profile.pdf"' - template = render_to_string(template_name, context) - pdf = pisa.CreatePDF(template, dest=response) - if pdf.err: - return HttpResponse("We had some problems generating the PDF") - return response - - -# ######################################################## -# Authentication and Registration -# ######################################################## - - -def validate_username(request): - username = request.GET.get("username", None) - data = {"is_taken": User.objects.filter(username__iexact=username).exists()} - return JsonResponse(data) - - -def register(request): - if request.method == "POST": - form = StudentAddForm(request.POST) - if form.is_valid(): - form.save() - messages.success(request, "Account created successfully.") - return redirect("login") - messages.error( - request, "Something is not correct, please fill all fields correctly." - ) - else: - form = StudentAddForm() - return render(request, "registration/register.html", {"form": form}) +# ============================================================================ +# LECTURER VIEWS +# ============================================================================ -# ######################################################## -# Profile Views -# ######################################################## +class LecturerCreateView(generics.CreateAPIView): + serializer_class = LecturerWriteSerializer + permission_classes = [IsAdminUser] -@login_required -def profile(request): - """Show profile of the current user.""" - current_session = Session.objects.filter(is_current_session=True).first() - current_semester = Semester.objects.filter( - is_current_semester=True, session=current_session - ).first() + def get_serializer_context(self): + context = super().get_serializer_context() + context["admin"] = self.request.user + return context - context = { - "title": request.user.get_full_name, - "current_session": current_session, - "current_semester": current_semester, - } - if request.user.is_lecturer: - courses = Course.objects.filter( - allocated_course__lecturer__pk=request.user.id, semester=current_semester - ) - context["courses"] = courses - return render(request, "accounts/profile.html", context) - - if request.user.is_student: - student = get_object_or_404(Student, student__pk=request.user.id) - parent = Parent.objects.filter(student=student).first() - courses = TakenCourse.objects.filter( - student__student__id=request.user.id, course__level=student.level - ) - context.update( +class LecturerListAPIView(generics.ListAPIView): + serializer_class = LecturerListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + return Lecturer.objects.filter(admin=self.request.user) + + +class LecturerRetrieveDestroyView(generics.RetrieveDestroyAPIView): + serializer_class = LecturerListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + return Lecturer.objects.filter(admin=self.request.user) + + +class LecturerUpdateView(generics.UpdateAPIView): + serializer_class = LecturerUpdateSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + return Lecturer.objects.filter(admin=self.request.user) + + +# ============================================================================ +# STUDENT VIEWS +# ============================================================================ + + +class StudentListGroupAPIView(generics.ListAPIView): + serializer_class = StudentListByGroupSerializer + permission_classes = [IsLecturer] + + def get_queryset(self): + group_id = self.kwargs.get("group_id") + return Student.objects.filter(group_id=group_id) + + +class StudentCreateView(generics.CreateAPIView): + serializer_class = StudentWriteSerializer + permission_classes = [IsAdminUser] + + def get_serializer_context(self): + context = super().get_serializer_context() + context["admin"] = self.request.user + return context + + +class StudentListAPIView(generics.ListAPIView): + serializer_class = StudentListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + return Student.objects.filter(admin=self.request.user) + + +class StudentRetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView): + serializer_class = StudentListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + return Student.objects.filter(admin=self.request.user) + + +class StudentUpdateAPIView(generics.UpdateAPIView): + serializer_class = StudentUpdateSerializer + permission_classes = [IsAuthenticated] + + def get_queryset(self): + # Разрешаем обновлять только своих студентов или все в зависимости от прав + if self.request.user.is_superuser or self.request.user.is_dep_head: + return Student.objects.all() + # Для преподавателей - только студентов их групп + elif self.request.user.is_lecturer: + return Student.objects.filter( + group__in=self.request.user.lecturer_groups.all() + ) + else: + return Student.objects.none() + + +# ============================================================================ +# GROUP VIEWS +# ============================================================================ + + +class GroupCreateView(generics.CreateAPIView): + serializer_class = GroupWriteSerializer + permission_classes = [IsAdminUser] + + def perform_create(self, serializer): + serializer.save(admin=self.request.user) + + +class GroupListAPIView(generics.ListAPIView): + serializer_class = GroupListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + return Group.objects.filter(admin=self.request.user) + + +class GroupRetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView): + serializer_class = GroupWriteSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + return Group.objects.filter(admin=self.request.user) + + +# ============================================================================ +# PARENT VIEWS +# ============================================================================ + + +class ParentCreateView(generics.CreateAPIView): + serializer_class = ParentWriteSerializer + permission_classes = [IsAdminUser] + + def get_serializer_context(self): + context = super().get_serializer_context() + context["admin"] = self.request.user + return context + + def perform_create(self, serializer): + serializer.save() + + +class ParentListAPIView(generics.ListAPIView): + serializer_class = ParentListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + return Parent.objects.filter(admin=self.request.user) + + +class ParentRetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView): + serializer_class = ParentWriteSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + return Parent.objects.filter(admin=self.request.user) + + +class ParentUpdateView(generics.UpdateAPIView): + serializer_class = ParentUpdateSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + user = self.request.user + + return Parent.objects.all(admin=user) + + def patch(self, request, *args, **kwargs): + return self.partial_update(request, *args, **kwargs) + + +# ============================================================================ +# Token views +# ============================================================================ + + +class CustomTokenObtainPairSerializer(TokenObtainPairSerializer): + @classmethod + def get_token(cls, user): + token = super().get_token(user) + # Добавляем кастомные поля в токен + token["username"] = user.username + token["email"] = user.email + return token + + def validate(self, attrs): + data = super().validate(attrs) + # Добавляем информацию о пользователе в ответ + data["user"] = UserSerializer(self.user).data + return data + + +class CustomTokenObtainPairView(TokenObtainPairView): + serializer_class = CustomTokenObtainPairSerializer + + def post(self, request, *args, **kwargs): + """ + Secure login that sets tokens in httpOnly cookies + """ + serializer = self.get_serializer(data=request.data) + + try: + serializer.is_valid(raise_exception=True) + except Exception as e: + return Response( + {"error": "Invalid credentials"}, status=status.HTTP_401_UNAUTHORIZED + ) + + # Get tokens + access_token = serializer.validated_data.get("access") + refresh_token = serializer.validated_data.get("refresh") + user_data = serializer.validated_data.get("user") + + # Create response + response = Response( { - "parent": parent, - "courses": courses, - "level": student.level, - } + "user": user_data, + "access": access_token, + "refresh": refresh_token, + "message": "Login successful", + }, + status=status.HTTP_200_OK, ) - return render(request, "accounts/profile.html", context) - - # For superuser or other staff - staff = User.objects.filter(is_lecturer=True) - context["staff"] = staff - return render(request, "accounts/profile.html", context) - - -@login_required -@admin_required -def profile_single(request, user_id): - """Show profile of any selected user.""" - if request.user.id == user_id: - return redirect("profile") - - current_session = Session.objects.filter(is_current_session=True).first() - current_semester = Semester.objects.filter( - is_current_semester=True, session=current_session - ).first() - user = get_object_or_404(User, pk=user_id) - - context = { - "title": user.get_full_name, - "user": user, - "current_session": current_session, - "current_semester": current_semester, - } - - if user.is_lecturer: - courses = Course.objects.filter( - allocated_course__lecturer__pk=user_id, semester=current_semester - ) - context.update( - { - "user_type": "Lecturer", - "courses": courses, - } + + # Set httpOnly cookies + # Access token (short-lived) + response.set_cookie( + key=settings.SIMPLE_JWT.get("AUTH_COOKIE", "access_token"), + value=access_token, + max_age=settings.SIMPLE_JWT.get("ACCESS_TOKEN_LIFETIME").total_seconds(), + httponly=True, + secure=not settings.DEBUG, # True in production (HTTPS) + samesite="Lax", # Protection against CSRF + domain=settings.SIMPLE_JWT.get("AUTH_COOKIE_DOMAIN"), + path="/", ) - elif user.is_student: - student = get_object_or_404(Student, student__pk=user_id) - courses = TakenCourse.objects.filter( - student__student__id=user_id, course__level=student.level + + # Refresh token (long-lived) + response.set_cookie( + key=settings.SIMPLE_JWT.get("AUTH_COOKIE_REFRESH", "refresh_token"), + value=refresh_token, + max_age=settings.SIMPLE_JWT.get("REFRESH_TOKEN_LIFETIME").total_seconds(), + httponly=True, + secure=not settings.DEBUG, + samesite="Lax", + domain=settings.SIMPLE_JWT.get("AUTH_COOKIE_DOMAIN"), + path="/", ) - context.update( - { - "user_type": "Student", - "courses": courses, - "student": student, - } + + return response + + +class SecureTokenRefreshView(TokenRefreshView): + """ + Secure token refresh that uses httpOnly cookies + """ + + def post(self, request, *args, **kwargs): + # Get refresh token from cookie + refresh_token = request.COOKIES.get( + settings.SIMPLE_JWT.get("AUTH_COOKIE_REFRESH", "refresh_token") ) - else: - context["user_type"] = "Superuser" - - if request.GET.get("download_pdf"): - return render_to_pdf("pdf/profile_single.html", context) - - return render(request, "accounts/profile_single.html", context) - - -@login_required -@admin_required -def admin_panel(request): - return render(request, "setting/admin_panel.html", {"title": "Admin Panel"}) - - -# ######################################################## -# Settings Views -# ######################################################## - - -@login_required -def profile_update(request): - if request.method == "POST": - form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user) - if form.is_valid(): - form.save() - messages.success(request, "Your profile has been updated successfully.") - return redirect("profile") - messages.error(request, "Please correct the error(s) below.") - else: - form = ProfileUpdateForm(instance=request.user) - return render(request, "setting/profile_info_change.html", {"form": form}) - - -@login_required -def change_password(request): - if request.method == "POST": - form = PasswordChangeForm(request.user, request.POST) - if form.is_valid(): - user = form.save() - update_session_auth_hash(request, user) - messages.success(request, "Your password was successfully updated!") - return redirect("profile") - messages.error(request, "Please correct the error(s) below.") - else: - form = PasswordChangeForm(request.user) - return render(request, "setting/password_change.html", {"form": form}) - - -# ######################################################## -# Staff (Lecturer) Views -# ######################################################## - - -@login_required -@admin_required -def staff_add_view(request): - if request.method == "POST": - form = StaffAddForm(request.POST) - if form.is_valid(): - lecturer = form.save() - full_name = lecturer.get_full_name - email = lecturer.email - messages.success( - request, - f"Account for lecturer {full_name} has been created. " - f"An email with account credentials will be sent to {email} within a minute.", + + if not refresh_token: + return Response( + {"error": "Refresh token not found"}, + status=status.HTTP_401_UNAUTHORIZED, ) - return redirect("lecturer_list") - else: - form = StaffAddForm() - return render( - request, "accounts/add_staff.html", {"title": "Add Lecturer", "form": form} - ) - - -@login_required -@admin_required -def edit_staff(request, pk): - lecturer = get_object_or_404(User, is_lecturer=True, pk=pk) - if request.method == "POST": - form = ProfileUpdateForm(request.POST, request.FILES, instance=lecturer) - if form.is_valid(): - form.save() - full_name = lecturer.get_full_name - messages.success(request, f"Lecturer {full_name} has been updated.") - return redirect("lecturer_list") - messages.error(request, "Please correct the error below.") - else: - form = ProfileUpdateForm(instance=lecturer) - return render( - request, "accounts/edit_lecturer.html", {"title": "Edit Lecturer", "form": form} - ) - - -@method_decorator([login_required, admin_required], name="dispatch") -class LecturerFilterView(FilterView): - filterset_class = LecturerFilter - queryset = User.objects.filter(is_lecturer=True) - template_name = "accounts/lecturer_list.html" - paginate_by = 10 - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["title"] = "Lecturers" - return context + try: + # Validate and refresh + refresh = RefreshToken(refresh_token) + access_token = str(refresh.access_token) + + # If rotation is enabled, get new refresh token + if settings.SIMPLE_JWT.get("ROTATE_REFRESH_TOKENS", False): + refresh.set_jti() + refresh.set_exp() + new_refresh_token = str(refresh) + else: + new_refresh_token = refresh_token + + response = Response( + { + "message": "Token refreshed successfully", + "access": access_token, + "refresh": new_refresh_token + if settings.SIMPLE_JWT.get("ROTATE_REFRESH_TOKENS", False) + else new_refresh_token, + }, + status=status.HTTP_200_OK, + ) -@login_required -@admin_required -def render_lecturer_pdf_list(request): - lecturers = User.objects.filter(is_lecturer=True) - template_path = "pdf/lecturer_list.html" - context = {"lecturers": lecturers} - response = HttpResponse(content_type="application/pdf") - response["Content-Disposition"] = 'filename="lecturers_list.pdf"' - template = get_template(template_path) - html = template.render(context) - pisa_status = pisa.CreatePDF(html, dest=response) - if pisa_status.err: - return HttpResponse(f"We had some errors
{html}
") - return response - - -@login_required -@admin_required -def delete_staff(request, pk): - lecturer = get_object_or_404(User, is_lecturer=True, pk=pk) - full_name = lecturer.get_full_name - lecturer.delete() - messages.success(request, f"Lecturer {full_name} has been deleted.") - return redirect("lecturer_list") - - -# ######################################################## -# Student Views -# ######################################################## - - -@login_required -@admin_required -def student_add_view(request): - if request.method == "POST": - form = StudentAddForm(request.POST) - if form.is_valid(): - student = form.save() - full_name = student.get_full_name - email = student.email - messages.success( - request, - f"Account for {full_name} has been created. " - f"An email with account credentials will be sent to {email} within a minute.", + # Set new access token cookie + response.set_cookie( + key=settings.SIMPLE_JWT.get("AUTH_COOKIE", "access_token"), + value=access_token, + max_age=settings.SIMPLE_JWT.get( + "ACCESS_TOKEN_LIFETIME" + ).total_seconds(), + httponly=True, + secure=not settings.DEBUG, + samesite="Lax", + domain=settings.SIMPLE_JWT.get("AUTH_COOKIE_DOMAIN"), + path="/", ) - return redirect("student_list") - messages.error(request, "Correct the error(s) below.") - else: - form = StudentAddForm() - return render( - request, "accounts/add_student.html", {"title": "Add Student", "form": form} - ) - - -@login_required -@admin_required -def edit_student(request, pk): - student_user = get_object_or_404(User, is_student=True, pk=pk) - if request.method == "POST": - form = ProfileUpdateForm(request.POST, request.FILES, instance=student_user) - if form.is_valid(): - form.save() - full_name = student_user.get_full_name - messages.success(request, f"Student {full_name} has been updated.") - return redirect("student_list") - messages.error(request, "Please correct the error below.") - else: - form = ProfileUpdateForm(instance=student_user) - return render( - request, "accounts/edit_student.html", {"title": "Edit Student", "form": form} - ) - - -@method_decorator([login_required, admin_required], name="dispatch") -class StudentListView(FilterView): - queryset = Student.objects.all() - filterset_class = StudentFilter - template_name = "accounts/student_list.html" - paginate_by = 10 - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["title"] = "Students" - return context + # Set new refresh token cookie if rotation is enabled + if settings.SIMPLE_JWT.get("ROTATE_REFRESH_TOKENS", False): + response.set_cookie( + key=settings.SIMPLE_JWT.get("AUTH_COOKIE_REFRESH", "refresh_token"), + value=new_refresh_token, + max_age=settings.SIMPLE_JWT.get( + "REFRESH_TOKEN_LIFETIME" + ).total_seconds(), + httponly=True, + secure=not settings.DEBUG, + samesite="Lax", + domain=settings.SIMPLE_JWT.get("AUTH_COOKIE_DOMAIN"), + path="/", + ) + + return response + + except (TokenError, InvalidToken) as e: + return Response( + {"error": "Invalid or expired refresh token"}, + status=status.HTTP_401_UNAUTHORIZED, + ) + + +class UserProfileView(APIView): + """ + Возвращает профиль текущего пользователя + """ + + permission_classes = [IsAuthenticated] + + def get(self, request): + serializer = UserSerializer(request.user) + data = serializer.data + + # Если это студент, добавляем данные студента + if request.user.is_student and hasattr(request.user, "student_profile"): + student = request.user.student_profile + student_serializer = StudentListSerializer(student) + data["student_data"] = student_serializer.data -@login_required -@admin_required -def render_student_pdf_list(request): - students = Student.objects.all() - template_path = "pdf/student_list.html" - context = {"students": students} - response = HttpResponse(content_type="application/pdf") - response["Content-Disposition"] = 'filename="students_list.pdf"' - template = get_template(template_path) - html = template.render(context) - pisa_status = pisa.CreatePDF(html, dest=response) - if pisa_status.err: - return HttpResponse(f"We had some errors
{html}
") - return response - - -@login_required -@admin_required -def delete_student(request, pk): - student = get_object_or_404(Student, pk=pk) - full_name = student.student.get_full_name - student.delete() - messages.success(request, f"Student {full_name} has been deleted.") - return redirect("student_list") - - -@login_required -@admin_required -def edit_student_program(request, pk): - student = get_object_or_404(Student, student_id=pk) - user = get_object_or_404(User, pk=pk) - if request.method == "POST": - form = ProgramUpdateForm(request.POST, request.FILES, instance=student) - if form.is_valid(): - form.save() - full_name = user.get_full_name - messages.success(request, f"{full_name}'s program has been updated.") - return redirect("profile_single", user_id=pk) - messages.error(request, "Please correct the error(s) below.") - else: - form = ProgramUpdateForm(instance=student) - return render( - request, - "accounts/edit_student_program.html", - {"title": "Edit Program", "form": form, "student": student}, - ) - - -# ######################################################## -# Parent Views -# ######################################################## - - -@method_decorator([login_required, admin_required], name="dispatch") -class ParentAdd(CreateView): - model = Parent - form_class = ParentAddForm - template_name = "accounts/parent_form.html" - - def form_valid(self, form): - messages.success(self.request, "Parent added successfully.") - return super().form_valid(form) + return Response(data) diff --git a/attendance/README.md b/attendance/README.md new file mode 100644 index 00000000..8a33d81f --- /dev/null +++ b/attendance/README.md @@ -0,0 +1,144 @@ +# Модуль Attendance (Посещаемость и Расписание) + +## Описание + +Модуль для управления расписанием занятий и учета посещаемости студентов в системе SkyLearn. + +## Модели + +### ScheduleItem (Расписание занятий) + +- `course` - связь с курсом +- `group` - связь с группой студентов +- `order` - порядковый номер занятия в день +- `day` - день недели (Monday-Friday) +- `start` - время начала +- `end` - время окончания + +### Attendance (Посещаемость) + +- `Student` - связь со студентом +- `status` - статус посещения (True - присутствовал, False - отсутствовал) +- `shcedule` - связь с занятием по расписанию + +## Функциональность + +### Для студентов: + +- Просмотр своего расписания +- Просмотр своей посещаемости +- Статистика личной посещаемости + +### Для преподавателей: + +- Просмотр расписания своих занятий +- Отметка посещаемости студентов на своих занятиях +- Массовое обновление посещаемости +- Статистика посещаемости по своим курсам + +### Для администраторов: + +- Полное управление расписанием (создание, редактирование, удаление) +- Полное управление посещаемостью +- Общая статистика по системе + +## API Endpoints + +### Расписание + +- `GET /attendance/schedules/` - список расписания +- `GET /attendance/schedules/{id}/` - конкретное занятие +- `POST /attendance/schedules/` - создать занятие (admin/lecturer) +- `PUT/PATCH /attendance/schedules/{id}/` - обновить занятие (admin/lecturer) +- `DELETE /attendance/schedules/{id}/` - удалить занятие (admin/lecturer) +- `GET /attendance/schedules/group/{group_id}/` - расписание группы +- `GET /attendance/schedules/day/{day}/` - расписание на день +- `GET /attendance/schedules/my_schedule/` - мое расписание + +### Посещаемость + +- `GET /attendance/attendances/` - список посещаемости +- `GET /attendance/attendances/{id}/` - конкретная запись +- `POST /attendance/attendances/` - создать запись (admin) +- `PUT/PATCH /attendance/attendances/{id}/` - обновить запись (admin/lecturer) +- `DELETE /attendance/attendances/{id}/` - удалить запись (admin) +- `GET /attendance/attendances/schedule/{schedule_id}/` - посещаемость занятия +- `GET /attendance/attendances/student/{student_id}/` - посещаемость студента +- `GET /attendance/attendances/my_attendance/` - моя посещаемость (student) +- `GET /attendance/attendances/statistics/` - статистика +- `POST /attendance/attendances/bulk_update/` - массовое обновление (lecturer/admin) + +## Установка + +1. Убедитесь, что модуль добавлен в `INSTALLED_APPS` в `config/settings.py`: + +```python +INSTALLED_APPS = [ + ... + 'attendance', + ... +] +``` + +2. Выполните миграции: + +```bash +python manage.py makemigrations attendance +python manage.py migrate attendance +``` + +3. URL уже подключен в `config/urls.py`: + +```python +path("attendance/", include("attendance.urls")), +``` + +## Использование + +Подробную документацию по API см. в [API_DOCUMENTATION.md](./API_DOCUMENTATION.md) + +## Примеры запросов + +### Получить свое расписание (студент): + +```bash +curl -X GET http://localhost:8000/attendance/schedules/my_schedule/ \ + -H "Authorization: Bearer YOUR_TOKEN" +``` + +### Отметить посещаемость (преподаватель): + +```bash +curl -X POST http://localhost:8000/attendance/attendances/bulk_update/ \ + -H "Authorization: Bearer YOUR_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "schedule_id": 1, + "attendances": [ + {"student_id": 1, "status": true}, + {"student_id": 2, "status": false} + ] + }' +``` + +### Получить статистику: + +```bash +curl -X GET http://localhost:8000/attendance/attendances/statistics/ \ + -H "Authorization: Bearer YOUR_TOKEN" +``` + +## Известные проблемы + +- В модели `Attendance` поле названо `shcedule` вместо `schedule` (опечатка). Рекомендуется исправить в будущих миграциях. +- Поле `Student` в модели `Attendance` должно быть lowercase `student` по PEP8. + +## Зависимости + +- Django REST Framework +- django-filter +- drf-spectacular (для документации API) + +## Лицензия + +Часть проекта SkyLearn diff --git a/course/__init__.py b/attendance/__init__.py similarity index 100% rename from course/__init__.py rename to attendance/__init__.py diff --git a/attendance/admin.py b/attendance/admin.py new file mode 100644 index 00000000..28e4a8a4 --- /dev/null +++ b/attendance/admin.py @@ -0,0 +1,6 @@ +from django.contrib import admin + +from .models import Attendance, ScheduleItem + +admin.site.register(ScheduleItem) +admin.site.register(Attendance) diff --git a/attendance/apps.py b/attendance/apps.py new file mode 100644 index 00000000..ed1c78ce --- /dev/null +++ b/attendance/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class AttendanceConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "attendance" diff --git a/attendance/migrations/0001_initial.py b/attendance/migrations/0001_initial.py new file mode 100644 index 00000000..aa7cc19e --- /dev/null +++ b/attendance/migrations/0001_initial.py @@ -0,0 +1,142 @@ +# Generated by Django 5.2.8 on 2025-12-28 15:54 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ("accounts", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="Attendance", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("status", models.BooleanField(default=False)), + ( + "Student", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="accounts.student", + ), + ), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_attendances", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + ), + migrations.CreateModel( + name="LessonTime", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "order", + models.IntegerField( + help_text="Номер урока (1, 2, 3, ...)", unique=True + ), + ), + ("start_time", models.TimeField(help_text="Время начала урока")), + ("end_time", models.TimeField(help_text="Время окончания урока")), + ( + "admin", + models.ForeignKey( + blank=True, + help_text="Администратор, создавший это расписание времен", + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="lesson_times", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "verbose_name": "Lesson Time", + "verbose_name_plural": "Lesson Times", + "ordering": ["order"], + }, + ), + migrations.CreateModel( + name="ScheduleItem", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "day", + models.CharField( + choices=[ + ("Monday", "Monday"), + ("Tuesday", "Tuesday"), + ("Wednesday", "Wednesday"), + ("Thursday", "Thursday"), + ("Friday", "Friday"), + ], + max_length=10, + ), + ), + ( + "date", + models.DateField( + blank=True, help_text="Дата проведения урока", null=True + ), + ), + ("order", models.IntegerField(blank=True, null=True)), + ("start", models.TimeField(blank=True, null=True)), + ("end", models.TimeField(blank=True, null=True)), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_schedule_items", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "verbose_name": "Schedule Item", + "verbose_name_plural": "Schedule Items", + "ordering": ["date", "lesson_time__order"], + }, + ), + ] diff --git a/attendance/migrations/0002_initial.py b/attendance/migrations/0002_initial.py new file mode 100644 index 00000000..af463188 --- /dev/null +++ b/attendance/migrations/0002_initial.py @@ -0,0 +1,55 @@ +# Generated by Django 5.2.8 on 2025-12-28 15:54 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ("accounts", "0002_group_program_user_groups_user_user_permissions"), + ("attendance", "0001_initial"), + ("core", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="scheduleitem", + name="course", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="core.course" + ), + ), + migrations.AddField( + model_name="scheduleitem", + name="group", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="accounts.group" + ), + ), + migrations.AddField( + model_name="scheduleitem", + name="lesson_time", + field=models.ForeignKey( + blank=True, + help_text="Время урока (автоматически определяет start и end)", + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="attendance.lessontime", + ), + ), + migrations.AddField( + model_name="attendance", + name="shcedule", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="attendance.scheduleitem", + ), + ), + migrations.AlterUniqueTogether( + name="lessontime", + unique_together={("order", "admin")}, + ), + ] diff --git a/attendance/migrations/0003_remove_scheduleitem_end_remove_scheduleitem_order_and_more.py b/attendance/migrations/0003_remove_scheduleitem_end_remove_scheduleitem_order_and_more.py new file mode 100644 index 00000000..98fecb71 --- /dev/null +++ b/attendance/migrations/0003_remove_scheduleitem_end_remove_scheduleitem_order_and_more.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.20 on 2025-12-29 02:31 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("attendance", "0002_initial"), + ] + + operations = [ + migrations.RemoveField( + model_name="scheduleitem", + name="end", + ), + migrations.RemoveField( + model_name="scheduleitem", + name="order", + ), + migrations.RemoveField( + model_name="scheduleitem", + name="start", + ), + ] diff --git a/course/migrations/__init__.py b/attendance/migrations/__init__.py similarity index 100% rename from course/migrations/__init__.py rename to attendance/migrations/__init__.py diff --git a/attendance/models.py b/attendance/models.py new file mode 100644 index 00000000..22e3b222 --- /dev/null +++ b/attendance/models.py @@ -0,0 +1,105 @@ +from django.conf import settings +from django.db import models + +from accounts.models import Group, Student +from core.models import Course + +# Create your models here. + +Days = ( + ("Monday", "Monday"), + ("Tuesday", "Tuesday"), + ("Wednesday", "Wednesday"), + ("Thursday", "Thursday"), + ("Friday", "Friday"), +) + + +class LessonTime(models.Model): + """ + Модель для хранения типовых времен уроков + Например: 1-й урок 9:00-10:30, 2-й урок 10:40-12:10 и т.д. + """ + + order = models.IntegerField(unique=True, help_text="Номер урока (1, 2, 3, ...)") + start_time = models.TimeField(help_text="Время начала урока") + end_time = models.TimeField(help_text="Время окончания урока") + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="lesson_times", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + help_text="Администратор, создавший это расписание времен", + ) + + class Meta: + ordering = ["order"] + verbose_name = "Lesson Time" + verbose_name_plural = "Lesson Times" + unique_together = [["order", "admin"]] + + def __str__(self): + return f"Урок {self.order}: {self.start_time.strftime('%H:%M')} - {self.end_time.strftime('%H:%M')}" + + +class ScheduleItem(models.Model): + course = models.ForeignKey(Course, on_delete=models.CASCADE) + group = models.ForeignKey(Group, on_delete=models.CASCADE) + lesson_time = models.ForeignKey( + LessonTime, + on_delete=models.CASCADE, + help_text="Время урока (автоматически определяет start и end)", + null=True, + blank=True, + ) + day = models.CharField(choices=Days, max_length=10) + date = models.DateField(help_text="Дата проведения урока", null=True, blank=True) + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_schedule_items", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + ) + + class Meta: + ordering = ["date", "lesson_time__order"] + verbose_name = "Schedule Item" + verbose_name_plural = "Schedule Items" + + def __str__(self): + return ( + f"{self.course.title} - {self.group.name} - {self.day} ({self.lesson_time})" + ) + + @property + def start_time(self): + """Время начала урока из LessonTime""" + return self.lesson_time.start_time if self.lesson_time else self.start + + @property + def end_time(self): + """Время окончания урока из LessonTime""" + return self.lesson_time.end_time if self.lesson_time else self.end + + @property + def lesson_order(self): + """Номер урока""" + return self.lesson_time.order if self.lesson_time else self.order + + +class Attendance(models.Model): + Student = models.ForeignKey(Student, on_delete=models.CASCADE) + status = models.BooleanField(default=False) + shcedule = models.ForeignKey(ScheduleItem, on_delete=models.CASCADE) + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_attendances", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + ) diff --git a/attendance/permissions.py b/attendance/permissions.py new file mode 100644 index 00000000..da08d11b --- /dev/null +++ b/attendance/permissions.py @@ -0,0 +1,55 @@ +from rest_framework import permissions + + +class IsStudent(permissions.BasePermission): + """ + Permission check for student users + """ + + def has_permission(self, request, view): + return bool( + request.user + and request.user.is_authenticated + and hasattr(request.user, "student") + ) + + +class IsLecturer(permissions.BasePermission): + """ + Permission check for lecturer users + """ + + def has_permission(self, request, view): + return bool( + request.user and request.user.is_authenticated and request.user.is_lecturer + ) + + +class IsAdminOrLecturer(permissions.BasePermission): + """ + Permission check for admin or lecturer users + """ + + def has_permission(self, request, view): + return bool( + request.user + and request.user.is_authenticated + and (request.user.is_staff or request.user.is_lecturer) + ) + + +class IsOwnerOrAdminOrLecturer(permissions.BasePermission): + """ + Permission check: owner of the object, lecturer, or admin + """ + + def has_object_permission(self, request, view, obj): + # Администраторы и преподаватели имеют полный доступ + if request.user.is_staff or request.user.is_lecturer: + return True + + # Студенты могут просматривать только свою посещаемость + if hasattr(obj, "Student") and hasattr(request.user, "student"): + return obj.Student == request.user.student + + return False diff --git a/attendance/serializers.py b/attendance/serializers.py new file mode 100644 index 00000000..be563a9c --- /dev/null +++ b/attendance/serializers.py @@ -0,0 +1,299 @@ +from rest_framework import serializers + +from .models import Attendance, LessonTime, ScheduleItem + + +class LessonTimeSerializer(serializers.ModelSerializer): + """Сериализатор для времен уроков""" + + class Meta: + model = LessonTime + fields = ["id", "order", "start_time", "end_time"] + read_only_fields = ["id"] + + def create(self, validated_data): + """ + Автоматически устанавливаем admin из контекста + """ + admin = self.context.get("admin") or self.context.get("request").user + validated_data["admin"] = admin + return super().create(validated_data) + + +class ScheduleItemSerializer(serializers.ModelSerializer): + """Базовый сериализатор для расписания""" + + course_title = serializers.CharField(source="course.name", read_only=True) + group_name = serializers.CharField(source="group.name", read_only=True) + lesson_order = serializers.IntegerField(source="lesson_time.order", read_only=True) + start_time = serializers.TimeField(source="lesson_time.start_time", read_only=True) + end_time = serializers.TimeField(source="lesson_time.end_time", read_only=True) + + class Meta: + model = ScheduleItem + fields = [ + "id", + "course", + "course_title", + "group", + "group_name", + "lesson_time", + "lesson_order", + "day", + "date", + "start_time", + "end_time", + ] + + def create(self, validated_data): + """ + Автоматически устанавливаем admin из контекста + """ + admin = self.context.get("admin") or self.context.get("request").user + validated_data["admin"] = admin + return super().create(validated_data) + + +class StudentScheduleItemSerializer(serializers.ModelSerializer): + """Сериализатор расписания для студентов (только чтение)""" + + course_title = serializers.CharField(source="course.name", read_only=True) + group_name = serializers.CharField(source="group.name", read_only=True) + lecturer_name = serializers.SerializerMethodField() + lesson_order = serializers.IntegerField(source="lesson_time.order", read_only=True) + start_time = serializers.TimeField(source="lesson_time.start_time", read_only=True) + end_time = serializers.TimeField(source="lesson_time.end_time", read_only=True) + + class Meta: + model = ScheduleItem + fields = [ + "id", + "course", + "course_title", + "course_code", + "group", + "group_name", + "lecturer_name", + "lesson_order", + "day", + "date", + "start_time", + "end_time", + ] + read_only_fields = [ + "id", + "course", + "group", + "lesson_order", + "day", + "date", + "start_time", + "end_time", + ] + + def get_lecturer_name(self, obj): + # Предполагая, что у Course есть связь с преподавателем + if hasattr(obj.course, "allocated_course"): + allocated = obj.course.allocated_course.first() + if allocated and allocated.lecturer: + return allocated.lecturer.get_full_name + return None + + +class LecturerScheduleItemSerializer(serializers.ModelSerializer): + """Сериализатор расписания для преподавателей""" + + course_title = serializers.CharField(source="course.name", read_only=True) + + group_name = serializers.CharField(source="group.name", read_only=True) + lesson_order = serializers.IntegerField(source="lesson_time.order", read_only=True) + start_time = serializers.TimeField(source="lesson_time.start_time", read_only=True) + end_time = serializers.TimeField(source="lesson_time.end_time", read_only=True) + + class Meta: + model = ScheduleItem + fields = [ + "id", + "course", + "course_title", + "group", + "group_name", + "lesson_order", + "day", + "date", + "start_time", + "end_time", + ] + read_only_fields = ["id", "course_title", "group_name"] + + +class AdminScheduleItemSerializer(serializers.ModelSerializer): + """Сериализатор расписания для администраторов (полный доступ)""" + + course_title = serializers.CharField(source="course.name", read_only=True) + group_name = serializers.CharField(source="group.name", read_only=True) + lesson_order = serializers.IntegerField(source="lesson_time.order", read_only=True) + start_time = serializers.TimeField(source="lesson_time.start_time", read_only=True) + end_time = serializers.TimeField(source="lesson_time.end_time", read_only=True) + + class Meta: + model = ScheduleItem + fields = [ + "id", + "course", + "course_title", + "group", + "group_name", + "lesson_time", + "lesson_order", + "day", + "date", + "start_time", + "end_time", + ] + + def create(self, validated_data): + """ + Автоматически устанавливаем admin из контекста + """ + admin = self.context.get("admin") or self.context.get("request").user + validated_data["admin"] = admin + return super().create(validated_data) + + +class AttendanceSerializer(serializers.ModelSerializer): + """Базовый сериализатор для посещаемости""" + + student_name = serializers.CharField(source="Student.get_full_name", read_only=True) + student_id = serializers.IntegerField(source="Student.id", read_only=True) + schedule_day = serializers.CharField(source="shcedule.day", read_only=True) + schedule_date = serializers.DateField(source="shcedule.date", read_only=True) + schedule_time = serializers.SerializerMethodField() + course_title = serializers.CharField(source="shcedule.course.title", read_only=True) + + class Meta: + model = Attendance + fields = [ + "id", + "Student", + "student_name", + "student_id", + "status", + "shcedule", + "schedule_day", + "schedule_date", + "schedule_time", + "course_title", + ] + + def get_schedule_time(self, obj): + if obj.shcedule and obj.shcedule.lesson_time: + return f"{obj.shcedule.lesson_time.start_time.strftime('%H:%M')} - {obj.shcedule.lesson_time.end_time.strftime('%H:%M')}" + return None + + +class StudentAttendanceSerializer(serializers.ModelSerializer): + """Сериализатор посещаемости для студентов (только чтение)""" + + schedule_day = serializers.CharField(source="shcedule.day", read_only=True) + schedule_date = serializers.DateField(source="shcedule.date", read_only=True) + schedule_time = serializers.SerializerMethodField() + course_title = serializers.CharField(source="shcedule.course.title", read_only=True) + course_code = serializers.CharField(source="shcedule.course.code", read_only=True) + + class Meta: + model = Attendance + fields = [ + "id", + "status", + "shcedule", + "schedule_day", + "schedule_date", + "schedule_time", + "course_title", + "course_code", + ] + read_only_fields = ["id", "status", "shcedule"] + + def get_schedule_time(self, obj): + if obj.shcedule and obj.shcedule.lesson_time: + return f"{obj.shcedule.lesson_time.start_time.strftime('%H:%M')} - {obj.shcedule.lesson_time.end_time.strftime('%H:%M')}" + return None + + +class LecturerAttendanceSerializer(serializers.ModelSerializer): + """Сериализатор посещаемости для преподавателей (можно редактировать)""" + + student_name = serializers.CharField(source="Student.get_full_name", read_only=True) + student_id = serializers.IntegerField(source="Student.id", read_only=True) + schedule_day = serializers.CharField(source="shcedule.day", read_only=True) + schedule_date = serializers.DateField(source="shcedule.date", read_only=True) + schedule_time = serializers.SerializerMethodField() + course_title = serializers.CharField(source="shcedule.course.title", read_only=True) + + class Meta: + model = Attendance + fields = [ + "id", + "Student", + "student_name", + "student_id", + "status", + "shcedule", + "schedule_day", + "schedule_date", + "schedule_time", + "course_title", + ] + read_only_fields = ["Student", "shcedule"] + + def get_schedule_time(self, obj): + if obj.shcedule and obj.shcedule.lesson_time: + return f"{obj.shcedule.lesson_time.start_time.strftime('%H:%M')} - {obj.shcedule.lesson_time.end_time.strftime('%H:%M')}" + return None + + +class AdminAttendanceSerializer(serializers.ModelSerializer): + """Сериализатор посещаемости для администраторов (полный доступ)""" + + student_name = serializers.CharField(source="Student.get_full_name", read_only=True) + schedule_day = serializers.CharField(source="shcedule.day", read_only=True) + schedule_date = serializers.DateField(source="shcedule.date", read_only=True) + schedule_time = serializers.SerializerMethodField() + course_title = serializers.CharField(source="shcedule.course.title", read_only=True) + + class Meta: + model = Attendance + fields = [ + "id", + "Student", + "student_name", + "status", + "shcedule", + "schedule_day", + "schedule_date", + "schedule_time", + "course_title", + ] + + def get_schedule_time(self, obj): + if obj.shcedule and obj.shcedule.lesson_time: + return f"{obj.shcedule.lesson_time.start_time.strftime('%H:%M')} - {obj.shcedule.lesson_time.end_time.strftime('%H:%M')}" + return None + + +class BulkAttendanceUpdateSerializer(serializers.Serializer): + """Сериализатор для массового обновления посещаемости""" + + student_id = serializers.IntegerField() + status = serializers.BooleanField() + + +class BulkAttendancesUpdateSerializer(serializers.Serializer): + """Сериализатор для массового обновления посещаемости по расписанию""" + + schedule_id = serializers.IntegerField() + attendances = BulkAttendanceUpdateSerializer(many=True) + + def validate(self, data): + return data diff --git a/attendance/tests/__init__.py b/attendance/tests/__init__.py new file mode 100644 index 00000000..086ab033 --- /dev/null +++ b/attendance/tests/__init__.py @@ -0,0 +1 @@ +# Tests for attendance app diff --git a/attendance/tests/test_api.py b/attendance/tests/test_api.py new file mode 100644 index 00000000..ce8054d7 --- /dev/null +++ b/attendance/tests/test_api.py @@ -0,0 +1,368 @@ +from datetime import time + +from course.models import Course, Program +from django.contrib.auth import get_user_model +from django.test import TestCase +from rest_framework import status +from rest_framework.authtoken.models import Token +from rest_framework.test import APIClient, APITestCase + +from accounts.models import Group, Student +from attendance.models import Attendance, ScheduleItem + +User = get_user_model() + + +class ScheduleItemModelTest(TestCase): + """Тесты для модели ScheduleItem""" + + def setUp(self): + self.program = Program.objects.create( + title="Computer Science", summary="CS Program" + ) + self.course = Course.objects.create( + title="Python Programming", code="CS101", credit=3, program=self.program + ) + self.group = Group.objects.create(name="Group A") + + def test_schedule_item_creation(self): + """Тест создания занятия в расписании""" + schedule = ScheduleItem.objects.create( + course=self.course, + group=self.group, + order=1, + day="Monday", + start=time(9, 0), + end=time(10, 30), + ) + self.assertEqual(schedule.course, self.course) + self.assertEqual(schedule.group, self.group) + self.assertEqual(schedule.day, "Monday") + + +class AttendanceModelTest(TestCase): + """Тесты для модели Attendance""" + + def setUp(self): + # Создаем пользователя-студента + self.user = User.objects.create_user( + username="student1", password="password123", is_student=True + ) + self.student = Student.objects.create(student=self.user, level="Bachelor") + + # Создаем программу и курс + self.program = Program.objects.create( + title="Computer Science", summary="CS Program" + ) + self.course = Course.objects.create( + title="Python Programming", code="CS101", credit=3, program=self.program + ) + self.group = Group.objects.create(name="Group A") + + # Создаем расписание + self.schedule = ScheduleItem.objects.create( + course=self.course, + group=self.group, + order=1, + day="Monday", + start=time(9, 0), + end=time(10, 30), + ) + + def test_attendance_creation(self): + """Тест создания записи о посещаемости""" + attendance = Attendance.objects.create( + Student=self.student, shcedule=self.schedule, status=True + ) + self.assertEqual(attendance.Student, self.student) + self.assertEqual(attendance.shcedule, self.schedule) + self.assertTrue(attendance.status) + + +class ScheduleItemAPITest(APITestCase): + """Тесты для API расписания""" + + def setUp(self): + # Создаем программу и курс + self.program = Program.objects.create( + title="Computer Science", summary="CS Program" + ) + self.course = Course.objects.create( + title="Python Programming", code="CS101", credit=3, program=self.program + ) + self.group = Group.objects.create(name="Group A") + + # Создаем пользователей разных ролей + self.admin = User.objects.create_superuser( + username="admin", password="admin123", email="admin@test.com" + ) + + self.lecturer = User.objects.create_user( + username="lecturer", password="lecturer123", is_lecturer=True + ) + + self.student_user = User.objects.create_user( + username="student", password="student123", is_student=True + ) + self.student = Student.objects.create( + student=self.student_user, level="Bachelor", group=self.group + ) + + # Создаем токены + self.admin_token = Token.objects.create(user=self.admin) + self.lecturer_token = Token.objects.create(user=self.lecturer) + self.student_token = Token.objects.create(user=self.student_user) + + # Создаем тестовое расписание + self.schedule = ScheduleItem.objects.create( + course=self.course, + group=self.group, + order=1, + day="Monday", + start=time(9, 0), + end=time(10, 30), + ) + + self.client = APIClient() + + def test_student_can_view_schedule(self): + """Студент может просматривать расписание своей группы""" + self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.student_token.key}") + response = self.client.get("/attendance/schedules/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(len(response.data), 1) + + def test_student_cannot_create_schedule(self): + """Студент не может создавать расписание""" + self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.student_token.key}") + data = { + "course": self.course.id, + "group": self.group.id, + "order": 2, + "day": "Tuesday", + "start": "11:00:00", + "end": "12:30:00", + } + response = self.client.post("/attendance/schedules/", data) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + def test_admin_can_create_schedule(self): + """Администратор может создавать расписание""" + self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.admin_token.key}") + data = { + "course": self.course.id, + "group": self.group.id, + "order": 2, + "day": "Tuesday", + "start": "11:00:00", + "end": "12:30:00", + } + response = self.client.post("/attendance/schedules/", data) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + + def test_filter_schedule_by_day(self): + """Фильтрация расписания по дню""" + # Создаем расписание на другой день + ScheduleItem.objects.create( + course=self.course, + group=self.group, + order=1, + day="Tuesday", + start=time(9, 0), + end=time(10, 30), + ) + + self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.admin_token.key}") + response = self.client.get("/attendance/schedules/?day=Monday") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(len(response.data), 1) + self.assertEqual(response.data[0]["day"], "Monday") + + def test_my_schedule_endpoint(self): + """Тест эндпоинта my_schedule для студента""" + self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.student_token.key}") + response = self.client.get("/attendance/schedules/my_schedule/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(len(response.data), 1) + + +class AttendanceAPITest(APITestCase): + """Тесты для API посещаемости""" + + def setUp(self): + # Создаем программу и курс + self.program = Program.objects.create( + title="Computer Science", summary="CS Program" + ) + self.course = Course.objects.create( + title="Python Programming", code="CS101", credit=3, program=self.program + ) + self.group = Group.objects.create(name="Group A") + + # Создаем пользователей + self.admin = User.objects.create_superuser( + username="admin", password="admin123", email="admin@test.com" + ) + + self.lecturer = User.objects.create_user( + username="lecturer", password="lecturer123", is_lecturer=True + ) + + self.student_user = User.objects.create_user( + username="student", password="student123", is_student=True + ) + self.student = Student.objects.create( + student=self.student_user, level="Bachelor", group=self.group + ) + + # Создаем токены + self.admin_token = Token.objects.create(user=self.admin) + self.lecturer_token = Token.objects.create(user=self.lecturer) + self.student_token = Token.objects.create(user=self.student_user) + + # Создаем расписание + self.schedule = ScheduleItem.objects.create( + course=self.course, + group=self.group, + order=1, + day="Monday", + start=time(9, 0), + end=time(10, 30), + ) + + # Создаем запись о посещаемости + self.attendance = Attendance.objects.create( + Student=self.student, shcedule=self.schedule, status=True + ) + + self.client = APIClient() + + def test_student_can_view_own_attendance(self): + """Студент может просматривать свою посещаемость""" + self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.student_token.key}") + response = self.client.get("/attendance/attendances/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(len(response.data), 1) + + def test_student_cannot_update_attendance(self): + """Студент не может обновлять посещаемость""" + self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.student_token.key}") + data = {"status": False} + response = self.client.patch( + f"/attendance/attendances/{self.attendance.id}/", data + ) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + def test_lecturer_can_update_attendance(self): + """Преподаватель может обновлять посещаемость""" + # Связываем преподавателя с курсом + from course.models import CourseAllocation + + CourseAllocation.objects.create(lecturer=self.lecturer, courses=self.course) + + self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.lecturer_token.key}") + data = {"status": False} + response = self.client.patch( + f"/attendance/attendances/{self.attendance.id}/", data + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertFalse(response.data["status"]) + + def test_my_attendance_endpoint(self): + """Тест эндпоинта my_attendance для студента""" + self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.student_token.key}") + response = self.client.get("/attendance/attendances/my_attendance/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(len(response.data), 1) + + def test_statistics_endpoint(self): + """Тест эндпоинта статистики""" + # Создаем еще несколько записей + Attendance.objects.create( + Student=self.student, shcedule=self.schedule, status=False + ) + + self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.student_token.key}") + response = self.client.get("/attendance/attendances/statistics/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertIn("total", response.data) + self.assertIn("present", response.data) + self.assertIn("absent", response.data) + self.assertIn("attendance_rate", response.data) + + def test_bulk_update_attendance(self): + """Тест массового обновления посещаемости""" + # Создаем еще студентов + student2_user = User.objects.create_user( + username="student2", password="student123", is_student=True + ) + student2 = Student.objects.create( + student=student2_user, level="Bachelor", group=self.group + ) + + # Связываем преподавателя с курсом + from course.models import CourseAllocation + + CourseAllocation.objects.create(lecturer=self.lecturer, courses=self.course) + + self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.lecturer_token.key}") + data = { + "schedule_id": self.schedule.id, + "attendances": [ + {"student_id": self.student.id, "status": True}, + {"student_id": student2.id, "status": False}, + ], + } + response = self.client.post( + "/attendance/attendances/bulk_update/", data, format="json" + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(len(response.data), 2) + + +class PermissionsTest(APITestCase): + """Тесты для проверки прав доступа""" + + def setUp(self): + # Создаем пользователей + self.admin = User.objects.create_superuser( + username="admin", password="admin123", email="admin@test.com" + ) + + self.lecturer = User.objects.create_user( + username="lecturer", password="lecturer123", is_lecturer=True + ) + + self.student_user = User.objects.create_user( + username="student", password="student123", is_student=True + ) + + # Создаем токены + self.admin_token = Token.objects.create(user=self.admin) + self.lecturer_token = Token.objects.create(user=self.lecturer) + self.student_token = Token.objects.create(user=self.student_user) + + self.client = APIClient() + + def test_unauthenticated_user_cannot_access(self): + """Неавторизованный пользователь не может получить доступ""" + response = self.client.get("/attendance/schedules/") + self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + + def test_authenticated_student_can_access(self): + """Авторизованный студент может получить доступ""" + self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.student_token.key}") + response = self.client.get("/attendance/schedules/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_authenticated_lecturer_can_access(self): + """Авторизованный преподаватель может получить доступ""" + self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.lecturer_token.key}") + response = self.client.get("/attendance/schedules/") + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_authenticated_admin_can_access(self): + """Авторизованный администратор может получить доступ""" + self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.admin_token.key}") + response = self.client.get("/attendance/schedules/") + self.assertEqual(response.status_code, status.HTTP_200_OK) diff --git a/attendance/urls.py b/attendance/urls.py new file mode 100644 index 00000000..c6e93d77 --- /dev/null +++ b/attendance/urls.py @@ -0,0 +1,15 @@ +from django.urls import include, path +from rest_framework.routers import DefaultRouter + +from .views import AttendanceViewSet, LessonTimeViewSet, ScheduleItemViewSet + +router = DefaultRouter() +router.register(r"lesson-times", LessonTimeViewSet, basename="lesson-time") +router.register(r"schedules", ScheduleItemViewSet, basename="schedule") +router.register(r"attendances", AttendanceViewSet, basename="attendance") + +app_name = "attendance" + +urlpatterns = [ + path("", include(router.urls)), +] diff --git a/attendance/views.py b/attendance/views.py new file mode 100644 index 00000000..aef5fd52 --- /dev/null +++ b/attendance/views.py @@ -0,0 +1,392 @@ +from django.db import transaction +from django_filters.rest_framework import DjangoFilterBackend +from drf_spectacular.types import OpenApiTypes +from drf_spectacular.utils import OpenApiParameter, extend_schema +from rest_framework import status, viewsets +from rest_framework.decorators import action +from rest_framework.filters import OrderingFilter, SearchFilter +from rest_framework.permissions import IsAdminUser, IsAuthenticated +from rest_framework.response import Response + +from core.permissions import IsAdminOrLecturer + +from .models import Attendance, LessonTime, ScheduleItem +from .serializers import ( + AdminAttendanceSerializer, + AdminScheduleItemSerializer, + AttendanceSerializer, + BulkAttendancesUpdateSerializer, + LecturerAttendanceSerializer, + LecturerScheduleItemSerializer, + LessonTimeSerializer, + ScheduleItemSerializer, + StudentAttendanceSerializer, + StudentScheduleItemSerializer, +) + + +class LessonTimeViewSet(viewsets.ModelViewSet): + """ + ViewSet для управления временами уроков. + Только администраторы могут создавать и изменять времена уроков. + """ + + serializer_class = LessonTimeSerializer + permission_classes = [IsAuthenticated, IsAdminUser] + filter_backends = [OrderingFilter] + ordering_fields = ["order"] + ordering = ["order"] + + def get_queryset(self): + """ + Фильтруем времена уроков по админу + """ + user = self.request.user + if user.is_superuser: + return LessonTime.objects.filter(admin=user) + elif hasattr(user, "admin") and user.admin: + # Преподаватели и студенты могут видеть времена уроков своего админа + return LessonTime.objects.filter(admin=user.admin) + return LessonTime.objects.none() + + def get_serializer_context(self): + """Передаем admin в контекст сериализатора""" + context = super().get_serializer_context() + context["admin"] = ( + self.request.user + if self.request.user.is_superuser + else getattr(self.request.user, "admin", None) + ) + return context + + +class ScheduleItemViewSet(viewsets.ModelViewSet): + """ + ViewSet для управления расписанием. + + - Студенты: только чтение своего расписания + - Преподаватели: чтение и редактирование расписания своих групп + - Администраторы: полный доступ + """ + + queryset = ScheduleItem.objects.select_related("course", "group").all() + permission_classes = [IsAuthenticated] + filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] + filterset_fields = ["course", "group", "day"] + + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + + # Студенты видят только расписание своей группы + if hasattr(user, "student"): + student = user.student + if student.group: + queryset = queryset.filter(group=student.group) + else: + queryset = queryset.none() + + # Преподаватели видят расписание групп, где они преподают + elif user.is_lecturer: + # Получаем курсы и группы преподавателя через CourseAllocation + from core.models import CourseAllocation + + allocations = CourseAllocation.objects.filter(lecturer=user) + + # Фильтруем расписание по курсам и группам преподавателя + from django.db.models import Q + + queries = Q() + for allocation in allocations: + course_ids = allocation.courses.values_list("id", flat=True) + if allocation.group: + # Если указана группа, фильтруем по курсу И группе + queries |= Q(course__in=course_ids, group=allocation.group) + else: + # Если группа не указана, показываем все группы для этих курсов + queries |= Q(course__in=course_ids) + + queryset = queryset.filter(queries) if queries else queryset.none() + + return queryset + + def get_serializer_class(self): + user = self.request.user + + if user.is_staff or user.is_superuser: + return AdminScheduleItemSerializer + elif user.is_lecturer: + return LecturerScheduleItemSerializer + elif hasattr(user, "student"): + return StudentScheduleItemSerializer + + return ScheduleItemSerializer + + def get_permissions(self): + """ + Определяет права доступа в зависимости от действия + Только администраторы могут управлять расписанием + """ + if self.action in ["create", "update", "partial_update", "destroy"]: + # Создание, редактирование и удаление только для админов + permission_classes = [IsAuthenticated, IsAdminUser] + else: + permission_classes = [IsAuthenticated] + + return [permission() for permission in permission_classes] + + @extend_schema( + parameters=[ + OpenApiParameter( + name="group_id", + type=OpenApiTypes.INT, + location=OpenApiParameter.PATH, + description="ID группы", + ) + ] + ) + @action(detail=False, methods=["get"], url_path="group/(?P[^/.]+)") + def by_group(self, request, group_id=None): + """Получить расписание по конкретной группе""" + queryset = self.get_queryset().filter(group_id=group_id) + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) + + @extend_schema( + parameters=[ + OpenApiParameter( + name="day", + type=OpenApiTypes.STR, + location=OpenApiParameter.PATH, + description="День недели", + ) + ] + ) + @action(detail=False, methods=["get"], url_path="day/(?P[^/.]+)") + def by_day(self, request, day=None): + """Получить расписание на конкретный день""" + queryset = self.get_queryset().filter(day=day) + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) + + @action(detail=False, methods=["get"]) + def my_schedule(self, request): + """Получить расписание текущего пользователя""" + queryset = self.get_queryset() + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) + + +class AttendanceViewSet(viewsets.ModelViewSet): + """ + ViewSet для управления посещаемостью. + + - Студенты: только чтение своей посещаемости + - Преподаватели: чтение и отметка посещаемости студентов на своих занятиях + - Администраторы: полный доступ + """ + + queryset = Attendance.objects.select_related( + "Student", "Student__student", "shcedule", "shcedule__course", "shcedule__group" + ).all() + permission_classes = [IsAuthenticated] + + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + + # Студенты видят только свою посещаемость + if hasattr(user, "student"): + queryset = queryset.filter(Student=user.student) + + # Преподаватели видят посещаемость на своих занятиях + elif user.is_lecturer: + from core.models import CourseAllocation + + allocations = CourseAllocation.objects.filter(lecturer=user) + + # Фильтруем посещаемость по курсам и группам преподавателя + from django.db.models import Q + + queries = Q() + for allocation in allocations: + course_ids = allocation.courses.values_list("id", flat=True) + if allocation.group: + queries |= Q( + shcedule__course__in=course_ids, + shcedule__group=allocation.group, + ) + else: + queries |= Q(shcedule__course__in=course_ids) + + queryset = queryset.filter(queries) if queries else queryset.none() + + return queryset + + def get_serializer_class(self): + user = self.request.user + + if user.is_staff or user.is_superuser: + return AdminAttendanceSerializer + elif user.is_lecturer: + return LecturerAttendanceSerializer + elif hasattr(user, "student"): + return StudentAttendanceSerializer + + return AttendanceSerializer + + def get_permissions(self): + """ + Определяет права доступа в зависимости от действия + """ + if self.action in ["create", "destroy"]: + # Создание и удаление только для админов + permission_classes = [IsAuthenticated, IsAdminUser] + elif self.action in [ + "update", + "partial_update", + "mark_attendance", + "bulk_update", + ]: + # Обновление для админов и преподавателей + permission_classes = [IsAuthenticated, IsAdminOrLecturer] + else: + permission_classes = [IsAuthenticated] + + return [permission() for permission in permission_classes] + + @extend_schema( + parameters=[ + OpenApiParameter( + name="schedule_id", + type=OpenApiTypes.INT, + location=OpenApiParameter.PATH, + description="ID занятия по расписанию", + ) + ] + ) + @action(detail=False, methods=["get"], url_path="schedule/(?P[^/.]+)") + def by_schedule(self, request, schedule_id=None): + """Получить посещаемость по конкретному занятию""" + queryset = self.get_queryset().filter(shcedule_id=schedule_id) + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) + + @extend_schema( + parameters=[ + OpenApiParameter( + name="student_id", + type=OpenApiTypes.INT, + location=OpenApiParameter.PATH, + description="ID студента", + ) + ] + ) + @action(detail=False, methods=["get"], url_path="student/(?P[^/.]+)") + def by_student(self, request, student_id=None): + """Получить посещаемость конкретного студента""" + queryset = self.get_queryset().filter(Student_id=student_id) + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) + + @action(detail=False, methods=["get"]) + def my_attendance(self, request): + """Получить посещаемость текущего студента""" + if hasattr(request.user, "student"): + queryset = self.get_queryset().filter(Student=request.user.student) + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) + return Response( + {"error": "Только студенты могут получить свою посещаемость"}, + status=status.HTTP_403_FORBIDDEN, + ) + + @action(detail=False, methods=["get"]) + def statistics(self, request): + """Получить статистику посещаемости""" + queryset = self.get_queryset() + + total = queryset.count() + present = queryset.filter(status=True).count() + absent = queryset.filter(status=False).count() + + attendance_rate = (present / total * 100) if total > 0 else 0 + + return Response( + { + "total": total, + "present": present, + "absent": absent, + "attendance_rate": round(attendance_rate, 2), + } + ) + + @extend_schema( + request=BulkAttendancesUpdateSerializer, + responses={200: AttendanceSerializer(many=True)}, + ) + @action( + detail=False, + methods=["post"], + permission_classes=[IsAuthenticated, IsAdminOrLecturer], + ) + def bulk_update(self, request): + """ + Массовое обновление посещаемости для занятия. + Ожидается формат: + { + "schedule_id": 1, + "attendances": [ + {"student_id": 1, "status": true}, + {"student_id": 2, "status": false} + ] + } + """ + serializer = BulkAttendancesUpdateSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + + schedule_id = serializer.validated_data["schedule_id"] + attendances_data = serializer.validated_data["attendances"] + + # Проверяем, что расписание существует + try: + schedule = ScheduleItem.objects.get(id=schedule_id) + except ScheduleItem.DoesNotExist: + return Response( + {"error": "Занятие не найдено"}, status=status.HTTP_404_NOT_FOUND + ) + + # Проверяем права преподавателя + if request.user.is_lecturer and not request.user.is_staff: + from core.models import CourseAllocation + + # Проверяем, что преподаватель назначен на этот курс И группу + has_permission = CourseAllocation.objects.filter( + lecturer=request.user, courses=schedule.course, group=schedule.group + ).exists() + + if not has_permission: + return Response( + { + "error": "У вас нет прав для отметки посещаемости на этом занятии" + }, + status=status.HTTP_403_FORBIDDEN, + ) + + updated_attendances = [] + + with transaction.atomic(): + for attendance_data in attendances_data: + student_id = attendance_data["student_id"] + status_value = attendance_data["status"] + + # Обновляем или создаем запись о посещаемости + attendance, created = Attendance.objects.update_or_create( + Student_id=student_id, + shcedule_id=schedule_id, + defaults={"status": status_value}, + ) + updated_attendances.append(attendance) + + serializer = self.get_serializer(updated_attendances, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) diff --git a/config/asgi.py b/config/asgi.py index 3d6b080e..856079b2 100644 --- a/config/asgi.py +++ b/config/asgi.py @@ -1,4 +1,5 @@ import os + from django.core.asgi import get_asgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings") diff --git a/config/settings.py b/config/settings.py index 43f70b16..20cb1ff0 100644 --- a/config/settings.py +++ b/config/settings.py @@ -11,6 +11,9 @@ """ import os + +import sentry_sdk +import structlog from decouple import config from django.utils.translation import gettext_lazy as _ @@ -28,7 +31,7 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = config("DEBUG", default=True, cast=bool) -ALLOWED_HOSTS = ["127.0.0.1", "adilmohak1.pythonanywhere.com"] +ALLOWED_HOSTS = ["127.0.0.1", "adilmohak1.pythonanywhere.com", "localhost"] # change the default user models to our custom model AUTH_USER_MODEL = "accounts.User" @@ -36,7 +39,6 @@ # Application definition DJANGO_APPS = [ - "modeltranslation", # Translation "jet.dashboard", "jet", "django.contrib.admin", @@ -46,23 +48,31 @@ "django.contrib.messages", "django.contrib.staticfiles", ] +if DEBUG: + # Add django_browser_reload only in DEBUG mode + DJANGO_APPS += ["django_browser_reload"] + +TAILWIND_APP_NAME = "theme" + # Third party apps THIRD_PARTY_APPS = [ "crispy_forms", - "crispy_bootstrap5", "django_filters", + "rest_framework.authtoken", + "rest_framework", + "rest_framework_simplejwt", + "corsheaders", + "drf_spectacular", ] # Custom apps PROJECT_APPS = [ "core.apps.CoreConfig", "accounts.apps.AccountsConfig", - "course.apps.CourseConfig", "result.apps.ResultConfig", - "search.apps.SearchConfig", - "quiz.apps.QuizConfig", - "payments.apps.PaymentsConfig", + "attendance.apps.AttendanceConfig", + "finance.apps.FinanceConfig", ] # Combine all apps @@ -76,10 +86,76 @@ "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", - "django.middleware.locale.LocaleMiddleware", - "whitenoise.middleware.WhiteNoiseMiddleware", # whitenoise to serve static files + "whitenoise.middleware.WhiteNoiseMiddleware", + "corsheaders.middleware.CorsMiddleware", + "django.middleware.common.CommonMiddleware", +] +if DEBUG: + # Add django_browser_reload middleware only in DEBUG mode + MIDDLEWARE += [ + "django_browser_reload.middleware.BrowserReloadMiddleware", + ] + +from datetime import timedelta # noqa: E402 + +# CORS Settings - Important for cookie-based auth +CORS_ALLOW_ALL_ORIGINS = DEBUG # Only allow all origins in development +if not DEBUG: + CORS_ALLOWED_ORIGINS = [ + "https://yourdomain.com", # Add your production frontend URL + "https://www.yourdomain.com", + ] + +CORS_ALLOW_CREDENTIALS = True # Required for cookies +CORS_ALLOW_HEADERS = [ + "accept", + "accept-encoding", + "authorization", + "content-type", + "dnt", + "origin", + "user-agent", + "x-csrftoken", + "x-requested-with", ] +# JWT Settings with Cookie support +SIMPLE_JWT = { + "ACCESS_TOKEN_LIFETIME": timedelta(days=5), # Shorter for better security + "REFRESH_TOKEN_LIFETIME": timedelta(days=7), # 7 days + "ROTATE_REFRESH_TOKENS": True, # Enable token rotation for better security + "BLACKLIST_AFTER_ROTATION": True, + "UPDATE_LAST_LOGIN": True, + # Cookie settings + "AUTH_COOKIE": "access_token", # Cookie name for access token + "AUTH_COOKIE_REFRESH": "refresh_token", # Cookie name for refresh token + "AUTH_COOKIE_DOMAIN": None, # None = current domain, or set specific domain + "AUTH_COOKIE_SECURE": not DEBUG, # True in production (requires HTTPS) + "AUTH_COOKIE_HTTP_ONLY": True, # httpOnly flag + "AUTH_COOKIE_PATH": "/", + "AUTH_COOKIE_SAMESITE": "Lax", # Lax or Strict for CSRF protection +} + +# Cookie name for JWT in requests +SIMPLE_JWT_COOKIE_NAME = "access_token" + +REST_FRAMEWORK = { + "DEFAULT_AUTHENTICATION_CLASSES": ( + "accounts.authentication.JWTCookieAuthentication", # Our custom auth + "rest_framework_simplejwt.authentication.JWTAuthentication", # Fallback + ), + "DEFAULT_PERMISSION_CLASSES": ("rest_framework.permissions.IsAuthenticated",), + "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema", + "EXCEPTION_HANDLER": "core.exception_handler.custom_exception_handler", +} + +SPECTACULAR_SETTINGS = { + "TITLE": "SU API", + "DESCRIPTION": "API for SU educational platform", + "VERSION": "1.0.0", +} + + ROOT_URLCONF = "config.urls" TEMPLATES = [ @@ -144,21 +220,9 @@ def gettext(s): return s -LANGUAGES = ( - ("en", gettext("English")), - ("fr", gettext("French")), - ("es", gettext("Spanish")), - ("ru", gettext("Russia")), -) - -LOCALE_PATHS = (os.path.join(BASE_DIR, "locale"),) - -MODELTRANSLATION_DEFAULT_LANGUAGE = "en" -LANGUAGE_CODE = "en-us" - TIME_ZONE = "UTC" -USE_I18N = True +USE_I18N = False USE_L10N = True @@ -269,3 +333,72 @@ def gettext(s): (SECOND, _("Second")), (THIRD, _("Third")), ) + + +LOGS_DIR = os.path.join(BASE_DIR, "logs") +os.makedirs(LOGS_DIR, exist_ok=True) + +LOGGING = { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "json": { + "()": structlog.stdlib.ProcessorFormatter, + "processor": structlog.processors.JSONRenderer(), + "foreign_pre_chain": [ + structlog.stdlib.add_log_level, + structlog.stdlib.add_logger_name, + structlog.processors.TimeStamper(fmt="iso"), + ], + }, + }, + "handlers": { + "console": { + "class": "logging.StreamHandler", + "formatter": "json", + }, + "file": { + "class": "logging.handlers.RotatingFileHandler", + "filename": os.path.join(LOGS_DIR, "django.log"), + "maxBytes": 10 * 1024 * 1024, # 10 MB + "backupCount": 5, + "formatter": "json", + }, + }, + "root": { + "handlers": ["console", "file"], + "level": "INFO", + }, + "loggers": { + "django": { + "handlers": ["console", "file"], + "level": "INFO", + "propagate": False, + }, + }, +} + +structlog.configure( + processors=[ + structlog.contextvars.merge_contextvars, + structlog.stdlib.filter_by_level, + structlog.stdlib.add_logger_name, + structlog.stdlib.add_log_level, + structlog.processors.TimeStamper(fmt="iso"), + structlog.processors.StackInfoRenderer(), + structlog.processors.format_exc_info, + structlog.processors.UnicodeDecoder(), + structlog.stdlib.ProcessorFormatter.wrap_for_formatter, + ], + wrapper_class=structlog.stdlib.BoundLogger, + context_class=dict, + logger_factory=structlog.stdlib.LoggerFactory(), + cache_logger_on_first_use=True, +) + +sentry_sdk.init( + dsn="https://834dca7c82eb8fd3693afb02042eee38@o4511205924274176.ingest.us.sentry.io/4511205929779200", + send_default_pii=True, + traces_sample_rate=1.0, + environment="development", +) diff --git a/config/urls.py b/config/urls.py index 74aa797b..0e2cb7be 100644 --- a/config/urls.py +++ b/config/urls.py @@ -1,33 +1,47 @@ -from django.contrib import admin -from django.urls import path, include from django.conf import settings from django.conf.urls.static import static +from django.contrib import admin +from django.urls import include, path from django.views import defaults as default_views -from django.conf.urls.i18n import i18n_patterns -from django.views.i18n import JavaScriptCatalog +from drf_spectacular.views import ( + SpectacularAPIView, + SpectacularRedocView, + SpectacularSwaggerView, +) admin.site.site_header = "SkyLearn Admin" + urlpatterns = [ + path("jet/", include("jet.urls", "jet")), + path("jet/dashboard/", include("jet.dashboard.urls", "jet-dashboard")), path("admin/", admin.site.urls), - path("i18n/", include("django.conf.urls.i18n")), -] - -urlpatterns += i18n_patterns( - path("jsi18n/", JavaScriptCatalog.as_view(), name="javascript-catalog"), - path("", include("core.urls")), - path("jet/", include("jet.urls", "jet")), # Django JET URLS + # API Schema + path("api/schema/", SpectacularAPIView.as_view(), name="schema"), + path( + "api/schema/swagger-ui/", + SpectacularSwaggerView.as_view(url_name="schema"), + name="swagger-ui", + ), path( - "jet/dashboard/", include("jet.dashboard.urls", "jet-dashboard") - ), # Django JET dashboard URLS + "api/schema/redoc/", + SpectacularRedocView.as_view(url_name="schema"), + name="redoc", + ), + # Apps URLs + path("", include("core.urls")), path("accounts/", include("accounts.urls")), - path("programs/", include("course.urls")), path("result/", include("result.urls")), - path("search/", include("search.urls")), - path("quiz/", include("quiz.urls")), - path("payments/", include("payments.urls")), -) + path("attendance/", include("attendance.urls")), + path("finance/", include("finance.urls")), +] + +if settings.DEBUG: + # Include django_browser_reload URLs only in DEBUG mode + urlpatterns += [ + path("__reload__/", include("django_browser_reload.urls")), + ] if settings.DEBUG: urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) diff --git a/core/admin.py b/core/admin.py index 6bec2bf0..852cc060 100644 --- a/core/admin.py +++ b/core/admin.py @@ -1,12 +1,10 @@ from django.contrib import admin -from modeltranslation.admin import TranslationAdmin -from .models import Session, Semester, NewsAndEvents - - -class NewsAndEventsAdmin(TranslationAdmin): - pass +from .models import AcademicYear, Course, CourseAllocation, Module, Program, Semester admin.site.register(Semester) -admin.site.register(Session) -admin.site.register(NewsAndEvents, NewsAndEventsAdmin) +admin.site.register(Program) +admin.site.register(AcademicYear) +admin.site.register(Module) +admin.site.register(Course) +admin.site.register(CourseAllocation) diff --git a/core/exception_handler.py b/core/exception_handler.py new file mode 100644 index 00000000..4af297e7 --- /dev/null +++ b/core/exception_handler.py @@ -0,0 +1,49 @@ +import logging + +from django.core.exceptions import PermissionDenied, ValidationError +from django.http import Http404 +from rest_framework import exceptions +from rest_framework.views import exception_handler + +logger = logging.getLogger(__name__) + + +def custom_exception_handler(exc, context): + # Map Django core exceptions to DRF equivalents + if isinstance(exc, Http404): + exc = exceptions.NotFound() + elif isinstance(exc, PermissionDenied): + exc = exceptions.PermissionDenied() + elif isinstance(exc, ValidationError): + exc = exceptions.ValidationError( + detail=exc.message_dict if hasattr(exc, "message_dict") else exc.messages + ) + + response = exception_handler(exc, context) + + if response is not None: + code = response.status_code + + # Flatten DRF error detail into a single string + detail = response.data.get("detail", None) + if detail is not None: + error = str(detail) + else: + # Validation errors: {"field": ["msg"]} → join all messages + messages = [] + for field, value in response.data.items(): + if isinstance(value, list): + for item in value: + messages.append(f"{field}: {item}") + else: + messages.append(f"{field}: {value}") + error = "; ".join(messages) if messages else "An error occurred." + + response.data = {"error": error, "code": code} + + if code >= 500: + logger.error("Server error %s – %s", code, error, exc_info=exc) + elif code >= 400: + logger.warning("Client error %s – %s", code, error) + + return response diff --git a/core/forms.py b/core/forms.py deleted file mode 100644 index 55c1dffa..00000000 --- a/core/forms.py +++ /dev/null @@ -1,78 +0,0 @@ -from django import forms -from .models import NewsAndEvents, Session, Semester, SEMESTER - - -# news and events -class NewsAndEventsForm(forms.ModelForm): - class Meta: - model = NewsAndEvents - fields = ( - "title", - "summary", - "posted_as", - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.fields["title"].widget.attrs.update({"class": "form-control"}) - self.fields["summary"].widget.attrs.update({"class": "form-control"}) - self.fields["posted_as"].widget.attrs.update({"class": "form-control"}) - - -class SessionForm(forms.ModelForm): - next_session_begins = forms.DateTimeField( - widget=forms.TextInput( - attrs={ - "type": "date", - } - ), - required=True, - ) - - class Meta: - model = Session - fields = ["session", "is_current_session", "next_session_begins"] - - -class SemesterForm(forms.ModelForm): - semester = forms.CharField( - widget=forms.Select( - choices=SEMESTER, - attrs={ - "class": "browser-default custom-select", - }, - ), - label="semester", - ) - is_current_semester = forms.CharField( - widget=forms.Select( - choices=((True, "Yes"), (False, "No")), - attrs={ - "class": "browser-default custom-select", - }, - ), - label="is current semester ?", - ) - session = forms.ModelChoiceField( - queryset=Session.objects.all(), - widget=forms.Select( - attrs={ - "class": "browser-default custom-select", - } - ), - required=True, - ) - - next_semester_begins = forms.DateTimeField( - widget=forms.TextInput( - attrs={ - "type": "date", - "class": "form-control", - } - ), - required=True, - ) - - class Meta: - model = Semester - fields = ["semester", "is_current_semester", "session", "next_semester_begins"] diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py index ee2c6d9f..aefa04af 100644 --- a/core/migrations/0001_initial.py +++ b/core/migrations/0001_initial.py @@ -1,7 +1,8 @@ -# Generated by Django 4.0.8 on 2024-08-31 11:51 +# Generated by Django 5.2.8 on 2025-12-28 15:54 -from django.db import migrations, models import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): @@ -9,45 +10,263 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ("accounts", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( - name='ActivityLog', + name="Course", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=200)), + ("description", models.TextField(blank=True, null=True)), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_courses", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "verbose_name": "Course", + "verbose_name_plural": "Courses", + }, + ), + migrations.CreateModel( + name="Program", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=200)), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_programs", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "verbose_name": "Program", + "verbose_name_plural": "Programs", + }, + ), + migrations.CreateModel( + name="AcademicYear", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('message', models.TextField()), - ('created_at', models.DateTimeField(auto_now=True)), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("year", models.IntegerField(unique=True)), + ("is_current", models.BooleanField(default=False)), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_academic_years", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "program", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="academic_years", + to="core.program", + ), + ), ], ), migrations.CreateModel( - name='NewsAndEvents', + name="Semester", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=200, null=True)), - ('summary', models.TextField(blank=True, max_length=200, null=True)), - ('posted_as', models.CharField(choices=[('News', 'News'), ('Event', 'Event')], max_length=10)), - ('updated_date', models.DateTimeField(auto_now=True, null=True)), - ('upload_time', models.DateTimeField(auto_now_add=True, null=True)), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "name", + models.CharField( + choices=[("First", "First"), ("Second", "Second")], + default="First", + max_length=10, + ), + ), + ( + "is_current", + models.BooleanField(blank=True, default=False, null=True), + ), + ( + "academic_year", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="semesters", + to="core.academicyear", + ), + ), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_semesters", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "courses", + models.ManyToManyField(related_name="semesters", to="core.course"), + ), ], + options={ + "verbose_name": "Semester", + "verbose_name_plural": "Semesters", + }, ), migrations.CreateModel( - name='Session', + name="Module", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('session', models.CharField(max_length=200, unique=True)), - ('is_current_session', models.BooleanField(blank=True, default=False, null=True)), - ('next_session_begins', models.DateField(blank=True, null=True)), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "name", + models.CharField( + choices=[("First", "First"), ("Second", "Second")], + max_length=10, + ), + ), + ("is_current", models.BooleanField(default=False)), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_modules", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "semester", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="modules", + to="core.semester", + ), + ), ], + options={ + "verbose_name": "Module", + "verbose_name_plural": "Modules", + }, ), migrations.CreateModel( - name='Semester', + name="CourseAllocation", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('semester', models.CharField(blank=True, choices=[('First', 'First'), ('Second', 'Second'), ('Third', 'Third')], max_length=10)), - ('is_current_semester', models.BooleanField(blank=True, default=False, null=True)), - ('next_semester_begins', models.DateField(blank=True, null=True)), - ('session', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.session')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_course_allocations", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "courses", + models.ManyToManyField( + related_name="course_allocations", to="core.course" + ), + ), + ( + "group", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="course_allocations", + to="accounts.group", + ), + ), + ( + "lecturer", + models.ForeignKey( + limit_choices_to={"is_staff": True}, + on_delete=django.db.models.deletion.CASCADE, + related_name="course_allocations", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "semester", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="course_allocations", + to="core.semester", + ), + ), ], + options={ + "verbose_name": "Course Allocation", + "verbose_name_plural": "Course Allocations", + }, ), ] diff --git a/core/migrations/0002_alter_courseallocation_lecturer.py b/core/migrations/0002_alter_courseallocation_lecturer.py new file mode 100644 index 00000000..1008a097 --- /dev/null +++ b/core/migrations/0002_alter_courseallocation_lecturer.py @@ -0,0 +1,26 @@ +# Generated by Django 5.2.8 on 2025-12-30 04:24 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("core", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AlterField( + model_name="courseallocation", + name="lecturer", + field=models.ForeignKey( + limit_choices_to={"is_lecturer": True}, + on_delete=django.db.models.deletion.CASCADE, + related_name="course_allocations", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/core/migrations/0002_newsandevents_summary_en_newsandevents_summary_ru_and_more.py b/core/migrations/0002_newsandevents_summary_en_newsandevents_summary_ru_and_more.py deleted file mode 100644 index 6a504ec5..00000000 --- a/core/migrations/0002_newsandevents_summary_en_newsandevents_summary_ru_and_more.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 4.2.16 on 2024-09-29 07:44 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("core", "0001_initial"), - ] - - operations = [ - migrations.AddField( - model_name="newsandevents", - name="summary_en", - field=models.TextField(blank=True, max_length=200, null=True), - ), - migrations.AddField( - model_name="newsandevents", - name="summary_ru", - field=models.TextField(blank=True, max_length=200, null=True), - ), - migrations.AddField( - model_name="newsandevents", - name="title_en", - field=models.CharField(max_length=200, null=True), - ), - migrations.AddField( - model_name="newsandevents", - name="title_ru", - field=models.CharField(max_length=200, null=True), - ), - ] diff --git a/core/migrations/0003_newsandevents_summary_es_newsandevents_summary_fr_and_more.py b/core/migrations/0003_newsandevents_summary_es_newsandevents_summary_fr_and_more.py deleted file mode 100644 index 357c1a1c..00000000 --- a/core/migrations/0003_newsandevents_summary_es_newsandevents_summary_fr_and_more.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 4.2.16 on 2024-09-29 13:17 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("core", "0002_newsandevents_summary_en_newsandevents_summary_ru_and_more"), - ] - - operations = [ - migrations.AddField( - model_name="newsandevents", - name="summary_es", - field=models.TextField(blank=True, max_length=200, null=True), - ), - migrations.AddField( - model_name="newsandevents", - name="summary_fr", - field=models.TextField(blank=True, max_length=200, null=True), - ), - migrations.AddField( - model_name="newsandevents", - name="title_es", - field=models.CharField(max_length=200, null=True), - ), - migrations.AddField( - model_name="newsandevents", - name="title_fr", - field=models.CharField(max_length=200, null=True), - ), - ] diff --git a/core/models.py b/core/models.py index b0881fde..d1956d88 100644 --- a/core/models.py +++ b/core/models.py @@ -1,93 +1,151 @@ from django.db import models -from django.db.models import Q from django.utils.translation import gettext_lazy as _ +from config import settings -NEWS = _("News") -EVENTS = _("Event") -POST = ( - (NEWS, _("News")), - (EVENTS, _("Event")), -) +class Course(models.Model): + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_courses", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + ) + name = models.CharField(max_length=200) + description = models.TextField(blank=True, null=True) -FIRST = _("First") -SECOND = _("Second") -THIRD = _("Third") + class Meta: + verbose_name = "Course" + verbose_name_plural = "Courses" -SEMESTER = ( - (FIRST, _("First")), - (SECOND, _("Second")), - (THIRD, _("Third")), -) + def __str__(self): + return f"{self.name}" -class NewsAndEventsQuerySet(models.query.QuerySet): - def search(self, query): - lookups = ( - Q(title__icontains=query) - | Q(summary__icontains=query) - | Q(posted_as__icontains=query) - ) - return self.filter(lookups).distinct() +class CourseAllocation(models.Model): + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_course_allocations", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + ) + lecturer = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="course_allocations", + limit_choices_to={"is_lecturer": True}, + ) + courses = models.ManyToManyField(Course, related_name="course_allocations") + semester = models.ForeignKey( + "core.Semester", on_delete=models.CASCADE, related_name="course_allocations" + ) + group = models.ForeignKey( + "accounts.Group", on_delete=models.CASCADE, related_name="course_allocations" + ) + + class Meta: + verbose_name = "Course Allocation" + verbose_name_plural = "Course Allocations" + def __str__(self): + return f"{self.lecturer.username} - {self.semester} - {self.group.name}" -class NewsAndEventsManager(models.Manager): - def get_queryset(self): - return NewsAndEventsQuerySet(self.model, using=self._db) - def all(self): - return self.get_queryset() +class SemesterName(models.TextChoices): + FIRST = "First", _("First") + SECOND = "Second", _("Second") - def get_by_id(self, id): - qs = self.get_queryset().filter( - id=id - ) # NewsAndEvents.objects == self.get_queryset() - if qs.count() == 1: - return qs.first() - return None - def search(self, query): - return self.get_queryset().search(query) +# preserve old export name for serializers and other modules +SEMESTER = SemesterName.choices -class NewsAndEvents(models.Model): - title = models.CharField(max_length=200, null=True) - summary = models.TextField(max_length=200, blank=True, null=True) - posted_as = models.CharField(choices=POST, max_length=10) - updated_date = models.DateTimeField(auto_now=True, auto_now_add=False, null=True) - upload_time = models.DateTimeField(auto_now=False, auto_now_add=True, null=True) +class Program(models.Model): + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_programs", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + ) + name = models.CharField(max_length=200) - objects = NewsAndEventsManager() + class Meta: + verbose_name = "Program" + verbose_name_plural = "Programs" def __str__(self): - return f"{self.title}" + return self.name -class Session(models.Model): - session = models.CharField(max_length=200, unique=True) - is_current_session = models.BooleanField(default=False, blank=True, null=True) - next_session_begins = models.DateField(blank=True, null=True) +class AcademicYear(models.Model): + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_academic_years", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + ) + year = models.IntegerField(unique=True) + program = models.ForeignKey( + Program, on_delete=models.CASCADE, related_name="academic_years" + ) + is_current = models.BooleanField(default=False) def __str__(self): - return f"{self.session}" + return f"{self.year} - {self.program.name}" class Semester(models.Model): - semester = models.CharField(max_length=10, choices=SEMESTER, blank=True) - is_current_semester = models.BooleanField(default=False, blank=True, null=True) - session = models.ForeignKey( - Session, on_delete=models.CASCADE, blank=True, null=True + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_semesters", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + ) + name = models.CharField( + max_length=10, choices=SemesterName.choices, default=SemesterName.FIRST + ) + academic_year = models.ForeignKey( + AcademicYear, on_delete=models.CASCADE, related_name="semesters" ) - next_semester_begins = models.DateField(null=True, blank=True) + courses = models.ManyToManyField(Course, related_name="semesters") + is_current = models.BooleanField(default=False, null=True, blank=True) def __str__(self): - return f"{self.semester}" + return f"{self.name} - {self.academic_year}" + class Meta: + verbose_name = "Semester" + verbose_name_plural = "Semesters" -class ActivityLog(models.Model): - message = models.TextField() - created_at = models.DateTimeField(auto_now=True) + +class Module(models.Model): + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_modules", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + ) + name = models.CharField(max_length=10, choices=SemesterName.choices) + semester = models.ForeignKey( + Semester, on_delete=models.CASCADE, related_name="modules" + ) + is_current = models.BooleanField(default=False) def __str__(self): - return f"[{self.created_at}]{self.message}" + return f"{self.name} - {self.semester}" + + class Meta: + verbose_name = "Module" + verbose_name_plural = "Modules" diff --git a/core/permissions.py b/core/permissions.py new file mode 100644 index 00000000..a57d9188 --- /dev/null +++ b/core/permissions.py @@ -0,0 +1,73 @@ +from rest_framework import permissions + + +class IsLecturer(permissions.BasePermission): + """ + Permission check for lecturer users + """ + + def has_permission(self, request, view): + return bool( + request.user and request.user.is_authenticated and request.user.is_lecturer + ) + + +class IsAdminOrLecturer(permissions.BasePermission): + """ + Permission check for admin or lecturer users + """ + + def has_permission(self, request, view): + return bool( + request.user + and request.user.is_authenticated + and (request.user.is_staff or request.user.is_lecturer) + ) + + +class IsOwnerAdmin(permissions.BasePermission): + """ + Проверяет, что объект принадлежит админу текущего пользователя + """ + + def has_object_permission(self, request, view, obj): + # Проверяем, что пользователь аутентифицирован + if not request.user or not request.user.is_authenticated: + return False + + # Суперпользователи могут видеть только свои объекты + if request.user.is_superuser: + # Проверяем, что объект принадлежит этому админу + if hasattr(obj, "admin"): + return obj.admin == request.user + return False + + # Преподаватели и студенты могут видеть объекты своего админа + if hasattr(request.user, "admin") and request.user.admin: + if hasattr(obj, "admin"): + return obj.admin == request.user.admin + return False + + return False + + +class CanModifyOwnData(permissions.BasePermission): + """ + Проверяет, что пользователь может изменять только свои данные + (только администраторы могут изменять данные своих объектов) + """ + + def has_object_permission(self, request, view, obj): + # Чтение разрешено всем + if request.method in permissions.SAFE_METHODS: + return True + + # Изменение разрешено только администраторам + if not request.user.is_superuser: + return False + + # Проверяем, что объект принадлежит этому админу + if hasattr(obj, "admin"): + return obj.admin == request.user + + return False diff --git a/core/serializers.py b/core/serializers.py new file mode 100644 index 00000000..02d7cb48 --- /dev/null +++ b/core/serializers.py @@ -0,0 +1,246 @@ +from django.contrib.auth import get_user_model +from rest_framework import serializers + +from .models import AcademicYear, Course, CourseAllocation, Module, Program, Semester + +User = get_user_model() + + +### program serializers + + +class ProgramListSerializer(serializers.ModelSerializer): + class Meta: + model = Program + fields = ["id", "name"] + + +class ProgramWriteSerializer(serializers.ModelSerializer): + class Meta: + model = Program + fields = ["name"] + + def update(self, instance, validated_data): + """ + Автоматически устанавливаем не трогая админ + """ + for attr, value in validated_data.items(): + setattr(instance, attr, value) + instance.save() + return instance + + +### semester serializers + + +class AcademicYearSerializer(serializers.ModelSerializer): + program = ProgramListSerializer() + + class Meta: + model = AcademicYear + fields = ["id", "year", "program", "is_current"] + + +class CourseSerializer(serializers.ModelSerializer): + class Meta: + model = Course + fields = "__all__" + + +class SemesterListSerializer(serializers.ModelSerializer): + courses = CourseSerializer(many=True, read_only=True) + academic_year = AcademicYearSerializer(read_only=True) + + class Meta: + model = Semester + fields = ["id", "name", "is_current", "academic_year", "courses"] + + +class SemesterWriteSerializer(serializers.ModelSerializer): + courses = serializers.PrimaryKeyRelatedField( + queryset=Course.objects.all(), many=True, required=False + ) + is_current = serializers.BooleanField(required=False, default=False) + + class Meta: + model = Semester + fields = ["name", "is_current", "courses", "academic_year"] + + def create(self, validated_data): + """ + Автоматически устанавливаем admin из контекста + """ + admin = self.context.get("admin") + courses = validated_data.pop("courses", []) + + semester = Semester.objects.create(admin=admin, **validated_data) + semester.courses.set(courses) + return semester + + def update(self, instance, validated_data): + courses = validated_data.pop("courses", serializers.empty) + + for attr, value in validated_data.items(): + setattr(instance, attr, value) + instance.save() + + if courses is not serializers.empty: + instance.courses.set(courses) + return instance + + +class SemesterDetailSerializer(serializers.ModelSerializer): + class Meta: + model = Semester + fields = ["id", "name", "is_current", "courses", "academic_year"] + + +### academic serializer + + +class AcademicYearListSerializer(serializers.ModelSerializer): + program = ProgramListSerializer() + + class Meta: + model = AcademicYear + fields = ["id", "year", "is_current", "program"] + + +class AcademicYearWriteSerializer(serializers.ModelSerializer): + class Meta: + model = AcademicYear + fields = ["id", "year", "is_current", "program"] + + def validate(self, data): + """Валидация уникальности года в программе""" + program = data.get("program") or ( + self.instance.program if self.instance else None + ) + year = data.get("year") or (self.instance.year if self.instance else None) + + if program and year: + queryset = AcademicYear.objects.filter(program=program, year=year) + if self.instance: + queryset = queryset.exclude(id=self.instance.id) + if queryset.exists(): + raise serializers.ValidationError( + {"year": f"Для этой программы уже существует учебный год {year}"} + ) + + return data + + def update(self, instance, validated_data): + for attr, value in validated_data.items(): + setattr(instance, attr, value) + instance.save() + return instance + + +### module serializers + + +class ModuleWriteSerializer(serializers.ModelSerializer): + class Meta: + model = Module + fields = ["name", "semester"] + + def update(self, instance, validated_data): + for attr, value in validated_data.items(): + setattr(instance, attr, value) + instance.save() + return instance + + +class SemesterSerializer(serializers.ModelSerializer): + class Meta: + model = Semester + fields = ["id", "name"] + + +class ModuleListSerializer(serializers.ModelSerializer): + semester = SemesterSerializer(read_only=True) + + class Meta: + model = Module + fields = ["id", "name", "is_current", "semester"] + + +### course serializers + + +class CourseListSerializer(serializers.ModelSerializer): + class Meta: + model = Course + fields = ["id", "name", "description"] + + +class CourseWriteSerializer(serializers.ModelSerializer): + class Meta: + model = Course + fields = ["name", "description"] + + def update(self, instance, validated_data): + """ + Автоматически устанавливаем не трогая админ + """ + for attr, value in validated_data.items(): + setattr(instance, attr, value) + instance.save() + return instance + + +User = get_user_model() + + +class CourseAllocationListSerializer(serializers.ModelSerializer): + lecturer = serializers.StringRelatedField() + lecturer_id = serializers.PrimaryKeyRelatedField(source="lecturer", read_only=True) + group = serializers.StringRelatedField() + group_id = serializers.PrimaryKeyRelatedField(source="group", read_only=True) + courses = CourseListSerializer(many=True, read_only=True) + semester = serializers.StringRelatedField() + semester_id = serializers.PrimaryKeyRelatedField(source="semester", read_only=True) + + class Meta: + model = CourseAllocation + fields = [ + "id", + "lecturer", + "lecturer_id", + "courses", + "semester", + "semester_id", + "group", + "group_id", + ] + + +class CourseAllocationWriteSerializer(serializers.ModelSerializer): + class Meta: + model = CourseAllocation + fields = ["lecturer", "courses", "semester", "group"] + + def create(self, validated_data): + """Создание с ManyToMany courses""" + courses = validated_data.pop("courses", []) + allocation = CourseAllocation.objects.create(**validated_data) + allocation.courses.set(courses) + return allocation + + def update(self, instance, validated_data): + """patch, put update с ManyToMany courses""" + courses = validated_data.pop("courses", None) + + for attr, value in validated_data.items(): + setattr(instance, attr, value) + instance.save() + + if courses is not None: + instance.courses.set(courses) + return instance + + +class StudentCoursesSerializer(serializers.ModelSerializer): + class Meta: + model = CourseAllocation + fields = ["id", "lecturer", "courses", "semester", "group"] diff --git a/core/tests.py b/core/tests.py index 7ce503c2..a39b155a 100644 --- a/core/tests.py +++ b/core/tests.py @@ -1,3 +1 @@ -from django.test import TestCase - # Create your tests here. diff --git a/core/translation.py b/core/translation.py deleted file mode 100644 index deeaeb75..00000000 --- a/core/translation.py +++ /dev/null @@ -1,11 +0,0 @@ -from modeltranslation.translator import register, TranslationOptions -from .models import NewsAndEvents - - -@register(NewsAndEvents) -class NewsAndEventsTranslationOptions(TranslationOptions): - fields = ( - "title", - "summary", - ) - empty_values = None diff --git a/core/urls.py b/core/urls.py index 93bdf6ba..b6009141 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,35 +1,120 @@ from django.urls import path +from . import views from .views import ( - home_view, - post_add, - edit_post, - delete_post, - session_list_view, - session_add_view, - session_update_view, - session_delete_view, - semester_list_view, - semester_add_view, - semester_update_view, - semester_delete_view, - dashboard_view, + CourseAllocationCreateAPIView, + CourseAllocationListAPIView, + CourseAllocationListByGroupAPIView, + CourseAllocationRetrieveUpdateDestroyAPIView, + CourseCreateAPIView, + CourseListAPIView, + CourseRetrieveUpdateDestroyAPIView, + TeacherCourseAllocations, ) - urlpatterns = [ - # Accounts url - path("", home_view, name="home"), - path("add_item/", post_add, name="add_item"), - path("item//edit/", edit_post, name="edit_post"), - path("item//delete/", delete_post, name="delete_post"), - path("session/", session_list_view, name="session_list"), - path("session/add/", session_add_view, name="add_session"), - path("session//edit/", session_update_view, name="edit_session"), - path("session//delete/", session_delete_view, name="delete_session"), - path("semester/", semester_list_view, name="semester_list"), - path("semester/add/", semester_add_view, name="add_semester"), - path("semester//edit/", semester_update_view, name="edit_semester"), - path("semester//delete/", semester_delete_view, name="delete_semester"), - path("dashboard/", dashboard_view, name="dashboard"), + # Semester urls + path("api/semesters/", views.SemesterListAPIView.as_view(), name="semester-list"), + path( + "api/semesters/create/", + views.SemesterCreateAPIView.as_view(), + name="semester-create", + ), + path( + "api/semesters//update/", + views.SemesterUpdateAPIView.as_view(), + name="semester-update", + ), + path( + "api/semesters//", + views.SemesterRetrieveDestroyAPIView.as_view(), + name="semester-detail", + ), + # Program urls + path("api/programs/", views.ProgramListAPIView.as_view(), name="program-list"), + path( + "api/programs/create/", + views.ProgramCreateAPIView.as_view(), + name="program-create", + ), + path( + "api/programs//update/", + views.ProgramUpdateAPIView.as_view(), + name="program-update", + ), + path( + "api/programs//", + views.ProgramRetrieveDestroyAPIView.as_view(), + name="program-detail", + ), + # Academic Year urls + path( + "api/academic-years/", + views.AcademicYearListAPIView.as_view(), + name="academic-year-list", + ), + path( + "api/academic-years/create/", + views.AcademicYearCreateAPIView.as_view(), + name="academic-year-create", + ), + path( + "api/academic-years//update/", + views.AcademicYearUpdateAPIView.as_view(), + name="academic-year-update", + ), + path( + "api/academic-years//", + views.AcademicYearRetrieveDestroyAPIView.as_view(), + name="academic-year-detail", + ), + # Module urls + path("api/modules/", views.ModuleListAPIView.as_view(), name="module-list"), + path( + "api/modules/create/", views.ModuleCreateAPIView.as_view(), name="module-create" + ), + path( + "api/modules//update/", + views.ModuleUpdateAPIView.as_view(), + name="module-update", + ), + path( + "api/modules//", + views.ModuleRetrieveDestroyAPIView.as_view(), + name="module-detail", + ), + # Course urls + path("api/courses/", CourseListAPIView.as_view(), name="course-list"), + path("api/courses/create/", CourseCreateAPIView.as_view(), name="course-create"), + path( + "api/courses//", + CourseRetrieveUpdateDestroyAPIView.as_view(), + name="course-detail", + ), + ### course allocation urls + path( + "api/course-allocations/", + CourseAllocationListAPIView.as_view(), + name="courseallocation-list", + ), + path( + "api/course-allocations/create/", + CourseAllocationCreateAPIView.as_view(), + name="courseallocation-create", + ), + path( + "api/course-allocations//", + CourseAllocationRetrieveUpdateDestroyAPIView.as_view(), + name="courseallocation-detail", + ), + path( + "api/teacher-allocations/", + TeacherCourseAllocations.as_view(), + name="teacherallocation-list", + ), + path( + "api/course-allocations/group//", + CourseAllocationListByGroupAPIView.as_view(), + name="courseallocation-list-by-group", + ), ] diff --git a/core/utils.py b/core/utils.py index 6705be06..1e77c038 100644 --- a/core/utils.py +++ b/core/utils.py @@ -1,10 +1,11 @@ import random import string -from django.utils.text import slugify + +from django.conf import settings from django.core.mail import send_mail from django.template.loader import render_to_string from django.utils.html import strip_tags -from django.conf import settings +from django.utils.text import slugify def send_email(user, subject, msg): diff --git a/core/views.py b/core/views.py index c0d2cf1a..5fe912f9 100644 --- a/core/views.py +++ b/core/views.py @@ -1,209 +1,304 @@ -from django.shortcuts import render, redirect, get_object_or_404 -from django.contrib import messages -from django.contrib.auth.decorators import login_required - -from accounts.decorators import admin_required, lecturer_required -from accounts.models import User, Student -from .forms import SessionForm, SemesterForm, NewsAndEventsForm -from .models import NewsAndEvents, ActivityLog, Session, Semester - - -# ######################################################## -# News & Events -# ######################################################## -@login_required -def home_view(request): - items = NewsAndEvents.objects.all().order_by("-updated_date") - context = { - "title": "News & Events", - "items": items, - } - return render(request, "core/index.html", context) - - -@login_required -@admin_required -def dashboard_view(request): - logs = ActivityLog.objects.all().order_by("-created_at")[:10] - gender_count = Student.get_gender_count() - context = { - "student_count": User.objects.get_student_count(), - "lecturer_count": User.objects.get_lecturer_count(), - "superuser_count": User.objects.get_superuser_count(), - "males_count": gender_count["M"], - "females_count": gender_count["F"], - "logs": logs, - } - return render(request, "core/dashboard.html", context) - - -@login_required -def post_add(request): - if request.method == "POST": - form = NewsAndEventsForm(request.POST) - title = form.cleaned_data.get("title", "Post") if form.is_valid() else None - if form.is_valid(): - form.save() - messages.success(request, f"{title} has been uploaded.") - return redirect("home") - messages.error(request, "Please correct the error(s) below.") - else: - form = NewsAndEventsForm() - return render(request, "core/post_add.html", {"title": "Add Post", "form": form}) - - -@login_required -@lecturer_required -def edit_post(request, pk): - instance = get_object_or_404(NewsAndEvents, pk=pk) - if request.method == "POST": - form = NewsAndEventsForm(request.POST, instance=instance) - title = form.cleaned_data.get("title", "Post") if form.is_valid() else None - if form.is_valid(): - form.save() - messages.success(request, f"{title} has been updated.") - return redirect("home") - messages.error(request, "Please correct the error(s) below.") - else: - form = NewsAndEventsForm(instance=instance) - return render(request, "core/post_add.html", {"title": "Edit Post", "form": form}) - - -@login_required -@lecturer_required -def delete_post(request, pk): - post = get_object_or_404(NewsAndEvents, pk=pk) - post_title = post.title - post.delete() - messages.success(request, f"{post_title} has been deleted.") - return redirect("home") - - -# ######################################################## -# Session -# ######################################################## -@login_required -@lecturer_required -def session_list_view(request): - """Show list of all sessions""" - sessions = Session.objects.all().order_by("-is_current_session", "-session") - return render(request, "core/session_list.html", {"sessions": sessions}) - - -@login_required -@lecturer_required -def session_add_view(request): - """Add a new session""" - if request.method == "POST": - form = SessionForm(request.POST) - if form.is_valid(): - if form.cleaned_data.get("is_current_session"): - unset_current_session() - form.save() - messages.success(request, "Session added successfully.") - return redirect("session_list") - else: - form = SessionForm() - return render(request, "core/session_update.html", {"form": form}) - - -@login_required -@lecturer_required -def session_update_view(request, pk): - session = get_object_or_404(Session, pk=pk) - if request.method == "POST": - form = SessionForm(request.POST, instance=session) - if form.is_valid(): - if form.cleaned_data.get("is_current_session"): - unset_current_session() - form.save() - messages.success(request, "Session updated successfully.") - return redirect("session_list") - else: - form = SessionForm(instance=session) - return render(request, "core/session_update.html", {"form": form}) - - -@login_required -@lecturer_required -def session_delete_view(request, pk): - session = get_object_or_404(Session, pk=pk) - if session.is_current_session: - messages.error(request, "You cannot delete the current session.") - else: - session.delete() - messages.success(request, "Session successfully deleted.") - return redirect("session_list") - - -def unset_current_session(): - """Unset current session""" - current_session = Session.objects.filter(is_current_session=True).first() - if current_session: - current_session.is_current_session = False - current_session.save() - - -# ######################################################## -# Semester -# ######################################################## -@login_required -@lecturer_required -def semester_list_view(request): - semesters = Semester.objects.all().order_by("-is_current_semester", "-semester") - return render(request, "core/semester_list.html", {"semesters": semesters}) - - -@login_required -@lecturer_required -def semester_add_view(request): - if request.method == "POST": - form = SemesterForm(request.POST) - if form.is_valid(): - if form.cleaned_data.get("is_current_semester"): - unset_current_semester() - unset_current_session() - form.save() - messages.success(request, "Semester added successfully.") - return redirect("semester_list") - else: - form = SemesterForm() - return render(request, "core/semester_update.html", {"form": form}) - - -@login_required -@lecturer_required -def semester_update_view(request, pk): - semester = get_object_or_404(Semester, pk=pk) - if request.method == "POST": - form = SemesterForm(request.POST, instance=semester) - if form.is_valid(): - if form.cleaned_data.get("is_current_semester"): - unset_current_semester() - unset_current_session() - form.save() - messages.success(request, "Semester updated successfully!") - return redirect("semester_list") - else: - form = SemesterForm(instance=semester) - return render(request, "core/semester_update.html", {"form": form}) - - -@login_required -@lecturer_required -def semester_delete_view(request, pk): - semester = get_object_or_404(Semester, pk=pk) - if semester.is_current_semester: - messages.error(request, "You cannot delete the current semester.") - else: - semester.delete() - messages.success(request, "Semester successfully deleted.") - return redirect("semester_list") - - -def unset_current_semester(): - """Unset current semester""" - current_semester = Semester.objects.filter(is_current_semester=True).first() - if current_semester: - current_semester.is_current_semester = False - current_semester.save() +from django.contrib.auth import get_user_model +from rest_framework import generics +from rest_framework.exceptions import PermissionDenied +from rest_framework.permissions import IsAdminUser, IsAuthenticated + +from .models import AcademicYear, Course, CourseAllocation, Module, Program, Semester +from .permissions import IsLecturer +from .serializers import ( + AcademicYearListSerializer, + AcademicYearWriteSerializer, + CourseAllocationListSerializer, + CourseAllocationWriteSerializer, + CourseListSerializer, + CourseWriteSerializer, + ModuleListSerializer, + ModuleWriteSerializer, + ProgramListSerializer, + ProgramWriteSerializer, + SemesterDetailSerializer, + SemesterListSerializer, + SemesterWriteSerializer, +) + +User = get_user_model() + + +### semester views + + +class SemesterListAPIView(generics.ListAPIView): + serializer_class = SemesterListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + user = self.request.user + if user.is_superuser: + return Semester.objects.filter(admin=user).order_by("-is_current", "-name") + else: + raise PermissionDenied("Only superusers can access this view.") + + +class SemesterCreateAPIView(generics.CreateAPIView): + serializer_class = SemesterWriteSerializer + permission_classes = [IsAdminUser] + + def get_serializer_context(self): + """giving admin to serializer context""" + context = super().get_serializer_context() + if self.request.user.is_superuser: + context["admin"] = self.request.user + else: + raise PermissionDenied("only admins can access this view") + return context + + +class SemesterUpdateAPIView(generics.UpdateAPIView): + serializer_class = SemesterWriteSerializer + permission_classes = [IsAdminUser] + queryset = Semester.objects.all() + + def get_serializer_context(self): + """giving admin to serializer context""" + if self.request.user.is_superuser: + admin = self.request.user + else: + raise PermissionDenied("only admins can access this view") + context = super().get_serializer_context() + context["admin"] = admin + return context + + +class SemesterRetrieveDestroyAPIView(generics.RetrieveDestroyAPIView): + serializer_class = SemesterDetailSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + if self.request.user.is_superuser: + return Semester.objects.filter(admin=self.request.user) + raise PermissionDenied("Only admins can access this view.") + + +### program views + + +class ProgramCreateAPIView(generics.CreateAPIView): + serializer_class = ProgramWriteSerializer + permission_classes = [IsAdminUser] + + def perform_create(self, serializer): + serializer.save(admin=self.request.user) + + +class ProgramUpdateAPIView(generics.UpdateAPIView): + serializer_class = ProgramWriteSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + if self.request.user.is_superuser: + return Program.objects.filter(admin=self.request.user) + raise PermissionDenied("Only admins can access this view.") + + +class ProgramRetrieveDestroyAPIView(generics.DestroyAPIView): + serializer_class = ProgramWriteSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + if self.request.user.is_superuser: + return Program.objects.filter(admin=self.request.user) + raise PermissionDenied("Only admins can access this view.") + + +class ProgramListAPIView(generics.ListAPIView): + serializer_class = ProgramListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + if self.request.user.is_superuser: + return Program.objects.filter(admin=self.request.user) + raise PermissionDenied("Only admins can access this view.") + + def get_serializer_context(self): + context = super().get_serializer_context() + context["language"] = self.request.query_params.get("lang", "ru") + return context + + +### academic year views + + +class AcademicYearCreateAPIView(generics.CreateAPIView): + serializer_class = AcademicYearWriteSerializer + permission_classes = [IsAdminUser] + + def perform_create(self, serializer): + serializer.save(admin=self.request.user) + + +class AcademicYearUpdateAPIView(generics.UpdateAPIView): + serializer_class = AcademicYearWriteSerializer + permission_classes = [IsAdminUser] + queryset = AcademicYear.objects.all() + + +class AcademicYearRetrieveDestroyAPIView(generics.RetrieveDestroyAPIView): + serializer_class = AcademicYearWriteSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + if self.request.user.is_superuser: + return AcademicYear.objects.filter(admin=self.request.user) + raise PermissionDenied("Only admins can access this view.") + + +class AcademicYearListAPIView(generics.ListAPIView): + serializer_class = AcademicYearListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + if self.request.user.is_superuser: + return AcademicYear.objects.filter(admin=self.request.user) + raise PermissionDenied("Only admins can access this view.") + + +### module views + + +class ModuleCreateAPIView(generics.CreateAPIView): + serializer_class = ModuleWriteSerializer + permission_classes = [IsAdminUser] + + def perform_create(self, serializer): + serializer.save(admin=self.request.user) + + +class ModuleUpdateAPIView(generics.UpdateAPIView): + serializer_class = ModuleWriteSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + return Module.objects.filter(admin=self.request.user) + + +class ModuleListAPIView(generics.ListAPIView): + serializer_class = ModuleListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + if self.request.user.is_superuser: + return Module.objects.filter(admin=self.request.user) + raise PermissionDenied("Only admins can access this view.") + + +class ModuleRetrieveDestroyAPIView(generics.RetrieveDestroyAPIView): + serializer_class = ModuleListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + if self.request.user.is_superuser: + return Module.objects.filter(admin=self.request.user) + raise PermissionDenied("Only admins can access this view.") + + +### course views + + +class CourseListAPIView(generics.ListAPIView): + serializer_class = CourseListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + user = self.request.user + if user.is_superuser: + return Course.objects.filter(admin=user).order_by("name") + else: + raise PermissionDenied("Only superusers can access this view.") + + +class CourseCreateAPIView(generics.CreateAPIView): + serializer_class = CourseWriteSerializer + permission_classes = [IsAdminUser] + + def get_serializer_context(self): + context = super().get_serializer_context() + context["admin"] = self.request.user + return context + + def perform_create(self, serializer): + serializer.save(admin=self.request.user) + + +class CourseRetrieveUpdateDestroyAPIView(generics.RetrieveUpdateDestroyAPIView): + permission_classes = [IsAdminUser] + queryset = Course.objects.all() + + def get_serializer_class(self): + if self.request.method in ["PUT", "PATCH"]: + return CourseWriteSerializer + return CourseListSerializer + + def get_serializer_context(self): + context = super().get_serializer_context() + context["admin"] = self.request.user + return context + + +### course allocation views + + +class CourseAllocationListAPIView(generics.ListAPIView): + serializer_class = CourseAllocationListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + return CourseAllocation.objects.filter(admin=self.request.user) + + +class CourseAllocationListByGroupAPIView(generics.ListAPIView): + serializer_class = CourseAllocationListSerializer + permission_classes = [IsAuthenticated] + + def get_queryset(self): + group_id = self.kwargs.get("group_id") + return CourseAllocation.objects.filter(group_id=group_id) + + +class CourseAllocationCreateAPIView(generics.CreateAPIView): + serializer_class = CourseAllocationWriteSerializer + permission_classes = [IsAdminUser] + + def get_serializer_context(self): + context = super().get_serializer_context() + context["admin"] = self.request.user + return context + + def perform_create(self, serializer): + serializer.save(admin=self.request.user) + + +class CourseAllocationRetrieveUpdateDestroyAPIView( + generics.RetrieveUpdateDestroyAPIView +): + permission_classes = [IsAdminUser] + queryset = CourseAllocation.objects.all() + + def get_serializer_class(self): + if self.request.method in ["PUT", "PATCH"]: + return CourseAllocationWriteSerializer + return CourseAllocationListSerializer + + def get_serializer_context(self): + context = super().get_serializer_context() + context["admin"] = self.request.user + return context + + +class TeacherCourseAllocations(generics.ListAPIView): + serializer_class = CourseAllocationListSerializer + permission_classes = [IsLecturer] + + def get_queryset(self): + user = self.request.user + return CourseAllocation.objects.filter(lecturer=user) + raise PermissionDenied("Only lecturers can access this view.") diff --git a/course/admin.py b/course/admin.py deleted file mode 100644 index 3a304115..00000000 --- a/course/admin.py +++ /dev/null @@ -1,17 +0,0 @@ -from django.contrib import admin -from django.contrib.auth.models import Group - -from .models import Program, Course, CourseAllocation, Upload -from modeltranslation.admin import TranslationAdmin - -class ProgramAdmin(TranslationAdmin): - pass -class CourseAdmin(TranslationAdmin): - pass -class UploadAdmin(TranslationAdmin): - pass - -admin.site.register(Program, ProgramAdmin) -admin.site.register(Course, CourseAdmin) -admin.site.register(CourseAllocation) -admin.site.register(Upload, UploadAdmin) diff --git a/course/apps.py b/course/apps.py deleted file mode 100644 index 1e63067c..00000000 --- a/course/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class CourseConfig(AppConfig): - name = "course" diff --git a/course/decorators.py b/course/decorators.py deleted file mode 100644 index 8365d6fd..00000000 --- a/course/decorators.py +++ /dev/null @@ -1,16 +0,0 @@ -# from django.contrib.auth import REDIRECT_FIELD_NAME -# from django.http import Http404 -from coursemanagement.models import CourseSetting - -# def student_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, calender_url=Http404): -# """ -# Decorator for views that checks that the logged in user is a student, -# redirects to the log-in page if necessary. -# """ -# obj = CourseSetting.objects.get(add_drop=True) -# if obj is not None: -# if function: -# return actual_decorator(function) -# return actual_decorator - -is_calender_on = CourseSetting.objects.filter(add_drop=True).count() > 0 diff --git a/course/filters.py b/course/filters.py deleted file mode 100644 index 8025629d..00000000 --- a/course/filters.py +++ /dev/null @@ -1,48 +0,0 @@ -from django.db.models import Q -import django_filters -from .models import Program, CourseAllocation, Course - - -class ProgramFilter(django_filters.FilterSet): - title = django_filters.CharFilter(lookup_expr="icontains", label="") - - class Meta: - model = Program - fields = ["title"] - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Change html classes and placeholders - self.filters["title"].field.widget.attrs.update( - {"class": "au-input", "placeholder": "Program name"} - ) - - -class CourseAllocationFilter(django_filters.FilterSet): - lecturer = django_filters.CharFilter(method="filter_by_lecturer", label="") - course = django_filters.filters.CharFilter(method="filter_by_course", label="") - - class Meta: - model = CourseAllocation - fields = [] - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Change html classes and placeholders - self.filters["lecturer"].field.widget.attrs.update( - {"class": "au-input", "placeholder": "Lecturer"} - ) - self.filters["course"].field.widget.attrs.update( - {"class": "au-input", "placeholder": "Course"} - ) - - def filter_by_lecturer(self, queryset, name, value): - return queryset.filter( - Q(lecturer__first_name__icontains=value) - | Q(lecturer__last_name__icontains=value) - ) - - def filter_by_course(self, queryset, name, value): - return queryset.filter(courses__title__icontains=value) diff --git a/course/forms.py b/course/forms.py deleted file mode 100644 index 18b1d9ea..00000000 --- a/course/forms.py +++ /dev/null @@ -1,107 +0,0 @@ -from django import forms -from accounts.models import User -from .models import Program, Course, CourseAllocation, Upload, UploadVideo - - -class ProgramForm(forms.ModelForm): - class Meta: - model = Program - fields = "__all__" - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.fields["title"].widget.attrs.update({"class": "form-control"}) - self.fields["summary"].widget.attrs.update({"class": "form-control"}) - - -class CourseAddForm(forms.ModelForm): - class Meta: - model = Course - fields = "__all__" - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.fields["title"].widget.attrs.update({"class": "form-control"}) - self.fields["code"].widget.attrs.update({"class": "form-control"}) - # self.fields['courseUnit'].widget.attrs.update({'class': 'form-control'}) - self.fields["credit"].widget.attrs.update({"class": "form-control"}) - self.fields["summary"].widget.attrs.update({"class": "form-control"}) - self.fields["program"].widget.attrs.update({"class": "form-control"}) - self.fields["level"].widget.attrs.update({"class": "form-control"}) - self.fields["year"].widget.attrs.update({"class": "form-control"}) - self.fields["semester"].widget.attrs.update({"class": "form-control"}) - - -class CourseAllocationForm(forms.ModelForm): - courses = forms.ModelMultipleChoiceField( - queryset=Course.objects.all().order_by("level"), - widget=forms.CheckboxSelectMultiple( - attrs={"class": "browser-default checkbox"} - ), - required=True, - ) - lecturer = forms.ModelChoiceField( - queryset=User.objects.filter(is_lecturer=True), - widget=forms.Select(attrs={"class": "browser-default custom-select"}), - label="lecturer", - ) - - class Meta: - model = CourseAllocation - fields = ["lecturer", "courses"] - - def __init__(self, *args, **kwargs): - super(CourseAllocationForm, self).__init__(*args, **kwargs) - self.fields["lecturer"].queryset = User.objects.filter(is_lecturer=True) - - -class EditCourseAllocationForm(forms.ModelForm): - courses = forms.ModelMultipleChoiceField( - queryset=Course.objects.all().order_by("level"), - widget=forms.CheckboxSelectMultiple, - required=True, - ) - lecturer = forms.ModelChoiceField( - queryset=User.objects.filter(is_lecturer=True), - widget=forms.Select(attrs={"class": "browser-default custom-select"}), - label="lecturer", - ) - - class Meta: - model = CourseAllocation - fields = ["lecturer", "courses"] - - def __init__(self, *args, **kwargs): - # user = kwargs.pop('user') - super(EditCourseAllocationForm, self).__init__(*args, **kwargs) - self.fields["lecturer"].queryset = User.objects.filter(is_lecturer=True) - - -# Upload files to specific course -class UploadFormFile(forms.ModelForm): - class Meta: - model = Upload - fields = ( - "title", - "file", - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.fields["title"].widget.attrs.update({"class": "form-control"}) - self.fields["file"].widget.attrs.update({"class": "form-control"}) - - -# Upload video to specific course -class UploadFormVideo(forms.ModelForm): - class Meta: - model = UploadVideo - fields = ( - "title", - "video", - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.fields["title"].widget.attrs.update({"class": "form-control"}) - self.fields["video"].widget.attrs.update({"class": "form-control"}) diff --git a/course/migrations/0001_initial.py b/course/migrations/0001_initial.py deleted file mode 100644 index 3534754d..00000000 --- a/course/migrations/0001_initial.py +++ /dev/null @@ -1,87 +0,0 @@ -# Generated by Django 4.0.8 on 2024-08-31 11:51 - -from django.conf import settings -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('accounts', '0001_initial'), - ('core', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Course', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('slug', models.SlugField(blank=True, unique=True)), - ('title', models.CharField(max_length=200, null=True)), - ('code', models.CharField(max_length=200, null=True, unique=True)), - ('credit', models.IntegerField(default=0, null=True)), - ('summary', models.TextField(blank=True, max_length=200, null=True)), - ('level', models.CharField(choices=[('Bachelor', 'Bachelor Degree'), ('Master', 'Master Degree')], max_length=25, null=True)), - ('year', models.IntegerField(choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (4, '5'), (4, '6')], default=0)), - ('semester', models.CharField(choices=[('First', 'First'), ('Second', 'Second'), ('Third', 'Third')], max_length=200)), - ('is_elective', models.BooleanField(blank=True, default=False, null=True)), - ], - ), - migrations.CreateModel( - name='Program', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=150, unique=True)), - ('summary', models.TextField(blank=True, null=True)), - ], - ), - migrations.CreateModel( - name='UploadVideo', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=100)), - ('slug', models.SlugField(blank=True, unique=True)), - ('video', models.FileField(help_text='Valid video formats: mp4, mkv, wmv, 3gp, f4v, avi, mp3', upload_to='course_videos/', validators=[django.core.validators.FileExtensionValidator(['mp4', 'mkv', 'wmv', '3gp', 'f4v', 'avi', 'mp3'])])), - ('summary', models.TextField(blank=True, null=True)), - ('timestamp', models.DateTimeField(auto_now_add=True, null=True)), - ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.course')), - ], - ), - migrations.CreateModel( - name='Upload', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=100)), - ('file', models.FileField(help_text='Valid Files: pdf, docx, doc, xls, xlsx, ppt, pptx, zip, rar, 7zip', upload_to='course_files/', validators=[django.core.validators.FileExtensionValidator(['pdf', 'docx', 'doc', 'xls', 'xlsx', 'ppt', 'pptx', 'zip', 'rar', '7zip'])])), - ('updated_date', models.DateTimeField(auto_now=True, null=True)), - ('upload_time', models.DateTimeField(auto_now_add=True, null=True)), - ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.course')), - ], - ), - migrations.CreateModel( - name='CourseOffer', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dep_head', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='accounts.departmenthead')), - ], - ), - migrations.CreateModel( - name='CourseAllocation', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('courses', models.ManyToManyField(related_name='allocated_course', to='course.course')), - ('lecturer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='allocated_lecturer', to=settings.AUTH_USER_MODEL)), - ('session', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.session')), - ], - ), - migrations.AddField( - model_name='course', - name='program', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.program'), - ), - ] diff --git a/course/migrations/0002_course_summary_en_course_summary_ru_course_title_en_and_more.py b/course/migrations/0002_course_summary_en_course_summary_ru_course_title_en_and_more.py deleted file mode 100644 index 9282f043..00000000 --- a/course/migrations/0002_course_summary_en_course_summary_ru_course_title_en_and_more.py +++ /dev/null @@ -1,83 +0,0 @@ -# Generated by Django 4.2.16 on 2024-09-29 07:44 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("course", "0001_initial"), - ] - - operations = [ - migrations.AddField( - model_name="course", - name="summary_en", - field=models.TextField(blank=True, max_length=200, null=True), - ), - migrations.AddField( - model_name="course", - name="summary_ru", - field=models.TextField(blank=True, max_length=200, null=True), - ), - migrations.AddField( - model_name="course", - name="title_en", - field=models.CharField(max_length=200, null=True), - ), - migrations.AddField( - model_name="course", - name="title_ru", - field=models.CharField(max_length=200, null=True), - ), - migrations.AddField( - model_name="program", - name="summary_en", - field=models.TextField(blank=True, null=True), - ), - migrations.AddField( - model_name="program", - name="summary_ru", - field=models.TextField(blank=True, null=True), - ), - migrations.AddField( - model_name="program", - name="title_en", - field=models.CharField(max_length=150, null=True, unique=True), - ), - migrations.AddField( - model_name="program", - name="title_ru", - field=models.CharField(max_length=150, null=True, unique=True), - ), - migrations.AddField( - model_name="upload", - name="title_en", - field=models.CharField(max_length=100, null=True), - ), - migrations.AddField( - model_name="upload", - name="title_ru", - field=models.CharField(max_length=100, null=True), - ), - migrations.AddField( - model_name="uploadvideo", - name="summary_en", - field=models.TextField(blank=True, null=True), - ), - migrations.AddField( - model_name="uploadvideo", - name="summary_ru", - field=models.TextField(blank=True, null=True), - ), - migrations.AddField( - model_name="uploadvideo", - name="title_en", - field=models.CharField(max_length=100, null=True), - ), - migrations.AddField( - model_name="uploadvideo", - name="title_ru", - field=models.CharField(max_length=100, null=True), - ), - ] diff --git a/course/migrations/0003_course_summary_es_course_summary_fr_course_title_es_and_more.py b/course/migrations/0003_course_summary_es_course_summary_fr_course_title_es_and_more.py deleted file mode 100644 index f6cba626..00000000 --- a/course/migrations/0003_course_summary_es_course_summary_fr_course_title_es_and_more.py +++ /dev/null @@ -1,83 +0,0 @@ -# Generated by Django 4.2.16 on 2024-09-29 13:17 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("course", "0002_course_summary_en_course_summary_ru_course_title_en_and_more"), - ] - - operations = [ - migrations.AddField( - model_name="course", - name="summary_es", - field=models.TextField(blank=True, max_length=200, null=True), - ), - migrations.AddField( - model_name="course", - name="summary_fr", - field=models.TextField(blank=True, max_length=200, null=True), - ), - migrations.AddField( - model_name="course", - name="title_es", - field=models.CharField(max_length=200, null=True), - ), - migrations.AddField( - model_name="course", - name="title_fr", - field=models.CharField(max_length=200, null=True), - ), - migrations.AddField( - model_name="program", - name="summary_es", - field=models.TextField(blank=True, null=True), - ), - migrations.AddField( - model_name="program", - name="summary_fr", - field=models.TextField(blank=True, null=True), - ), - migrations.AddField( - model_name="program", - name="title_es", - field=models.CharField(max_length=150, null=True, unique=True), - ), - migrations.AddField( - model_name="program", - name="title_fr", - field=models.CharField(max_length=150, null=True, unique=True), - ), - migrations.AddField( - model_name="upload", - name="title_es", - field=models.CharField(max_length=100, null=True), - ), - migrations.AddField( - model_name="upload", - name="title_fr", - field=models.CharField(max_length=100, null=True), - ), - migrations.AddField( - model_name="uploadvideo", - name="summary_es", - field=models.TextField(blank=True, null=True), - ), - migrations.AddField( - model_name="uploadvideo", - name="summary_fr", - field=models.TextField(blank=True, null=True), - ), - migrations.AddField( - model_name="uploadvideo", - name="title_es", - field=models.CharField(max_length=100, null=True), - ), - migrations.AddField( - model_name="uploadvideo", - name="title_fr", - field=models.CharField(max_length=100, null=True), - ), - ] diff --git a/course/migrations/0004_alter_course_code_alter_course_credit_and_more.py b/course/migrations/0004_alter_course_code_alter_course_credit_and_more.py deleted file mode 100644 index e4daff82..00000000 --- a/course/migrations/0004_alter_course_code_alter_course_credit_and_more.py +++ /dev/null @@ -1,96 +0,0 @@ -# Generated by Django 4.2.16 on 2024-10-04 22:51 - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ("course", "0003_course_summary_es_course_summary_fr_course_title_es_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="course", - name="code", - field=models.CharField(default="testcode101", max_length=200, unique=True), - preserve_default=False, - ), - migrations.AlterField( - model_name="course", - name="credit", - field=models.IntegerField(default=0), - ), - migrations.AlterField( - model_name="course", - name="is_elective", - field=models.BooleanField(default=False), - ), - migrations.AlterField( - model_name="course", - name="level", - field=models.CharField( - choices=[("Bachelor", "Bachelor Degree"), ("Master", "Master Degree")], - default="Bachelor", - max_length=25, - ), - preserve_default=False, - ), - migrations.AlterField( - model_name="course", - name="summary", - field=models.TextField(blank=True, default="Test summary", max_length=200), - preserve_default=False, - ), - migrations.AlterField( - model_name="course", - name="title", - field=models.CharField(default="Test title", max_length=200), - preserve_default=False, - ), - migrations.AlterField( - model_name="course", - name="year", - field=models.IntegerField( - choices=[(1, "1"), (2, "2"), (3, "3"), (4, "4"), (5, "5"), (6, "6")], - default=1, - ), - ), - migrations.AlterField( - model_name="program", - name="summary", - field=models.TextField(blank=True, default="Test summary"), - preserve_default=False, - ), - migrations.AlterField( - model_name="upload", - name="updated_date", - field=models.DateTimeField( - auto_now=True, default=django.utils.timezone.now - ), - preserve_default=False, - ), - migrations.AlterField( - model_name="upload", - name="upload_time", - field=models.DateTimeField( - auto_now_add=True, default=django.utils.timezone.now - ), - preserve_default=False, - ), - migrations.AlterField( - model_name="uploadvideo", - name="summary", - field=models.TextField(blank=True, default="test"), - preserve_default=False, - ), - migrations.AlterField( - model_name="uploadvideo", - name="timestamp", - field=models.DateTimeField( - auto_now_add=True, default=django.utils.timezone.now - ), - preserve_default=False, - ), - ] diff --git a/course/models.py b/course/models.py deleted file mode 100644 index 37377458..00000000 --- a/course/models.py +++ /dev/null @@ -1,256 +0,0 @@ -from django.conf import settings -from django.core.validators import FileExtensionValidator -from django.db import models -from django.db.models import Q -from django.db.models.signals import pre_save, post_delete, post_save -from django.dispatch import receiver -from django.urls import reverse -from django.utils.translation import gettext_lazy as _ - -from core.models import ActivityLog, Semester -from core.utils import unique_slug_generator - - -class ProgramManager(models.Manager): - def search(self, query=None): - queryset = self.get_queryset() - if query: - or_lookup = Q(title__icontains=query) | Q(summary__icontains=query) - queryset = queryset.filter(or_lookup).distinct() - return queryset - - -class Program(models.Model): - title = models.CharField(max_length=150, unique=True) - summary = models.TextField(blank=True) - - objects = ProgramManager() - - def __str__(self): - return f"{self.title}" - - def get_absolute_url(self): - return reverse("program_detail", kwargs={"pk": self.pk}) - - -@receiver(post_save, sender=Program) -def log_program_save(sender, instance, created, **kwargs): - verb = "created" if created else "updated" - ActivityLog.objects.create(message=_(f"The program '{instance}' has been {verb}.")) - - -@receiver(post_delete, sender=Program) -def log_program_delete(sender, instance, **kwargs): - ActivityLog.objects.create(message=_(f"The program '{instance}' has been deleted.")) - - -class CourseManager(models.Manager): - def search(self, query=None): - queryset = self.get_queryset() - if query: - or_lookup = ( - Q(title__icontains=query) - | Q(summary__icontains=query) - | Q(code__icontains=query) - | Q(slug__icontains=query) - ) - queryset = queryset.filter(or_lookup).distinct() - return queryset - - -class Course(models.Model): - slug = models.SlugField(unique=True, blank=True) - title = models.CharField(max_length=200) - code = models.CharField(max_length=200, unique=True) - credit = models.IntegerField(default=0) - summary = models.TextField(max_length=200, blank=True) - program = models.ForeignKey(Program, on_delete=models.CASCADE) - level = models.CharField(max_length=25, choices=settings.LEVEL_CHOICES) - year = models.IntegerField(choices=settings.YEARS, default=1) - semester = models.CharField(choices=settings.SEMESTER_CHOICES, max_length=200) - is_elective = models.BooleanField(default=False) - - objects = CourseManager() - - def __str__(self): - return f"{self.title} ({self.code})" - - def get_absolute_url(self): - return reverse("course_detail", kwargs={"slug": self.slug}) - - @property - def is_current_semester(self): - - current_semester = Semester.objects.filter(is_current_semester=True).first() - return self.semester == current_semester.semester if current_semester else False - - -@receiver(pre_save, sender=Course) -def course_pre_save_receiver(sender, instance, **kwargs): - if not instance.slug: - instance.slug = unique_slug_generator(instance) - - -@receiver(post_save, sender=Course) -def log_course_save(sender, instance, created, **kwargs): - verb = "created" if created else "updated" - ActivityLog.objects.create(message=_(f"The course '{instance}' has been {verb}.")) - - -@receiver(post_delete, sender=Course) -def log_course_delete(sender, instance, **kwargs): - ActivityLog.objects.create(message=_(f"The course '{instance}' has been deleted.")) - - -class CourseAllocation(models.Model): - lecturer = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name="allocated_lecturer", - ) - courses = models.ManyToManyField(Course, related_name="allocated_course") - session = models.ForeignKey( - "core.Session", on_delete=models.CASCADE, blank=True, null=True - ) - - def __str__(self): - return self.lecturer.get_full_name - - def get_absolute_url(self): - return reverse("edit_allocated_course", kwargs={"pk": self.pk}) - - -class Upload(models.Model): - title = models.CharField(max_length=100) - course = models.ForeignKey(Course, on_delete=models.CASCADE) - file = models.FileField( - upload_to="course_files/", - help_text=_( - "Valid Files: pdf, docx, doc, xls, xlsx, ppt, pptx, zip, rar, 7zip" - ), - validators=[ - FileExtensionValidator( - [ - "pdf", - "docx", - "doc", - "xls", - "xlsx", - "ppt", - "pptx", - "zip", - "rar", - "7zip", - ] - ) - ], - ) - updated_date = models.DateTimeField(auto_now=True) - upload_time = models.DateTimeField(auto_now_add=True) - - def __str__(self): - return f"{self.title}" - - def get_extension_short(self): - ext = self.file.name.split(".")[-1].lower() - if ext in ("doc", "docx"): - return "word" - elif ext == "pdf": - return "pdf" - elif ext in ("xls", "xlsx"): - return "excel" - elif ext in ("ppt", "pptx"): - return "powerpoint" - elif ext in ("zip", "rar", "7zip"): - return "archive" - return "file" - - def delete(self, *args, **kwargs): - self.file.delete(save=False) - super().delete(*args, **kwargs) - - -@receiver(post_save, sender=Upload) -def log_upload_save(sender, instance, created, **kwargs): - if created: - message = _( - f"The file '{instance.title}' has been uploaded to the course '{instance.course}'." - ) - else: - message = _( - f"The file '{instance.title}' of the course '{instance.course}' has been updated." - ) - ActivityLog.objects.create(message=message) - - -@receiver(post_delete, sender=Upload) -def log_upload_delete(sender, instance, **kwargs): - ActivityLog.objects.create( - message=_( - f"The file '{instance.title}' of the course '{instance.course}' has been deleted." - ) - ) - - -class UploadVideo(models.Model): - title = models.CharField(max_length=100) - slug = models.SlugField(unique=True, blank=True) - course = models.ForeignKey(Course, on_delete=models.CASCADE) - video = models.FileField( - upload_to="course_videos/", - help_text=_("Valid video formats: mp4, mkv, wmv, 3gp, f4v, avi, mp3"), - validators=[ - FileExtensionValidator(["mp4", "mkv", "wmv", "3gp", "f4v", "avi", "mp3"]) - ], - ) - summary = models.TextField(blank=True) - timestamp = models.DateTimeField(auto_now_add=True) - - def __str__(self): - return f"{self.title}" - - def get_absolute_url(self): - return reverse( - "video_single", kwargs={"slug": self.course.slug, "video_slug": self.slug} - ) - - def delete(self, *args, **kwargs): - self.video.delete(save=False) - super().delete(*args, **kwargs) - - -@receiver(pre_save, sender=UploadVideo) -def video_pre_save_receiver(sender, instance, **kwargs): - if not instance.slug: - instance.slug = unique_slug_generator(instance) - - -@receiver(post_save, sender=UploadVideo) -def log_uploadvideo_save(sender, instance, created, **kwargs): - if created: - message = _( - f"The video '{instance.title}' has been uploaded to the course '{instance.course}'." - ) - else: - message = _( - f"The video '{instance.title}' of the course '{instance.course}' has been updated." - ) - ActivityLog.objects.create(message=message) - - -@receiver(post_delete, sender=UploadVideo) -def log_uploadvideo_delete(sender, instance, **kwargs): - ActivityLog.objects.create( - message=_( - f"The video '{instance.title}' of the course '{instance.course}' has been deleted." - ) - ) - - -class CourseOffer(models.Model): - """NOTE: Only department head can offer semester courses""" - - dep_head = models.ForeignKey("accounts.DepartmentHead", on_delete=models.CASCADE) - - def __str__(self): - return str(self.dep_head) diff --git a/course/tests.py b/course/tests.py deleted file mode 100644 index 7ce503c2..00000000 --- a/course/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/course/translation.py b/course/translation.py deleted file mode 100644 index 91c781f9..00000000 --- a/course/translation.py +++ /dev/null @@ -1,22 +0,0 @@ -from modeltranslation.translator import register, TranslationOptions -from .models import Program, Course, Upload, UploadVideo - -@register(Program) -class ProgramTranslationOptions(TranslationOptions): - fields = ('title', 'summary',) - empty_values=None - -@register(Course) -class CourseTranslationOptions(TranslationOptions): - fields = ('title', 'summary',) - empty_values=None - -@register(Upload) -class UploadTranslationOptions(TranslationOptions): - fields = ('title',) - empty_values=None - -@register(UploadVideo) -class UploadVideoTranslationOptions(TranslationOptions): - fields = ('title', 'summary',) - empty_values=None \ No newline at end of file diff --git a/course/urls.py b/course/urls.py deleted file mode 100644 index ef29b76a..00000000 --- a/course/urls.py +++ /dev/null @@ -1,77 +0,0 @@ -from django.urls import path -from . import views - - -urlpatterns = [ - # Program urls - path("", views.ProgramFilterView.as_view(), name="programs"), - path("/detail/", views.program_detail, name="program_detail"), - path("add/", views.program_add, name="add_program"), - path("/edit/", views.program_edit, name="edit_program"), - path("/delete/", views.program_delete, name="program_delete"), - # Course urls - path("course//detail/", views.course_single, name="course_detail"), - path("/course/add/", views.course_add, name="course_add"), - path("course//edit/", views.course_edit, name="edit_course"), - path("course/delete//", views.course_delete, name="delete_course"), - # CourseAllocation urls - path( - "course/assign/", - views.CourseAllocationFormView.as_view(), - name="course_allocation", - ), - path( - "course/allocated/", - views.CourseAllocationFilterView.as_view(), - name="course_allocation_view", - ), - path( - "allocated_course//edit/", - views.edit_allocated_course, - name="edit_allocated_course", - ), - path( - "course//deallocate/", views.deallocate_course, name="course_deallocate" - ), - # File uploads urls - path( - "course//documentations/upload/", - views.handle_file_upload, - name="upload_file_view", - ), - path( - "course//documentations//edit/", - views.handle_file_edit, - name="upload_file_edit", - ), - path( - "course//documentations//delete/", - views.handle_file_delete, - name="upload_file_delete", - ), - # Video uploads urls - path( - "course//video_tutorials/upload/", - views.handle_video_upload, - name="upload_video", - ), - path( - "course//video_tutorials//detail/", - views.handle_video_single, - name="video_single", - ), - path( - "course//video_tutorials//edit/", - views.handle_video_edit, - name="upload_video_edit", - ), - path( - "course//video_tutorials//delete/", - views.handle_video_delete, - name="upload_video_delete", - ), - # course registration - path("course/registration/", views.course_registration, name="course_registration"), - path("course/drop/", views.course_drop, name="course_drop"), - path("my_courses/", views.user_course_list, name="user_course_list"), -] diff --git a/course/utils.py b/course/utils.py deleted file mode 100644 index e69de29b..00000000 diff --git a/course/views.py b/course/views.py deleted file mode 100644 index 73466e00..00000000 --- a/course/views.py +++ /dev/null @@ -1,504 +0,0 @@ -from django.conf import settings -from django.contrib import messages -from django.contrib.auth.decorators import login_required -from django.core.paginator import Paginator -from django.db.models import Sum -from django.shortcuts import get_object_or_404, redirect, render -from django.utils.decorators import method_decorator -from django.views.generic import CreateView -from django_filters.views import FilterView - -from accounts.decorators import lecturer_required, student_required -from accounts.models import Student -from core.models import Semester -from course.filters import CourseAllocationFilter, ProgramFilter -from course.forms import ( - CourseAddForm, - CourseAllocationForm, - EditCourseAllocationForm, - ProgramForm, - UploadFormFile, - UploadFormVideo, -) -from course.models import ( - Course, - CourseAllocation, - Program, - Upload, - UploadVideo, -) -from result.models import TakenCourse - - -# ######################################################## -# Program Views -# ######################################################## - - -@method_decorator([login_required, lecturer_required], name="dispatch") -class ProgramFilterView(FilterView): - filterset_class = ProgramFilter - template_name = "course/program_list.html" - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["title"] = "Programs" - return context - - -@login_required -@lecturer_required -def program_add(request): - if request.method == "POST": - form = ProgramForm(request.POST) - if form.is_valid(): - program = form.save() - messages.success(request, f"{program.title} program has been created.") - return redirect("programs") - messages.error(request, "Correct the error(s) below.") - else: - form = ProgramForm() - return render( - request, "course/program_add.html", {"title": "Add Program", "form": form} - ) - - -@login_required -def program_detail(request, pk): - program = get_object_or_404(Program, pk=pk) - courses = Course.objects.filter(program_id=pk).order_by("-year") - credits = courses.aggregate(total_credits=Sum("credit")) - paginator = Paginator(courses, 10) - page = request.GET.get("page") - courses = paginator.get_page(page) - return render( - request, - "course/program_single.html", - { - "title": program.title, - "program": program, - "courses": courses, - "credits": credits, - }, - ) - - -@login_required -@lecturer_required -def program_edit(request, pk): - program = get_object_or_404(Program, pk=pk) - if request.method == "POST": - form = ProgramForm(request.POST, instance=program) - if form.is_valid(): - program = form.save() - messages.success(request, f"{program.title} program has been updated.") - return redirect("programs") - messages.error(request, "Correct the error(s) below.") - else: - form = ProgramForm(instance=program) - return render( - request, "course/program_add.html", {"title": "Edit Program", "form": form} - ) - - -@login_required -@lecturer_required -def program_delete(request, pk): - program = get_object_or_404(Program, pk=pk) - title = program.title - program.delete() - messages.success(request, f"Program {title} has been deleted.") - return redirect("programs") - - -# ######################################################## -# Course Views -# ######################################################## - - -@login_required -def course_single(request, slug): - course = get_object_or_404(Course, slug=slug) - files = Upload.objects.filter(course__slug=slug) - videos = UploadVideo.objects.filter(course__slug=slug) - lecturers = CourseAllocation.objects.filter(courses__pk=course.id) - return render( - request, - "course/course_single.html", - { - "title": course.title, - "course": course, - "files": files, - "videos": videos, - "lecturers": lecturers, - "media_url": settings.MEDIA_URL, - }, - ) - - -@login_required -@lecturer_required -def course_add(request, pk): - program = get_object_or_404(Program, pk=pk) - if request.method == "POST": - form = CourseAddForm(request.POST) - if form.is_valid(): - course = form.save() - messages.success( - request, f"{course.title} ({course.code}) has been created." - ) - return redirect("program_detail", pk=program.pk) - messages.error(request, "Correct the error(s) below.") - else: - form = CourseAddForm(initial={"program": program}) - return render( - request, - "course/course_add.html", - {"title": "Add Course", "form": form, "program": program}, - ) - - -@login_required -@lecturer_required -def course_edit(request, slug): - course = get_object_or_404(Course, slug=slug) - if request.method == "POST": - form = CourseAddForm(request.POST, instance=course) - if form.is_valid(): - course = form.save() - messages.success( - request, f"{course.title} ({course.code}) has been updated." - ) - return redirect("program_detail", pk=course.program.pk) - messages.error(request, "Correct the error(s) below.") - else: - form = CourseAddForm(instance=course) - return render( - request, "course/course_add.html", {"title": "Edit Course", "form": form} - ) - - -@login_required -@lecturer_required -def course_delete(request, slug): - course = get_object_or_404(Course, slug=slug) - title = course.title - program_id = course.program.id - course.delete() - messages.success(request, f"Course {title} has been deleted.") - return redirect("program_detail", pk=program_id) - - -# ######################################################## -# Course Allocation Views -# ######################################################## - - -@method_decorator([login_required, lecturer_required], name="dispatch") -class CourseAllocationFormView(CreateView): - form_class = CourseAllocationForm - template_name = "course/course_allocation_form.html" - - def form_valid(self, form): - lecturer = form.cleaned_data["lecturer"] - selected_courses = form.cleaned_data["courses"] - allocation, created = CourseAllocation.objects.get_or_create(lecturer=lecturer) - allocation.courses.set(selected_courses) - messages.success( - self.request, f"Courses allocated to {lecturer.get_full_name} successfully." - ) - return redirect("course_allocation_view") - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["title"] = "Assign Course" - return context - - -@method_decorator([login_required, lecturer_required], name="dispatch") -class CourseAllocationFilterView(FilterView): - filterset_class = CourseAllocationFilter - template_name = "course/course_allocation_view.html" - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["title"] = "Course Allocations" - return context - - -@login_required -@lecturer_required -def edit_allocated_course(request, pk): - allocation = get_object_or_404(CourseAllocation, pk=pk) - if request.method == "POST": - form = EditCourseAllocationForm(request.POST, instance=allocation) - if form.is_valid(): - form.save() - messages.success(request, "Course allocation has been updated.") - return redirect("course_allocation_view") - messages.error(request, "Correct the error(s) below.") - else: - form = EditCourseAllocationForm(instance=allocation) - return render( - request, - "course/course_allocation_form.html", - {"title": "Edit Course Allocation", "form": form}, - ) - - -@login_required -@lecturer_required -def deallocate_course(request, pk): - allocation = get_object_or_404(CourseAllocation, pk=pk) - allocation.delete() - messages.success(request, "Successfully deallocated courses.") - return redirect("course_allocation_view") - - -# ######################################################## -# File Upload Views -# ######################################################## - - -@login_required -@lecturer_required -def handle_file_upload(request, slug): - course = get_object_or_404(Course, slug=slug) - if request.method == "POST": - form = UploadFormFile(request.POST, request.FILES) - if form.is_valid(): - upload = form.save(commit=False) - upload.course = course - upload.save() - messages.success(request, f"{upload.title} has been uploaded.") - return redirect("course_detail", slug=slug) - messages.error(request, "Correct the error(s) below.") - else: - form = UploadFormFile() - return render( - request, - "upload/upload_file_form.html", - {"title": "File Upload", "form": form, "course": course}, - ) - - -@login_required -@lecturer_required -def handle_file_edit(request, slug, file_id): - course = get_object_or_404(Course, slug=slug) - upload = get_object_or_404(Upload, pk=file_id) - if request.method == "POST": - form = UploadFormFile(request.POST, request.FILES, instance=upload) - if form.is_valid(): - upload = form.save() - messages.success(request, f"{upload.title} has been updated.") - return redirect("course_detail", slug=slug) - messages.error(request, "Correct the error(s) below.") - else: - form = UploadFormFile(instance=upload) - return render( - request, - "upload/upload_file_form.html", - {"title": "Edit File", "form": form, "course": course}, - ) - - -@login_required -@lecturer_required -def handle_file_delete(request, slug, file_id): - upload = get_object_or_404(Upload, pk=file_id) - title = upload.title - upload.delete() - messages.success(request, f"{title} has been deleted.") - return redirect("course_detail", slug=slug) - - -# ######################################################## -# Video Upload Views -# ######################################################## - - -@login_required -@lecturer_required -def handle_video_upload(request, slug): - course = get_object_or_404(Course, slug=slug) - if request.method == "POST": - form = UploadFormVideo(request.POST, request.FILES) - if form.is_valid(): - video = form.save(commit=False) - video.course = course - video.save() - messages.success(request, f"{video.title} has been uploaded.") - return redirect("course_detail", slug=slug) - messages.error(request, "Correct the error(s) below.") - else: - form = UploadFormVideo() - return render( - request, - "upload/upload_video_form.html", - {"title": "Video Upload", "form": form, "course": course}, - ) - - -@login_required -def handle_video_single(request, slug, video_slug): - course = get_object_or_404(Course, slug=slug) - video = get_object_or_404(UploadVideo, slug=video_slug) - return render( - request, - "upload/video_single.html", - {"video": video, "course": course}, - ) - - -@login_required -@lecturer_required -def handle_video_edit(request, slug, video_slug): - course = get_object_or_404(Course, slug=slug) - video = get_object_or_404(UploadVideo, slug=video_slug) - if request.method == "POST": - form = UploadFormVideo(request.POST, request.FILES, instance=video) - if form.is_valid(): - video = form.save() - messages.success(request, f"{video.title} has been updated.") - return redirect("course_detail", slug=slug) - messages.error(request, "Correct the error(s) below.") - else: - form = UploadFormVideo(instance=video) - return render( - request, - "upload/upload_video_form.html", - {"title": "Edit Video", "form": form, "course": course}, - ) - - -@login_required -@lecturer_required -def handle_video_delete(request, slug, video_slug): - video = get_object_or_404(UploadVideo, slug=video_slug) - title = video.title - video.delete() - messages.success(request, f"{title} has been deleted.") - return redirect("course_detail", slug=slug) - - -# ######################################################## -# Course Registration Views -# ######################################################## - - -@login_required -@student_required -def course_registration(request): - if request.method == "POST": - student = Student.objects.get(student__pk=request.user.id) - ids = () - data = request.POST.copy() - data.pop("csrfmiddlewaretoken", None) # remove csrf_token - for key in data.keys(): - ids = ids + (str(key),) - for s in range(0, len(ids)): - course = Course.objects.get(pk=ids[s]) - obj = TakenCourse.objects.create(student=student, course=course) - obj.save() - messages.success(request, "Courses registered successfully!") - return redirect("course_registration") - else: - current_semester = Semester.objects.filter(is_current_semester=True).first() - if not current_semester: - messages.error(request, "No active semester found.") - return render(request, "course/course_registration.html") - - # student = Student.objects.get(student__pk=request.user.id) - student = get_object_or_404(Student, student__id=request.user.id) - taken_courses = TakenCourse.objects.filter(student__student__id=request.user.id) - t = () - for i in taken_courses: - t += (i.course.pk,) - - courses = ( - Course.objects.filter( - program__pk=student.program.id, - level=student.level, - semester=current_semester, - ) - .exclude(id__in=t) - .order_by("year") - ) - all_courses = Course.objects.filter( - level=student.level, program__pk=student.program.id - ) - - no_course_is_registered = False # Check if no course is registered - all_courses_are_registered = False - - registered_courses = Course.objects.filter(level=student.level).filter(id__in=t) - if ( - registered_courses.count() == 0 - ): # Check if number of registered courses is 0 - no_course_is_registered = True - - if registered_courses.count() == all_courses.count(): - all_courses_are_registered = True - - total_first_semester_credit = 0 - total_sec_semester_credit = 0 - total_registered_credit = 0 - for i in courses: - if i.semester == "First": - total_first_semester_credit += int(i.credit) - if i.semester == "Second": - total_sec_semester_credit += int(i.credit) - for i in registered_courses: - total_registered_credit += int(i.credit) - context = { - "is_calender_on": True, - "all_courses_are_registered": all_courses_are_registered, - "no_course_is_registered": no_course_is_registered, - "current_semester": current_semester, - "courses": courses, - "total_first_semester_credit": total_first_semester_credit, - "total_sec_semester_credit": total_sec_semester_credit, - "registered_courses": registered_courses, - "total_registered_credit": total_registered_credit, - "student": student, - } - return render(request, "course/course_registration.html", context) - - -@login_required -@student_required -def course_drop(request): - if request.method == "POST": - student = get_object_or_404(Student, student__pk=request.user.id) - course_ids = request.POST.getlist("course_ids") - print("course_ids", course_ids) - for course_id in course_ids: - course = get_object_or_404(Course, pk=course_id) - TakenCourse.objects.filter(student=student, course=course).delete() - messages.success(request, "Courses dropped successfully!") - return redirect("course_registration") - - -# ######################################################## -# User Course List View -# ######################################################## - - -@login_required -def user_course_list(request): - if request.user.is_lecturer: - courses = Course.objects.filter(allocated_course__lecturer__pk=request.user.id) - return render(request, "course/user_course_list.html", {"courses": courses}) - - if request.user.is_student: - student = get_object_or_404(Student, student__pk=request.user.id) - taken_courses = TakenCourse.objects.filter(student=student) - return render( - request, - "course/user_course_list.html", - {"student": student, "taken_courses": taken_courses}, - ) - - # For other users - return render(request, "course/user_course_list.html") diff --git a/db.sqlite3.backup b/db.sqlite3.backup new file mode 100644 index 00000000..5fff10a4 Binary files /dev/null and b/db.sqlite3.backup differ diff --git a/payments/__init__.py b/finance/__init__.py similarity index 100% rename from payments/__init__.py rename to finance/__init__.py diff --git a/finance/admin.py b/finance/admin.py new file mode 100644 index 00000000..8c09e6e5 --- /dev/null +++ b/finance/admin.py @@ -0,0 +1,21 @@ +from django.contrib import admin + +from .models import Invoice, Payment + + +@admin.register(Invoice) +class InvoiceAdmin(admin.ModelAdmin): + list_display = ["title", "student", "amount", "status", "due_date", "created_at"] + list_filter = ["status", "due_date"] + search_fields = [ + "title", + "student__student__first_name", + "student__student__last_name", + ] + + +@admin.register(Payment) +class PaymentAdmin(admin.ModelAdmin): + list_display = ["student", "invoice", "amount", "payment_method", "created_at"] + list_filter = ["payment_method", "created_at"] + search_fields = ["student__student__first_name", "student__student__last_name"] diff --git a/finance/apps.py b/finance/apps.py new file mode 100644 index 00000000..2fc5a789 --- /dev/null +++ b/finance/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class FinanceConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "finance" diff --git a/finance/migrations/0001_initial.py b/finance/migrations/0001_initial.py new file mode 100644 index 00000000..83267279 --- /dev/null +++ b/finance/migrations/0001_initial.py @@ -0,0 +1,135 @@ +# Generated by Django 5.2.8 on 2026-04-10 06:00 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ("accounts", "0004_add_lecturer_model"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="Invoice", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255)), + ("amount", models.DecimalField(decimal_places=2, max_digits=10)), + ( + "status", + models.CharField( + choices=[ + ("pending", "Pending"), + ("paid", "Paid"), + ("partially_paid", "Partially Paid"), + ("overdue", "Overdue"), + ], + default="pending", + max_length=20, + ), + ), + ("due_date", models.DateField()), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_invoices", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "student", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="invoices", + to="accounts.student", + ), + ), + ], + options={ + "verbose_name": "Invoice", + "verbose_name_plural": "Invoices", + "ordering": ["-created_at"], + }, + ), + migrations.CreateModel( + name="Payment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("amount", models.DecimalField(decimal_places=2, max_digits=10)), + ( + "payment_method", + models.CharField( + choices=[ + ("cash", "Cash"), + ("card", "Card"), + ("transfer", "Transfer"), + ], + default="cash", + max_length=20, + ), + ), + ("comment", models.TextField(blank=True, default="")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_payments", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "invoice", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="payments", + to="finance.invoice", + ), + ), + ( + "student", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="payments", + to="accounts.student", + ), + ), + ], + options={ + "verbose_name": "Payment", + "verbose_name_plural": "Payments", + "ordering": ["-created_at"], + }, + ), + ] diff --git a/payments/migrations/__init__.py b/finance/migrations/__init__.py similarity index 100% rename from payments/migrations/__init__.py rename to finance/migrations/__init__.py diff --git a/finance/models.py b/finance/models.py new file mode 100644 index 00000000..a0e91017 --- /dev/null +++ b/finance/models.py @@ -0,0 +1,97 @@ +from django.db import models +from django.db.models import Sum + +from config import settings + +INVOICE_STATUS = ( + ("pending", "Pending"), + ("paid", "Paid"), + ("partially_paid", "Partially Paid"), + ("overdue", "Overdue"), +) + +PAYMENT_METHOD = ( + ("cash", "Cash"), + ("card", "Card"), + ("transfer", "Transfer"), +) + + +class Invoice(models.Model): + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_invoices", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + ) + student = models.ForeignKey( + "accounts.Student", + on_delete=models.CASCADE, + related_name="invoices", + ) + title = models.CharField(max_length=255) + amount = models.DecimalField(max_digits=10, decimal_places=2) + status = models.CharField(max_length=20, choices=INVOICE_STATUS, default="pending") + due_date = models.DateField() + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + class Meta: + verbose_name = "Invoice" + verbose_name_plural = "Invoices" + ordering = ["-created_at"] + + def __str__(self): + return f"{self.title} - {self.student}" + + @property + def total_paid(self): + result = self.payments.aggregate(total=Sum("amount")) + return result["total"] or 0 + + def update_status(self): + total_paid = self.total_paid + if total_paid >= self.amount: + self.status = "paid" + elif total_paid > 0: + self.status = "partially_paid" + else: + self.status = "pending" + self.save(update_fields=["status", "updated_at"]) + + +class Payment(models.Model): + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_payments", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + ) + invoice = models.ForeignKey( + Invoice, + on_delete=models.CASCADE, + related_name="payments", + ) + student = models.ForeignKey( + "accounts.Student", + on_delete=models.CASCADE, + related_name="payments", + ) + amount = models.DecimalField(max_digits=10, decimal_places=2) + payment_method = models.CharField( + max_length=20, choices=PAYMENT_METHOD, default="cash" + ) + comment = models.TextField(blank=True, default="") + created_at = models.DateTimeField(auto_now_add=True) + + class Meta: + verbose_name = "Payment" + verbose_name_plural = "Payments" + ordering = ["-created_at"] + + def __str__(self): + return f"Payment {self.amount} - {self.student}" diff --git a/finance/permissions.py b/finance/permissions.py new file mode 100644 index 00000000..3fbee5f7 --- /dev/null +++ b/finance/permissions.py @@ -0,0 +1,8 @@ +from rest_framework import permissions + + +class IsStudentOwner(permissions.BasePermission): + def has_permission(self, request, view): + return bool( + request.user and request.user.is_authenticated and request.user.is_student + ) diff --git a/finance/serializers.py b/finance/serializers.py new file mode 100644 index 00000000..d446f244 --- /dev/null +++ b/finance/serializers.py @@ -0,0 +1,83 @@ +from rest_framework import serializers + +from .models import Invoice, Payment + + +class InvoiceListSerializer(serializers.ModelSerializer): + student_name = serializers.CharField(source="student.get_full_name", read_only=True) + student_id = serializers.PrimaryKeyRelatedField(source="student", read_only=True) + total_paid = serializers.DecimalField( + max_digits=10, decimal_places=2, read_only=True + ) + + class Meta: + model = Invoice + fields = [ + "id", + "student_id", + "student_name", + "title", + "amount", + "status", + "due_date", + "total_paid", + "created_at", + "updated_at", + ] + + +class InvoiceWriteSerializer(serializers.ModelSerializer): + class Meta: + model = Invoice + fields = ["student", "title", "amount", "status", "due_date"] + + def create(self, validated_data): + admin = self.context.get("admin") + return Invoice.objects.create(admin=admin, **validated_data) + + def update(self, instance, validated_data): + for attr, value in validated_data.items(): + setattr(instance, attr, value) + instance.save() + return instance + + +class PaymentListSerializer(serializers.ModelSerializer): + student_name = serializers.CharField(source="student.get_full_name", read_only=True) + student_id = serializers.PrimaryKeyRelatedField(source="student", read_only=True) + invoice_title = serializers.CharField(source="invoice.title", read_only=True) + invoice_id = serializers.PrimaryKeyRelatedField(source="invoice", read_only=True) + + class Meta: + model = Payment + fields = [ + "id", + "student_id", + "student_name", + "invoice_id", + "invoice_title", + "amount", + "payment_method", + "comment", + "created_at", + ] + + +class PaymentWriteSerializer(serializers.ModelSerializer): + class Meta: + model = Payment + fields = ["invoice", "student", "amount", "payment_method", "comment"] + + def create(self, validated_data): + admin = self.context.get("admin") + payment = Payment.objects.create(admin=admin, **validated_data) + payment.invoice.update_status() + return payment + + +class StudentBalanceSerializer(serializers.Serializer): + student_id = serializers.IntegerField() + student_name = serializers.CharField() + total_charged = serializers.DecimalField(max_digits=10, decimal_places=2) + total_paid = serializers.DecimalField(max_digits=10, decimal_places=2) + balance = serializers.DecimalField(max_digits=10, decimal_places=2) diff --git a/finance/urls.py b/finance/urls.py new file mode 100644 index 00000000..b9377b51 --- /dev/null +++ b/finance/urls.py @@ -0,0 +1,46 @@ +from django.urls import path + +from . import views + +urlpatterns = [ + # Admin: Invoices + path("invoices/", views.InvoiceListAPIView.as_view(), name="invoice-list"), + path( + "invoices/create/", views.InvoiceCreateAPIView.as_view(), name="invoice-create" + ), + path( + "invoices//", + views.InvoiceRetrieveAPIView.as_view(), + name="invoice-detail", + ), + path( + "invoices//update/", + views.InvoiceUpdateAPIView.as_view(), + name="invoice-update", + ), + path( + "invoices//delete/", + views.InvoiceDeleteAPIView.as_view(), + name="invoice-delete", + ), + # Admin: Payments + path("payments/", views.PaymentListAPIView.as_view(), name="payment-list"), + path( + "payments/create/", views.PaymentCreateAPIView.as_view(), name="payment-create" + ), + path( + "payments//delete/", + views.PaymentDeleteAPIView.as_view(), + name="payment-delete", + ), + # Admin: Student Balance + path( + "students//balance/", + views.StudentBalanceAPIView.as_view(), + name="student-balance", + ), + # Student: My Finance + path("my/invoices/", views.MyInvoicesAPIView.as_view(), name="my-invoices"), + path("my/payments/", views.MyPaymentsAPIView.as_view(), name="my-payments"), + path("my/balance/", views.MyBalanceAPIView.as_view(), name="my-balance"), +] diff --git a/finance/views.py b/finance/views.py new file mode 100644 index 00000000..e9f018a9 --- /dev/null +++ b/finance/views.py @@ -0,0 +1,216 @@ +from django.db.models import Sum +from rest_framework import generics +from rest_framework.exceptions import PermissionDenied +from rest_framework.permissions import IsAdminUser +from rest_framework.response import Response +from rest_framework.views import APIView + +from accounts.models import Student + +from .models import Invoice, Payment +from .permissions import IsStudentOwner +from .serializers import ( + InvoiceListSerializer, + InvoiceWriteSerializer, + PaymentListSerializer, + PaymentWriteSerializer, + StudentBalanceSerializer, +) + +# ===================== Admin: Invoices ===================== + + +class InvoiceListAPIView(generics.ListAPIView): + serializer_class = InvoiceListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + if not self.request.user.is_superuser: + raise PermissionDenied("Only admins can access this view.") + qs = Invoice.objects.filter(admin=self.request.user) + student_id = self.request.query_params.get("student") + status = self.request.query_params.get("status") + if student_id: + qs = qs.filter(student_id=student_id) + if status: + qs = qs.filter(status=status) + return qs + + +class InvoiceCreateAPIView(generics.CreateAPIView): + serializer_class = InvoiceWriteSerializer + permission_classes = [IsAdminUser] + + def get_serializer_context(self): + context = super().get_serializer_context() + if not self.request.user.is_superuser: + raise PermissionDenied("Only admins can access this view.") + context["admin"] = self.request.user + return context + + +class InvoiceRetrieveAPIView(generics.RetrieveAPIView): + serializer_class = InvoiceListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + if not self.request.user.is_superuser: + raise PermissionDenied("Only admins can access this view.") + return Invoice.objects.filter(admin=self.request.user) + + +class InvoiceUpdateAPIView(generics.UpdateAPIView): + serializer_class = InvoiceWriteSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + if not self.request.user.is_superuser: + raise PermissionDenied("Only admins can access this view.") + return Invoice.objects.filter(admin=self.request.user) + + def get_serializer_context(self): + context = super().get_serializer_context() + context["admin"] = self.request.user + return context + + +class InvoiceDeleteAPIView(generics.DestroyAPIView): + permission_classes = [IsAdminUser] + + def get_queryset(self): + if not self.request.user.is_superuser: + raise PermissionDenied("Only admins can access this view.") + return Invoice.objects.filter(admin=self.request.user) + + +# ===================== Admin: Payments ===================== + + +class PaymentListAPIView(generics.ListAPIView): + serializer_class = PaymentListSerializer + permission_classes = [IsAdminUser] + + def get_queryset(self): + if not self.request.user.is_superuser: + raise PermissionDenied("Only admins can access this view.") + qs = Payment.objects.filter(admin=self.request.user) + student_id = self.request.query_params.get("student") + if student_id: + qs = qs.filter(student_id=student_id) + return qs + + +class PaymentCreateAPIView(generics.CreateAPIView): + serializer_class = PaymentWriteSerializer + permission_classes = [IsAdminUser] + + def get_serializer_context(self): + context = super().get_serializer_context() + if not self.request.user.is_superuser: + raise PermissionDenied("Only admins can access this view.") + context["admin"] = self.request.user + return context + + +class PaymentDeleteAPIView(generics.DestroyAPIView): + permission_classes = [IsAdminUser] + + def get_queryset(self): + if not self.request.user.is_superuser: + raise PermissionDenied("Only admins can access this view.") + return Payment.objects.filter(admin=self.request.user) + + def perform_destroy(self, instance): + invoice = instance.invoice + instance.delete() + invoice.update_status() + + +# ===================== Admin: Student Balance ===================== + + +class StudentBalanceAPIView(APIView): + permission_classes = [IsAdminUser] + + def get(self, request, pk): + if not request.user.is_superuser: + raise PermissionDenied("Only admins can access this view.") + + try: + student = Student.objects.get(pk=pk, admin=request.user) + except Student.DoesNotExist: + return Response({"detail": "Student not found."}, status=404) + + total_charged = ( + Invoice.objects.filter(student=student, admin=request.user).aggregate( + total=Sum("amount") + )["total"] + or 0 + ) + total_paid = ( + Payment.objects.filter(student=student, admin=request.user).aggregate( + total=Sum("amount") + )["total"] + or 0 + ) + + data = { + "student_id": student.pk, + "student_name": student.get_full_name(), + "total_charged": total_charged, + "total_paid": total_paid, + "balance": total_charged - total_paid, + } + serializer = StudentBalanceSerializer(data) + return Response(serializer.data) + + +# ===================== Student: My Finance ===================== + + +class MyInvoicesAPIView(generics.ListAPIView): + serializer_class = InvoiceListSerializer + permission_classes = [IsStudentOwner] + + def get_queryset(self): + student = self.request.user.student_profile + return Invoice.objects.filter(student=student) + + +class MyPaymentsAPIView(generics.ListAPIView): + serializer_class = PaymentListSerializer + permission_classes = [IsStudentOwner] + + def get_queryset(self): + student = self.request.user.student_profile + return Payment.objects.filter(student=student) + + +class MyBalanceAPIView(APIView): + permission_classes = [IsStudentOwner] + + def get(self, request): + student = request.user.student_profile + + total_charged = ( + Invoice.objects.filter(student=student).aggregate(total=Sum("amount"))[ + "total" + ] + or 0 + ) + total_paid = ( + Payment.objects.filter(student=student).aggregate(total=Sum("amount"))[ + "total" + ] + or 0 + ) + + data = { + "student_id": student.pk, + "student_name": student.get_full_name(), + "total_charged": total_charged, + "total_paid": total_paid, + "balance": total_charged - total_paid, + } + serializer = StudentBalanceSerializer(data) + return Response(serializer.data) diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po deleted file mode 100644 index 66fe8d57..00000000 --- a/locale/es/LC_MESSAGES/django.po +++ /dev/null @@ -1,3665 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-29 15:37+0300\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: accounts/models.py:14 course/models.py:24 -msgid "Bachelor" -msgstr "" - -#: accounts/models.py:15 course/models.py:25 -msgid "Master" -msgstr "" - -#: accounts/models.py:19 course/models.py:29 -msgid "Bachelor Degree" -msgstr "" - -#: accounts/models.py:20 course/models.py:30 -msgid "Master Degree" -msgstr "" - -#: accounts/models.py:23 accounts/models.py:32 -msgid "Father" -msgstr "" - -#: accounts/models.py:24 accounts/models.py:33 -msgid "Mother" -msgstr "" - -#: accounts/models.py:25 accounts/models.py:34 -msgid "Brother" -msgstr "" - -#: accounts/models.py:26 accounts/models.py:35 -msgid "Sister" -msgstr "" - -#: accounts/models.py:27 accounts/models.py:36 -msgid "Grand mother" -msgstr "" - -#: accounts/models.py:28 accounts/models.py:37 -msgid "Grand father" -msgstr "" - -#: accounts/models.py:29 accounts/models.py:38 -msgid "Other" -msgstr "" - -#: accounts/models.py:67 -msgid "M" -msgstr "" - -#: accounts/models.py:67 -msgid "Male" -msgstr "" - -#: accounts/models.py:67 -msgid "F" -msgstr "" - -#: accounts/models.py:67 -msgid "Female" -msgstr "" - -#: accounts/models.py:103 -msgid "Admin" -msgstr "" - -#: accounts/models.py:105 templates/result/add_score_for.html:52 -msgid "Student" -msgstr "" - -#: accounts/models.py:107 templates/course/course_allocation_view.html:32 -msgid "Lecturer" -msgstr "" - -#: accounts/models.py:109 -msgid "Parent" -msgstr "" - -#: accounts/validators.py:12 -msgid "" -"Enter a valid username. This value may contain only English letters, " -"numbers, and @/./+/-/_ characters." -msgstr "" - -#: config/settings.py:148 -msgid "English" -msgstr "" - -#: config/settings.py:149 -msgid "French" -msgstr "" - -#: config/settings.py:150 -msgid "Spanish" -msgstr "" - -#: config/settings.py:151 -msgid "Russia" -msgstr "" - -#: core/models.py:9 core/models.py:13 templates/core/index.html:47 -#: templates/core/index.html:52 templates/setting/admin_panel.html:80 -#: templates/setting/admin_panel.html:81 -msgid "News" -msgstr "" - -#: core/models.py:10 core/models.py:14 -msgid "Event" -msgstr "" - -#: core/models.py:17 core/models.py:22 course/models.py:33 course/models.py:38 -msgid "First" -msgstr "" - -#: core/models.py:18 core/models.py:23 course/models.py:34 course/models.py:39 -msgid "Second" -msgstr "" - -#: core/models.py:19 core/models.py:24 course/models.py:35 course/models.py:40 -msgid "Third" -msgstr "" - -#: course/models.py:71 -#, python-brace-format -msgid "The program '{instance}' has been {verb}." -msgstr "" - -#: course/models.py:76 -#, python-brace-format -msgid "The program '{instance}' has been deleted." -msgstr "" - -#: course/models.py:138 -#, python-brace-format -msgid "The course '{instance}' has been {verb}." -msgstr "" - -#: course/models.py:143 -#, python-brace-format -msgid "The course '{instance}' has been deleted." -msgstr "" - -#: course/models.py:150 -msgid "allocated_lecturer" -msgstr "" - -#: course/models.py:152 -msgid "allocated_course" -msgstr "" - -#: course/models.py:218 -#, python-brace-format -msgid "" -"The file '{instance.title}' has been uploaded to the course '{instance." -"course}'." -msgstr "" - -#: course/models.py:224 -#, python-brace-format -msgid "" -"The file '{instance.title}' of the course '{instance.course}' has been " -"updated." -msgstr "" - -#: course/models.py:233 -#, python-brace-format -msgid "" -"The file '{instance.title}' of the course '{instance.course}' has been " -"deleted." -msgstr "" - -#: course/models.py:244 -msgid "Valid video formats: mp4, mkv, wmv, 3gp, f4v, avi, mp3" -msgstr "" - -#: course/models.py:278 -#, python-brace-format -msgid "" -"The video '{instance.title}' has been uploaded to the course {instance." -"course}." -msgstr "" - -#: course/models.py:284 -#, python-brace-format -msgid "" -"The video '{instance.title}' of the course '{instance.course}' has been " -"updated." -msgstr "" - -#: course/models.py:293 -#, python-brace-format -msgid "" -"The video '{instance.title}' of the course '{instance.course}' has been " -"deleted." -msgstr "" - -#: course/models.py:299 -msgid "NOTE: Only department head can offer semester courses" -msgstr "" - -#: quiz/admin.py:31 quiz/admin.py:32 quiz/forms.py:38 quiz/forms.py:39 -#: quiz/models.py:468 templates/quiz/quiz_list.html:41 -msgid "Questions" -msgstr "" - -#: quiz/models.py:23 quiz/models.py:529 -msgid "Content" -msgstr "" - -#: quiz/models.py:24 -msgid "Random" -msgstr "" - -#: quiz/models.py:25 -#: venv/lib/python3.9/site-packages/modeltranslation/widgets.py:32 -msgid "None" -msgstr "" - -#: quiz/models.py:29 templates/result/add_score_for.html:53 -#: templates/result/assessment_results.html:40 -#: templates/result/assessment_results.html:82 -msgid "Assignment" -msgstr "" - -#: quiz/models.py:30 -msgid "Exam" -msgstr "" - -#: quiz/models.py:31 -msgid "Practice Quiz" -msgstr "" - -#: quiz/models.py:53 -msgid "Title" -msgstr "" - -#: quiz/models.py:56 -msgid "Description" -msgstr "" - -#: quiz/models.py:58 -msgid "A detailed description of the quiz" -msgstr "" - -#: quiz/models.py:64 -msgid "Random Order" -msgstr "" - -#: quiz/models.py:65 -msgid "Display the questions in a random order or as they are set?" -msgstr "" - -#: quiz/models.py:74 -msgid "Answers at end" -msgstr "" - -#: quiz/models.py:76 -msgid "" -"Correct answer is NOT shown after question. Answers displayed at the end." -msgstr "" - -#: quiz/models.py:83 -msgid "Exam Paper" -msgstr "" - -#: quiz/models.py:85 -msgid "" -"If yes, the result of each attempt by a user will be stored. Necessary for " -"marking." -msgstr "" - -#: quiz/models.py:92 -msgid "Single Attempt" -msgstr "" - -#: quiz/models.py:93 -msgid "If yes, only one attempt by a user will be permitted." -msgstr "" - -#: quiz/models.py:99 -msgid "Pass Mark" -msgstr "" - -#: quiz/models.py:101 -msgid "Percentage required to pass exam." -msgstr "" - -#: quiz/models.py:107 -msgid "Draft" -msgstr "" - -#: quiz/models.py:109 -msgid "" -"If yes, the quiz is not displayed in the quiz list and can only be taken by " -"users who can edit quizzes." -msgstr "" - -#: quiz/models.py:129 quiz/models.py:290 quiz/models.py:443 -#: templates/quiz/quiz_list.html:39 templates/quiz/sitting_list.html:37 -#: templates/result/add_score_for.html:55 -#: templates/result/assessment_results.html:42 -#: templates/result/assessment_results.html:84 -#: templates/search/search_view.html:79 templates/search/search_view.html:127 -msgid "Quiz" -msgstr "" - -#: quiz/models.py:130 templates/question.html:16 -#: templates/quiz/mcquestion_form.html:13 templates/quiz/quiz_form.html:13 -#: templates/quiz/quiz_list.html:16 templates/quiz/quiz_list.html:26 -#: templates/result.html:18 -msgid "Quizzes" -msgstr "" - -#: quiz/models.py:164 quiz/models.py:288 templates/quiz/sitting_detail.html:24 -#: templates/quiz/sitting_list.html:35 -msgid "User" -msgstr "" - -#: quiz/models.py:168 templates/progress.html:68 -#: templates/quiz/sitting_detail.html:26 templates/quiz/sitting_list.html:39 -msgid "Score" -msgstr "" - -#: quiz/models.py:175 -msgid "User Progress" -msgstr "" - -#: quiz/models.py:176 -msgid "User progress records" -msgstr "" - -#: quiz/models.py:203 -msgid "error" -msgstr "" - -#: quiz/models.py:203 -msgid "category does not exist or invalid score" -msgstr "" - -#: quiz/models.py:248 -msgid "Question set of the quiz is empty. Please configure questions properly" -msgstr "" - -#: quiz/models.py:292 templates/quiz/sitting_list.html:36 -#: templates/search/search_view.html:59 templates/search/search_view.html:125 -msgid "Course" -msgstr "" - -#: quiz/models.py:297 -msgid "Question Order" -msgstr "" - -#: quiz/models.py:303 -msgid "Question List" -msgstr "" - -#: quiz/models.py:310 -msgid "Incorrect questions" -msgstr "" - -#: quiz/models.py:314 -msgid "Current Score" -msgstr "" - -#: quiz/models.py:316 -msgid "Complete" -msgstr "" - -#: quiz/models.py:319 -msgid "User Answers" -msgstr "" - -#: quiz/models.py:321 templates/quiz/sitting_detail.html:27 -msgid "Start" -msgstr "" - -#: quiz/models.py:322 templates/quiz/sitting_detail.html:28 -msgid "End" -msgstr "" - -#: quiz/models.py:327 -msgid "Can see completed exams." -msgstr "" - -#: quiz/models.py:404 -msgid "You have passed this quiz, congratulation" -msgstr "" - -#: quiz/models.py:406 -msgid "You failed this quiz, give it one chance again." -msgstr "" - -#: quiz/models.py:448 -msgid "Figure" -msgstr "" - -#: quiz/models.py:449 -msgid "Add an image for the question if it's necessary." -msgstr "" - -#: quiz/models.py:454 -msgid "Enter the question text that you want displayed" -msgstr "" - -#: quiz/models.py:455 quiz/models.py:467 quiz/models.py:522 -#: templates/question.html:125 templates/quiz/sitting_detail.html:34 -msgid "Question" -msgstr "" - -#: quiz/models.py:460 -msgid "Explanation to be shown after the question has been answered." -msgstr "" - -#: quiz/models.py:461 templates/question.html:80 templates/question.html:89 -#: templates/result.html:80 templates/result.html:150 -msgid "Explanation" -msgstr "" - -#: quiz/models.py:481 -msgid "The order in which multichoice choice options are displayed to the user" -msgstr "" - -#: quiz/models.py:483 -msgid "Choice Order" -msgstr "" - -#: quiz/models.py:516 -msgid "Multiple Choice Question" -msgstr "" - -#: quiz/models.py:517 -msgid "Multiple Choice Questions" -msgstr "" - -#: quiz/models.py:528 -msgid "Enter the choice text that you want displayed" -msgstr "" - -#: quiz/models.py:535 -msgid "Is this a correct answer?" -msgstr "" - -#: quiz/models.py:536 templates/quiz/mcquestion_form.html:53 -#: templates/quiz/sitting_detail.html:56 -msgid "Correct" -msgstr "" - -#: quiz/models.py:543 -msgid "Choice" -msgstr "" - -#: quiz/models.py:544 templates/quiz/mcquestion_form.html:47 -msgid "Choices" -msgstr "" - -#: quiz/models.py:564 -msgid "Essay style question" -msgstr "" - -#: quiz/models.py:565 -msgid "Essay style questions" -msgstr "" - -#: templates/400.html:5 -msgid "Bad request" -msgstr "" - -#: templates/400.html:6 -msgid "Please make sure the form is correctly filled." -msgstr "" - -#: templates/400.html:7 templates/403.html:7 templates/404.html:7 -#: templates/500.html:7 -msgid "Return to the app" -msgstr "" - -#: templates/403.html:5 -msgid "forbidden" -msgstr "" - -#: templates/403.html:6 -msgid "You need the proper permission to make that request." -msgstr "" - -#: templates/404.html:6 -msgid "Looks like the page you" -msgstr "" - -#: templates/500.html:5 -msgid "Server error" -msgstr "" - -#: templates/500.html:6 -msgid "Please try again later." -msgstr "" - -#: templates/accounts/add_staff.html:3 templates/accounts/add_student.html:3 -#: templates/accounts/edit_lecturer.html:3 -#: templates/accounts/edit_student.html:3 -#: templates/accounts/lecturer_list.html:3 -#: templates/accounts/parent_form.html:3 templates/accounts/profile.html:3 -#: templates/accounts/profile_single.html:3 -#: templates/accounts/student_list.html:3 templates/core/dashboard.html:3 -#: templates/core/index.html:3 templates/core/post_add.html:3 -#: templates/core/semester_list.html:3 templates/core/semester_update.html:3 -#: templates/core/session_list.html:3 templates/core/session_update.html:3 -#: templates/course/course_add.html:3 -#: templates/course/course_allocation_form.html:3 -#: templates/course/course_allocation_view.html:3 -#: templates/course/course_registration.html:3 -#: templates/course/course_single.html:3 templates/course/program_add.html:3 -#: templates/course/program_list.html:3 templates/course/program_single.html:3 -#: templates/course/user_course_list.html:3 templates/progress.html:4 -#: templates/question.html:5 templates/quiz/sitting_detail.html:4 -#: templates/quiz/sitting_list.html:3 templates/result.html:7 -#: templates/result/add_score.html:3 templates/result/add_score_for.html:3 -#: templates/result/assessment_results.html:3 -#: templates/result/grade_results.html:3 templates/search/search_view.html:3 -#: templates/setting/admin_panel.html:3 -#: templates/setting/password_change.html:3 -#: templates/setting/profile_info_change.html:3 -#: templates/upload/upload_file_form.html:3 -#: templates/upload/upload_video_form.html:3 -#: templates/upload/video_single.html:3 -msgid "Learning management system" -msgstr "" - -#: templates/accounts/add_staff.html:11 templates/accounts/add_student.html:12 -#: templates/accounts/edit_lecturer.html:11 -#: templates/accounts/edit_student.html:11 -#: templates/accounts/lecturer_list.html:9 templates/accounts/profile.html:14 -#: templates/accounts/profile_single.html:14 -#: templates/accounts/student_list.html:10 templates/aside.html:47 -#: templates/core/dashboard.html:13 templates/core/index.html:34 -#: templates/core/post_add.html:11 templates/core/semester_list.html:9 -#: templates/core/semester_update.html:11 templates/core/session_list.html:9 -#: templates/core/session_update.html:11 templates/course/course_add.html:11 -#: templates/course/course_allocation_form.html:11 -#: templates/course/course_allocation_view.html:9 -#: templates/course/course_registration.html:12 -#: templates/course/course_single.html:10 templates/course/program_add.html:11 -#: templates/course/program_list.html:9 templates/course/program_single.html:10 -#: templates/course/user_course_list.html:10 templates/progress.html:11 -#: templates/question.html:12 templates/quiz/mcquestion_form.html:9 -#: templates/quiz/quiz_form.html:9 templates/quiz/quiz_list.html:12 -#: templates/quiz/sitting_detail.html:11 templates/quiz/sitting_list.html:9 -#: templates/result.html:14 templates/result/add_score.html:10 -#: templates/result/add_score_for.html:10 -#: templates/result/assessment_results.html:9 -#: templates/result/grade_results.html:9 templates/search/search_view.html:11 -#: templates/setting/admin_panel.html:11 -#: templates/setting/password_change.html:11 -#: templates/setting/profile_info_change.html:11 -#: templates/upload/upload_file_form.html:10 -#: templates/upload/upload_video_form.html:10 -#: templates/upload/video_single.html:10 -msgid "Home" -msgstr "" - -#: templates/accounts/add_staff.html:12 -#: templates/accounts/edit_lecturer.html:12 -#: templates/accounts/lecturer_list.html:10 -#: templates/accounts/lecturer_list.html:21 templates/aside.html:58 -#: templates/core/dashboard.html:63 templates/pdf/lecturer_list.html:35 -#: templates/setting/admin_panel.html:37 -msgid "Lecturers" -msgstr "" - -#: templates/accounts/add_staff.html:13 templates/accounts/add_student.html:14 -#: templates/aside.html:113 -msgid "Add" -msgstr "" - -#: templates/accounts/add_staff.html:17 -msgid "Lecturer Add Form" -msgstr "" - -#: templates/accounts/add_staff.html:26 templates/accounts/add_student.html:27 -#: templates/accounts/edit_lecturer.html:27 -#: templates/accounts/edit_student.html:25 templates/accounts/profile.html:75 -#: templates/accounts/profile_single.html:88 -#: templates/pdf/profile_single.html:65 templates/registration/register.html:40 -#: templates/setting/profile_info_change.html:24 -msgid "Personal Info" -msgstr "" - -#: templates/accounts/add_staff.html:37 templates/accounts/add_student.html:49 -#: templates/accounts/edit_lecturer.html:46 -#: templates/accounts/edit_student.html:46 -#: templates/accounts/parent_form.html:11 templates/core/post_add.html:25 -#: templates/core/semester_update.html:38 templates/core/session_update.html:38 -#: templates/course/course_add.html:49 -#: templates/course/course_allocation_form.html:49 -#: templates/course/program_add.html:26 templates/quiz/mcquestion_form.html:67 -#: templates/quiz/quiz_form.html:66 templates/result/add_score_for.html:38 -msgid "Save" -msgstr "" - -#: templates/accounts/add_student.html:13 -#: templates/accounts/edit_student.html:12 -#: templates/accounts/student_list.html:11 -#: templates/accounts/student_list.html:24 templates/aside.html:61 -#: templates/core/dashboard.html:54 templates/pdf/student_list.html:35 -#: templates/setting/admin_panel.html:42 -msgid "Students" -msgstr "" - -#: templates/accounts/add_student.html:18 -msgid "Student Add Form" -msgstr "" - -#: templates/accounts/add_student.html:40 -#: templates/accounts/edit_lecturer.html:39 -#: templates/accounts/edit_student.html:39 templates/core/dashboard.html:117 -#: templates/setting/profile_info_change.html:37 -msgid "Others" -msgstr "" - -#: templates/accounts/edit_lecturer.html:13 -#: templates/accounts/edit_student.html:13 -#: templates/accounts/lecturer_list.html:59 -#: templates/accounts/student_list.html:61 -#: templates/course/program_list.html:56 -msgid "Update" -msgstr "" - -#: templates/accounts/edit_lecturer.html:17 -msgid "Lecturer Update Form" -msgstr "" - -#: templates/accounts/edit_lecturer.html:27 -#: templates/accounts/edit_student.html:25 -#: templates/accounts/lecturer_list.html:33 -#: templates/accounts/profile_single.html:107 -#: templates/accounts/student_list.html:38 templates/pdf/lecturer_list.html:44 -#: templates/pdf/student_list.html:43 -#: templates/registration/password_reset.html:13 -#: templates/setting/profile_info_change.html:24 -msgid "Email" -msgstr "" - -#: templates/accounts/edit_student.html:17 -msgid "Student Update Form" -msgstr "" - -#: templates/accounts/lecturer_list.html:16 -msgid "Add Lecturer" -msgstr "" - -#: templates/accounts/lecturer_list.html:17 -#: templates/accounts/student_list.html:20 -msgid "Download pdf" -msgstr "" - -#: templates/accounts/lecturer_list.html:31 -#: templates/accounts/profile_single.html:92 -#: templates/accounts/student_list.html:36 templates/pdf/lecturer_list.html:42 -#: templates/pdf/student_list.html:41 -msgid "ID No." -msgstr "" - -#: templates/accounts/lecturer_list.html:32 -#: templates/accounts/student_list.html:37 templates/pdf/lecturer_list.html:43 -#: templates/pdf/student_list.html:42 -msgid "Full Name" -msgstr "" - -#: templates/accounts/lecturer_list.html:34 templates/pdf/lecturer_list.html:45 -#: templates/pdf/student_list.html:44 -msgid "Mob No." -msgstr "" - -#: templates/accounts/lecturer_list.html:35 -#: templates/accounts/profile_single.html:109 -msgid "Address/city" -msgstr "" - -#: templates/accounts/lecturer_list.html:36 -#: templates/accounts/profile_single.html:29 -#: templates/accounts/profile_single.html:115 -msgid "Last login" -msgstr "" - -#: templates/accounts/lecturer_list.html:38 -#: templates/accounts/student_list.html:41 -#: templates/course/course_allocation_view.html:35 -#: templates/course/program_list.html:35 -#: templates/course/program_single.html:47 -msgid "Action" -msgstr "" - -#: templates/accounts/lecturer_list.html:60 -#: templates/accounts/student_list.html:62 -msgid "Download PDF" -msgstr "" - -#: templates/accounts/lecturer_list.html:61 -#: templates/accounts/student_list.html:63 templates/core/index.html:78 -#: templates/core/semester_list.html:71 templates/core/session_list.html:66 -#: templates/course/course_single.html:91 -#: templates/course/course_single.html:168 -#: templates/course/program_list.html:57 -#: templates/course/program_single.html:81 -#: templates/quiz/mcquestion_form.html:57 templates/quiz/quiz_list.html:68 -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:499 -msgid "Delete" -msgstr "" - -#: templates/accounts/lecturer_list.html:71 templates/pdf/lecturer_list.html:63 -#: templates/pdf/student_list.html:61 -msgid "No Lecturer(s)." -msgstr "" - -#: templates/accounts/lecturer_list.html:75 -msgid "Add Lecturer Now." -msgstr "" - -#: templates/accounts/profile.html:29 templates/accounts/profile.html:101 -#: templates/navbar.html:29 templates/pdf/profile_single.html:41 -#: templates/pdf/profile_single.html:92 -msgid "Last login:" -msgstr "" - -#: templates/accounts/profile.html:30 templates/pdf/profile_single.html:42 -msgid "Role:" -msgstr "" - -#: templates/accounts/profile.html:37 templates/accounts/profile_single.html:40 -#: templates/accounts/profile_single.html:48 -msgid "Edit Profile" -msgstr "" - -#: templates/accounts/profile.html:39 -msgid "Change password" -msgstr "" - -#: templates/accounts/profile.html:62 templates/accounts/profile_single.html:75 -#: templates/aside.html:67 templates/course/user_course_list.html:3 -#: templates/course/user_course_list.html:11 -#: templates/course/user_course_list.html:23 templates/navbar.html:34 -#: templates/pdf/profile_single.html:52 -msgid "My Courses" -msgstr "" - -#: templates/accounts/profile.html:70 templates/accounts/profile_single.html:83 -#: templates/pdf/profile_single.html:60 -msgid "No courses assigned!" -msgstr "" - -#: templates/accounts/profile.html:77 templates/pdf/profile_single.html:67 -msgid "First Name:" -msgstr "" - -#: templates/accounts/profile.html:78 templates/pdf/profile_single.html:68 -msgid "Last Name:" -msgstr "" - -#: templates/accounts/profile.html:79 templates/pdf/profile_single.html:69 -msgid "ID No.:" -msgstr "" - -#: templates/accounts/profile.html:83 templates/accounts/profile_single.html:96 -#: templates/pdf/profile_single.html:74 -msgid "Applicant Info" -msgstr "" - -#: templates/accounts/profile.html:85 templates/pdf/profile_single.html:76 -msgid "School:" -msgstr "" - -#: templates/accounts/profile.html:85 templates/pdf/profile_single.html:76 -msgid "Hawas Preparatory School" -msgstr "" - -#: templates/accounts/profile.html:86 templates/pdf/profile_single.html:77 -msgid "Level:" -msgstr "" - -#: templates/accounts/profile.html:91 -#: templates/accounts/profile_single.html:105 -#: templates/pdf/profile_single.html:82 -msgid "Contact Info" -msgstr "" - -#: templates/accounts/profile.html:93 templates/pdf/profile_single.html:84 -msgid "Email:" -msgstr "" - -#: templates/accounts/profile.html:94 templates/pdf/profile_single.html:85 -msgid "Tel No.:" -msgstr "" - -#: templates/accounts/profile.html:95 templates/pdf/profile_single.html:86 -msgid "Address/city:" -msgstr "" - -#: templates/accounts/profile.html:99 -#: templates/accounts/profile_single.html:113 -#: templates/pdf/profile_single.html:90 -msgid "Important Dates" -msgstr "" - -#: templates/accounts/profile.html:103 templates/pdf/profile_single.html:94 -msgid "Academic Year:" -msgstr "" - -#: templates/accounts/profile.html:103 -#: templates/accounts/profile_single.html:117 -#: templates/core/semester_list.html:41 templates/course/program_single.html:44 -#: templates/course/user_course_list.html:52 -#: templates/course/user_course_list.html:96 -#: templates/pdf/profile_single.html:94 templates/result/add_score.html:24 -#: templates/result/add_score_for.html:46 templates/setting/admin_panel.html:52 -msgid "Semester" -msgstr "" - -#: templates/accounts/profile.html:105 templates/pdf/profile_single.html:96 -msgid "Registered Date:" -msgstr "" - -#: templates/accounts/profile_single.html:30 -msgid "Role" -msgstr "" - -#: templates/accounts/profile_single.html:43 -msgid "Change Program" -msgstr "" - -#: templates/accounts/profile_single.html:90 -msgid "First Name" -msgstr "" - -#: templates/accounts/profile_single.html:91 -msgid "Last Name" -msgstr "" - -#: templates/accounts/profile_single.html:98 -msgid "School" -msgstr "" - -#: templates/accounts/profile_single.html:99 -#: templates/course/program_single.html:42 -msgid "Level" -msgstr "" - -#: templates/accounts/profile_single.html:100 -#: templates/accounts/student_list.html:39 templates/pdf/student_list.html:45 -#: templates/search/search_view.html:49 templates/search/search_view.html:89 -#: templates/search/search_view.html:124 -msgid "Program" -msgstr "" - -#: templates/accounts/profile_single.html:108 -msgid "Tel No." -msgstr "" - -#: templates/accounts/profile_single.html:117 -msgid "Academic Year" -msgstr "" - -#: templates/accounts/profile_single.html:119 -msgid "Registered Date" -msgstr "" - -#: templates/accounts/student_list.html:19 -msgid "Add Student" -msgstr "" - -#: templates/accounts/student_list.html:73 -#: templates/result/add_score_for.html:105 -msgid "No Student." -msgstr "" - -#: templates/accounts/student_list.html:77 -msgid "Add Student Now." -msgstr "" - -#: templates/aside.html:43 templates/core/dashboard.html:3 -#: templates/core/dashboard.html:14 templates/core/dashboard.html:33 -msgid "Dashboard" -msgstr "" - -#: templates/aside.html:50 templates/navbar.html:41 -msgid "Profile" -msgstr "" - -#: templates/aside.html:55 templates/navbar.html:38 -#: templates/setting/admin_panel.html:12 templates/setting/admin_panel.html:16 -msgid "Admin Panel" -msgstr "" - -#: templates/aside.html:72 -msgid "Programs & Courses" -msgstr "" - -#: templates/aside.html:77 templates/quiz/sitting_list.html:10 -msgid "Complete Exams" -msgstr "" - -#: templates/aside.html:83 templates/aside.html:104 -msgid "Quiz Progress Rec" -msgstr "" - -#: templates/aside.html:86 -msgid "Course Allocation" -msgstr "" - -#: templates/aside.html:89 -msgid "Manage Session" -msgstr "" - -#: templates/aside.html:92 -msgid "Manage Semester" -msgstr "" - -#: templates/aside.html:98 templates/result/add_score.html:11 -#: templates/result/add_score.html:17 templates/result/add_score_for.html:12 -msgid "Manage Score" -msgstr "" - -#: templates/aside.html:107 templates/result/grade_results.html:10 -#: templates/result/grade_results.html:28 -msgid "Grade Results" -msgstr "" - -#: templates/aside.html:110 templates/result/assessment_results.html:10 -#: templates/result/assessment_results.html:28 -msgid "Assesment Results" -msgstr "" - -#: templates/aside.html:113 -msgid "Drop Course" -msgstr "" - -#: templates/aside.html:119 -msgid "Account Setting" -msgstr "" - -#: templates/aside.html:122 templates/setting/password_change.html:21 -#: templates/setting/password_change.html:25 -msgid "Change Password" -msgstr "" - -#: templates/aside.html:130 -msgid "Read our" -msgstr "" - -#: templates/aside.html:130 -msgid "Privacy" -msgstr "" - -#: templates/aside.html:130 -#: venv/lib/python3.9/site-packages/django/db/models/base.py:1423 -#: venv/lib/python3.9/site-packages/django/forms/models.py:893 -msgid "and" -msgstr "" - -#: templates/aside.html:130 -msgid "Terms of use." -msgstr "" - -#: templates/aside.html:135 -msgid "⭐️ Star This Project" -msgstr "" - -#: templates/core/dashboard.html:40 -msgid "Dashboard settings" -msgstr "" - -#: templates/core/dashboard.html:41 -msgid "Display grid" -msgstr "" - -#: templates/core/dashboard.html:42 -msgid "Display table" -msgstr "" - -#: templates/core/dashboard.html:44 -msgid "Manage dashboard" -msgstr "" - -#: templates/core/dashboard.html:72 -msgid "Administrators" -msgstr "" - -#: templates/core/dashboard.html:81 -msgid "Lab Assistance" -msgstr "" - -#: templates/core/dashboard.html:90 -msgid "Librarians" -msgstr "" - -#: templates/core/dashboard.html:99 -msgid "Supervisors" -msgstr "" - -#: templates/core/dashboard.html:108 -msgid "Office Assistance" -msgstr "" - -#: templates/core/dashboard.html:145 -msgid "Latest activities" -msgstr "" - -#: templates/core/dashboard.html:150 -msgid "No recent activity" -msgstr "" - -#: templates/core/dashboard.html:158 -msgid "School Demographics" -msgstr "" - -#: templates/core/index.html:40 -msgid "Add New Post" -msgstr "" - -#: templates/core/index.html:47 templates/core/index.html:55 -#: templates/setting/admin_panel.html:80 templates/setting/admin_panel.html:81 -msgid "Events" -msgstr "" - -#: templates/core/index.html:65 -msgid "news" -msgstr "" - -#: templates/core/index.html:65 -msgid "events" -msgstr "" - -#: templates/core/index.html:76 templates/core/semester_list.html:69 -#: templates/core/session_list.html:65 templates/course/course_single.html:87 -#: templates/course/course_single.html:164 -#: templates/course/program_single.html:78 templates/quiz/quiz_list.html:65 -msgid "Edit" -msgstr "" - -#: templates/core/index.html:88 templates/upload/video_single.html:31 -msgid "ago" -msgstr "" - -#: templates/core/index.html:98 -msgid "School news and events will appear here." -msgstr "" - -#: templates/core/post_add.html:12 -msgid "Post form" -msgstr "" - -#: templates/core/post_add.html:21 -msgid "Post Form" -msgstr "" - -#: templates/core/post_add.html:26 templates/upload/upload_file_form.html:34 -#: templates/upload/upload_video_form.html:33 -msgid "Cancel" -msgstr "" - -#: templates/core/semester_list.html:10 -msgid "Semester list" -msgstr "" - -#: templates/core/semester_list.html:16 -msgid "Add New Semester" -msgstr "" - -#: templates/core/semester_list.html:20 templates/core/semester_update.html:12 -msgid "Semester List" -msgstr "" - -#: templates/core/semester_list.html:42 -msgid "Is Current semester" -msgstr "" - -#: templates/core/semester_list.html:43 templates/core/session_list.html:41 -#: templates/setting/admin_panel.html:47 -msgid "Session" -msgstr "" - -#: templates/core/semester_list.html:44 -msgid "Next Semester Begins" -msgstr "" - -#: templates/core/semester_list.html:46 templates/core/session_list.html:45 -#: templates/course/course_single.html:61 -#: templates/course/course_single.html:138 -msgid "Actions" -msgstr "" - -#: templates/core/semester_list.html:83 -msgid "No Semester." -msgstr "" - -#: templates/core/semester_list.html:87 -msgid "Add Semester Now." -msgstr "" - -#: templates/core/semester_update.html:13 -msgid "Semester Form" -msgstr "" - -#: templates/core/semester_update.html:34 -msgid "Semester Add & update Form" -msgstr "" - -#: templates/core/session_list.html:10 templates/core/session_list.html:20 -#: templates/core/session_update.html:12 -msgid "Session List" -msgstr "" - -#: templates/core/session_list.html:16 -msgid "Add New Session" -msgstr "" - -#: templates/core/session_list.html:42 -msgid "Is Current Session" -msgstr "" - -#: templates/core/session_list.html:43 -msgid "Next Session Begins" -msgstr "" - -#: templates/core/session_list.html:77 -msgid "No Session." -msgstr "" - -#: templates/core/session_list.html:81 -msgid "Add Session Now." -msgstr "" - -#: templates/core/session_update.html:13 -msgid "Session Form" -msgstr "" - -#: templates/core/session_update.html:34 -msgid "Session Add & update Form" -msgstr "" - -#: templates/correct_answer.html:6 templates/question.html:50 -#: templates/result.html:51 -msgid "You answered the above question incorrectly" -msgstr "" - -#: templates/correct_answer.html:16 templates/question.html:60 -#: templates/result.html:61 -msgid "This is the correct answer" -msgstr "" - -#: templates/correct_answer.html:24 templates/question.html:68 -#: templates/result.html:69 -msgid "This was your answer." -msgstr "" - -#: templates/course/course_add.html:12 templates/course/course_single.html:11 -#: templates/course/program_add.html:12 templates/course/program_list.html:10 -#: templates/course/program_single.html:11 -#: templates/quiz/mcquestion_form.html:10 templates/quiz/quiz_form.html:10 -#: templates/quiz/quiz_list.html:13 templates/result.html:15 -#: templates/setting/admin_panel.html:70 -#: templates/upload/upload_file_form.html:11 -#: templates/upload/upload_video_form.html:11 -#: templates/upload/video_single.html:11 -msgid "Programs" -msgstr "" - -#: templates/course/course_add.html:13 templates/course/course_add.html:17 -msgid "Course Form" -msgstr "" - -#: templates/course/course_add.html:27 -msgid "Course Detail" -msgstr "" - -#: templates/course/course_add.html:37 -msgid "Other Info" -msgstr "" - -#: templates/course/course_allocation_form.html:12 -#: templates/course/course_allocation_view.html:20 -#: templates/setting/admin_panel.html:75 -msgid "Course Allocations" -msgstr "" - -#: templates/course/course_allocation_form.html:13 -msgid "Allocation Form" -msgstr "" - -#: templates/course/course_allocation_form.html:34 -msgid "Course Allocation Form" -msgstr "" - -#: templates/course/course_allocation_view.html:10 -msgid "Allocation list" -msgstr "" - -#: templates/course/course_allocation_view.html:16 -msgid "Allocate Now" -msgstr "" - -#: templates/course/course_allocation_view.html:33 -#: templates/setting/admin_panel.html:70 -msgid "Courses" -msgstr "" - -#: templates/course/course_allocation_view.html:50 -msgid "Edit or Update" -msgstr "" - -#: templates/course/course_allocation_view.html:53 -msgid "Deallocate" -msgstr "" - -#: templates/course/course_allocation_view.html:65 -msgid "No Course Allocated." -msgstr "" - -#: templates/course/course_allocation_view.html:69 -msgid "Allocate now" -msgstr "" - -#: templates/course/course_registration.html:13 -msgid "Course Registration" -msgstr "" - -#: templates/course/course_registration.html:17 -#: templates/course/course_registration.html:35 -#: templates/setting/admin_panel.html:58 -msgid "Course Add" -msgstr "" - -#: templates/course/course_registration.html:17 -#: templates/setting/admin_panel.html:58 -msgid "Drop" -msgstr "" - -#: templates/course/course_registration.html:25 -msgid "Calender is off" -msgstr "" - -#: templates/course/course_registration.html:26 -msgid "Check the university calender" -msgstr "" - -#: templates/course/course_registration.html:38 -#: templates/course/course_registration.html:200 -msgid "Save Score" -msgstr "" - -#: templates/course/course_registration.html:43 -#: templates/result/assessment_results.html:32 -#: templates/result/grade_results.html:32 -msgid "First Semester:" -msgstr "" - -#: templates/course/course_registration.html:48 -#: templates/course/course_registration.html:111 -#: templates/course/course_registration.html:216 -msgid "Mark" -msgstr "" - -#: templates/course/course_registration.html:49 -#: templates/course/course_registration.html:112 -#: templates/course/course_registration.html:217 -#: templates/course/program_single.html:40 -#: templates/course/user_course_list.html:49 -#: templates/course/user_course_list.html:93 -#: templates/result/assessment_results.html:38 -#: templates/result/grade_results.html:38 -#: templates/result/grade_results.html:103 -msgid "Course Code" -msgstr "" - -#: templates/course/course_registration.html:50 -#: templates/course/course_registration.html:113 -#: templates/course/course_registration.html:218 -#: templates/result/assessment_results.html:37 -#: templates/result/assessment_results.html:79 -#: templates/result/grade_results.html:37 -#: templates/result/grade_results.html:102 -msgid "Course Title" -msgstr "" - -#: templates/course/course_registration.html:51 -#: templates/course/course_registration.html:114 -#: templates/course/course_registration.html:219 -#: templates/result/assessment_results.html:39 -#: templates/result/assessment_results.html:81 -msgid "Cr.Hr(s)" -msgstr "" - -#: templates/course/course_registration.html:52 -#: templates/course/course_registration.html:115 -#: templates/course/course_registration.html:220 -#: templates/course/program_single.html:43 -#: templates/course/user_course_list.html:51 -#: templates/course/user_course_list.html:95 -msgid "Year" -msgstr "" - -#: templates/course/course_registration.html:53 -#: templates/course/course_registration.html:116 -#: templates/course/course_registration.html:221 -msgid "Classification" -msgstr "" - -#: templates/course/course_registration.html:54 -#: templates/course/course_registration.html:117 -#: templates/course/course_registration.html:222 -msgid "Elective Group" -msgstr "" - -#: templates/course/course_registration.html:69 -#: templates/course/course_registration.html:132 -#: templates/course/course_registration.html:236 -msgid "Elective" -msgstr "" - -#: templates/course/course_registration.html:71 -#: templates/course/course_registration.html:134 -#: templates/course/course_registration.html:238 -msgid "Core" -msgstr "" - -#: templates/course/course_registration.html:83 -#: templates/course/course_registration.html:146 -#: templates/course/course_registration.html:249 -msgid "No Course." -msgstr "" - -#: templates/course/course_registration.html:97 -msgid "First semester Credit(s):" -msgstr "" - -#: templates/course/course_registration.html:106 -#: templates/result/assessment_results.html:74 -#: templates/result/grade_results.html:97 -msgid "Second Semester:" -msgstr "" - -#: templates/course/course_registration.html:160 -msgid "Second semester credit(s):" -msgstr "" - -#: templates/course/course_registration.html:165 -msgid "Registerd course credit(s):" -msgstr "" - -#: templates/course/course_registration.html:170 -#: templates/course/course_registration.html:263 -msgid "Total credit(s):" -msgstr "" - -#: templates/course/course_registration.html:186 -msgid "Print Registration Form" -msgstr "" - -#: templates/course/course_registration.html:187 -msgid "Print Registerd Courses" -msgstr "" - -#: templates/course/course_registration.html:191 -msgid "Course Drop" -msgstr "" - -#: templates/course/course_registration.html:201 -msgid "Drop Selected" -msgstr "" - -#: templates/course/course_single.html:22 -msgid "Edit course" -msgstr "" - -#: templates/course/course_single.html:27 -msgid "Upload new file" -msgstr "" - -#: templates/course/course_single.html:30 -msgid "Upload new video" -msgstr "" - -#: templates/course/course_single.html:36 -msgid "Take a Quiz" -msgstr "" - -#: templates/course/course_single.html:51 -msgid "Video Tutorials" -msgstr "" - -#: templates/course/course_single.html:57 -msgid "Video Title" -msgstr "" - -#: templates/course/course_single.html:58 -#: templates/course/course_single.html:134 -msgid "Uploaded Date" -msgstr "" - -#: templates/course/course_single.html:59 -msgid "Get Started" -msgstr "" - -#: templates/course/course_single.html:79 -msgid "Play now" -msgstr "" - -#: templates/course/course_single.html:104 -msgid "No video Uploaded." -msgstr "" - -#: templates/course/course_single.html:108 -#: templates/course/course_single.html:185 -msgid "Upload now." -msgstr "" - -#: templates/course/course_single.html:127 -msgid "Documentations" -msgstr "" - -#: templates/course/course_single.html:133 -msgid "File name" -msgstr "" - -#: templates/course/course_single.html:135 -msgid "Updated Date" -msgstr "" - -#: templates/course/course_single.html:136 -msgid "Downloads" -msgstr "" - -#: templates/course/course_single.html:156 -msgid "Download" -msgstr "" - -#: templates/course/course_single.html:181 -msgid "No File Uploaded." -msgstr "" - -#: templates/course/course_single.html:205 -msgid "Lecturer(s)" -msgstr "" - -#: templates/course/course_single.html:232 -msgid "No lecturer assigned for this course" -msgstr "" - -#: templates/course/program_add.html:13 -msgid "Program Form" -msgstr "" - -#: templates/course/program_add.html:22 -msgid "Program Add Form" -msgstr "" - -#: templates/course/program_list.html:16 -msgid "Add Program" -msgstr "" - -#: templates/course/program_list.html:20 -msgid "Program List" -msgstr "" - -#: templates/course/program_list.html:32 -msgid "Program Name" -msgstr "" - -#: templates/course/program_list.html:33 -msgid "Summary" -msgstr "" - -#: templates/course/program_list.html:69 -msgid "No program." -msgstr "" - -#: templates/course/program_list.html:73 -msgid "Add program now." -msgstr "" - -#: templates/course/program_single.html:18 -msgid "Add Course" -msgstr "" - -#: templates/course/program_single.html:39 -#: templates/course/user_course_list.html:48 -#: templates/course/user_course_list.html:92 -msgid "Course Name" -msgstr "" - -#: templates/course/program_single.html:41 -#: templates/course/user_course_list.html:50 -#: templates/course/user_course_list.html:94 -#: templates/result/grade_results.html:39 -#: templates/result/grade_results.html:104 -msgid "Cr.Hr" -msgstr "" - -#: templates/course/program_single.html:45 -#: templates/course/user_course_list.html:53 -#: templates/course/user_course_list.html:97 -msgid "Current Semester" -msgstr "" - -#: templates/course/program_single.html:92 -msgid "No course for this progrm." -msgstr "" - -#: templates/course/program_single.html:96 -msgid "Add one now." -msgstr "" - -#: templates/course/user_course_list.html:42 -msgid "Taken Courses:" -msgstr "" - -#: templates/course/user_course_list.html:54 -#: templates/course/user_course_list.html:75 -msgid "Taken" -msgstr "" - -#: templates/course/user_course_list.html:86 -msgid "All Courses:" -msgstr "" - -#: templates/invoice_detail.html:2 templates/invoices.html:1 -msgid "Invoices" -msgstr "" - -#: templates/invoices.html:5 -msgid "Pay now" -msgstr "" - -#: templates/navbar.html:12 -msgid "Search All... #course, #program, #Quiz, #News, #Events" -msgstr "" - -#: templates/navbar.html:42 -msgid "Setting" -msgstr "" - -#: templates/navbar.html:46 -msgid "Signout" -msgstr "" - -#: templates/payments/charge.html:24 -msgid "Payment Succeed, You has been make payment successfuly." -msgstr "" - -#: templates/payments/charge.html:25 -msgid "Redirect to your dashboard in" -msgstr "" - -#: templates/payments/coinbase.html:3 templates/payments/coinbase.html:8 -msgid "Coinbase" -msgstr "" - -#: templates/pdf/lecturer_list.html:46 -msgid "Address/City" -msgstr "" - -#: templates/progress.html:4 templates/progress.html:12 -msgid "Progress Page" -msgstr "" - -#: templates/progress.html:5 -msgid "User Progress Page" -msgstr "" - -#: templates/progress.html:18 -msgid "Question Category Scores" -msgstr "" - -#: templates/progress.html:25 templates/quiz/sitting_detail.html:19 -msgid "Category" -msgstr "" - -#: templates/progress.html:26 -msgid "Correctly answererd" -msgstr "" - -#: templates/progress.html:27 -msgid "Incorrect" -msgstr "" - -#: templates/progress.html:56 -msgid "Previous exam papers" -msgstr "" - -#: templates/progress.html:58 -msgid "Below are the results of exams that you have sat." -msgstr "" - -#: templates/progress.html:60 templates/quiz/sitting_list.html:29 -msgid "Total complete exams:" -msgstr "" - -#: templates/progress.html:67 -msgid "Quiz Title" -msgstr "" - -#: templates/progress.html:69 -msgid "Possible Score" -msgstr "" - -#: templates/progress.html:70 -#, python-format -msgid "Out of 100%%" -msgstr "" - -#: templates/progress.html:94 -msgid "No recordes yet. Try to do some quizzes in your course." -msgstr "" - -#: templates/question.html:28 templates/result.html:38 -msgid "The previous question" -msgstr "" - -#: templates/question.html:37 -msgid "Your answer was" -msgstr "" - -#: templates/question.html:85 templates/result.html:85 -msgid "No explanation set to this question." -msgstr "" - -#: templates/question.html:108 -msgid "Quiz instractions" -msgstr "" - -#: templates/question.html:116 -msgid "Understood" -msgstr "" - -#: templates/question.html:125 -msgid "of" -msgstr "" - -#: templates/question.html:130 -msgid "Quiz category" -msgstr "" - -#: templates/question.html:157 -msgid "Previous" -msgstr "" - -#: templates/quiz/mcquestion_form.html:14 -msgid "MC Question Form" -msgstr "" - -#: templates/quiz/mcquestion_form.html:18 -msgid "Add questions" -msgstr "" - -#: templates/quiz/mcquestion_form.html:31 -msgid "question added" -msgstr "" - -#: templates/quiz/mcquestion_form.html:34 -msgid "Correct the error(s) below." -msgstr "" - -#: templates/quiz/quiz_form.html:14 -msgid "Quiz Form" -msgstr "" - -#: templates/quiz/quiz_form.html:18 -msgid "Quiz form for" -msgstr "" - -#: templates/quiz/quiz_form.html:55 -msgid "Hold down" -msgstr "" - -#: templates/quiz/quiz_form.html:55 -#: venv/lib/python3.9/site-packages/django/utils/text.py:322 -msgid "or" -msgstr "" - -#: templates/quiz/quiz_form.html:55 -msgid "on a Mac, to select more than one." -msgstr "" - -#: templates/quiz/quiz_form.html:66 -msgid "Continue" -msgstr "" - -#: templates/quiz/quiz_list.html:22 -msgid "Add Quiz" -msgstr "" - -#: templates/quiz/quiz_list.html:54 -msgid "You will only get one attempt at this quiz" -msgstr "" - -#: templates/quiz/quiz_list.html:58 -msgid "Start quiz" -msgstr "" - -#: templates/quiz/sitting_detail.html:4 -msgid "Result of" -msgstr "" - -#: templates/quiz/sitting_detail.html:4 templates/search/search_view.html:43 -msgid "for" -msgstr "" - -#: templates/quiz/sitting_detail.html:12 -msgid "Completed Exams" -msgstr "" - -#: templates/quiz/sitting_detail.html:13 -msgid "Marking" -msgstr "" - -#: templates/quiz/sitting_detail.html:18 templates/result.html:99 -msgid "Quiz title" -msgstr "" - -#: templates/quiz/sitting_detail.html:25 templates/quiz/sitting_list.html:38 -msgid "Completed" -msgstr "" - -#: templates/quiz/sitting_detail.html:35 -msgid "User answer" -msgstr "" - -#: templates/quiz/sitting_detail.html:54 -msgid "incorrect" -msgstr "" - -#: templates/quiz/sitting_detail.html:62 -msgid "Toggle whether correct" -msgstr "" - -#: templates/quiz/sitting_list.html:3 -msgid "All Quizzes" -msgstr "" - -#: templates/quiz/sitting_list.html:16 -msgid "List of complete exams" -msgstr "" - -#: templates/quiz/sitting_list.html:24 templates/snippets/filter_form.html:12 -msgid "Filter" -msgstr "" - -#: templates/quiz/sitting_list.html:54 -msgid "View details" -msgstr "" - -#: templates/quiz/sitting_list.html:63 -msgid "No completed exams for you" -msgstr "" - -#: templates/registration/login.html:3 -msgid "Dj Learning Management System - Login" -msgstr "" - -#: templates/registration/login.html:11 -msgid "Sign in" -msgstr "" - -#: templates/registration/login.html:16 -msgid "ID Number" -msgstr "" - -#: templates/registration/login.html:21 -msgid "Password" -msgstr "" - -#: templates/registration/login.html:25 templates/registration/register.html:73 -msgid "Invalid ID & Password." -msgstr "" - -#: templates/registration/login.html:28 -msgid "SIGN IN" -msgstr "" - -#: templates/registration/login.html:32 -msgid "Forgot password ?" -msgstr "" - -#: templates/registration/password_reset.html:3 -msgid "Password Reset | Learning management system" -msgstr "" - -#: templates/registration/password_reset.html:7 -msgid "Password Reset" -msgstr "" - -#: templates/registration/password_reset.html:17 -msgid "Request Password Reset" -msgstr "" - -#: templates/registration/password_reset_complete.html:3 -msgid "Password Reset Complete | Learning management system" -msgstr "" - -#: templates/registration/password_reset_complete.html:8 -msgid "Password Reset Complete" -msgstr "" - -#: templates/registration/password_reset_complete.html:11 -msgid "Your password has been set, you are now able to Log In!" -msgstr "" - -#: templates/registration/password_reset_complete.html:13 -msgid "Sign In Here" -msgstr "" - -#: templates/registration/password_reset_confirm.html:22 -msgid "Confirm New Password" -msgstr "" - -#: templates/registration/password_reset_confirm.html:31 -msgid "Reset Password" -msgstr "" - -#: templates/registration/password_reset_done.html:3 -msgid "Email Sent | Learning management system" -msgstr "" - -#: templates/registration/password_reset_done.html:8 -msgid "Email sent" -msgstr "" - -#: templates/registration/password_reset_done.html:14 -msgid "Back To Login" -msgstr "" - -#: templates/registration/register.html:3 -msgid "Register | Learning management system" -msgstr "" - -#: templates/registration/register.html:12 -msgid "Create Your Account" -msgstr "" - -#: templates/registration/register.html:20 -msgid "Login Form" -msgstr "" - -#: templates/registration/register.html:76 -msgid "SIGN UP" -msgstr "" - -#: templates/registration/register.html:79 -msgid "Already Registered ?" -msgstr "" - -#: templates/registration/register.html:79 -msgid "Login" -msgstr "" - -#: templates/result.html:8 -msgid "Quiz Results for" -msgstr "" - -#: templates/result.html:20 templates/result/assessment_results.html:29 -#: templates/result/grade_results.html:29 -msgid "Result" -msgstr "" - -#: templates/result.html:26 -msgid "Calculating your result..." -msgstr "" - -#: templates/result.html:96 -msgid "Quiz result" -msgstr "" - -#: templates/result.html:103 -msgid "You answered" -msgstr "" - -#: templates/result.html:103 -msgid "questions correctly out of" -msgstr "" - -#: templates/result.html:103 -msgid "giving you" -msgstr "" - -#: templates/result.html:103 -#, python-format -msgid "%% correct" -msgstr "" - -#: templates/result.html:117 -msgid "Review the questions below and try the quiz again in the future" -msgstr "" - -#: templates/result.html:119 -msgid "The result of this quiz will be stored in your progress section" -msgstr "" - -#: templates/result.html:121 -msgid "so you can review and monitor your progression" -msgstr "" - -#: templates/result.html:134 -msgid "Your session score is" -msgstr "" - -#: templates/result.html:134 -msgid "out of a possible" -msgstr "" - -#: templates/result.html:157 -msgid "No explanation set for this question." -msgstr "" - -#: templates/result.html:164 -msgid "Your answer" -msgstr "" - -#: templates/result/add_score.html:29 -msgid "Select Your Course Here" -msgstr "" - -#: templates/result/add_score.html:35 templates/result/add_score_for.html:24 -msgid "No course." -msgstr "" - -#: templates/result/add_score.html:39 -msgid "To manage scores, please select the course using the button above." -msgstr "" - -#: templates/result/add_score_for.html:30 -msgid "Students result form" -msgstr "" - -#: templates/result/add_score_for.html:41 -msgid "Grade report" -msgstr "" - -#: templates/result/add_score_for.html:54 -#: templates/result/assessment_results.html:41 -#: templates/result/assessment_results.html:83 -msgid "Mid exam" -msgstr "" - -#: templates/result/add_score_for.html:56 -#: templates/result/assessment_results.html:43 -#: templates/result/assessment_results.html:85 -msgid "Attendance" -msgstr "" - -#: templates/result/add_score_for.html:57 -#: templates/result/assessment_results.html:44 -#: templates/result/assessment_results.html:86 -msgid "Final exam" -msgstr "" - -#: templates/result/add_score_for.html:58 -#: templates/result/assessment_results.html:45 -#: templates/result/assessment_results.html:87 -msgid "Total" -msgstr "" - -#: templates/result/add_score_for.html:59 -msgid "Point" -msgstr "" - -#: templates/result/add_score_for.html:60 -#: templates/result/grade_results.html:40 -msgid "Grade" -msgstr "" - -#: templates/result/add_score_for.html:61 -#: templates/result/grade_results.html:42 -#: templates/result/grade_results.html:107 -msgid "Comment" -msgstr "" - -#: templates/result/grade_results.html:41 -#: templates/result/grade_results.html:106 -msgid "Points" -msgstr "" - -#: templates/result/grade_results.html:58 -#: templates/result/grade_results.html:123 -msgid "PASS" -msgstr "" - -#: templates/result/grade_results.html:60 -#: templates/result/grade_results.html:125 -msgid "FAIL" -msgstr "" - -#: templates/result/grade_results.html:79 -msgid "Total first semester credit:" -msgstr "" - -#: templates/result/grade_results.html:88 -#: templates/result/grade_results.html:177 -msgid "First Semester GPA:" -msgstr "" - -#: templates/result/grade_results.html:105 -msgid "GRADE" -msgstr "" - -#: templates/result/grade_results.html:139 -msgid "Total second semester credit:" -msgstr "" - -#: templates/result/grade_results.html:144 -msgid "Total Credit:" -msgstr "" - -#: templates/result/grade_results.html:153 -#: templates/result/grade_results.html:184 -msgid "Second Semester GPA:" -msgstr "" - -#: templates/result/grade_results.html:162 -#: templates/result/grade_results.html:192 -msgid "Previous CGPA:" -msgstr "" - -#: templates/search/search_view.html:3 -msgid "Search result for" -msgstr "" - -#: templates/search/search_view.html:12 -msgid "Search" -msgstr "" - -#: templates/search/search_view.html:43 -msgid "result" -msgstr "" - -#: templates/search/search_view.html:62 -msgid "Program of" -msgstr "" - -#: templates/search/search_view.html:69 templates/search/search_view.html:126 -msgid "News And Events" -msgstr "" - -#: templates/search/search_view.html:72 -msgid "Date:" -msgstr "" - -#: templates/search/search_view.html:82 -msgid "quiz" -msgstr "" - -#: templates/search/search_view.html:82 -msgid "Course:" -msgstr "" - -#: templates/search/search_view.html:122 -msgid "Search by:" -msgstr "" - -#: templates/search/search_view.html:124 -msgid "Title or Description" -msgstr "" - -#: templates/search/search_view.html:125 -msgid "Title, Code or Description" -msgstr "" - -#: templates/search/search_view.html:127 -msgid "Title, Description or Category(practice, assignment and exam)" -msgstr "" - -#: templates/setting/admin_panel.html:37 templates/setting/admin_panel.html:42 -#: templates/setting/admin_panel.html:47 templates/setting/admin_panel.html:52 -#: templates/setting/admin_panel.html:70 templates/setting/admin_panel.html:75 -#: templates/setting/admin_panel.html:80 -msgid "Manage" -msgstr "" - -#: templates/setting/admin_panel.html:43 -msgid "students" -msgstr "" - -#: templates/setting/admin_panel.html:48 -msgid "sessions" -msgstr "" - -#: templates/setting/admin_panel.html:53 -msgid "semesters" -msgstr "" - -#: templates/setting/admin_panel.html:64 -msgid "Switch" -msgstr "" - -#: templates/setting/admin_panel.html:71 -msgid "programs" -msgstr "" - -#: templates/setting/admin_panel.html:76 -msgid "course allocations" -msgstr "" - -#: templates/setting/password_change.html:12 -msgid "Password Change" -msgstr "" - -#: templates/setting/profile_info_change.html:12 -msgid "Account setting" -msgstr "" - -#: templates/setting/profile_info_change.html:16 -msgid "Account Settings" -msgstr "" - -#: templates/setting/profile_info_change.html:44 -msgid "Update Profile" -msgstr "" - -#: templates/upload/upload_file_form.html:14 -msgid "File upload" -msgstr "" - -#: templates/upload/upload_file_form.html:18 -msgid "File upload for" -msgstr "" - -#: templates/upload/upload_file_form.html:26 -msgid "File Upload Form" -msgstr "" - -#: templates/upload/upload_file_form.html:33 -#: templates/upload/upload_video_form.html:32 -msgid "Upload" -msgstr "" - -#: templates/upload/upload_video_form.html:14 -msgid "Video upload" -msgstr "" - -#: templates/upload/upload_video_form.html:18 -msgid "Video upload for" -msgstr "" - -#: templates/upload/upload_video_form.html:26 -msgid "Video Upload Form" -msgstr "" - -#: templates/upload/video_single.html:35 -msgid "No video description set." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/_termui_impl.py:518 -#, python-brace-format -msgid "{editor}: Editing failed" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/_termui_impl.py:522 -#, python-brace-format -msgid "{editor}: Editing failed: {e}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1120 -msgid "Aborted!" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1309 -#: venv/lib/python3.9/site-packages/click/decorators.py:559 -msgid "Show this message and exit." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1340 -#: venv/lib/python3.9/site-packages/click/core.py:1370 -#, python-brace-format -msgid "(Deprecated) {text}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1387 -msgid "Options" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1413 -#, python-brace-format -msgid "Got unexpected extra argument ({args})" -msgid_plural "Got unexpected extra arguments ({args})" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/core.py:1429 -msgid "DeprecationWarning: The command {name!r} is deprecated." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1636 -msgid "Commands" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1668 -msgid "Missing command." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1746 -msgid "No such command {name!r}." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:2310 -msgid "Value must be an iterable." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:2331 -#, python-brace-format -msgid "Takes {nargs} values but 1 was given." -msgid_plural "Takes {nargs} values but {len} were given." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/core.py:2778 -#, python-brace-format -msgid "env var: {var}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:2808 -msgid "(dynamic)" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:2821 -#, python-brace-format -msgid "default: {default}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:2834 -msgid "required" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/decorators.py:465 -#, python-format -msgid "%(prog)s, version %(version)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/decorators.py:528 -msgid "Show the version and exit." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:44 -#: venv/lib/python3.9/site-packages/click/exceptions.py:80 -#, python-brace-format -msgid "Error: {message}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:72 -#, python-brace-format -msgid "Try '{command} {option}' for help." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:121 -#, python-brace-format -msgid "Invalid value: {message}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:123 -#, python-brace-format -msgid "Invalid value for {param_hint}: {message}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:179 -msgid "Missing argument" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:181 -msgid "Missing option" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:183 -msgid "Missing parameter" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:185 -#, python-brace-format -msgid "Missing {param_type}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:192 -#, python-brace-format -msgid "Missing parameter: {param_name}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:212 -#, python-brace-format -msgid "No such option: {name}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:224 -#, python-brace-format -msgid "Did you mean {possibility}?" -msgid_plural "(Possible options: {possibilities})" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:262 -msgid "unknown error" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:269 -msgid "Could not open file {filename!r}: {message}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/parser.py:231 -msgid "Argument {name!r} takes {nargs} values." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/parser.py:413 -msgid "Option {name!r} does not take a value." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/parser.py:474 -msgid "Option {name!r} requires an argument." -msgid_plural "Option {name!r} requires {nargs} arguments." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/shell_completion.py:319 -msgid "Shell completion is not supported for Bash versions older than 4.4." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/shell_completion.py:326 -msgid "Couldn't detect Bash version, shell completion is not supported." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:158 -msgid "Repeat for confirmation" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:174 -msgid "Error: The value you entered was invalid." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:176 -#, python-brace-format -msgid "Error: {e.message}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:187 -msgid "Error: The two entered values do not match." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:243 -msgid "Error: invalid input" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:773 -msgid "Press any key to continue..." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:266 -#, python-brace-format -msgid "" -"Choose from:\n" -"\t{choices}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:298 -msgid "{value!r} is not {choice}." -msgid_plural "{value!r} is not one of {choices}." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/types.py:392 -msgid "{value!r} does not match the format {format}." -msgid_plural "{value!r} does not match the formats {formats}." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/types.py:414 -msgid "{value!r} is not a valid {number_type}." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:470 -#, python-brace-format -msgid "{value} is not in the range {range}." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:611 -msgid "{value!r} is not a valid boolean." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:635 -msgid "{value!r} is not a valid UUID." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:822 -msgid "file" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:824 -msgid "directory" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:826 -msgid "path" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:877 -msgid "{name} {filename!r} does not exist." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:886 -msgid "{name} {filename!r} is a file." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:894 -#, python-brace-format -msgid "{name} '{filename}' is a directory." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:903 -msgid "{name} {filename!r} is not readable." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:912 -msgid "{name} {filename!r} is not writable." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:921 -msgid "{name} {filename!r} is not executable." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:988 -#, python-brace-format -msgid "{len_type} values are required, but {len_value} was given." -msgid_plural "{len_type} values are required, but {len_value} were given." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/crispy_forms/tests/test_form_helper.py:130 -#: venv/lib/python3.9/site-packages/crispy_forms/tests/test_form_helper.py:140 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:91 -msgid "This field is required." -msgstr "" - -#: venv/lib/python3.9/site-packages/crispy_forms/tests/test_layout.py:392 -msgid "i18n text" -msgstr "" - -#: venv/lib/python3.9/site-packages/crispy_forms/tests/test_layout.py:394 -msgid "i18n legend" -msgstr "" - -#: venv/lib/python3.9/site-packages/crispy_forms/tests/test_layout_objects.py:143 -#: venv/lib/python3.9/site-packages/django/core/validators.py:22 -msgid "Enter a valid value." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/contrib/messages/apps.py:15 -msgid "Messages" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/contrib/sitemaps/apps.py:8 -msgid "Site Maps" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/contrib/staticfiles/apps.py:9 -msgid "Static Files" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/contrib/syndication/apps.py:7 -msgid "Syndication" -msgstr "" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -#: venv/lib/python3.9/site-packages/django/core/paginator.py:30 -msgid "…" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/paginator.py:50 -msgid "That page number is not an integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/paginator.py:52 -msgid "That page number is less than 1" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/paginator.py:54 -msgid "That page contains no results" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:104 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:752 -msgid "Enter a valid URL." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:165 -msgid "Enter a valid integer." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:176 -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -#: venv/lib/python3.9/site-packages/django/core/validators.py:259 -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:267 -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:279 -#: venv/lib/python3.9/site-packages/django/core/validators.py:287 -#: venv/lib/python3.9/site-packages/django/core/validators.py:316 -msgid "Enter a valid IPv4 address." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:296 -#: venv/lib/python3.9/site-packages/django/core/validators.py:317 -msgid "Enter a valid IPv6 address." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:308 -#: venv/lib/python3.9/site-packages/django/core/validators.py:315 -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:351 -msgid "Enter only digits separated by commas." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:357 -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:392 -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:401 -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:410 -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:420 -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:438 -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:461 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:347 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:386 -msgid "Enter a number." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:463 -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:468 -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:473 -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:544 -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:605 -msgid "Null characters are not allowed." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/base.py:1425 -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/constraints.py:17 -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:128 -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:129 -msgid "This field cannot be null." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:130 -msgid "This field cannot be blank." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:131 -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:135 -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:173 -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1094 -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1095 -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1097 -msgid "Boolean (Either True or False)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1147 -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1149 -msgid "String (unlimited)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1253 -msgid "Comma-separated integers" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1354 -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1358 -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1493 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1362 -msgid "Date (without time)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1489 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1497 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1502 -msgid "Date (with time)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1626 -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1628 -msgid "Decimal number" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1789 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1793 -msgid "Duration" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1845 -msgid "Email address" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1870 -msgid "File path" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1948 -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1950 -msgid "Floating point number" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1990 -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1992 -msgid "Integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2088 -msgid "Big (8 byte) integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2105 -msgid "Small integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2113 -msgid "IPv4 address" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2144 -msgid "IP address" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2237 -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2238 -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2240 -msgid "Boolean (Either True, False or None)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2291 -msgid "Positive big integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2306 -msgid "Positive integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2321 -msgid "Positive small integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2337 -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2373 -msgid "Text" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2448 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2452 -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2456 -msgid "Time" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2564 -msgid "URL" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2588 -msgid "Raw binary data" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2653 -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2655 -msgid "Universally unique identifier" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/files.py:232 -msgid "File" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/files.py:393 -msgid "Image" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/json.py:26 -msgid "A JSON object" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/json.py:28 -msgid "Value must be valid JSON." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:919 -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:921 -msgid "Foreign Key (type determined by related field)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:1212 -msgid "One-to-one relationship" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:1269 -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:1271 -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:1319 -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the label -#: venv/lib/python3.9/site-packages/django/forms/boundfield.py:184 -msgid ":?.!" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:298 -msgid "Enter a whole number." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:467 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1241 -msgid "Enter a valid date." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:490 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1242 -msgid "Enter a valid time." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:517 -msgid "Enter a valid date/time." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:551 -msgid "Enter a valid duration." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:552 -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:621 -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:622 -msgid "No file was submitted." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:623 -msgid "The submitted file is empty." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:625 -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:630 -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:694 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:857 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:949 -#: venv/lib/python3.9/site-packages/django/forms/models.py:1566 -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:951 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1070 -#: venv/lib/python3.9/site-packages/django/forms/models.py:1564 -msgid "Enter a list of values." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1071 -msgid "Enter a complete value." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1310 -msgid "Enter a valid UUID." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1340 -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -#: venv/lib/python3.9/site-packages/django/forms/forms.py:98 -msgid ":" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/forms.py:244 -#: venv/lib/python3.9/site-packages/django/forms/forms.py:328 -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:63 -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:67 -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:72 -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:484 -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:491 -msgid "Order" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:886 -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:891 -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:898 -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:907 -msgid "Please correct the duplicate values below." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:1338 -msgid "The inline value did not match the parent instance." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:1429 -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:1568 -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/utils.py:226 -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:463 -msgid "Clear" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:464 -msgid "Currently" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:465 -msgid "Change" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:794 -msgid "Unknown" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:795 -msgid "Yes" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:796 -msgid "No" -msgstr "" - -#. Translators: Please do not add spaces around commas. -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:874 -msgid "yes,no,maybe" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:904 -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:921 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:923 -#, python-format -msgid "%s KB" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:925 -#, python-format -msgid "%s MB" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:927 -#, python-format -msgid "%s GB" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:929 -#, python-format -msgid "%s TB" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:931 -#, python-format -msgid "%s PB" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:73 -msgid "p.m." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:74 -msgid "a.m." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:79 -msgid "PM" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:80 -msgid "AM" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:152 -msgid "midnight" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:154 -msgid "noon" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:7 -msgid "Monday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:8 -msgid "Tuesday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:9 -msgid "Wednesday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:10 -msgid "Thursday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:11 -msgid "Friday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:12 -msgid "Saturday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:13 -msgid "Sunday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:16 -msgid "Mon" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:17 -msgid "Tue" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:18 -msgid "Wed" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:19 -msgid "Thu" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:20 -msgid "Fri" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:21 -msgid "Sat" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:22 -msgid "Sun" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:25 -msgid "January" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:26 -msgid "February" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:27 -msgid "March" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:28 -msgid "April" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:29 -msgid "May" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:30 -msgid "June" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:31 -msgid "July" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:32 -msgid "August" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:33 -msgid "September" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:34 -msgid "October" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:35 -msgid "November" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:36 -msgid "December" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:39 -msgid "jan" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:40 -msgid "feb" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:41 -msgid "mar" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:42 -msgid "apr" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:43 -msgid "may" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:44 -msgid "jun" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:45 -msgid "jul" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:46 -msgid "aug" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:47 -msgid "sep" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:48 -msgid "oct" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:49 -msgid "nov" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:50 -msgid "dec" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:53 -msgctxt "abbrev. month" -msgid "Jan." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:54 -msgctxt "abbrev. month" -msgid "Feb." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:55 -msgctxt "abbrev. month" -msgid "March" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:56 -msgctxt "abbrev. month" -msgid "April" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:57 -msgctxt "abbrev. month" -msgid "May" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:58 -msgctxt "abbrev. month" -msgid "June" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:59 -msgctxt "abbrev. month" -msgid "July" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:60 -msgctxt "abbrev. month" -msgid "Aug." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:61 -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:62 -msgctxt "abbrev. month" -msgid "Oct." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:63 -msgctxt "abbrev. month" -msgid "Nov." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:64 -msgctxt "abbrev. month" -msgid "Dec." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:67 -msgctxt "alt. month" -msgid "January" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:68 -msgctxt "alt. month" -msgid "February" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:69 -msgctxt "alt. month" -msgid "March" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:70 -msgctxt "alt. month" -msgid "April" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:71 -msgctxt "alt. month" -msgid "May" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:72 -msgctxt "alt. month" -msgid "June" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:73 -msgctxt "alt. month" -msgid "July" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:74 -msgctxt "alt. month" -msgid "August" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:75 -msgctxt "alt. month" -msgid "September" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:76 -msgctxt "alt. month" -msgid "October" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:77 -msgctxt "alt. month" -msgid "November" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:78 -msgctxt "alt. month" -msgid "December" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/ipv6.py:8 -msgid "This is not a valid IPv6 address." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/text.py:137 -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -#. Translators: This string is used as a separator between list elements -#: venv/lib/python3.9/site-packages/django/utils/text.py:341 -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:135 -msgid ", " -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:8 -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:9 -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:10 -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:11 -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:12 -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:13 -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:111 -msgid "Forbidden" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:112 -msgid "CSRF verification failed. Request aborted." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:116 -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:122 -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:127 -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:136 -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:142 -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:148 -msgid "More information is available with DEBUG=True." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:44 -msgid "No year specified" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:64 -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:115 -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:214 -msgid "Date out of range" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:94 -msgid "No month specified" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:147 -msgid "No day specified" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:194 -msgid "No week specified" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:349 -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:380 -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:652 -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:692 -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/detail.py:56 -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/list.py:70 -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/list.py:77 -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/list.py:169 -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/static.py:38 -msgid "Directory indexes are not allowed here." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/static.py:40 -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/static.py:79 -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:7 -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:220 -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:206 -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:221 -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:229 -msgid "Django Documentation" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:230 -msgid "Topics, references, & how-to’s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:238 -msgid "Tutorial: A Polling App" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:239 -msgid "Get started with Django" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:247 -msgid "Django Community" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:248 -msgid "Connect, get help, or contribute" -msgstr "" - -#: venv/lib/python3.9/site-packages/kombu/transport/qpid.py:1311 -#, python-format -msgid "Attempting to connect to qpid with SASL mechanism %s" -msgstr "" - -#: venv/lib/python3.9/site-packages/kombu/transport/qpid.py:1316 -#, python-format -msgid "Connected to qpid with SASL mechanism %s" -msgstr "" - -#: venv/lib/python3.9/site-packages/kombu/transport/qpid.py:1334 -#, python-format -msgid "Unable to connect to qpid with SASL mechanism %s" -msgstr "" diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index 1433c22a..00000000 --- a/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,3665 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-29 15:37+0300\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#: accounts/models.py:14 course/models.py:24 -msgid "Bachelor" -msgstr "" - -#: accounts/models.py:15 course/models.py:25 -msgid "Master" -msgstr "" - -#: accounts/models.py:19 course/models.py:29 -msgid "Bachelor Degree" -msgstr "" - -#: accounts/models.py:20 course/models.py:30 -msgid "Master Degree" -msgstr "" - -#: accounts/models.py:23 accounts/models.py:32 -msgid "Father" -msgstr "" - -#: accounts/models.py:24 accounts/models.py:33 -msgid "Mother" -msgstr "" - -#: accounts/models.py:25 accounts/models.py:34 -msgid "Brother" -msgstr "" - -#: accounts/models.py:26 accounts/models.py:35 -msgid "Sister" -msgstr "" - -#: accounts/models.py:27 accounts/models.py:36 -msgid "Grand mother" -msgstr "" - -#: accounts/models.py:28 accounts/models.py:37 -msgid "Grand father" -msgstr "" - -#: accounts/models.py:29 accounts/models.py:38 -msgid "Other" -msgstr "" - -#: accounts/models.py:67 -msgid "M" -msgstr "" - -#: accounts/models.py:67 -msgid "Male" -msgstr "" - -#: accounts/models.py:67 -msgid "F" -msgstr "" - -#: accounts/models.py:67 -msgid "Female" -msgstr "" - -#: accounts/models.py:103 -msgid "Admin" -msgstr "" - -#: accounts/models.py:105 templates/result/add_score_for.html:52 -msgid "Student" -msgstr "" - -#: accounts/models.py:107 templates/course/course_allocation_view.html:32 -msgid "Lecturer" -msgstr "" - -#: accounts/models.py:109 -msgid "Parent" -msgstr "" - -#: accounts/validators.py:12 -msgid "" -"Enter a valid username. This value may contain only English letters, " -"numbers, and @/./+/-/_ characters." -msgstr "" - -#: config/settings.py:148 -msgid "English" -msgstr "" - -#: config/settings.py:149 -msgid "French" -msgstr "" - -#: config/settings.py:150 -msgid "Spanish" -msgstr "" - -#: config/settings.py:151 -msgid "Russia" -msgstr "" - -#: core/models.py:9 core/models.py:13 templates/core/index.html:47 -#: templates/core/index.html:52 templates/setting/admin_panel.html:80 -#: templates/setting/admin_panel.html:81 -msgid "News" -msgstr "" - -#: core/models.py:10 core/models.py:14 -msgid "Event" -msgstr "" - -#: core/models.py:17 core/models.py:22 course/models.py:33 course/models.py:38 -msgid "First" -msgstr "" - -#: core/models.py:18 core/models.py:23 course/models.py:34 course/models.py:39 -msgid "Second" -msgstr "" - -#: core/models.py:19 core/models.py:24 course/models.py:35 course/models.py:40 -msgid "Third" -msgstr "" - -#: course/models.py:71 -#, python-brace-format -msgid "The program '{instance}' has been {verb}." -msgstr "" - -#: course/models.py:76 -#, python-brace-format -msgid "The program '{instance}' has been deleted." -msgstr "" - -#: course/models.py:138 -#, python-brace-format -msgid "The course '{instance}' has been {verb}." -msgstr "" - -#: course/models.py:143 -#, python-brace-format -msgid "The course '{instance}' has been deleted." -msgstr "" - -#: course/models.py:150 -msgid "allocated_lecturer" -msgstr "" - -#: course/models.py:152 -msgid "allocated_course" -msgstr "" - -#: course/models.py:218 -#, python-brace-format -msgid "" -"The file '{instance.title}' has been uploaded to the course '{instance." -"course}'." -msgstr "" - -#: course/models.py:224 -#, python-brace-format -msgid "" -"The file '{instance.title}' of the course '{instance.course}' has been " -"updated." -msgstr "" - -#: course/models.py:233 -#, python-brace-format -msgid "" -"The file '{instance.title}' of the course '{instance.course}' has been " -"deleted." -msgstr "" - -#: course/models.py:244 -msgid "Valid video formats: mp4, mkv, wmv, 3gp, f4v, avi, mp3" -msgstr "" - -#: course/models.py:278 -#, python-brace-format -msgid "" -"The video '{instance.title}' has been uploaded to the course {instance." -"course}." -msgstr "" - -#: course/models.py:284 -#, python-brace-format -msgid "" -"The video '{instance.title}' of the course '{instance.course}' has been " -"updated." -msgstr "" - -#: course/models.py:293 -#, python-brace-format -msgid "" -"The video '{instance.title}' of the course '{instance.course}' has been " -"deleted." -msgstr "" - -#: course/models.py:299 -msgid "NOTE: Only department head can offer semester courses" -msgstr "" - -#: quiz/admin.py:31 quiz/admin.py:32 quiz/forms.py:38 quiz/forms.py:39 -#: quiz/models.py:468 templates/quiz/quiz_list.html:41 -msgid "Questions" -msgstr "" - -#: quiz/models.py:23 quiz/models.py:529 -msgid "Content" -msgstr "" - -#: quiz/models.py:24 -msgid "Random" -msgstr "" - -#: quiz/models.py:25 -#: venv/lib/python3.9/site-packages/modeltranslation/widgets.py:32 -msgid "None" -msgstr "" - -#: quiz/models.py:29 templates/result/add_score_for.html:53 -#: templates/result/assessment_results.html:40 -#: templates/result/assessment_results.html:82 -msgid "Assignment" -msgstr "" - -#: quiz/models.py:30 -msgid "Exam" -msgstr "" - -#: quiz/models.py:31 -msgid "Practice Quiz" -msgstr "" - -#: quiz/models.py:53 -msgid "Title" -msgstr "" - -#: quiz/models.py:56 -msgid "Description" -msgstr "" - -#: quiz/models.py:58 -msgid "A detailed description of the quiz" -msgstr "" - -#: quiz/models.py:64 -msgid "Random Order" -msgstr "" - -#: quiz/models.py:65 -msgid "Display the questions in a random order or as they are set?" -msgstr "" - -#: quiz/models.py:74 -msgid "Answers at end" -msgstr "" - -#: quiz/models.py:76 -msgid "" -"Correct answer is NOT shown after question. Answers displayed at the end." -msgstr "" - -#: quiz/models.py:83 -msgid "Exam Paper" -msgstr "" - -#: quiz/models.py:85 -msgid "" -"If yes, the result of each attempt by a user will be stored. Necessary for " -"marking." -msgstr "" - -#: quiz/models.py:92 -msgid "Single Attempt" -msgstr "" - -#: quiz/models.py:93 -msgid "If yes, only one attempt by a user will be permitted." -msgstr "" - -#: quiz/models.py:99 -msgid "Pass Mark" -msgstr "" - -#: quiz/models.py:101 -msgid "Percentage required to pass exam." -msgstr "" - -#: quiz/models.py:107 -msgid "Draft" -msgstr "" - -#: quiz/models.py:109 -msgid "" -"If yes, the quiz is not displayed in the quiz list and can only be taken by " -"users who can edit quizzes." -msgstr "" - -#: quiz/models.py:129 quiz/models.py:290 quiz/models.py:443 -#: templates/quiz/quiz_list.html:39 templates/quiz/sitting_list.html:37 -#: templates/result/add_score_for.html:55 -#: templates/result/assessment_results.html:42 -#: templates/result/assessment_results.html:84 -#: templates/search/search_view.html:79 templates/search/search_view.html:127 -msgid "Quiz" -msgstr "" - -#: quiz/models.py:130 templates/question.html:16 -#: templates/quiz/mcquestion_form.html:13 templates/quiz/quiz_form.html:13 -#: templates/quiz/quiz_list.html:16 templates/quiz/quiz_list.html:26 -#: templates/result.html:18 -msgid "Quizzes" -msgstr "" - -#: quiz/models.py:164 quiz/models.py:288 templates/quiz/sitting_detail.html:24 -#: templates/quiz/sitting_list.html:35 -msgid "User" -msgstr "" - -#: quiz/models.py:168 templates/progress.html:68 -#: templates/quiz/sitting_detail.html:26 templates/quiz/sitting_list.html:39 -msgid "Score" -msgstr "" - -#: quiz/models.py:175 -msgid "User Progress" -msgstr "" - -#: quiz/models.py:176 -msgid "User progress records" -msgstr "" - -#: quiz/models.py:203 -msgid "error" -msgstr "" - -#: quiz/models.py:203 -msgid "category does not exist or invalid score" -msgstr "" - -#: quiz/models.py:248 -msgid "Question set of the quiz is empty. Please configure questions properly" -msgstr "" - -#: quiz/models.py:292 templates/quiz/sitting_list.html:36 -#: templates/search/search_view.html:59 templates/search/search_view.html:125 -msgid "Course" -msgstr "" - -#: quiz/models.py:297 -msgid "Question Order" -msgstr "" - -#: quiz/models.py:303 -msgid "Question List" -msgstr "" - -#: quiz/models.py:310 -msgid "Incorrect questions" -msgstr "" - -#: quiz/models.py:314 -msgid "Current Score" -msgstr "" - -#: quiz/models.py:316 -msgid "Complete" -msgstr "" - -#: quiz/models.py:319 -msgid "User Answers" -msgstr "" - -#: quiz/models.py:321 templates/quiz/sitting_detail.html:27 -msgid "Start" -msgstr "" - -#: quiz/models.py:322 templates/quiz/sitting_detail.html:28 -msgid "End" -msgstr "" - -#: quiz/models.py:327 -msgid "Can see completed exams." -msgstr "" - -#: quiz/models.py:404 -msgid "You have passed this quiz, congratulation" -msgstr "" - -#: quiz/models.py:406 -msgid "You failed this quiz, give it one chance again." -msgstr "" - -#: quiz/models.py:448 -msgid "Figure" -msgstr "" - -#: quiz/models.py:449 -msgid "Add an image for the question if it's necessary." -msgstr "" - -#: quiz/models.py:454 -msgid "Enter the question text that you want displayed" -msgstr "" - -#: quiz/models.py:455 quiz/models.py:467 quiz/models.py:522 -#: templates/question.html:125 templates/quiz/sitting_detail.html:34 -msgid "Question" -msgstr "" - -#: quiz/models.py:460 -msgid "Explanation to be shown after the question has been answered." -msgstr "" - -#: quiz/models.py:461 templates/question.html:80 templates/question.html:89 -#: templates/result.html:80 templates/result.html:150 -msgid "Explanation" -msgstr "" - -#: quiz/models.py:481 -msgid "The order in which multichoice choice options are displayed to the user" -msgstr "" - -#: quiz/models.py:483 -msgid "Choice Order" -msgstr "" - -#: quiz/models.py:516 -msgid "Multiple Choice Question" -msgstr "" - -#: quiz/models.py:517 -msgid "Multiple Choice Questions" -msgstr "" - -#: quiz/models.py:528 -msgid "Enter the choice text that you want displayed" -msgstr "" - -#: quiz/models.py:535 -msgid "Is this a correct answer?" -msgstr "" - -#: quiz/models.py:536 templates/quiz/mcquestion_form.html:53 -#: templates/quiz/sitting_detail.html:56 -msgid "Correct" -msgstr "" - -#: quiz/models.py:543 -msgid "Choice" -msgstr "" - -#: quiz/models.py:544 templates/quiz/mcquestion_form.html:47 -msgid "Choices" -msgstr "" - -#: quiz/models.py:564 -msgid "Essay style question" -msgstr "" - -#: quiz/models.py:565 -msgid "Essay style questions" -msgstr "" - -#: templates/400.html:5 -msgid "Bad request" -msgstr "" - -#: templates/400.html:6 -msgid "Please make sure the form is correctly filled." -msgstr "" - -#: templates/400.html:7 templates/403.html:7 templates/404.html:7 -#: templates/500.html:7 -msgid "Return to the app" -msgstr "" - -#: templates/403.html:5 -msgid "forbidden" -msgstr "" - -#: templates/403.html:6 -msgid "You need the proper permission to make that request." -msgstr "" - -#: templates/404.html:6 -msgid "Looks like the page you" -msgstr "" - -#: templates/500.html:5 -msgid "Server error" -msgstr "" - -#: templates/500.html:6 -msgid "Please try again later." -msgstr "" - -#: templates/accounts/add_staff.html:3 templates/accounts/add_student.html:3 -#: templates/accounts/edit_lecturer.html:3 -#: templates/accounts/edit_student.html:3 -#: templates/accounts/lecturer_list.html:3 -#: templates/accounts/parent_form.html:3 templates/accounts/profile.html:3 -#: templates/accounts/profile_single.html:3 -#: templates/accounts/student_list.html:3 templates/core/dashboard.html:3 -#: templates/core/index.html:3 templates/core/post_add.html:3 -#: templates/core/semester_list.html:3 templates/core/semester_update.html:3 -#: templates/core/session_list.html:3 templates/core/session_update.html:3 -#: templates/course/course_add.html:3 -#: templates/course/course_allocation_form.html:3 -#: templates/course/course_allocation_view.html:3 -#: templates/course/course_registration.html:3 -#: templates/course/course_single.html:3 templates/course/program_add.html:3 -#: templates/course/program_list.html:3 templates/course/program_single.html:3 -#: templates/course/user_course_list.html:3 templates/progress.html:4 -#: templates/question.html:5 templates/quiz/sitting_detail.html:4 -#: templates/quiz/sitting_list.html:3 templates/result.html:7 -#: templates/result/add_score.html:3 templates/result/add_score_for.html:3 -#: templates/result/assessment_results.html:3 -#: templates/result/grade_results.html:3 templates/search/search_view.html:3 -#: templates/setting/admin_panel.html:3 -#: templates/setting/password_change.html:3 -#: templates/setting/profile_info_change.html:3 -#: templates/upload/upload_file_form.html:3 -#: templates/upload/upload_video_form.html:3 -#: templates/upload/video_single.html:3 -msgid "Learning management system" -msgstr "" - -#: templates/accounts/add_staff.html:11 templates/accounts/add_student.html:12 -#: templates/accounts/edit_lecturer.html:11 -#: templates/accounts/edit_student.html:11 -#: templates/accounts/lecturer_list.html:9 templates/accounts/profile.html:14 -#: templates/accounts/profile_single.html:14 -#: templates/accounts/student_list.html:10 templates/aside.html:47 -#: templates/core/dashboard.html:13 templates/core/index.html:34 -#: templates/core/post_add.html:11 templates/core/semester_list.html:9 -#: templates/core/semester_update.html:11 templates/core/session_list.html:9 -#: templates/core/session_update.html:11 templates/course/course_add.html:11 -#: templates/course/course_allocation_form.html:11 -#: templates/course/course_allocation_view.html:9 -#: templates/course/course_registration.html:12 -#: templates/course/course_single.html:10 templates/course/program_add.html:11 -#: templates/course/program_list.html:9 templates/course/program_single.html:10 -#: templates/course/user_course_list.html:10 templates/progress.html:11 -#: templates/question.html:12 templates/quiz/mcquestion_form.html:9 -#: templates/quiz/quiz_form.html:9 templates/quiz/quiz_list.html:12 -#: templates/quiz/sitting_detail.html:11 templates/quiz/sitting_list.html:9 -#: templates/result.html:14 templates/result/add_score.html:10 -#: templates/result/add_score_for.html:10 -#: templates/result/assessment_results.html:9 -#: templates/result/grade_results.html:9 templates/search/search_view.html:11 -#: templates/setting/admin_panel.html:11 -#: templates/setting/password_change.html:11 -#: templates/setting/profile_info_change.html:11 -#: templates/upload/upload_file_form.html:10 -#: templates/upload/upload_video_form.html:10 -#: templates/upload/video_single.html:10 -msgid "Home" -msgstr "" - -#: templates/accounts/add_staff.html:12 -#: templates/accounts/edit_lecturer.html:12 -#: templates/accounts/lecturer_list.html:10 -#: templates/accounts/lecturer_list.html:21 templates/aside.html:58 -#: templates/core/dashboard.html:63 templates/pdf/lecturer_list.html:35 -#: templates/setting/admin_panel.html:37 -msgid "Lecturers" -msgstr "" - -#: templates/accounts/add_staff.html:13 templates/accounts/add_student.html:14 -#: templates/aside.html:113 -msgid "Add" -msgstr "" - -#: templates/accounts/add_staff.html:17 -msgid "Lecturer Add Form" -msgstr "" - -#: templates/accounts/add_staff.html:26 templates/accounts/add_student.html:27 -#: templates/accounts/edit_lecturer.html:27 -#: templates/accounts/edit_student.html:25 templates/accounts/profile.html:75 -#: templates/accounts/profile_single.html:88 -#: templates/pdf/profile_single.html:65 templates/registration/register.html:40 -#: templates/setting/profile_info_change.html:24 -msgid "Personal Info" -msgstr "" - -#: templates/accounts/add_staff.html:37 templates/accounts/add_student.html:49 -#: templates/accounts/edit_lecturer.html:46 -#: templates/accounts/edit_student.html:46 -#: templates/accounts/parent_form.html:11 templates/core/post_add.html:25 -#: templates/core/semester_update.html:38 templates/core/session_update.html:38 -#: templates/course/course_add.html:49 -#: templates/course/course_allocation_form.html:49 -#: templates/course/program_add.html:26 templates/quiz/mcquestion_form.html:67 -#: templates/quiz/quiz_form.html:66 templates/result/add_score_for.html:38 -msgid "Save" -msgstr "" - -#: templates/accounts/add_student.html:13 -#: templates/accounts/edit_student.html:12 -#: templates/accounts/student_list.html:11 -#: templates/accounts/student_list.html:24 templates/aside.html:61 -#: templates/core/dashboard.html:54 templates/pdf/student_list.html:35 -#: templates/setting/admin_panel.html:42 -msgid "Students" -msgstr "" - -#: templates/accounts/add_student.html:18 -msgid "Student Add Form" -msgstr "" - -#: templates/accounts/add_student.html:40 -#: templates/accounts/edit_lecturer.html:39 -#: templates/accounts/edit_student.html:39 templates/core/dashboard.html:117 -#: templates/setting/profile_info_change.html:37 -msgid "Others" -msgstr "" - -#: templates/accounts/edit_lecturer.html:13 -#: templates/accounts/edit_student.html:13 -#: templates/accounts/lecturer_list.html:59 -#: templates/accounts/student_list.html:61 -#: templates/course/program_list.html:56 -msgid "Update" -msgstr "" - -#: templates/accounts/edit_lecturer.html:17 -msgid "Lecturer Update Form" -msgstr "" - -#: templates/accounts/edit_lecturer.html:27 -#: templates/accounts/edit_student.html:25 -#: templates/accounts/lecturer_list.html:33 -#: templates/accounts/profile_single.html:107 -#: templates/accounts/student_list.html:38 templates/pdf/lecturer_list.html:44 -#: templates/pdf/student_list.html:43 -#: templates/registration/password_reset.html:13 -#: templates/setting/profile_info_change.html:24 -msgid "Email" -msgstr "" - -#: templates/accounts/edit_student.html:17 -msgid "Student Update Form" -msgstr "" - -#: templates/accounts/lecturer_list.html:16 -msgid "Add Lecturer" -msgstr "" - -#: templates/accounts/lecturer_list.html:17 -#: templates/accounts/student_list.html:20 -msgid "Download pdf" -msgstr "" - -#: templates/accounts/lecturer_list.html:31 -#: templates/accounts/profile_single.html:92 -#: templates/accounts/student_list.html:36 templates/pdf/lecturer_list.html:42 -#: templates/pdf/student_list.html:41 -msgid "ID No." -msgstr "" - -#: templates/accounts/lecturer_list.html:32 -#: templates/accounts/student_list.html:37 templates/pdf/lecturer_list.html:43 -#: templates/pdf/student_list.html:42 -msgid "Full Name" -msgstr "" - -#: templates/accounts/lecturer_list.html:34 templates/pdf/lecturer_list.html:45 -#: templates/pdf/student_list.html:44 -msgid "Mob No." -msgstr "" - -#: templates/accounts/lecturer_list.html:35 -#: templates/accounts/profile_single.html:109 -msgid "Address/city" -msgstr "" - -#: templates/accounts/lecturer_list.html:36 -#: templates/accounts/profile_single.html:29 -#: templates/accounts/profile_single.html:115 -msgid "Last login" -msgstr "" - -#: templates/accounts/lecturer_list.html:38 -#: templates/accounts/student_list.html:41 -#: templates/course/course_allocation_view.html:35 -#: templates/course/program_list.html:35 -#: templates/course/program_single.html:47 -msgid "Action" -msgstr "" - -#: templates/accounts/lecturer_list.html:60 -#: templates/accounts/student_list.html:62 -msgid "Download PDF" -msgstr "" - -#: templates/accounts/lecturer_list.html:61 -#: templates/accounts/student_list.html:63 templates/core/index.html:78 -#: templates/core/semester_list.html:71 templates/core/session_list.html:66 -#: templates/course/course_single.html:91 -#: templates/course/course_single.html:168 -#: templates/course/program_list.html:57 -#: templates/course/program_single.html:81 -#: templates/quiz/mcquestion_form.html:57 templates/quiz/quiz_list.html:68 -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:499 -msgid "Delete" -msgstr "" - -#: templates/accounts/lecturer_list.html:71 templates/pdf/lecturer_list.html:63 -#: templates/pdf/student_list.html:61 -msgid "No Lecturer(s)." -msgstr "" - -#: templates/accounts/lecturer_list.html:75 -msgid "Add Lecturer Now." -msgstr "" - -#: templates/accounts/profile.html:29 templates/accounts/profile.html:101 -#: templates/navbar.html:29 templates/pdf/profile_single.html:41 -#: templates/pdf/profile_single.html:92 -msgid "Last login:" -msgstr "" - -#: templates/accounts/profile.html:30 templates/pdf/profile_single.html:42 -msgid "Role:" -msgstr "" - -#: templates/accounts/profile.html:37 templates/accounts/profile_single.html:40 -#: templates/accounts/profile_single.html:48 -msgid "Edit Profile" -msgstr "" - -#: templates/accounts/profile.html:39 -msgid "Change password" -msgstr "" - -#: templates/accounts/profile.html:62 templates/accounts/profile_single.html:75 -#: templates/aside.html:67 templates/course/user_course_list.html:3 -#: templates/course/user_course_list.html:11 -#: templates/course/user_course_list.html:23 templates/navbar.html:34 -#: templates/pdf/profile_single.html:52 -msgid "My Courses" -msgstr "" - -#: templates/accounts/profile.html:70 templates/accounts/profile_single.html:83 -#: templates/pdf/profile_single.html:60 -msgid "No courses assigned!" -msgstr "" - -#: templates/accounts/profile.html:77 templates/pdf/profile_single.html:67 -msgid "First Name:" -msgstr "" - -#: templates/accounts/profile.html:78 templates/pdf/profile_single.html:68 -msgid "Last Name:" -msgstr "" - -#: templates/accounts/profile.html:79 templates/pdf/profile_single.html:69 -msgid "ID No.:" -msgstr "" - -#: templates/accounts/profile.html:83 templates/accounts/profile_single.html:96 -#: templates/pdf/profile_single.html:74 -msgid "Applicant Info" -msgstr "" - -#: templates/accounts/profile.html:85 templates/pdf/profile_single.html:76 -msgid "School:" -msgstr "" - -#: templates/accounts/profile.html:85 templates/pdf/profile_single.html:76 -msgid "Hawas Preparatory School" -msgstr "" - -#: templates/accounts/profile.html:86 templates/pdf/profile_single.html:77 -msgid "Level:" -msgstr "" - -#: templates/accounts/profile.html:91 -#: templates/accounts/profile_single.html:105 -#: templates/pdf/profile_single.html:82 -msgid "Contact Info" -msgstr "" - -#: templates/accounts/profile.html:93 templates/pdf/profile_single.html:84 -msgid "Email:" -msgstr "" - -#: templates/accounts/profile.html:94 templates/pdf/profile_single.html:85 -msgid "Tel No.:" -msgstr "" - -#: templates/accounts/profile.html:95 templates/pdf/profile_single.html:86 -msgid "Address/city:" -msgstr "" - -#: templates/accounts/profile.html:99 -#: templates/accounts/profile_single.html:113 -#: templates/pdf/profile_single.html:90 -msgid "Important Dates" -msgstr "" - -#: templates/accounts/profile.html:103 templates/pdf/profile_single.html:94 -msgid "Academic Year:" -msgstr "" - -#: templates/accounts/profile.html:103 -#: templates/accounts/profile_single.html:117 -#: templates/core/semester_list.html:41 templates/course/program_single.html:44 -#: templates/course/user_course_list.html:52 -#: templates/course/user_course_list.html:96 -#: templates/pdf/profile_single.html:94 templates/result/add_score.html:24 -#: templates/result/add_score_for.html:46 templates/setting/admin_panel.html:52 -msgid "Semester" -msgstr "" - -#: templates/accounts/profile.html:105 templates/pdf/profile_single.html:96 -msgid "Registered Date:" -msgstr "" - -#: templates/accounts/profile_single.html:30 -msgid "Role" -msgstr "" - -#: templates/accounts/profile_single.html:43 -msgid "Change Program" -msgstr "" - -#: templates/accounts/profile_single.html:90 -msgid "First Name" -msgstr "" - -#: templates/accounts/profile_single.html:91 -msgid "Last Name" -msgstr "" - -#: templates/accounts/profile_single.html:98 -msgid "School" -msgstr "" - -#: templates/accounts/profile_single.html:99 -#: templates/course/program_single.html:42 -msgid "Level" -msgstr "" - -#: templates/accounts/profile_single.html:100 -#: templates/accounts/student_list.html:39 templates/pdf/student_list.html:45 -#: templates/search/search_view.html:49 templates/search/search_view.html:89 -#: templates/search/search_view.html:124 -msgid "Program" -msgstr "" - -#: templates/accounts/profile_single.html:108 -msgid "Tel No." -msgstr "" - -#: templates/accounts/profile_single.html:117 -msgid "Academic Year" -msgstr "" - -#: templates/accounts/profile_single.html:119 -msgid "Registered Date" -msgstr "" - -#: templates/accounts/student_list.html:19 -msgid "Add Student" -msgstr "" - -#: templates/accounts/student_list.html:73 -#: templates/result/add_score_for.html:105 -msgid "No Student." -msgstr "" - -#: templates/accounts/student_list.html:77 -msgid "Add Student Now." -msgstr "" - -#: templates/aside.html:43 templates/core/dashboard.html:3 -#: templates/core/dashboard.html:14 templates/core/dashboard.html:33 -msgid "Dashboard" -msgstr "" - -#: templates/aside.html:50 templates/navbar.html:41 -msgid "Profile" -msgstr "" - -#: templates/aside.html:55 templates/navbar.html:38 -#: templates/setting/admin_panel.html:12 templates/setting/admin_panel.html:16 -msgid "Admin Panel" -msgstr "" - -#: templates/aside.html:72 -msgid "Programs & Courses" -msgstr "" - -#: templates/aside.html:77 templates/quiz/sitting_list.html:10 -msgid "Complete Exams" -msgstr "" - -#: templates/aside.html:83 templates/aside.html:104 -msgid "Quiz Progress Rec" -msgstr "" - -#: templates/aside.html:86 -msgid "Course Allocation" -msgstr "" - -#: templates/aside.html:89 -msgid "Manage Session" -msgstr "" - -#: templates/aside.html:92 -msgid "Manage Semester" -msgstr "" - -#: templates/aside.html:98 templates/result/add_score.html:11 -#: templates/result/add_score.html:17 templates/result/add_score_for.html:12 -msgid "Manage Score" -msgstr "" - -#: templates/aside.html:107 templates/result/grade_results.html:10 -#: templates/result/grade_results.html:28 -msgid "Grade Results" -msgstr "" - -#: templates/aside.html:110 templates/result/assessment_results.html:10 -#: templates/result/assessment_results.html:28 -msgid "Assesment Results" -msgstr "" - -#: templates/aside.html:113 -msgid "Drop Course" -msgstr "" - -#: templates/aside.html:119 -msgid "Account Setting" -msgstr "" - -#: templates/aside.html:122 templates/setting/password_change.html:21 -#: templates/setting/password_change.html:25 -msgid "Change Password" -msgstr "" - -#: templates/aside.html:130 -msgid "Read our" -msgstr "" - -#: templates/aside.html:130 -msgid "Privacy" -msgstr "" - -#: templates/aside.html:130 -#: venv/lib/python3.9/site-packages/django/db/models/base.py:1423 -#: venv/lib/python3.9/site-packages/django/forms/models.py:893 -msgid "and" -msgstr "" - -#: templates/aside.html:130 -msgid "Terms of use." -msgstr "" - -#: templates/aside.html:135 -msgid "⭐️ Star This Project" -msgstr "" - -#: templates/core/dashboard.html:40 -msgid "Dashboard settings" -msgstr "" - -#: templates/core/dashboard.html:41 -msgid "Display grid" -msgstr "" - -#: templates/core/dashboard.html:42 -msgid "Display table" -msgstr "" - -#: templates/core/dashboard.html:44 -msgid "Manage dashboard" -msgstr "" - -#: templates/core/dashboard.html:72 -msgid "Administrators" -msgstr "" - -#: templates/core/dashboard.html:81 -msgid "Lab Assistance" -msgstr "" - -#: templates/core/dashboard.html:90 -msgid "Librarians" -msgstr "" - -#: templates/core/dashboard.html:99 -msgid "Supervisors" -msgstr "" - -#: templates/core/dashboard.html:108 -msgid "Office Assistance" -msgstr "" - -#: templates/core/dashboard.html:145 -msgid "Latest activities" -msgstr "" - -#: templates/core/dashboard.html:150 -msgid "No recent activity" -msgstr "" - -#: templates/core/dashboard.html:158 -msgid "School Demographics" -msgstr "" - -#: templates/core/index.html:40 -msgid "Add New Post" -msgstr "" - -#: templates/core/index.html:47 templates/core/index.html:55 -#: templates/setting/admin_panel.html:80 templates/setting/admin_panel.html:81 -msgid "Events" -msgstr "" - -#: templates/core/index.html:65 -msgid "news" -msgstr "" - -#: templates/core/index.html:65 -msgid "events" -msgstr "" - -#: templates/core/index.html:76 templates/core/semester_list.html:69 -#: templates/core/session_list.html:65 templates/course/course_single.html:87 -#: templates/course/course_single.html:164 -#: templates/course/program_single.html:78 templates/quiz/quiz_list.html:65 -msgid "Edit" -msgstr "" - -#: templates/core/index.html:88 templates/upload/video_single.html:31 -msgid "ago" -msgstr "" - -#: templates/core/index.html:98 -msgid "School news and events will appear here." -msgstr "" - -#: templates/core/post_add.html:12 -msgid "Post form" -msgstr "" - -#: templates/core/post_add.html:21 -msgid "Post Form" -msgstr "" - -#: templates/core/post_add.html:26 templates/upload/upload_file_form.html:34 -#: templates/upload/upload_video_form.html:33 -msgid "Cancel" -msgstr "" - -#: templates/core/semester_list.html:10 -msgid "Semester list" -msgstr "" - -#: templates/core/semester_list.html:16 -msgid "Add New Semester" -msgstr "" - -#: templates/core/semester_list.html:20 templates/core/semester_update.html:12 -msgid "Semester List" -msgstr "" - -#: templates/core/semester_list.html:42 -msgid "Is Current semester" -msgstr "" - -#: templates/core/semester_list.html:43 templates/core/session_list.html:41 -#: templates/setting/admin_panel.html:47 -msgid "Session" -msgstr "" - -#: templates/core/semester_list.html:44 -msgid "Next Semester Begins" -msgstr "" - -#: templates/core/semester_list.html:46 templates/core/session_list.html:45 -#: templates/course/course_single.html:61 -#: templates/course/course_single.html:138 -msgid "Actions" -msgstr "" - -#: templates/core/semester_list.html:83 -msgid "No Semester." -msgstr "" - -#: templates/core/semester_list.html:87 -msgid "Add Semester Now." -msgstr "" - -#: templates/core/semester_update.html:13 -msgid "Semester Form" -msgstr "" - -#: templates/core/semester_update.html:34 -msgid "Semester Add & update Form" -msgstr "" - -#: templates/core/session_list.html:10 templates/core/session_list.html:20 -#: templates/core/session_update.html:12 -msgid "Session List" -msgstr "" - -#: templates/core/session_list.html:16 -msgid "Add New Session" -msgstr "" - -#: templates/core/session_list.html:42 -msgid "Is Current Session" -msgstr "" - -#: templates/core/session_list.html:43 -msgid "Next Session Begins" -msgstr "" - -#: templates/core/session_list.html:77 -msgid "No Session." -msgstr "" - -#: templates/core/session_list.html:81 -msgid "Add Session Now." -msgstr "" - -#: templates/core/session_update.html:13 -msgid "Session Form" -msgstr "" - -#: templates/core/session_update.html:34 -msgid "Session Add & update Form" -msgstr "" - -#: templates/correct_answer.html:6 templates/question.html:50 -#: templates/result.html:51 -msgid "You answered the above question incorrectly" -msgstr "" - -#: templates/correct_answer.html:16 templates/question.html:60 -#: templates/result.html:61 -msgid "This is the correct answer" -msgstr "" - -#: templates/correct_answer.html:24 templates/question.html:68 -#: templates/result.html:69 -msgid "This was your answer." -msgstr "" - -#: templates/course/course_add.html:12 templates/course/course_single.html:11 -#: templates/course/program_add.html:12 templates/course/program_list.html:10 -#: templates/course/program_single.html:11 -#: templates/quiz/mcquestion_form.html:10 templates/quiz/quiz_form.html:10 -#: templates/quiz/quiz_list.html:13 templates/result.html:15 -#: templates/setting/admin_panel.html:70 -#: templates/upload/upload_file_form.html:11 -#: templates/upload/upload_video_form.html:11 -#: templates/upload/video_single.html:11 -msgid "Programs" -msgstr "" - -#: templates/course/course_add.html:13 templates/course/course_add.html:17 -msgid "Course Form" -msgstr "" - -#: templates/course/course_add.html:27 -msgid "Course Detail" -msgstr "" - -#: templates/course/course_add.html:37 -msgid "Other Info" -msgstr "" - -#: templates/course/course_allocation_form.html:12 -#: templates/course/course_allocation_view.html:20 -#: templates/setting/admin_panel.html:75 -msgid "Course Allocations" -msgstr "" - -#: templates/course/course_allocation_form.html:13 -msgid "Allocation Form" -msgstr "" - -#: templates/course/course_allocation_form.html:34 -msgid "Course Allocation Form" -msgstr "" - -#: templates/course/course_allocation_view.html:10 -msgid "Allocation list" -msgstr "" - -#: templates/course/course_allocation_view.html:16 -msgid "Allocate Now" -msgstr "" - -#: templates/course/course_allocation_view.html:33 -#: templates/setting/admin_panel.html:70 -msgid "Courses" -msgstr "" - -#: templates/course/course_allocation_view.html:50 -msgid "Edit or Update" -msgstr "" - -#: templates/course/course_allocation_view.html:53 -msgid "Deallocate" -msgstr "" - -#: templates/course/course_allocation_view.html:65 -msgid "No Course Allocated." -msgstr "" - -#: templates/course/course_allocation_view.html:69 -msgid "Allocate now" -msgstr "" - -#: templates/course/course_registration.html:13 -msgid "Course Registration" -msgstr "" - -#: templates/course/course_registration.html:17 -#: templates/course/course_registration.html:35 -#: templates/setting/admin_panel.html:58 -msgid "Course Add" -msgstr "" - -#: templates/course/course_registration.html:17 -#: templates/setting/admin_panel.html:58 -msgid "Drop" -msgstr "" - -#: templates/course/course_registration.html:25 -msgid "Calender is off" -msgstr "" - -#: templates/course/course_registration.html:26 -msgid "Check the university calender" -msgstr "" - -#: templates/course/course_registration.html:38 -#: templates/course/course_registration.html:200 -msgid "Save Score" -msgstr "" - -#: templates/course/course_registration.html:43 -#: templates/result/assessment_results.html:32 -#: templates/result/grade_results.html:32 -msgid "First Semester:" -msgstr "" - -#: templates/course/course_registration.html:48 -#: templates/course/course_registration.html:111 -#: templates/course/course_registration.html:216 -msgid "Mark" -msgstr "" - -#: templates/course/course_registration.html:49 -#: templates/course/course_registration.html:112 -#: templates/course/course_registration.html:217 -#: templates/course/program_single.html:40 -#: templates/course/user_course_list.html:49 -#: templates/course/user_course_list.html:93 -#: templates/result/assessment_results.html:38 -#: templates/result/grade_results.html:38 -#: templates/result/grade_results.html:103 -msgid "Course Code" -msgstr "" - -#: templates/course/course_registration.html:50 -#: templates/course/course_registration.html:113 -#: templates/course/course_registration.html:218 -#: templates/result/assessment_results.html:37 -#: templates/result/assessment_results.html:79 -#: templates/result/grade_results.html:37 -#: templates/result/grade_results.html:102 -msgid "Course Title" -msgstr "" - -#: templates/course/course_registration.html:51 -#: templates/course/course_registration.html:114 -#: templates/course/course_registration.html:219 -#: templates/result/assessment_results.html:39 -#: templates/result/assessment_results.html:81 -msgid "Cr.Hr(s)" -msgstr "" - -#: templates/course/course_registration.html:52 -#: templates/course/course_registration.html:115 -#: templates/course/course_registration.html:220 -#: templates/course/program_single.html:43 -#: templates/course/user_course_list.html:51 -#: templates/course/user_course_list.html:95 -msgid "Year" -msgstr "" - -#: templates/course/course_registration.html:53 -#: templates/course/course_registration.html:116 -#: templates/course/course_registration.html:221 -msgid "Classification" -msgstr "" - -#: templates/course/course_registration.html:54 -#: templates/course/course_registration.html:117 -#: templates/course/course_registration.html:222 -msgid "Elective Group" -msgstr "" - -#: templates/course/course_registration.html:69 -#: templates/course/course_registration.html:132 -#: templates/course/course_registration.html:236 -msgid "Elective" -msgstr "" - -#: templates/course/course_registration.html:71 -#: templates/course/course_registration.html:134 -#: templates/course/course_registration.html:238 -msgid "Core" -msgstr "" - -#: templates/course/course_registration.html:83 -#: templates/course/course_registration.html:146 -#: templates/course/course_registration.html:249 -msgid "No Course." -msgstr "" - -#: templates/course/course_registration.html:97 -msgid "First semester Credit(s):" -msgstr "" - -#: templates/course/course_registration.html:106 -#: templates/result/assessment_results.html:74 -#: templates/result/grade_results.html:97 -msgid "Second Semester:" -msgstr "" - -#: templates/course/course_registration.html:160 -msgid "Second semester credit(s):" -msgstr "" - -#: templates/course/course_registration.html:165 -msgid "Registerd course credit(s):" -msgstr "" - -#: templates/course/course_registration.html:170 -#: templates/course/course_registration.html:263 -msgid "Total credit(s):" -msgstr "" - -#: templates/course/course_registration.html:186 -msgid "Print Registration Form" -msgstr "" - -#: templates/course/course_registration.html:187 -msgid "Print Registerd Courses" -msgstr "" - -#: templates/course/course_registration.html:191 -msgid "Course Drop" -msgstr "" - -#: templates/course/course_registration.html:201 -msgid "Drop Selected" -msgstr "" - -#: templates/course/course_single.html:22 -msgid "Edit course" -msgstr "" - -#: templates/course/course_single.html:27 -msgid "Upload new file" -msgstr "" - -#: templates/course/course_single.html:30 -msgid "Upload new video" -msgstr "" - -#: templates/course/course_single.html:36 -msgid "Take a Quiz" -msgstr "" - -#: templates/course/course_single.html:51 -msgid "Video Tutorials" -msgstr "" - -#: templates/course/course_single.html:57 -msgid "Video Title" -msgstr "" - -#: templates/course/course_single.html:58 -#: templates/course/course_single.html:134 -msgid "Uploaded Date" -msgstr "" - -#: templates/course/course_single.html:59 -msgid "Get Started" -msgstr "" - -#: templates/course/course_single.html:79 -msgid "Play now" -msgstr "" - -#: templates/course/course_single.html:104 -msgid "No video Uploaded." -msgstr "" - -#: templates/course/course_single.html:108 -#: templates/course/course_single.html:185 -msgid "Upload now." -msgstr "" - -#: templates/course/course_single.html:127 -msgid "Documentations" -msgstr "" - -#: templates/course/course_single.html:133 -msgid "File name" -msgstr "" - -#: templates/course/course_single.html:135 -msgid "Updated Date" -msgstr "" - -#: templates/course/course_single.html:136 -msgid "Downloads" -msgstr "" - -#: templates/course/course_single.html:156 -msgid "Download" -msgstr "" - -#: templates/course/course_single.html:181 -msgid "No File Uploaded." -msgstr "" - -#: templates/course/course_single.html:205 -msgid "Lecturer(s)" -msgstr "" - -#: templates/course/course_single.html:232 -msgid "No lecturer assigned for this course" -msgstr "" - -#: templates/course/program_add.html:13 -msgid "Program Form" -msgstr "" - -#: templates/course/program_add.html:22 -msgid "Program Add Form" -msgstr "" - -#: templates/course/program_list.html:16 -msgid "Add Program" -msgstr "" - -#: templates/course/program_list.html:20 -msgid "Program List" -msgstr "" - -#: templates/course/program_list.html:32 -msgid "Program Name" -msgstr "" - -#: templates/course/program_list.html:33 -msgid "Summary" -msgstr "" - -#: templates/course/program_list.html:69 -msgid "No program." -msgstr "" - -#: templates/course/program_list.html:73 -msgid "Add program now." -msgstr "" - -#: templates/course/program_single.html:18 -msgid "Add Course" -msgstr "" - -#: templates/course/program_single.html:39 -#: templates/course/user_course_list.html:48 -#: templates/course/user_course_list.html:92 -msgid "Course Name" -msgstr "" - -#: templates/course/program_single.html:41 -#: templates/course/user_course_list.html:50 -#: templates/course/user_course_list.html:94 -#: templates/result/grade_results.html:39 -#: templates/result/grade_results.html:104 -msgid "Cr.Hr" -msgstr "" - -#: templates/course/program_single.html:45 -#: templates/course/user_course_list.html:53 -#: templates/course/user_course_list.html:97 -msgid "Current Semester" -msgstr "" - -#: templates/course/program_single.html:92 -msgid "No course for this progrm." -msgstr "" - -#: templates/course/program_single.html:96 -msgid "Add one now." -msgstr "" - -#: templates/course/user_course_list.html:42 -msgid "Taken Courses:" -msgstr "" - -#: templates/course/user_course_list.html:54 -#: templates/course/user_course_list.html:75 -msgid "Taken" -msgstr "" - -#: templates/course/user_course_list.html:86 -msgid "All Courses:" -msgstr "" - -#: templates/invoice_detail.html:2 templates/invoices.html:1 -msgid "Invoices" -msgstr "" - -#: templates/invoices.html:5 -msgid "Pay now" -msgstr "" - -#: templates/navbar.html:12 -msgid "Search All... #course, #program, #Quiz, #News, #Events" -msgstr "" - -#: templates/navbar.html:42 -msgid "Setting" -msgstr "" - -#: templates/navbar.html:46 -msgid "Signout" -msgstr "" - -#: templates/payments/charge.html:24 -msgid "Payment Succeed, You has been make payment successfuly." -msgstr "" - -#: templates/payments/charge.html:25 -msgid "Redirect to your dashboard in" -msgstr "" - -#: templates/payments/coinbase.html:3 templates/payments/coinbase.html:8 -msgid "Coinbase" -msgstr "" - -#: templates/pdf/lecturer_list.html:46 -msgid "Address/City" -msgstr "" - -#: templates/progress.html:4 templates/progress.html:12 -msgid "Progress Page" -msgstr "" - -#: templates/progress.html:5 -msgid "User Progress Page" -msgstr "" - -#: templates/progress.html:18 -msgid "Question Category Scores" -msgstr "" - -#: templates/progress.html:25 templates/quiz/sitting_detail.html:19 -msgid "Category" -msgstr "" - -#: templates/progress.html:26 -msgid "Correctly answererd" -msgstr "" - -#: templates/progress.html:27 -msgid "Incorrect" -msgstr "" - -#: templates/progress.html:56 -msgid "Previous exam papers" -msgstr "" - -#: templates/progress.html:58 -msgid "Below are the results of exams that you have sat." -msgstr "" - -#: templates/progress.html:60 templates/quiz/sitting_list.html:29 -msgid "Total complete exams:" -msgstr "" - -#: templates/progress.html:67 -msgid "Quiz Title" -msgstr "" - -#: templates/progress.html:69 -msgid "Possible Score" -msgstr "" - -#: templates/progress.html:70 -#, python-format -msgid "Out of 100%%" -msgstr "" - -#: templates/progress.html:94 -msgid "No recordes yet. Try to do some quizzes in your course." -msgstr "" - -#: templates/question.html:28 templates/result.html:38 -msgid "The previous question" -msgstr "" - -#: templates/question.html:37 -msgid "Your answer was" -msgstr "" - -#: templates/question.html:85 templates/result.html:85 -msgid "No explanation set to this question." -msgstr "" - -#: templates/question.html:108 -msgid "Quiz instractions" -msgstr "" - -#: templates/question.html:116 -msgid "Understood" -msgstr "" - -#: templates/question.html:125 -msgid "of" -msgstr "" - -#: templates/question.html:130 -msgid "Quiz category" -msgstr "" - -#: templates/question.html:157 -msgid "Previous" -msgstr "" - -#: templates/quiz/mcquestion_form.html:14 -msgid "MC Question Form" -msgstr "" - -#: templates/quiz/mcquestion_form.html:18 -msgid "Add questions" -msgstr "" - -#: templates/quiz/mcquestion_form.html:31 -msgid "question added" -msgstr "" - -#: templates/quiz/mcquestion_form.html:34 -msgid "Correct the error(s) below." -msgstr "" - -#: templates/quiz/quiz_form.html:14 -msgid "Quiz Form" -msgstr "" - -#: templates/quiz/quiz_form.html:18 -msgid "Quiz form for" -msgstr "" - -#: templates/quiz/quiz_form.html:55 -msgid "Hold down" -msgstr "" - -#: templates/quiz/quiz_form.html:55 -#: venv/lib/python3.9/site-packages/django/utils/text.py:322 -msgid "or" -msgstr "" - -#: templates/quiz/quiz_form.html:55 -msgid "on a Mac, to select more than one." -msgstr "" - -#: templates/quiz/quiz_form.html:66 -msgid "Continue" -msgstr "" - -#: templates/quiz/quiz_list.html:22 -msgid "Add Quiz" -msgstr "" - -#: templates/quiz/quiz_list.html:54 -msgid "You will only get one attempt at this quiz" -msgstr "" - -#: templates/quiz/quiz_list.html:58 -msgid "Start quiz" -msgstr "" - -#: templates/quiz/sitting_detail.html:4 -msgid "Result of" -msgstr "" - -#: templates/quiz/sitting_detail.html:4 templates/search/search_view.html:43 -msgid "for" -msgstr "" - -#: templates/quiz/sitting_detail.html:12 -msgid "Completed Exams" -msgstr "" - -#: templates/quiz/sitting_detail.html:13 -msgid "Marking" -msgstr "" - -#: templates/quiz/sitting_detail.html:18 templates/result.html:99 -msgid "Quiz title" -msgstr "" - -#: templates/quiz/sitting_detail.html:25 templates/quiz/sitting_list.html:38 -msgid "Completed" -msgstr "" - -#: templates/quiz/sitting_detail.html:35 -msgid "User answer" -msgstr "" - -#: templates/quiz/sitting_detail.html:54 -msgid "incorrect" -msgstr "" - -#: templates/quiz/sitting_detail.html:62 -msgid "Toggle whether correct" -msgstr "" - -#: templates/quiz/sitting_list.html:3 -msgid "All Quizzes" -msgstr "" - -#: templates/quiz/sitting_list.html:16 -msgid "List of complete exams" -msgstr "" - -#: templates/quiz/sitting_list.html:24 templates/snippets/filter_form.html:12 -msgid "Filter" -msgstr "" - -#: templates/quiz/sitting_list.html:54 -msgid "View details" -msgstr "" - -#: templates/quiz/sitting_list.html:63 -msgid "No completed exams for you" -msgstr "" - -#: templates/registration/login.html:3 -msgid "Dj Learning Management System - Login" -msgstr "" - -#: templates/registration/login.html:11 -msgid "Sign in" -msgstr "" - -#: templates/registration/login.html:16 -msgid "ID Number" -msgstr "" - -#: templates/registration/login.html:21 -msgid "Password" -msgstr "" - -#: templates/registration/login.html:25 templates/registration/register.html:73 -msgid "Invalid ID & Password." -msgstr "" - -#: templates/registration/login.html:28 -msgid "SIGN IN" -msgstr "" - -#: templates/registration/login.html:32 -msgid "Forgot password ?" -msgstr "" - -#: templates/registration/password_reset.html:3 -msgid "Password Reset | Learning management system" -msgstr "" - -#: templates/registration/password_reset.html:7 -msgid "Password Reset" -msgstr "" - -#: templates/registration/password_reset.html:17 -msgid "Request Password Reset" -msgstr "" - -#: templates/registration/password_reset_complete.html:3 -msgid "Password Reset Complete | Learning management system" -msgstr "" - -#: templates/registration/password_reset_complete.html:8 -msgid "Password Reset Complete" -msgstr "" - -#: templates/registration/password_reset_complete.html:11 -msgid "Your password has been set, you are now able to Log In!" -msgstr "" - -#: templates/registration/password_reset_complete.html:13 -msgid "Sign In Here" -msgstr "" - -#: templates/registration/password_reset_confirm.html:22 -msgid "Confirm New Password" -msgstr "" - -#: templates/registration/password_reset_confirm.html:31 -msgid "Reset Password" -msgstr "" - -#: templates/registration/password_reset_done.html:3 -msgid "Email Sent | Learning management system" -msgstr "" - -#: templates/registration/password_reset_done.html:8 -msgid "Email sent" -msgstr "" - -#: templates/registration/password_reset_done.html:14 -msgid "Back To Login" -msgstr "" - -#: templates/registration/register.html:3 -msgid "Register | Learning management system" -msgstr "" - -#: templates/registration/register.html:12 -msgid "Create Your Account" -msgstr "" - -#: templates/registration/register.html:20 -msgid "Login Form" -msgstr "" - -#: templates/registration/register.html:76 -msgid "SIGN UP" -msgstr "" - -#: templates/registration/register.html:79 -msgid "Already Registered ?" -msgstr "" - -#: templates/registration/register.html:79 -msgid "Login" -msgstr "" - -#: templates/result.html:8 -msgid "Quiz Results for" -msgstr "" - -#: templates/result.html:20 templates/result/assessment_results.html:29 -#: templates/result/grade_results.html:29 -msgid "Result" -msgstr "" - -#: templates/result.html:26 -msgid "Calculating your result..." -msgstr "" - -#: templates/result.html:96 -msgid "Quiz result" -msgstr "" - -#: templates/result.html:103 -msgid "You answered" -msgstr "" - -#: templates/result.html:103 -msgid "questions correctly out of" -msgstr "" - -#: templates/result.html:103 -msgid "giving you" -msgstr "" - -#: templates/result.html:103 -#, python-format -msgid "%% correct" -msgstr "" - -#: templates/result.html:117 -msgid "Review the questions below and try the quiz again in the future" -msgstr "" - -#: templates/result.html:119 -msgid "The result of this quiz will be stored in your progress section" -msgstr "" - -#: templates/result.html:121 -msgid "so you can review and monitor your progression" -msgstr "" - -#: templates/result.html:134 -msgid "Your session score is" -msgstr "" - -#: templates/result.html:134 -msgid "out of a possible" -msgstr "" - -#: templates/result.html:157 -msgid "No explanation set for this question." -msgstr "" - -#: templates/result.html:164 -msgid "Your answer" -msgstr "" - -#: templates/result/add_score.html:29 -msgid "Select Your Course Here" -msgstr "" - -#: templates/result/add_score.html:35 templates/result/add_score_for.html:24 -msgid "No course." -msgstr "" - -#: templates/result/add_score.html:39 -msgid "To manage scores, please select the course using the button above." -msgstr "" - -#: templates/result/add_score_for.html:30 -msgid "Students result form" -msgstr "" - -#: templates/result/add_score_for.html:41 -msgid "Grade report" -msgstr "" - -#: templates/result/add_score_for.html:54 -#: templates/result/assessment_results.html:41 -#: templates/result/assessment_results.html:83 -msgid "Mid exam" -msgstr "" - -#: templates/result/add_score_for.html:56 -#: templates/result/assessment_results.html:43 -#: templates/result/assessment_results.html:85 -msgid "Attendance" -msgstr "" - -#: templates/result/add_score_for.html:57 -#: templates/result/assessment_results.html:44 -#: templates/result/assessment_results.html:86 -msgid "Final exam" -msgstr "" - -#: templates/result/add_score_for.html:58 -#: templates/result/assessment_results.html:45 -#: templates/result/assessment_results.html:87 -msgid "Total" -msgstr "" - -#: templates/result/add_score_for.html:59 -msgid "Point" -msgstr "" - -#: templates/result/add_score_for.html:60 -#: templates/result/grade_results.html:40 -msgid "Grade" -msgstr "" - -#: templates/result/add_score_for.html:61 -#: templates/result/grade_results.html:42 -#: templates/result/grade_results.html:107 -msgid "Comment" -msgstr "" - -#: templates/result/grade_results.html:41 -#: templates/result/grade_results.html:106 -msgid "Points" -msgstr "" - -#: templates/result/grade_results.html:58 -#: templates/result/grade_results.html:123 -msgid "PASS" -msgstr "" - -#: templates/result/grade_results.html:60 -#: templates/result/grade_results.html:125 -msgid "FAIL" -msgstr "" - -#: templates/result/grade_results.html:79 -msgid "Total first semester credit:" -msgstr "" - -#: templates/result/grade_results.html:88 -#: templates/result/grade_results.html:177 -msgid "First Semester GPA:" -msgstr "" - -#: templates/result/grade_results.html:105 -msgid "GRADE" -msgstr "" - -#: templates/result/grade_results.html:139 -msgid "Total second semester credit:" -msgstr "" - -#: templates/result/grade_results.html:144 -msgid "Total Credit:" -msgstr "" - -#: templates/result/grade_results.html:153 -#: templates/result/grade_results.html:184 -msgid "Second Semester GPA:" -msgstr "" - -#: templates/result/grade_results.html:162 -#: templates/result/grade_results.html:192 -msgid "Previous CGPA:" -msgstr "" - -#: templates/search/search_view.html:3 -msgid "Search result for" -msgstr "" - -#: templates/search/search_view.html:12 -msgid "Search" -msgstr "" - -#: templates/search/search_view.html:43 -msgid "result" -msgstr "" - -#: templates/search/search_view.html:62 -msgid "Program of" -msgstr "" - -#: templates/search/search_view.html:69 templates/search/search_view.html:126 -msgid "News And Events" -msgstr "" - -#: templates/search/search_view.html:72 -msgid "Date:" -msgstr "" - -#: templates/search/search_view.html:82 -msgid "quiz" -msgstr "" - -#: templates/search/search_view.html:82 -msgid "Course:" -msgstr "" - -#: templates/search/search_view.html:122 -msgid "Search by:" -msgstr "" - -#: templates/search/search_view.html:124 -msgid "Title or Description" -msgstr "" - -#: templates/search/search_view.html:125 -msgid "Title, Code or Description" -msgstr "" - -#: templates/search/search_view.html:127 -msgid "Title, Description or Category(practice, assignment and exam)" -msgstr "" - -#: templates/setting/admin_panel.html:37 templates/setting/admin_panel.html:42 -#: templates/setting/admin_panel.html:47 templates/setting/admin_panel.html:52 -#: templates/setting/admin_panel.html:70 templates/setting/admin_panel.html:75 -#: templates/setting/admin_panel.html:80 -msgid "Manage" -msgstr "" - -#: templates/setting/admin_panel.html:43 -msgid "students" -msgstr "" - -#: templates/setting/admin_panel.html:48 -msgid "sessions" -msgstr "" - -#: templates/setting/admin_panel.html:53 -msgid "semesters" -msgstr "" - -#: templates/setting/admin_panel.html:64 -msgid "Switch" -msgstr "" - -#: templates/setting/admin_panel.html:71 -msgid "programs" -msgstr "" - -#: templates/setting/admin_panel.html:76 -msgid "course allocations" -msgstr "" - -#: templates/setting/password_change.html:12 -msgid "Password Change" -msgstr "" - -#: templates/setting/profile_info_change.html:12 -msgid "Account setting" -msgstr "" - -#: templates/setting/profile_info_change.html:16 -msgid "Account Settings" -msgstr "" - -#: templates/setting/profile_info_change.html:44 -msgid "Update Profile" -msgstr "" - -#: templates/upload/upload_file_form.html:14 -msgid "File upload" -msgstr "" - -#: templates/upload/upload_file_form.html:18 -msgid "File upload for" -msgstr "" - -#: templates/upload/upload_file_form.html:26 -msgid "File Upload Form" -msgstr "" - -#: templates/upload/upload_file_form.html:33 -#: templates/upload/upload_video_form.html:32 -msgid "Upload" -msgstr "" - -#: templates/upload/upload_video_form.html:14 -msgid "Video upload" -msgstr "" - -#: templates/upload/upload_video_form.html:18 -msgid "Video upload for" -msgstr "" - -#: templates/upload/upload_video_form.html:26 -msgid "Video Upload Form" -msgstr "" - -#: templates/upload/video_single.html:35 -msgid "No video description set." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/_termui_impl.py:518 -#, python-brace-format -msgid "{editor}: Editing failed" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/_termui_impl.py:522 -#, python-brace-format -msgid "{editor}: Editing failed: {e}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1120 -msgid "Aborted!" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1309 -#: venv/lib/python3.9/site-packages/click/decorators.py:559 -msgid "Show this message and exit." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1340 -#: venv/lib/python3.9/site-packages/click/core.py:1370 -#, python-brace-format -msgid "(Deprecated) {text}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1387 -msgid "Options" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1413 -#, python-brace-format -msgid "Got unexpected extra argument ({args})" -msgid_plural "Got unexpected extra arguments ({args})" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/core.py:1429 -msgid "DeprecationWarning: The command {name!r} is deprecated." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1636 -msgid "Commands" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1668 -msgid "Missing command." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1746 -msgid "No such command {name!r}." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:2310 -msgid "Value must be an iterable." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:2331 -#, python-brace-format -msgid "Takes {nargs} values but 1 was given." -msgid_plural "Takes {nargs} values but {len} were given." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/core.py:2778 -#, python-brace-format -msgid "env var: {var}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:2808 -msgid "(dynamic)" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:2821 -#, python-brace-format -msgid "default: {default}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:2834 -msgid "required" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/decorators.py:465 -#, python-format -msgid "%(prog)s, version %(version)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/decorators.py:528 -msgid "Show the version and exit." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:44 -#: venv/lib/python3.9/site-packages/click/exceptions.py:80 -#, python-brace-format -msgid "Error: {message}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:72 -#, python-brace-format -msgid "Try '{command} {option}' for help." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:121 -#, python-brace-format -msgid "Invalid value: {message}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:123 -#, python-brace-format -msgid "Invalid value for {param_hint}: {message}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:179 -msgid "Missing argument" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:181 -msgid "Missing option" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:183 -msgid "Missing parameter" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:185 -#, python-brace-format -msgid "Missing {param_type}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:192 -#, python-brace-format -msgid "Missing parameter: {param_name}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:212 -#, python-brace-format -msgid "No such option: {name}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:224 -#, python-brace-format -msgid "Did you mean {possibility}?" -msgid_plural "(Possible options: {possibilities})" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:262 -msgid "unknown error" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:269 -msgid "Could not open file {filename!r}: {message}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/parser.py:231 -msgid "Argument {name!r} takes {nargs} values." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/parser.py:413 -msgid "Option {name!r} does not take a value." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/parser.py:474 -msgid "Option {name!r} requires an argument." -msgid_plural "Option {name!r} requires {nargs} arguments." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/shell_completion.py:319 -msgid "Shell completion is not supported for Bash versions older than 4.4." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/shell_completion.py:326 -msgid "Couldn't detect Bash version, shell completion is not supported." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:158 -msgid "Repeat for confirmation" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:174 -msgid "Error: The value you entered was invalid." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:176 -#, python-brace-format -msgid "Error: {e.message}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:187 -msgid "Error: The two entered values do not match." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:243 -msgid "Error: invalid input" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:773 -msgid "Press any key to continue..." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:266 -#, python-brace-format -msgid "" -"Choose from:\n" -"\t{choices}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:298 -msgid "{value!r} is not {choice}." -msgid_plural "{value!r} is not one of {choices}." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/types.py:392 -msgid "{value!r} does not match the format {format}." -msgid_plural "{value!r} does not match the formats {formats}." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/types.py:414 -msgid "{value!r} is not a valid {number_type}." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:470 -#, python-brace-format -msgid "{value} is not in the range {range}." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:611 -msgid "{value!r} is not a valid boolean." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:635 -msgid "{value!r} is not a valid UUID." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:822 -msgid "file" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:824 -msgid "directory" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:826 -msgid "path" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:877 -msgid "{name} {filename!r} does not exist." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:886 -msgid "{name} {filename!r} is a file." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:894 -#, python-brace-format -msgid "{name} '{filename}' is a directory." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:903 -msgid "{name} {filename!r} is not readable." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:912 -msgid "{name} {filename!r} is not writable." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:921 -msgid "{name} {filename!r} is not executable." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:988 -#, python-brace-format -msgid "{len_type} values are required, but {len_value} was given." -msgid_plural "{len_type} values are required, but {len_value} were given." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/crispy_forms/tests/test_form_helper.py:130 -#: venv/lib/python3.9/site-packages/crispy_forms/tests/test_form_helper.py:140 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:91 -msgid "This field is required." -msgstr "" - -#: venv/lib/python3.9/site-packages/crispy_forms/tests/test_layout.py:392 -msgid "i18n text" -msgstr "" - -#: venv/lib/python3.9/site-packages/crispy_forms/tests/test_layout.py:394 -msgid "i18n legend" -msgstr "" - -#: venv/lib/python3.9/site-packages/crispy_forms/tests/test_layout_objects.py:143 -#: venv/lib/python3.9/site-packages/django/core/validators.py:22 -msgid "Enter a valid value." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/contrib/messages/apps.py:15 -msgid "Messages" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/contrib/sitemaps/apps.py:8 -msgid "Site Maps" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/contrib/staticfiles/apps.py:9 -msgid "Static Files" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/contrib/syndication/apps.py:7 -msgid "Syndication" -msgstr "" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -#: venv/lib/python3.9/site-packages/django/core/paginator.py:30 -msgid "…" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/paginator.py:50 -msgid "That page number is not an integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/paginator.py:52 -msgid "That page number is less than 1" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/paginator.py:54 -msgid "That page contains no results" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:104 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:752 -msgid "Enter a valid URL." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:165 -msgid "Enter a valid integer." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:176 -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -#: venv/lib/python3.9/site-packages/django/core/validators.py:259 -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:267 -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:279 -#: venv/lib/python3.9/site-packages/django/core/validators.py:287 -#: venv/lib/python3.9/site-packages/django/core/validators.py:316 -msgid "Enter a valid IPv4 address." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:296 -#: venv/lib/python3.9/site-packages/django/core/validators.py:317 -msgid "Enter a valid IPv6 address." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:308 -#: venv/lib/python3.9/site-packages/django/core/validators.py:315 -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:351 -msgid "Enter only digits separated by commas." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:357 -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:392 -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:401 -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:410 -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:420 -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:438 -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:461 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:347 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:386 -msgid "Enter a number." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:463 -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:468 -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:473 -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:544 -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:605 -msgid "Null characters are not allowed." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/base.py:1425 -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/constraints.py:17 -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:128 -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:129 -msgid "This field cannot be null." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:130 -msgid "This field cannot be blank." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:131 -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:135 -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:173 -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1094 -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1095 -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1097 -msgid "Boolean (Either True or False)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1147 -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1149 -msgid "String (unlimited)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1253 -msgid "Comma-separated integers" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1354 -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1358 -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1493 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1362 -msgid "Date (without time)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1489 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1497 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1502 -msgid "Date (with time)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1626 -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1628 -msgid "Decimal number" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1789 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1793 -msgid "Duration" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1845 -msgid "Email address" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1870 -msgid "File path" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1948 -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1950 -msgid "Floating point number" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1990 -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1992 -msgid "Integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2088 -msgid "Big (8 byte) integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2105 -msgid "Small integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2113 -msgid "IPv4 address" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2144 -msgid "IP address" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2237 -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2238 -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2240 -msgid "Boolean (Either True, False or None)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2291 -msgid "Positive big integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2306 -msgid "Positive integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2321 -msgid "Positive small integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2337 -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2373 -msgid "Text" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2448 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2452 -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2456 -msgid "Time" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2564 -msgid "URL" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2588 -msgid "Raw binary data" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2653 -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2655 -msgid "Universally unique identifier" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/files.py:232 -msgid "File" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/files.py:393 -msgid "Image" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/json.py:26 -msgid "A JSON object" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/json.py:28 -msgid "Value must be valid JSON." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:919 -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:921 -msgid "Foreign Key (type determined by related field)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:1212 -msgid "One-to-one relationship" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:1269 -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:1271 -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:1319 -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the label -#: venv/lib/python3.9/site-packages/django/forms/boundfield.py:184 -msgid ":?.!" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:298 -msgid "Enter a whole number." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:467 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1241 -msgid "Enter a valid date." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:490 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1242 -msgid "Enter a valid time." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:517 -msgid "Enter a valid date/time." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:551 -msgid "Enter a valid duration." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:552 -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:621 -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:622 -msgid "No file was submitted." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:623 -msgid "The submitted file is empty." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:625 -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:630 -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:694 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:857 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:949 -#: venv/lib/python3.9/site-packages/django/forms/models.py:1566 -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:951 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1070 -#: venv/lib/python3.9/site-packages/django/forms/models.py:1564 -msgid "Enter a list of values." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1071 -msgid "Enter a complete value." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1310 -msgid "Enter a valid UUID." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1340 -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -#: venv/lib/python3.9/site-packages/django/forms/forms.py:98 -msgid ":" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/forms.py:244 -#: venv/lib/python3.9/site-packages/django/forms/forms.py:328 -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:63 -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:67 -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:72 -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:484 -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:491 -msgid "Order" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:886 -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:891 -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:898 -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:907 -msgid "Please correct the duplicate values below." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:1338 -msgid "The inline value did not match the parent instance." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:1429 -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:1568 -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/utils.py:226 -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:463 -msgid "Clear" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:464 -msgid "Currently" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:465 -msgid "Change" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:794 -msgid "Unknown" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:795 -msgid "Yes" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:796 -msgid "No" -msgstr "" - -#. Translators: Please do not add spaces around commas. -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:874 -msgid "yes,no,maybe" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:904 -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:921 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:923 -#, python-format -msgid "%s KB" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:925 -#, python-format -msgid "%s MB" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:927 -#, python-format -msgid "%s GB" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:929 -#, python-format -msgid "%s TB" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:931 -#, python-format -msgid "%s PB" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:73 -msgid "p.m." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:74 -msgid "a.m." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:79 -msgid "PM" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:80 -msgid "AM" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:152 -msgid "midnight" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:154 -msgid "noon" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:7 -msgid "Monday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:8 -msgid "Tuesday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:9 -msgid "Wednesday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:10 -msgid "Thursday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:11 -msgid "Friday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:12 -msgid "Saturday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:13 -msgid "Sunday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:16 -msgid "Mon" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:17 -msgid "Tue" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:18 -msgid "Wed" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:19 -msgid "Thu" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:20 -msgid "Fri" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:21 -msgid "Sat" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:22 -msgid "Sun" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:25 -msgid "January" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:26 -msgid "February" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:27 -msgid "March" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:28 -msgid "April" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:29 -msgid "May" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:30 -msgid "June" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:31 -msgid "July" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:32 -msgid "August" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:33 -msgid "September" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:34 -msgid "October" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:35 -msgid "November" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:36 -msgid "December" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:39 -msgid "jan" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:40 -msgid "feb" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:41 -msgid "mar" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:42 -msgid "apr" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:43 -msgid "may" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:44 -msgid "jun" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:45 -msgid "jul" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:46 -msgid "aug" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:47 -msgid "sep" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:48 -msgid "oct" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:49 -msgid "nov" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:50 -msgid "dec" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:53 -msgctxt "abbrev. month" -msgid "Jan." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:54 -msgctxt "abbrev. month" -msgid "Feb." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:55 -msgctxt "abbrev. month" -msgid "March" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:56 -msgctxt "abbrev. month" -msgid "April" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:57 -msgctxt "abbrev. month" -msgid "May" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:58 -msgctxt "abbrev. month" -msgid "June" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:59 -msgctxt "abbrev. month" -msgid "July" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:60 -msgctxt "abbrev. month" -msgid "Aug." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:61 -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:62 -msgctxt "abbrev. month" -msgid "Oct." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:63 -msgctxt "abbrev. month" -msgid "Nov." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:64 -msgctxt "abbrev. month" -msgid "Dec." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:67 -msgctxt "alt. month" -msgid "January" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:68 -msgctxt "alt. month" -msgid "February" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:69 -msgctxt "alt. month" -msgid "March" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:70 -msgctxt "alt. month" -msgid "April" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:71 -msgctxt "alt. month" -msgid "May" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:72 -msgctxt "alt. month" -msgid "June" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:73 -msgctxt "alt. month" -msgid "July" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:74 -msgctxt "alt. month" -msgid "August" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:75 -msgctxt "alt. month" -msgid "September" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:76 -msgctxt "alt. month" -msgid "October" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:77 -msgctxt "alt. month" -msgid "November" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:78 -msgctxt "alt. month" -msgid "December" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/ipv6.py:8 -msgid "This is not a valid IPv6 address." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/text.py:137 -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -#. Translators: This string is used as a separator between list elements -#: venv/lib/python3.9/site-packages/django/utils/text.py:341 -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:135 -msgid ", " -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:8 -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:9 -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:10 -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:11 -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:12 -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:13 -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:111 -msgid "Forbidden" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:112 -msgid "CSRF verification failed. Request aborted." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:116 -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:122 -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:127 -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:136 -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:142 -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:148 -msgid "More information is available with DEBUG=True." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:44 -msgid "No year specified" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:64 -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:115 -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:214 -msgid "Date out of range" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:94 -msgid "No month specified" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:147 -msgid "No day specified" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:194 -msgid "No week specified" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:349 -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:380 -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:652 -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:692 -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/detail.py:56 -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/list.py:70 -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/list.py:77 -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/list.py:169 -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/static.py:38 -msgid "Directory indexes are not allowed here." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/static.py:40 -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/static.py:79 -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:7 -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:220 -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:206 -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:221 -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:229 -msgid "Django Documentation" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:230 -msgid "Topics, references, & how-to’s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:238 -msgid "Tutorial: A Polling App" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:239 -msgid "Get started with Django" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:247 -msgid "Django Community" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:248 -msgid "Connect, get help, or contribute" -msgstr "" - -#: venv/lib/python3.9/site-packages/kombu/transport/qpid.py:1311 -#, python-format -msgid "Attempting to connect to qpid with SASL mechanism %s" -msgstr "" - -#: venv/lib/python3.9/site-packages/kombu/transport/qpid.py:1316 -#, python-format -msgid "Connected to qpid with SASL mechanism %s" -msgstr "" - -#: venv/lib/python3.9/site-packages/kombu/transport/qpid.py:1334 -#, python-format -msgid "Unable to connect to qpid with SASL mechanism %s" -msgstr "" diff --git a/locale/ru/LC_MESSAGES/django.po b/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index 0e7e1d80..00000000 --- a/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,3659 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-29 13:25+0300\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " -"(n%100>=11 && n%100<=14)? 2 : 3);\n" - -#: accounts/models.py:14 course/models.py:24 -msgid "Bachelor" -msgstr "" - -#: accounts/models.py:15 course/models.py:25 -msgid "Master" -msgstr "" - -#: accounts/models.py:19 course/models.py:29 -msgid "Bachelor Degree" -msgstr "" - -#: accounts/models.py:20 course/models.py:30 -msgid "Master Degree" -msgstr "" - -#: accounts/models.py:23 accounts/models.py:32 -msgid "Father" -msgstr "" - -#: accounts/models.py:24 accounts/models.py:33 -msgid "Mother" -msgstr "" - -#: accounts/models.py:25 accounts/models.py:34 -msgid "Brother" -msgstr "" - -#: accounts/models.py:26 accounts/models.py:35 -msgid "Sister" -msgstr "" - -#: accounts/models.py:27 accounts/models.py:36 -msgid "Grand mother" -msgstr "" - -#: accounts/models.py:28 accounts/models.py:37 -msgid "Grand father" -msgstr "" - -#: accounts/models.py:29 accounts/models.py:38 -msgid "Other" -msgstr "" - -#: accounts/models.py:67 -msgid "M" -msgstr "" - -#: accounts/models.py:67 -msgid "Male" -msgstr "" - -#: accounts/models.py:67 -msgid "F" -msgstr "" - -#: accounts/models.py:67 -msgid "Female" -msgstr "" - -#: accounts/models.py:103 -msgid "Admin" -msgstr "" - -#: accounts/models.py:105 templates/result/add_score_for.html:52 -msgid "Student" -msgstr "" - -#: accounts/models.py:107 templates/course/course_allocation_view.html:32 -msgid "Lecturer" -msgstr "" - -#: accounts/models.py:109 -msgid "Parent" -msgstr "" - -#: accounts/validators.py:12 -msgid "" -"Enter a valid username. This value may contain only English letters, " -"numbers, and @/./+/-/_ characters." -msgstr "" - -#: config/settings.py:147 -msgid "English" -msgstr "" - -#: config/settings.py:148 -msgid "Russia" -msgstr "" - -#: core/models.py:9 core/models.py:13 templates/core/index.html:47 -#: templates/core/index.html:52 templates/setting/admin_panel.html:80 -#: templates/setting/admin_panel.html:81 -msgid "News" -msgstr "" - -#: core/models.py:10 core/models.py:14 -msgid "Event" -msgstr "" - -#: core/models.py:17 core/models.py:22 course/models.py:33 course/models.py:38 -msgid "First" -msgstr "" - -#: core/models.py:18 core/models.py:23 course/models.py:34 course/models.py:39 -msgid "Second" -msgstr "" - -#: core/models.py:19 core/models.py:24 course/models.py:35 course/models.py:40 -msgid "Third" -msgstr "" - -#: course/models.py:71 -#, python-brace-format -msgid "The program '{instance}' has been {verb}." -msgstr "" - -#: course/models.py:76 -#, python-brace-format -msgid "The program '{instance}' has been deleted." -msgstr "" - -#: course/models.py:138 -#, python-brace-format -msgid "The course '{instance}' has been {verb}." -msgstr "" - -#: course/models.py:143 -#, python-brace-format -msgid "The course '{instance}' has been deleted." -msgstr "" - -#: course/models.py:150 -msgid "allocated_lecturer" -msgstr "" - -#: course/models.py:152 -msgid "allocated_course" -msgstr "" - -#: course/models.py:218 -#, python-brace-format -msgid "" -"The file '{instance.title}' has been uploaded to the course '{instance." -"course}'." -msgstr "" - -#: course/models.py:224 -#, python-brace-format -msgid "" -"The file '{instance.title}' of the course '{instance.course}' has been " -"updated." -msgstr "" - -#: course/models.py:233 -#, python-brace-format -msgid "" -"The file '{instance.title}' of the course '{instance.course}' has been " -"deleted." -msgstr "" - -#: course/models.py:244 -msgid "Valid video formats: mp4, mkv, wmv, 3gp, f4v, avi, mp3" -msgstr "" - -#: course/models.py:278 -#, python-brace-format -msgid "" -"The video '{instance.title}' has been uploaded to the course {instance." -"course}." -msgstr "" - -#: course/models.py:284 -#, python-brace-format -msgid "" -"The video '{instance.title}' of the course '{instance.course}' has been " -"updated." -msgstr "" - -#: course/models.py:293 -#, python-brace-format -msgid "" -"The video '{instance.title}' of the course '{instance.course}' has been " -"deleted." -msgstr "" - -#: course/models.py:299 -msgid "NOTE: Only department head can offer semester courses" -msgstr "" - -#: quiz/admin.py:31 quiz/admin.py:32 quiz/forms.py:38 quiz/forms.py:39 -#: quiz/models.py:468 templates/quiz/quiz_list.html:41 -msgid "Questions" -msgstr "" - -#: quiz/models.py:23 quiz/models.py:529 -msgid "Content" -msgstr "" - -#: quiz/models.py:24 -msgid "Random" -msgstr "" - -#: quiz/models.py:25 -#: venv/lib/python3.9/site-packages/modeltranslation/widgets.py:32 -msgid "None" -msgstr "" - -#: quiz/models.py:29 templates/result/add_score_for.html:53 -#: templates/result/assessment_results.html:40 -#: templates/result/assessment_results.html:82 -msgid "Assignment" -msgstr "" - -#: quiz/models.py:30 -msgid "Exam" -msgstr "" - -#: quiz/models.py:31 -msgid "Practice Quiz" -msgstr "" - -#: quiz/models.py:53 -msgid "Title" -msgstr "" - -#: quiz/models.py:56 -msgid "Description" -msgstr "" - -#: quiz/models.py:58 -msgid "A detailed description of the quiz" -msgstr "" - -#: quiz/models.py:64 -msgid "Random Order" -msgstr "" - -#: quiz/models.py:65 -msgid "Display the questions in a random order or as they are set?" -msgstr "" - -#: quiz/models.py:74 -msgid "Answers at end" -msgstr "" - -#: quiz/models.py:76 -msgid "" -"Correct answer is NOT shown after question. Answers displayed at the end." -msgstr "" - -#: quiz/models.py:83 -msgid "Exam Paper" -msgstr "" - -#: quiz/models.py:85 -msgid "" -"If yes, the result of each attempt by a user will be stored. Necessary for " -"marking." -msgstr "" - -#: quiz/models.py:92 -msgid "Single Attempt" -msgstr "" - -#: quiz/models.py:93 -msgid "If yes, only one attempt by a user will be permitted." -msgstr "" - -#: quiz/models.py:99 -msgid "Pass Mark" -msgstr "" - -#: quiz/models.py:101 -msgid "Percentage required to pass exam." -msgstr "" - -#: quiz/models.py:107 -msgid "Draft" -msgstr "" - -#: quiz/models.py:109 -msgid "" -"If yes, the quiz is not displayed in the quiz list and can only be taken by " -"users who can edit quizzes." -msgstr "" - -#: quiz/models.py:129 quiz/models.py:290 quiz/models.py:443 -#: templates/quiz/quiz_list.html:39 templates/quiz/sitting_list.html:37 -#: templates/result/add_score_for.html:55 -#: templates/result/assessment_results.html:42 -#: templates/result/assessment_results.html:84 -#: templates/search/search_view.html:79 templates/search/search_view.html:127 -msgid "Quiz" -msgstr "" - -#: quiz/models.py:130 templates/question.html:16 -#: templates/quiz/mcquestion_form.html:13 templates/quiz/quiz_form.html:13 -#: templates/quiz/quiz_list.html:16 templates/quiz/quiz_list.html:26 -#: templates/result.html:18 -msgid "Quizzes" -msgstr "" - -#: quiz/models.py:164 quiz/models.py:288 templates/quiz/sitting_detail.html:24 -#: templates/quiz/sitting_list.html:35 -msgid "User" -msgstr "" - -#: quiz/models.py:168 templates/progress.html:68 -#: templates/quiz/sitting_detail.html:26 templates/quiz/sitting_list.html:39 -msgid "Score" -msgstr "" - -#: quiz/models.py:175 -msgid "User Progress" -msgstr "" - -#: quiz/models.py:176 -msgid "User progress records" -msgstr "" - -#: quiz/models.py:203 -msgid "error" -msgstr "" - -#: quiz/models.py:203 -msgid "category does not exist or invalid score" -msgstr "" - -#: quiz/models.py:248 -msgid "Question set of the quiz is empty. Please configure questions properly" -msgstr "" - -#: quiz/models.py:292 templates/quiz/sitting_list.html:36 -#: templates/search/search_view.html:59 templates/search/search_view.html:125 -msgid "Course" -msgstr "" - -#: quiz/models.py:297 -msgid "Question Order" -msgstr "" - -#: quiz/models.py:303 -msgid "Question List" -msgstr "" - -#: quiz/models.py:310 -msgid "Incorrect questions" -msgstr "" - -#: quiz/models.py:314 -msgid "Current Score" -msgstr "" - -#: quiz/models.py:316 -msgid "Complete" -msgstr "" - -#: quiz/models.py:319 -msgid "User Answers" -msgstr "" - -#: quiz/models.py:321 templates/quiz/sitting_detail.html:27 -msgid "Start" -msgstr "" - -#: quiz/models.py:322 templates/quiz/sitting_detail.html:28 -msgid "End" -msgstr "" - -#: quiz/models.py:327 -msgid "Can see completed exams." -msgstr "" - -#: quiz/models.py:404 -msgid "You have passed this quiz, congratulation" -msgstr "" - -#: quiz/models.py:406 -msgid "You failed this quiz, give it one chance again." -msgstr "" - -#: quiz/models.py:448 -msgid "Figure" -msgstr "" - -#: quiz/models.py:449 -msgid "Add an image for the question if it's necessary." -msgstr "" - -#: quiz/models.py:454 -msgid "Enter the question text that you want displayed" -msgstr "" - -#: quiz/models.py:455 quiz/models.py:467 quiz/models.py:522 -#: templates/question.html:125 templates/quiz/sitting_detail.html:34 -msgid "Question" -msgstr "" - -#: quiz/models.py:460 -msgid "Explanation to be shown after the question has been answered." -msgstr "" - -#: quiz/models.py:461 templates/question.html:80 templates/question.html:89 -#: templates/result.html:80 templates/result.html:150 -msgid "Explanation" -msgstr "" - -#: quiz/models.py:481 -msgid "The order in which multichoice choice options are displayed to the user" -msgstr "" - -#: quiz/models.py:483 -msgid "Choice Order" -msgstr "" - -#: quiz/models.py:516 -msgid "Multiple Choice Question" -msgstr "" - -#: quiz/models.py:517 -msgid "Multiple Choice Questions" -msgstr "" - -#: quiz/models.py:528 -msgid "Enter the choice text that you want displayed" -msgstr "" - -#: quiz/models.py:535 -msgid "Is this a correct answer?" -msgstr "" - -#: quiz/models.py:536 templates/quiz/mcquestion_form.html:53 -#: templates/quiz/sitting_detail.html:56 -msgid "Correct" -msgstr "" - -#: quiz/models.py:543 -msgid "Choice" -msgstr "" - -#: quiz/models.py:544 templates/quiz/mcquestion_form.html:47 -msgid "Choices" -msgstr "" - -#: quiz/models.py:564 -msgid "Essay style question" -msgstr "" - -#: quiz/models.py:565 -msgid "Essay style questions" -msgstr "" - -#: templates/400.html:5 -msgid "Bad request" -msgstr "" - -#: templates/400.html:6 -msgid "Please make sure the form is correctly filled." -msgstr "" - -#: templates/400.html:7 templates/403.html:7 templates/404.html:7 -#: templates/500.html:7 -msgid "Return to the app" -msgstr "" - -#: templates/403.html:5 -msgid "forbidden" -msgstr "" - -#: templates/403.html:6 -msgid "You need the proper permission to make that request." -msgstr "" - -#: templates/404.html:6 -msgid "Looks like the page you" -msgstr "" - -#: templates/500.html:5 -msgid "Server error" -msgstr "" - -#: templates/500.html:6 -msgid "Please try again later." -msgstr "" - -#: templates/accounts/add_staff.html:3 templates/accounts/add_student.html:3 -#: templates/accounts/edit_lecturer.html:3 -#: templates/accounts/edit_student.html:3 -#: templates/accounts/lecturer_list.html:3 -#: templates/accounts/parent_form.html:3 templates/accounts/profile.html:3 -#: templates/accounts/profile_single.html:3 -#: templates/accounts/student_list.html:3 templates/core/dashboard.html:3 -#: templates/core/index.html:3 templates/core/post_add.html:3 -#: templates/core/semester_list.html:3 templates/core/semester_update.html:3 -#: templates/core/session_list.html:3 templates/core/session_update.html:3 -#: templates/course/course_add.html:3 -#: templates/course/course_allocation_form.html:3 -#: templates/course/course_allocation_view.html:3 -#: templates/course/course_registration.html:3 -#: templates/course/course_single.html:3 templates/course/program_add.html:3 -#: templates/course/program_list.html:3 templates/course/program_single.html:3 -#: templates/course/user_course_list.html:3 templates/progress.html:4 -#: templates/question.html:5 templates/quiz/sitting_detail.html:4 -#: templates/quiz/sitting_list.html:3 templates/result.html:7 -#: templates/result/add_score.html:3 templates/result/add_score_for.html:3 -#: templates/result/assessment_results.html:3 -#: templates/result/grade_results.html:3 templates/search/search_view.html:3 -#: templates/setting/admin_panel.html:3 -#: templates/setting/password_change.html:3 -#: templates/setting/profile_info_change.html:3 -#: templates/upload/upload_file_form.html:3 -#: templates/upload/upload_video_form.html:3 -#: templates/upload/video_single.html:3 -msgid "Learning management system" -msgstr "" - -#: templates/accounts/add_staff.html:11 templates/accounts/add_student.html:12 -#: templates/accounts/edit_lecturer.html:11 -#: templates/accounts/edit_student.html:11 -#: templates/accounts/lecturer_list.html:9 templates/accounts/profile.html:14 -#: templates/accounts/profile_single.html:14 -#: templates/accounts/student_list.html:10 templates/aside.html:47 -#: templates/core/dashboard.html:13 templates/core/index.html:34 -#: templates/core/post_add.html:11 templates/core/semester_list.html:9 -#: templates/core/semester_update.html:11 templates/core/session_list.html:9 -#: templates/core/session_update.html:11 templates/course/course_add.html:11 -#: templates/course/course_allocation_form.html:11 -#: templates/course/course_allocation_view.html:9 -#: templates/course/course_registration.html:12 -#: templates/course/course_single.html:10 templates/course/program_add.html:11 -#: templates/course/program_list.html:9 templates/course/program_single.html:10 -#: templates/course/user_course_list.html:10 templates/progress.html:11 -#: templates/question.html:12 templates/quiz/mcquestion_form.html:9 -#: templates/quiz/quiz_form.html:9 templates/quiz/quiz_list.html:12 -#: templates/quiz/sitting_detail.html:11 templates/quiz/sitting_list.html:9 -#: templates/result.html:14 templates/result/add_score.html:10 -#: templates/result/add_score_for.html:10 -#: templates/result/assessment_results.html:9 -#: templates/result/grade_results.html:9 templates/search/search_view.html:11 -#: templates/setting/admin_panel.html:11 -#: templates/setting/password_change.html:11 -#: templates/setting/profile_info_change.html:11 -#: templates/upload/upload_file_form.html:10 -#: templates/upload/upload_video_form.html:10 -#: templates/upload/video_single.html:10 -msgid "Home" -msgstr "" - -#: templates/accounts/add_staff.html:12 -#: templates/accounts/edit_lecturer.html:12 -#: templates/accounts/lecturer_list.html:10 -#: templates/accounts/lecturer_list.html:21 templates/aside.html:58 -#: templates/core/dashboard.html:63 templates/pdf/lecturer_list.html:35 -#: templates/setting/admin_panel.html:37 -msgid "Lecturers" -msgstr "" - -#: templates/accounts/add_staff.html:13 templates/accounts/add_student.html:14 -#: templates/aside.html:113 -msgid "Add" -msgstr "" - -#: templates/accounts/add_staff.html:17 -msgid "Lecturer Add Form" -msgstr "" - -#: templates/accounts/add_staff.html:26 templates/accounts/add_student.html:27 -#: templates/accounts/edit_lecturer.html:27 -#: templates/accounts/edit_student.html:25 templates/accounts/profile.html:75 -#: templates/accounts/profile_single.html:88 -#: templates/pdf/profile_single.html:65 templates/registration/register.html:40 -#: templates/setting/profile_info_change.html:24 -msgid "Personal Info" -msgstr "" - -#: templates/accounts/add_staff.html:37 templates/accounts/add_student.html:49 -#: templates/accounts/edit_lecturer.html:46 -#: templates/accounts/edit_student.html:46 -#: templates/accounts/parent_form.html:11 templates/core/post_add.html:25 -#: templates/core/semester_update.html:38 templates/core/session_update.html:38 -#: templates/course/course_add.html:49 -#: templates/course/course_allocation_form.html:49 -#: templates/course/program_add.html:26 templates/quiz/mcquestion_form.html:67 -#: templates/quiz/quiz_form.html:66 templates/result/add_score_for.html:38 -msgid "Save" -msgstr "" - -#: templates/accounts/add_student.html:13 -#: templates/accounts/edit_student.html:12 -#: templates/accounts/student_list.html:11 -#: templates/accounts/student_list.html:24 templates/aside.html:61 -#: templates/core/dashboard.html:54 templates/pdf/student_list.html:35 -#: templates/setting/admin_panel.html:42 -msgid "Students" -msgstr "" - -#: templates/accounts/add_student.html:18 -msgid "Student Add Form" -msgstr "" - -#: templates/accounts/add_student.html:40 -#: templates/accounts/edit_lecturer.html:39 -#: templates/accounts/edit_student.html:39 templates/core/dashboard.html:117 -#: templates/setting/profile_info_change.html:37 -msgid "Others" -msgstr "" - -#: templates/accounts/edit_lecturer.html:13 -#: templates/accounts/edit_student.html:13 -#: templates/accounts/lecturer_list.html:59 -#: templates/accounts/student_list.html:61 -#: templates/course/program_list.html:56 -msgid "Update" -msgstr "" - -#: templates/accounts/edit_lecturer.html:17 -msgid "Lecturer Update Form" -msgstr "" - -#: templates/accounts/edit_lecturer.html:27 -#: templates/accounts/edit_student.html:25 -#: templates/accounts/lecturer_list.html:33 -#: templates/accounts/profile_single.html:107 -#: templates/accounts/student_list.html:38 templates/pdf/lecturer_list.html:44 -#: templates/pdf/student_list.html:43 -#: templates/registration/password_reset.html:13 -#: templates/setting/profile_info_change.html:24 -msgid "Email" -msgstr "" - -#: templates/accounts/edit_student.html:17 -msgid "Student Update Form" -msgstr "" - -#: templates/accounts/lecturer_list.html:16 -msgid "Add Lecturer" -msgstr "" - -#: templates/accounts/lecturer_list.html:17 -#: templates/accounts/student_list.html:20 -msgid "Download pdf" -msgstr "" - -#: templates/accounts/lecturer_list.html:31 -#: templates/accounts/profile_single.html:92 -#: templates/accounts/student_list.html:36 templates/pdf/lecturer_list.html:42 -#: templates/pdf/student_list.html:41 -msgid "ID No." -msgstr "" - -#: templates/accounts/lecturer_list.html:32 -#: templates/accounts/student_list.html:37 templates/pdf/lecturer_list.html:43 -#: templates/pdf/student_list.html:42 -msgid "Full Name" -msgstr "" - -#: templates/accounts/lecturer_list.html:34 templates/pdf/lecturer_list.html:45 -#: templates/pdf/student_list.html:44 -msgid "Mob No." -msgstr "" - -#: templates/accounts/lecturer_list.html:35 -#: templates/accounts/profile_single.html:109 -msgid "Address/city" -msgstr "" - -#: templates/accounts/lecturer_list.html:36 -#: templates/accounts/profile_single.html:29 -#: templates/accounts/profile_single.html:115 -msgid "Last login" -msgstr "" - -#: templates/accounts/lecturer_list.html:38 -#: templates/accounts/student_list.html:41 -#: templates/course/course_allocation_view.html:35 -#: templates/course/program_list.html:35 -#: templates/course/program_single.html:47 -msgid "Action" -msgstr "" - -#: templates/accounts/lecturer_list.html:60 -#: templates/accounts/student_list.html:62 -msgid "Download PDF" -msgstr "" - -#: templates/accounts/lecturer_list.html:61 -#: templates/accounts/student_list.html:63 templates/core/index.html:78 -#: templates/core/semester_list.html:71 templates/core/session_list.html:66 -#: templates/course/course_single.html:91 -#: templates/course/course_single.html:168 -#: templates/course/program_list.html:57 -#: templates/course/program_single.html:81 -#: templates/quiz/mcquestion_form.html:57 templates/quiz/quiz_list.html:68 -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:499 -msgid "Delete" -msgstr "" - -#: templates/accounts/lecturer_list.html:71 templates/pdf/lecturer_list.html:63 -#: templates/pdf/student_list.html:61 -msgid "No Lecturer(s)." -msgstr "" - -#: templates/accounts/lecturer_list.html:75 -msgid "Add Lecturer Now." -msgstr "" - -#: templates/accounts/profile.html:29 templates/accounts/profile.html:101 -#: templates/navbar.html:29 templates/pdf/profile_single.html:41 -#: templates/pdf/profile_single.html:92 -msgid "Last login:" -msgstr "" - -#: templates/accounts/profile.html:30 templates/pdf/profile_single.html:42 -msgid "Role:" -msgstr "" - -#: templates/accounts/profile.html:37 templates/accounts/profile_single.html:40 -#: templates/accounts/profile_single.html:48 -msgid "Edit Profile" -msgstr "" - -#: templates/accounts/profile.html:39 -msgid "Change password" -msgstr "" - -#: templates/accounts/profile.html:62 templates/accounts/profile_single.html:75 -#: templates/aside.html:67 templates/course/user_course_list.html:3 -#: templates/course/user_course_list.html:11 -#: templates/course/user_course_list.html:23 templates/navbar.html:34 -#: templates/pdf/profile_single.html:52 -msgid "My Courses" -msgstr "" - -#: templates/accounts/profile.html:70 templates/accounts/profile_single.html:83 -#: templates/pdf/profile_single.html:60 -msgid "No courses assigned!" -msgstr "" - -#: templates/accounts/profile.html:77 templates/pdf/profile_single.html:67 -msgid "First Name:" -msgstr "" - -#: templates/accounts/profile.html:78 templates/pdf/profile_single.html:68 -msgid "Last Name:" -msgstr "" - -#: templates/accounts/profile.html:79 templates/pdf/profile_single.html:69 -msgid "ID No.:" -msgstr "" - -#: templates/accounts/profile.html:83 templates/accounts/profile_single.html:96 -#: templates/pdf/profile_single.html:74 -msgid "Applicant Info" -msgstr "" - -#: templates/accounts/profile.html:85 templates/pdf/profile_single.html:76 -msgid "School:" -msgstr "" - -#: templates/accounts/profile.html:85 templates/pdf/profile_single.html:76 -msgid "Hawas Preparatory School" -msgstr "" - -#: templates/accounts/profile.html:86 templates/pdf/profile_single.html:77 -msgid "Level:" -msgstr "" - -#: templates/accounts/profile.html:91 -#: templates/accounts/profile_single.html:105 -#: templates/pdf/profile_single.html:82 -msgid "Contact Info" -msgstr "" - -#: templates/accounts/profile.html:93 templates/pdf/profile_single.html:84 -msgid "Email:" -msgstr "" - -#: templates/accounts/profile.html:94 templates/pdf/profile_single.html:85 -msgid "Tel No.:" -msgstr "" - -#: templates/accounts/profile.html:95 templates/pdf/profile_single.html:86 -msgid "Address/city:" -msgstr "" - -#: templates/accounts/profile.html:99 -#: templates/accounts/profile_single.html:113 -#: templates/pdf/profile_single.html:90 -msgid "Important Dates" -msgstr "" - -#: templates/accounts/profile.html:103 templates/pdf/profile_single.html:94 -msgid "Academic Year:" -msgstr "" - -#: templates/accounts/profile.html:103 -#: templates/accounts/profile_single.html:117 -#: templates/core/semester_list.html:41 templates/course/program_single.html:44 -#: templates/course/user_course_list.html:52 -#: templates/course/user_course_list.html:96 -#: templates/pdf/profile_single.html:94 templates/result/add_score.html:24 -#: templates/result/add_score_for.html:46 templates/setting/admin_panel.html:52 -msgid "Semester" -msgstr "" - -#: templates/accounts/profile.html:105 templates/pdf/profile_single.html:96 -msgid "Registered Date:" -msgstr "" - -#: templates/accounts/profile_single.html:30 -msgid "Role" -msgstr "" - -#: templates/accounts/profile_single.html:43 -msgid "Change Program" -msgstr "" - -#: templates/accounts/profile_single.html:90 -msgid "First Name" -msgstr "" - -#: templates/accounts/profile_single.html:91 -msgid "Last Name" -msgstr "" - -#: templates/accounts/profile_single.html:98 -msgid "School" -msgstr "" - -#: templates/accounts/profile_single.html:99 -#: templates/course/program_single.html:42 -msgid "Level" -msgstr "" - -#: templates/accounts/profile_single.html:100 -#: templates/accounts/student_list.html:39 templates/pdf/student_list.html:45 -#: templates/search/search_view.html:49 templates/search/search_view.html:89 -#: templates/search/search_view.html:124 -msgid "Program" -msgstr "" - -#: templates/accounts/profile_single.html:108 -msgid "Tel No." -msgstr "" - -#: templates/accounts/profile_single.html:117 -msgid "Academic Year" -msgstr "" - -#: templates/accounts/profile_single.html:119 -msgid "Registered Date" -msgstr "" - -#: templates/accounts/student_list.html:19 -msgid "Add Student" -msgstr "" - -#: templates/accounts/student_list.html:73 -#: templates/result/add_score_for.html:105 -msgid "No Student." -msgstr "" - -#: templates/accounts/student_list.html:77 -msgid "Add Student Now." -msgstr "" - -#: templates/aside.html:43 templates/core/dashboard.html:3 -#: templates/core/dashboard.html:14 templates/core/dashboard.html:33 -msgid "Dashboard" -msgstr "" - -#: templates/aside.html:50 templates/navbar.html:41 -msgid "Profile" -msgstr "" - -#: templates/aside.html:55 templates/navbar.html:38 -#: templates/setting/admin_panel.html:12 templates/setting/admin_panel.html:16 -msgid "Admin Panel" -msgstr "" - -#: templates/aside.html:72 -msgid "Programs & Courses" -msgstr "" - -#: templates/aside.html:77 templates/quiz/sitting_list.html:10 -msgid "Complete Exams" -msgstr "" - -#: templates/aside.html:83 templates/aside.html:104 -msgid "Quiz Progress Rec" -msgstr "" - -#: templates/aside.html:86 -msgid "Course Allocation" -msgstr "" - -#: templates/aside.html:89 -msgid "Manage Session" -msgstr "" - -#: templates/aside.html:92 -msgid "Manage Semester" -msgstr "" - -#: templates/aside.html:98 templates/result/add_score.html:11 -#: templates/result/add_score.html:17 templates/result/add_score_for.html:12 -msgid "Manage Score" -msgstr "" - -#: templates/aside.html:107 templates/result/grade_results.html:10 -#: templates/result/grade_results.html:28 -msgid "Grade Results" -msgstr "" - -#: templates/aside.html:110 templates/result/assessment_results.html:10 -#: templates/result/assessment_results.html:28 -msgid "Assesment Results" -msgstr "" - -#: templates/aside.html:113 -msgid "Drop Course" -msgstr "" - -#: templates/aside.html:119 -msgid "Account Setting" -msgstr "" - -#: templates/aside.html:122 templates/setting/password_change.html:21 -#: templates/setting/password_change.html:25 -msgid "Change Password" -msgstr "" - -#: templates/aside.html:130 -msgid "Read our" -msgstr "" - -#: templates/aside.html:130 -msgid "Privacy" -msgstr "" - -#: templates/aside.html:130 -#: venv/lib/python3.9/site-packages/django/db/models/base.py:1423 -#: venv/lib/python3.9/site-packages/django/forms/models.py:893 -msgid "and" -msgstr "" - -#: templates/aside.html:130 -msgid "Terms of use." -msgstr "" - -#: templates/aside.html:135 -msgid "⭐️ Star This Project" -msgstr "" - -#: templates/core/dashboard.html:40 -msgid "Dashboard settings" -msgstr "" - -#: templates/core/dashboard.html:41 -msgid "Display grid" -msgstr "" - -#: templates/core/dashboard.html:42 -msgid "Display table" -msgstr "" - -#: templates/core/dashboard.html:44 -msgid "Manage dashboard" -msgstr "" - -#: templates/core/dashboard.html:72 -msgid "Administrators" -msgstr "" - -#: templates/core/dashboard.html:81 -msgid "Lab Assistance" -msgstr "" - -#: templates/core/dashboard.html:90 -msgid "Librarians" -msgstr "" - -#: templates/core/dashboard.html:99 -msgid "Supervisors" -msgstr "" - -#: templates/core/dashboard.html:108 -msgid "Office Assistance" -msgstr "" - -#: templates/core/dashboard.html:145 -msgid "Latest activities" -msgstr "" - -#: templates/core/dashboard.html:150 -msgid "No recent activity" -msgstr "" - -#: templates/core/dashboard.html:158 -msgid "School Demographics" -msgstr "" - -#: templates/core/index.html:40 -msgid "Add New Post" -msgstr "" - -#: templates/core/index.html:47 templates/core/index.html:55 -#: templates/setting/admin_panel.html:80 templates/setting/admin_panel.html:81 -msgid "Events" -msgstr "" - -#: templates/core/index.html:65 -msgid "news" -msgstr "" - -#: templates/core/index.html:65 -msgid "events" -msgstr "" - -#: templates/core/index.html:76 templates/core/semester_list.html:69 -#: templates/core/session_list.html:65 templates/course/course_single.html:87 -#: templates/course/course_single.html:164 -#: templates/course/program_single.html:78 templates/quiz/quiz_list.html:65 -msgid "Edit" -msgstr "" - -#: templates/core/index.html:88 templates/upload/video_single.html:31 -msgid "ago" -msgstr "" - -#: templates/core/index.html:98 -msgid "School news and events will appear here." -msgstr "" - -#: templates/core/post_add.html:12 -msgid "Post form" -msgstr "" - -#: templates/core/post_add.html:21 -msgid "Post Form" -msgstr "" - -#: templates/core/post_add.html:26 templates/upload/upload_file_form.html:34 -#: templates/upload/upload_video_form.html:33 -msgid "Cancel" -msgstr "" - -#: templates/core/semester_list.html:10 -msgid "Semester list" -msgstr "" - -#: templates/core/semester_list.html:16 -msgid "Add New Semester" -msgstr "" - -#: templates/core/semester_list.html:20 templates/core/semester_update.html:12 -msgid "Semester List" -msgstr "" - -#: templates/core/semester_list.html:42 -msgid "Is Current semester" -msgstr "" - -#: templates/core/semester_list.html:43 templates/core/session_list.html:41 -#: templates/setting/admin_panel.html:47 -msgid "Session" -msgstr "" - -#: templates/core/semester_list.html:44 -msgid "Next Semester Begins" -msgstr "" - -#: templates/core/semester_list.html:46 templates/core/session_list.html:45 -#: templates/course/course_single.html:61 -#: templates/course/course_single.html:138 -msgid "Actions" -msgstr "" - -#: templates/core/semester_list.html:83 -msgid "No Semester." -msgstr "" - -#: templates/core/semester_list.html:87 -msgid "Add Semester Now." -msgstr "" - -#: templates/core/semester_update.html:13 -msgid "Semester Form" -msgstr "" - -#: templates/core/semester_update.html:34 -msgid "Semester Add & update Form" -msgstr "" - -#: templates/core/session_list.html:10 templates/core/session_list.html:20 -#: templates/core/session_update.html:12 -msgid "Session List" -msgstr "" - -#: templates/core/session_list.html:16 -msgid "Add New Session" -msgstr "" - -#: templates/core/session_list.html:42 -msgid "Is Current Session" -msgstr "" - -#: templates/core/session_list.html:43 -msgid "Next Session Begins" -msgstr "" - -#: templates/core/session_list.html:77 -msgid "No Session." -msgstr "" - -#: templates/core/session_list.html:81 -msgid "Add Session Now." -msgstr "" - -#: templates/core/session_update.html:13 -msgid "Session Form" -msgstr "" - -#: templates/core/session_update.html:34 -msgid "Session Add & update Form" -msgstr "" - -#: templates/correct_answer.html:6 templates/question.html:50 -#: templates/result.html:51 -msgid "You answered the above question incorrectly" -msgstr "" - -#: templates/correct_answer.html:16 templates/question.html:60 -#: templates/result.html:61 -msgid "This is the correct answer" -msgstr "" - -#: templates/correct_answer.html:24 templates/question.html:68 -#: templates/result.html:69 -msgid "This was your answer." -msgstr "" - -#: templates/course/course_add.html:12 templates/course/course_single.html:11 -#: templates/course/program_add.html:12 templates/course/program_list.html:10 -#: templates/course/program_single.html:11 -#: templates/quiz/mcquestion_form.html:10 templates/quiz/quiz_form.html:10 -#: templates/quiz/quiz_list.html:13 templates/result.html:15 -#: templates/setting/admin_panel.html:70 -#: templates/upload/upload_file_form.html:11 -#: templates/upload/upload_video_form.html:11 -#: templates/upload/video_single.html:11 -msgid "Programs" -msgstr "" - -#: templates/course/course_add.html:13 templates/course/course_add.html:17 -msgid "Course Form" -msgstr "" - -#: templates/course/course_add.html:27 -msgid "Course Detail" -msgstr "" - -#: templates/course/course_add.html:37 -msgid "Other Info" -msgstr "" - -#: templates/course/course_allocation_form.html:12 -#: templates/course/course_allocation_view.html:20 -#: templates/setting/admin_panel.html:75 -msgid "Course Allocations" -msgstr "" - -#: templates/course/course_allocation_form.html:13 -msgid "Allocation Form" -msgstr "" - -#: templates/course/course_allocation_form.html:34 -msgid "Course Allocation Form" -msgstr "" - -#: templates/course/course_allocation_view.html:10 -msgid "Allocation list" -msgstr "" - -#: templates/course/course_allocation_view.html:16 -msgid "Allocate Now" -msgstr "" - -#: templates/course/course_allocation_view.html:33 -#: templates/setting/admin_panel.html:70 -msgid "Courses" -msgstr "" - -#: templates/course/course_allocation_view.html:50 -msgid "Edit or Update" -msgstr "" - -#: templates/course/course_allocation_view.html:53 -msgid "Deallocate" -msgstr "" - -#: templates/course/course_allocation_view.html:65 -msgid "No Course Allocated." -msgstr "" - -#: templates/course/course_allocation_view.html:69 -msgid "Allocate now" -msgstr "" - -#: templates/course/course_registration.html:13 -msgid "Course Registration" -msgstr "" - -#: templates/course/course_registration.html:17 -#: templates/course/course_registration.html:35 -#: templates/setting/admin_panel.html:58 -msgid "Course Add" -msgstr "" - -#: templates/course/course_registration.html:17 -#: templates/setting/admin_panel.html:58 -msgid "Drop" -msgstr "" - -#: templates/course/course_registration.html:25 -msgid "Calender is off" -msgstr "" - -#: templates/course/course_registration.html:26 -msgid "Check the university calender" -msgstr "" - -#: templates/course/course_registration.html:38 -#: templates/course/course_registration.html:200 -msgid "Save Score" -msgstr "" - -#: templates/course/course_registration.html:43 -#: templates/result/assessment_results.html:32 -#: templates/result/grade_results.html:32 -msgid "First Semester:" -msgstr "" - -#: templates/course/course_registration.html:48 -#: templates/course/course_registration.html:111 -#: templates/course/course_registration.html:216 -msgid "Mark" -msgstr "" - -#: templates/course/course_registration.html:49 -#: templates/course/course_registration.html:112 -#: templates/course/course_registration.html:217 -#: templates/course/program_single.html:40 -#: templates/course/user_course_list.html:49 -#: templates/course/user_course_list.html:93 -#: templates/result/assessment_results.html:38 -#: templates/result/grade_results.html:38 -#: templates/result/grade_results.html:103 -msgid "Course Code" -msgstr "" - -#: templates/course/course_registration.html:50 -#: templates/course/course_registration.html:113 -#: templates/course/course_registration.html:218 -#: templates/result/assessment_results.html:37 -#: templates/result/assessment_results.html:79 -#: templates/result/grade_results.html:37 -#: templates/result/grade_results.html:102 -msgid "Course Title" -msgstr "" - -#: templates/course/course_registration.html:51 -#: templates/course/course_registration.html:114 -#: templates/course/course_registration.html:219 -#: templates/result/assessment_results.html:39 -#: templates/result/assessment_results.html:81 -msgid "Cr.Hr(s)" -msgstr "" - -#: templates/course/course_registration.html:52 -#: templates/course/course_registration.html:115 -#: templates/course/course_registration.html:220 -#: templates/course/program_single.html:43 -#: templates/course/user_course_list.html:51 -#: templates/course/user_course_list.html:95 -msgid "Year" -msgstr "" - -#: templates/course/course_registration.html:53 -#: templates/course/course_registration.html:116 -#: templates/course/course_registration.html:221 -msgid "Classification" -msgstr "" - -#: templates/course/course_registration.html:54 -#: templates/course/course_registration.html:117 -#: templates/course/course_registration.html:222 -msgid "Elective Group" -msgstr "" - -#: templates/course/course_registration.html:69 -#: templates/course/course_registration.html:132 -#: templates/course/course_registration.html:236 -msgid "Elective" -msgstr "" - -#: templates/course/course_registration.html:71 -#: templates/course/course_registration.html:134 -#: templates/course/course_registration.html:238 -msgid "Core" -msgstr "" - -#: templates/course/course_registration.html:83 -#: templates/course/course_registration.html:146 -#: templates/course/course_registration.html:249 -msgid "No Course." -msgstr "" - -#: templates/course/course_registration.html:97 -msgid "First semester Credit(s):" -msgstr "" - -#: templates/course/course_registration.html:106 -#: templates/result/assessment_results.html:74 -#: templates/result/grade_results.html:97 -msgid "Second Semester:" -msgstr "" - -#: templates/course/course_registration.html:160 -msgid "Second semester credit(s):" -msgstr "" - -#: templates/course/course_registration.html:165 -msgid "Registerd course credit(s):" -msgstr "" - -#: templates/course/course_registration.html:170 -#: templates/course/course_registration.html:263 -msgid "Total credit(s):" -msgstr "" - -#: templates/course/course_registration.html:186 -msgid "Print Registration Form" -msgstr "" - -#: templates/course/course_registration.html:187 -msgid "Print Registerd Courses" -msgstr "" - -#: templates/course/course_registration.html:191 -msgid "Course Drop" -msgstr "" - -#: templates/course/course_registration.html:201 -msgid "Drop Selected" -msgstr "" - -#: templates/course/course_single.html:22 -msgid "Edit course" -msgstr "" - -#: templates/course/course_single.html:27 -msgid "Upload new file" -msgstr "" - -#: templates/course/course_single.html:30 -msgid "Upload new video" -msgstr "" - -#: templates/course/course_single.html:36 -msgid "Take a Quiz" -msgstr "" - -#: templates/course/course_single.html:51 -msgid "Video Tutorials" -msgstr "" - -#: templates/course/course_single.html:57 -msgid "Video Title" -msgstr "" - -#: templates/course/course_single.html:58 -#: templates/course/course_single.html:134 -msgid "Uploaded Date" -msgstr "" - -#: templates/course/course_single.html:59 -msgid "Get Started" -msgstr "" - -#: templates/course/course_single.html:79 -msgid "Play now" -msgstr "" - -#: templates/course/course_single.html:104 -msgid "No video Uploaded." -msgstr "" - -#: templates/course/course_single.html:108 -#: templates/course/course_single.html:185 -msgid "Upload now." -msgstr "" - -#: templates/course/course_single.html:127 -msgid "Documentations" -msgstr "" - -#: templates/course/course_single.html:133 -msgid "File name" -msgstr "" - -#: templates/course/course_single.html:135 -msgid "Updated Date" -msgstr "" - -#: templates/course/course_single.html:136 -msgid "Downloads" -msgstr "" - -#: templates/course/course_single.html:156 -msgid "Download" -msgstr "" - -#: templates/course/course_single.html:181 -msgid "No File Uploaded." -msgstr "" - -#: templates/course/course_single.html:205 -msgid "Lecturer(s)" -msgstr "" - -#: templates/course/course_single.html:232 -msgid "No lecturer assigned for this course" -msgstr "" - -#: templates/course/program_add.html:13 -msgid "Program Form" -msgstr "" - -#: templates/course/program_add.html:22 -msgid "Program Add Form" -msgstr "" - -#: templates/course/program_list.html:16 -msgid "Add Program" -msgstr "" - -#: templates/course/program_list.html:20 -msgid "Program List" -msgstr "" - -#: templates/course/program_list.html:32 -msgid "Program Name" -msgstr "" - -#: templates/course/program_list.html:33 -msgid "Summary" -msgstr "" - -#: templates/course/program_list.html:69 -msgid "No program." -msgstr "" - -#: templates/course/program_list.html:73 -msgid "Add program now." -msgstr "" - -#: templates/course/program_single.html:18 -msgid "Add Course" -msgstr "" - -#: templates/course/program_single.html:39 -#: templates/course/user_course_list.html:48 -#: templates/course/user_course_list.html:92 -msgid "Course Name" -msgstr "" - -#: templates/course/program_single.html:41 -#: templates/course/user_course_list.html:50 -#: templates/course/user_course_list.html:94 -#: templates/result/grade_results.html:39 -#: templates/result/grade_results.html:104 -msgid "Cr.Hr" -msgstr "" - -#: templates/course/program_single.html:45 -#: templates/course/user_course_list.html:53 -#: templates/course/user_course_list.html:97 -msgid "Current Semester" -msgstr "" - -#: templates/course/program_single.html:92 -msgid "No course for this progrm." -msgstr "" - -#: templates/course/program_single.html:96 -msgid "Add one now." -msgstr "" - -#: templates/course/user_course_list.html:42 -msgid "Taken Courses:" -msgstr "" - -#: templates/course/user_course_list.html:54 -#: templates/course/user_course_list.html:75 -msgid "Taken" -msgstr "" - -#: templates/course/user_course_list.html:86 -msgid "All Courses:" -msgstr "" - -#: templates/invoice_detail.html:2 templates/invoices.html:1 -msgid "Invoices" -msgstr "" - -#: templates/invoices.html:5 -msgid "Pay now" -msgstr "" - -#: templates/navbar.html:12 -msgid "Search All... #course, #program, #Quiz, #News, #Events" -msgstr "" - -#: templates/navbar.html:42 -msgid "Setting" -msgstr "" - -#: templates/navbar.html:46 -msgid "Signout" -msgstr "" - -#: templates/payments/charge.html:24 -msgid "Payment Succeed, You has been make payment successfuly." -msgstr "" - -#: templates/payments/charge.html:25 -msgid "Redirect to your dashboard in" -msgstr "" - -#: templates/payments/coinbase.html:3 templates/payments/coinbase.html:8 -msgid "Coinbase" -msgstr "" - -#: templates/pdf/lecturer_list.html:46 -msgid "Address/City" -msgstr "" - -#: templates/progress.html:4 templates/progress.html:12 -msgid "Progress Page" -msgstr "" - -#: templates/progress.html:5 -msgid "User Progress Page" -msgstr "" - -#: templates/progress.html:18 -msgid "Question Category Scores" -msgstr "" - -#: templates/progress.html:25 templates/quiz/sitting_detail.html:19 -msgid "Category" -msgstr "" - -#: templates/progress.html:26 -msgid "Correctly answererd" -msgstr "" - -#: templates/progress.html:27 -msgid "Incorrect" -msgstr "" - -#: templates/progress.html:56 -msgid "Previous exam papers" -msgstr "" - -#: templates/progress.html:58 -msgid "Below are the results of exams that you have sat." -msgstr "" - -#: templates/progress.html:60 templates/quiz/sitting_list.html:29 -msgid "Total complete exams:" -msgstr "" - -#: templates/progress.html:67 -msgid "Quiz Title" -msgstr "" - -#: templates/progress.html:69 -msgid "Possible Score" -msgstr "" - -#: templates/progress.html:70 -#, python-format -msgid "Out of 100%%" -msgstr "" - -#: templates/progress.html:94 -msgid "No recordes yet. Try to do some quizzes in your course." -msgstr "" - -#: templates/question.html:28 templates/result.html:38 -msgid "The previous question" -msgstr "" - -#: templates/question.html:37 -msgid "Your answer was" -msgstr "" - -#: templates/question.html:85 templates/result.html:85 -msgid "No explanation set to this question." -msgstr "" - -#: templates/question.html:108 -msgid "Quiz instractions" -msgstr "" - -#: templates/question.html:116 -msgid "Understood" -msgstr "" - -#: templates/question.html:125 -msgid "of" -msgstr "" - -#: templates/question.html:130 -msgid "Quiz category" -msgstr "" - -#: templates/question.html:157 -msgid "Previous" -msgstr "" - -#: templates/quiz/mcquestion_form.html:14 -msgid "MC Question Form" -msgstr "" - -#: templates/quiz/mcquestion_form.html:18 -msgid "Add questions" -msgstr "" - -#: templates/quiz/mcquestion_form.html:31 -msgid "question added" -msgstr "" - -#: templates/quiz/mcquestion_form.html:34 -msgid "Correct the error(s) below." -msgstr "" - -#: templates/quiz/quiz_form.html:14 -msgid "Quiz Form" -msgstr "" - -#: templates/quiz/quiz_form.html:18 -msgid "Quiz form for" -msgstr "" - -#: templates/quiz/quiz_form.html:55 -msgid "Hold down" -msgstr "" - -#: templates/quiz/quiz_form.html:55 -#: venv/lib/python3.9/site-packages/django/utils/text.py:322 -msgid "or" -msgstr "" - -#: templates/quiz/quiz_form.html:55 -msgid "on a Mac, to select more than one." -msgstr "" - -#: templates/quiz/quiz_form.html:66 -msgid "Continue" -msgstr "" - -#: templates/quiz/quiz_list.html:22 -msgid "Add Quiz" -msgstr "" - -#: templates/quiz/quiz_list.html:54 -msgid "You will only get one attempt at this quiz" -msgstr "" - -#: templates/quiz/quiz_list.html:58 -msgid "Start quiz" -msgstr "" - -#: templates/quiz/sitting_detail.html:4 -msgid "Result of" -msgstr "" - -#: templates/quiz/sitting_detail.html:4 templates/search/search_view.html:43 -msgid "for" -msgstr "" - -#: templates/quiz/sitting_detail.html:12 -msgid "Completed Exams" -msgstr "" - -#: templates/quiz/sitting_detail.html:13 -msgid "Marking" -msgstr "" - -#: templates/quiz/sitting_detail.html:18 templates/result.html:99 -msgid "Quiz title" -msgstr "" - -#: templates/quiz/sitting_detail.html:25 templates/quiz/sitting_list.html:38 -msgid "Completed" -msgstr "" - -#: templates/quiz/sitting_detail.html:35 -msgid "User answer" -msgstr "" - -#: templates/quiz/sitting_detail.html:54 -msgid "incorrect" -msgstr "" - -#: templates/quiz/sitting_detail.html:62 -msgid "Toggle whether correct" -msgstr "" - -#: templates/quiz/sitting_list.html:3 -msgid "All Quizzes" -msgstr "" - -#: templates/quiz/sitting_list.html:16 -msgid "List of complete exams" -msgstr "" - -#: templates/quiz/sitting_list.html:24 templates/snippets/filter_form.html:12 -msgid "Filter" -msgstr "" - -#: templates/quiz/sitting_list.html:54 -msgid "View details" -msgstr "" - -#: templates/quiz/sitting_list.html:63 -msgid "No completed exams for you" -msgstr "" - -#: templates/registration/login.html:3 -msgid "Dj Learning Management System - Login" -msgstr "" - -#: templates/registration/login.html:11 -msgid "Sign in" -msgstr "" - -#: templates/registration/login.html:16 -msgid "ID Number" -msgstr "" - -#: templates/registration/login.html:21 -msgid "Password" -msgstr "" - -#: templates/registration/login.html:25 templates/registration/register.html:73 -msgid "Invalid ID & Password." -msgstr "" - -#: templates/registration/login.html:28 -msgid "SIGN IN" -msgstr "" - -#: templates/registration/login.html:32 -msgid "Forgot password ?" -msgstr "" - -#: templates/registration/password_reset.html:3 -msgid "Password Reset | Learning management system" -msgstr "" - -#: templates/registration/password_reset.html:7 -msgid "Password Reset" -msgstr "" - -#: templates/registration/password_reset.html:17 -msgid "Request Password Reset" -msgstr "" - -#: templates/registration/password_reset_complete.html:3 -msgid "Password Reset Complete | Learning management system" -msgstr "" - -#: templates/registration/password_reset_complete.html:8 -msgid "Password Reset Complete" -msgstr "" - -#: templates/registration/password_reset_complete.html:11 -msgid "Your password has been set, you are now able to Log In!" -msgstr "" - -#: templates/registration/password_reset_complete.html:13 -msgid "Sign In Here" -msgstr "" - -#: templates/registration/password_reset_confirm.html:22 -msgid "Confirm New Password" -msgstr "" - -#: templates/registration/password_reset_confirm.html:31 -msgid "Reset Password" -msgstr "" - -#: templates/registration/password_reset_done.html:3 -msgid "Email Sent | Learning management system" -msgstr "" - -#: templates/registration/password_reset_done.html:8 -msgid "Email sent" -msgstr "" - -#: templates/registration/password_reset_done.html:14 -msgid "Back To Login" -msgstr "" - -#: templates/registration/register.html:3 -msgid "Register | Learning management system" -msgstr "" - -#: templates/registration/register.html:12 -msgid "Create Your Account" -msgstr "" - -#: templates/registration/register.html:20 -msgid "Login Form" -msgstr "" - -#: templates/registration/register.html:76 -msgid "SIGN UP" -msgstr "" - -#: templates/registration/register.html:79 -msgid "Already Registered ?" -msgstr "" - -#: templates/registration/register.html:79 -msgid "Login" -msgstr "" - -#: templates/result.html:8 -msgid "Quiz Results for" -msgstr "" - -#: templates/result.html:20 templates/result/assessment_results.html:29 -#: templates/result/grade_results.html:29 -msgid "Result" -msgstr "" - -#: templates/result.html:26 -msgid "Calculating your result..." -msgstr "" - -#: templates/result.html:96 -msgid "Quiz result" -msgstr "" - -#: templates/result.html:103 -msgid "You answered" -msgstr "" - -#: templates/result.html:103 -msgid "questions correctly out of" -msgstr "" - -#: templates/result.html:103 -msgid "giving you" -msgstr "" - -#: templates/result.html:103 -#, python-format -msgid "%% correct" -msgstr "" - -#: templates/result.html:117 -msgid "Review the questions below and try the quiz again in the future" -msgstr "" - -#: templates/result.html:119 -msgid "The result of this quiz will be stored in your progress section" -msgstr "" - -#: templates/result.html:121 -msgid "so you can review and monitor your progression" -msgstr "" - -#: templates/result.html:134 -msgid "Your session score is" -msgstr "" - -#: templates/result.html:134 -msgid "out of a possible" -msgstr "" - -#: templates/result.html:157 -msgid "No explanation set for this question." -msgstr "" - -#: templates/result.html:164 -msgid "Your answer" -msgstr "" - -#: templates/result/add_score.html:29 -msgid "Select Your Course Here" -msgstr "" - -#: templates/result/add_score.html:35 templates/result/add_score_for.html:24 -msgid "No course." -msgstr "" - -#: templates/result/add_score.html:39 -msgid "To manage scores, please select the course using the button above." -msgstr "" - -#: templates/result/add_score_for.html:30 -msgid "Students result form" -msgstr "" - -#: templates/result/add_score_for.html:41 -msgid "Grade report" -msgstr "" - -#: templates/result/add_score_for.html:54 -#: templates/result/assessment_results.html:41 -#: templates/result/assessment_results.html:83 -msgid "Mid exam" -msgstr "" - -#: templates/result/add_score_for.html:56 -#: templates/result/assessment_results.html:43 -#: templates/result/assessment_results.html:85 -msgid "Attendance" -msgstr "" - -#: templates/result/add_score_for.html:57 -#: templates/result/assessment_results.html:44 -#: templates/result/assessment_results.html:86 -msgid "Final exam" -msgstr "" - -#: templates/result/add_score_for.html:58 -#: templates/result/assessment_results.html:45 -#: templates/result/assessment_results.html:87 -msgid "Total" -msgstr "" - -#: templates/result/add_score_for.html:59 -msgid "Point" -msgstr "" - -#: templates/result/add_score_for.html:60 -#: templates/result/grade_results.html:40 -msgid "Grade" -msgstr "" - -#: templates/result/add_score_for.html:61 -#: templates/result/grade_results.html:42 -#: templates/result/grade_results.html:107 -msgid "Comment" -msgstr "" - -#: templates/result/grade_results.html:41 -#: templates/result/grade_results.html:106 -msgid "Points" -msgstr "" - -#: templates/result/grade_results.html:58 -#: templates/result/grade_results.html:123 -msgid "PASS" -msgstr "" - -#: templates/result/grade_results.html:60 -#: templates/result/grade_results.html:125 -msgid "FAIL" -msgstr "" - -#: templates/result/grade_results.html:79 -msgid "Total first semester credit:" -msgstr "" - -#: templates/result/grade_results.html:88 -#: templates/result/grade_results.html:177 -msgid "First Semester GPA:" -msgstr "" - -#: templates/result/grade_results.html:105 -msgid "GRADE" -msgstr "" - -#: templates/result/grade_results.html:139 -msgid "Total second semester credit:" -msgstr "" - -#: templates/result/grade_results.html:144 -msgid "Total Credit:" -msgstr "" - -#: templates/result/grade_results.html:153 -#: templates/result/grade_results.html:184 -msgid "Second Semester GPA:" -msgstr "" - -#: templates/result/grade_results.html:162 -#: templates/result/grade_results.html:192 -msgid "Previous CGPA:" -msgstr "" - -#: templates/search/search_view.html:3 -msgid "Search result for" -msgstr "" - -#: templates/search/search_view.html:12 -msgid "Search" -msgstr "" - -#: templates/search/search_view.html:43 -msgid "result" -msgstr "" - -#: templates/search/search_view.html:62 -msgid "Program of" -msgstr "" - -#: templates/search/search_view.html:69 templates/search/search_view.html:126 -msgid "News And Events" -msgstr "" - -#: templates/search/search_view.html:72 -msgid "Date:" -msgstr "" - -#: templates/search/search_view.html:82 -msgid "quiz" -msgstr "" - -#: templates/search/search_view.html:82 -msgid "Course:" -msgstr "" - -#: templates/search/search_view.html:122 -msgid "Search by:" -msgstr "" - -#: templates/search/search_view.html:124 -msgid "Title or Description" -msgstr "" - -#: templates/search/search_view.html:125 -msgid "Title, Code or Description" -msgstr "" - -#: templates/search/search_view.html:127 -msgid "Title, Description or Category(practice, assignment and exam)" -msgstr "" - -#: templates/setting/admin_panel.html:37 templates/setting/admin_panel.html:42 -#: templates/setting/admin_panel.html:47 templates/setting/admin_panel.html:52 -#: templates/setting/admin_panel.html:70 templates/setting/admin_panel.html:75 -#: templates/setting/admin_panel.html:80 -msgid "Manage" -msgstr "" - -#: templates/setting/admin_panel.html:43 -msgid "students" -msgstr "" - -#: templates/setting/admin_panel.html:48 -msgid "sessions" -msgstr "" - -#: templates/setting/admin_panel.html:53 -msgid "semesters" -msgstr "" - -#: templates/setting/admin_panel.html:64 -msgid "Switch" -msgstr "" - -#: templates/setting/admin_panel.html:71 -msgid "programs" -msgstr "" - -#: templates/setting/admin_panel.html:76 -msgid "course allocations" -msgstr "" - -#: templates/setting/password_change.html:12 -msgid "Password Change" -msgstr "" - -#: templates/setting/profile_info_change.html:12 -msgid "Account setting" -msgstr "" - -#: templates/setting/profile_info_change.html:16 -msgid "Account Settings" -msgstr "" - -#: templates/setting/profile_info_change.html:44 -msgid "Update Profile" -msgstr "" - -#: templates/upload/upload_file_form.html:14 -msgid "File upload" -msgstr "" - -#: templates/upload/upload_file_form.html:18 -msgid "File upload for" -msgstr "" - -#: templates/upload/upload_file_form.html:26 -msgid "File Upload Form" -msgstr "" - -#: templates/upload/upload_file_form.html:33 -#: templates/upload/upload_video_form.html:32 -msgid "Upload" -msgstr "" - -#: templates/upload/upload_video_form.html:14 -msgid "Video upload" -msgstr "" - -#: templates/upload/upload_video_form.html:18 -msgid "Video upload for" -msgstr "" - -#: templates/upload/upload_video_form.html:26 -msgid "Video Upload Form" -msgstr "" - -#: templates/upload/video_single.html:35 -msgid "No video description set." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/_termui_impl.py:518 -#, python-brace-format -msgid "{editor}: Editing failed" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/_termui_impl.py:522 -#, python-brace-format -msgid "{editor}: Editing failed: {e}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1120 -msgid "Aborted!" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1309 -#: venv/lib/python3.9/site-packages/click/decorators.py:559 -msgid "Show this message and exit." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1340 -#: venv/lib/python3.9/site-packages/click/core.py:1370 -#, python-brace-format -msgid "(Deprecated) {text}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1387 -msgid "Options" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1413 -#, python-brace-format -msgid "Got unexpected extra argument ({args})" -msgid_plural "Got unexpected extra arguments ({args})" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/core.py:1429 -msgid "DeprecationWarning: The command {name!r} is deprecated." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1636 -msgid "Commands" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1668 -msgid "Missing command." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:1746 -msgid "No such command {name!r}." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:2310 -msgid "Value must be an iterable." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:2331 -#, python-brace-format -msgid "Takes {nargs} values but 1 was given." -msgid_plural "Takes {nargs} values but {len} were given." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/core.py:2778 -#, python-brace-format -msgid "env var: {var}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:2808 -msgid "(dynamic)" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:2821 -#, python-brace-format -msgid "default: {default}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/core.py:2834 -msgid "required" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/decorators.py:465 -#, python-format -msgid "%(prog)s, version %(version)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/decorators.py:528 -msgid "Show the version and exit." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:44 -#: venv/lib/python3.9/site-packages/click/exceptions.py:80 -#, python-brace-format -msgid "Error: {message}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:72 -#, python-brace-format -msgid "Try '{command} {option}' for help." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:121 -#, python-brace-format -msgid "Invalid value: {message}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:123 -#, python-brace-format -msgid "Invalid value for {param_hint}: {message}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:179 -msgid "Missing argument" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:181 -msgid "Missing option" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:183 -msgid "Missing parameter" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:185 -#, python-brace-format -msgid "Missing {param_type}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:192 -#, python-brace-format -msgid "Missing parameter: {param_name}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:212 -#, python-brace-format -msgid "No such option: {name}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:224 -#, python-brace-format -msgid "Did you mean {possibility}?" -msgid_plural "(Possible options: {possibilities})" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:262 -msgid "unknown error" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/exceptions.py:269 -msgid "Could not open file {filename!r}: {message}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/parser.py:231 -msgid "Argument {name!r} takes {nargs} values." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/parser.py:413 -msgid "Option {name!r} does not take a value." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/parser.py:474 -msgid "Option {name!r} requires an argument." -msgid_plural "Option {name!r} requires {nargs} arguments." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/shell_completion.py:319 -msgid "Shell completion is not supported for Bash versions older than 4.4." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/shell_completion.py:326 -msgid "Couldn't detect Bash version, shell completion is not supported." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:158 -msgid "Repeat for confirmation" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:174 -msgid "Error: The value you entered was invalid." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:176 -#, python-brace-format -msgid "Error: {e.message}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:187 -msgid "Error: The two entered values do not match." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:243 -msgid "Error: invalid input" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/termui.py:773 -msgid "Press any key to continue..." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:266 -#, python-brace-format -msgid "" -"Choose from:\n" -"\t{choices}" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:298 -msgid "{value!r} is not {choice}." -msgid_plural "{value!r} is not one of {choices}." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/types.py:392 -msgid "{value!r} does not match the format {format}." -msgid_plural "{value!r} does not match the formats {formats}." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/click/types.py:414 -msgid "{value!r} is not a valid {number_type}." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:470 -#, python-brace-format -msgid "{value} is not in the range {range}." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:611 -msgid "{value!r} is not a valid boolean." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:635 -msgid "{value!r} is not a valid UUID." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:822 -msgid "file" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:824 -msgid "directory" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:826 -msgid "path" -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:877 -msgid "{name} {filename!r} does not exist." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:886 -msgid "{name} {filename!r} is a file." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:894 -#, python-brace-format -msgid "{name} '{filename}' is a directory." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:903 -msgid "{name} {filename!r} is not readable." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:912 -msgid "{name} {filename!r} is not writable." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:921 -msgid "{name} {filename!r} is not executable." -msgstr "" - -#: venv/lib/python3.9/site-packages/click/types.py:988 -#, python-brace-format -msgid "{len_type} values are required, but {len_value} was given." -msgid_plural "{len_type} values are required, but {len_value} were given." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/crispy_forms/tests/test_form_helper.py:130 -#: venv/lib/python3.9/site-packages/crispy_forms/tests/test_form_helper.py:140 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:91 -msgid "This field is required." -msgstr "" - -#: venv/lib/python3.9/site-packages/crispy_forms/tests/test_layout.py:392 -msgid "i18n text" -msgstr "" - -#: venv/lib/python3.9/site-packages/crispy_forms/tests/test_layout.py:394 -msgid "i18n legend" -msgstr "" - -#: venv/lib/python3.9/site-packages/crispy_forms/tests/test_layout_objects.py:143 -#: venv/lib/python3.9/site-packages/django/core/validators.py:22 -msgid "Enter a valid value." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/contrib/messages/apps.py:15 -msgid "Messages" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/contrib/sitemaps/apps.py:8 -msgid "Site Maps" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/contrib/staticfiles/apps.py:9 -msgid "Static Files" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/contrib/syndication/apps.py:7 -msgid "Syndication" -msgstr "" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -#: venv/lib/python3.9/site-packages/django/core/paginator.py:30 -msgid "…" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/paginator.py:50 -msgid "That page number is not an integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/paginator.py:52 -msgid "That page number is less than 1" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/paginator.py:54 -msgid "That page contains no results" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:104 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:752 -msgid "Enter a valid URL." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:165 -msgid "Enter a valid integer." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:176 -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -#: venv/lib/python3.9/site-packages/django/core/validators.py:259 -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:267 -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:279 -#: venv/lib/python3.9/site-packages/django/core/validators.py:287 -#: venv/lib/python3.9/site-packages/django/core/validators.py:316 -msgid "Enter a valid IPv4 address." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:296 -#: venv/lib/python3.9/site-packages/django/core/validators.py:317 -msgid "Enter a valid IPv6 address." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:308 -#: venv/lib/python3.9/site-packages/django/core/validators.py:315 -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:351 -msgid "Enter only digits separated by commas." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:357 -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:392 -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:401 -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:410 -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:420 -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:438 -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:461 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:347 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:386 -msgid "Enter a number." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:463 -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:468 -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:473 -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:544 -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/core/validators.py:605 -msgid "Null characters are not allowed." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/base.py:1425 -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/constraints.py:17 -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:128 -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:129 -msgid "This field cannot be null." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:130 -msgid "This field cannot be blank." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:131 -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:135 -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:173 -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1094 -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1095 -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1097 -msgid "Boolean (Either True or False)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1147 -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1149 -msgid "String (unlimited)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1253 -msgid "Comma-separated integers" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1354 -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1358 -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1493 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1362 -msgid "Date (without time)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1489 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1497 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1502 -msgid "Date (with time)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1626 -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1628 -msgid "Decimal number" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1789 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1793 -msgid "Duration" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1845 -msgid "Email address" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1870 -msgid "File path" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1948 -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1950 -msgid "Floating point number" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1990 -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:1992 -msgid "Integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2088 -msgid "Big (8 byte) integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2105 -msgid "Small integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2113 -msgid "IPv4 address" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2144 -msgid "IP address" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2237 -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2238 -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2240 -msgid "Boolean (Either True, False or None)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2291 -msgid "Positive big integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2306 -msgid "Positive integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2321 -msgid "Positive small integer" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2337 -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2373 -msgid "Text" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2448 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2452 -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2456 -msgid "Time" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2564 -msgid "URL" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2588 -msgid "Raw binary data" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2653 -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/__init__.py:2655 -msgid "Universally unique identifier" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/files.py:232 -msgid "File" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/files.py:393 -msgid "Image" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/json.py:26 -msgid "A JSON object" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/json.py:28 -msgid "Value must be valid JSON." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:919 -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:921 -msgid "Foreign Key (type determined by related field)" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:1212 -msgid "One-to-one relationship" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:1269 -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:1271 -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/db/models/fields/related.py:1319 -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the label -#: venv/lib/python3.9/site-packages/django/forms/boundfield.py:184 -msgid ":?.!" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:298 -msgid "Enter a whole number." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:467 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1241 -msgid "Enter a valid date." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:490 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1242 -msgid "Enter a valid time." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:517 -msgid "Enter a valid date/time." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:551 -msgid "Enter a valid duration." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:552 -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:621 -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:622 -msgid "No file was submitted." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:623 -msgid "The submitted file is empty." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:625 -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:630 -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:694 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:857 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:949 -#: venv/lib/python3.9/site-packages/django/forms/models.py:1566 -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:951 -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1070 -#: venv/lib/python3.9/site-packages/django/forms/models.py:1564 -msgid "Enter a list of values." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1071 -msgid "Enter a complete value." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1310 -msgid "Enter a valid UUID." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/fields.py:1340 -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -#: venv/lib/python3.9/site-packages/django/forms/forms.py:98 -msgid ":" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/forms.py:244 -#: venv/lib/python3.9/site-packages/django/forms/forms.py:328 -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:63 -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:67 -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:72 -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:484 -#: venv/lib/python3.9/site-packages/django/forms/formsets.py:491 -msgid "Order" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:886 -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:891 -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:898 -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:907 -msgid "Please correct the duplicate values below." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:1338 -msgid "The inline value did not match the parent instance." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:1429 -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/models.py:1568 -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/utils.py:226 -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:463 -msgid "Clear" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:464 -msgid "Currently" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:465 -msgid "Change" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:794 -msgid "Unknown" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:795 -msgid "Yes" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/forms/widgets.py:796 -msgid "No" -msgstr "" - -#. Translators: Please do not add spaces around commas. -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:874 -msgid "yes,no,maybe" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:904 -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:921 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:923 -#, python-format -msgid "%s KB" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:925 -#, python-format -msgid "%s MB" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:927 -#, python-format -msgid "%s GB" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:929 -#, python-format -msgid "%s TB" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/template/defaultfilters.py:931 -#, python-format -msgid "%s PB" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:73 -msgid "p.m." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:74 -msgid "a.m." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:79 -msgid "PM" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:80 -msgid "AM" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:152 -msgid "midnight" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dateformat.py:154 -msgid "noon" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:7 -msgid "Monday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:8 -msgid "Tuesday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:9 -msgid "Wednesday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:10 -msgid "Thursday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:11 -msgid "Friday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:12 -msgid "Saturday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:13 -msgid "Sunday" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:16 -msgid "Mon" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:17 -msgid "Tue" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:18 -msgid "Wed" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:19 -msgid "Thu" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:20 -msgid "Fri" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:21 -msgid "Sat" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:22 -msgid "Sun" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:25 -msgid "January" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:26 -msgid "February" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:27 -msgid "March" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:28 -msgid "April" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:29 -msgid "May" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:30 -msgid "June" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:31 -msgid "July" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:32 -msgid "August" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:33 -msgid "September" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:34 -msgid "October" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:35 -msgid "November" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:36 -msgid "December" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:39 -msgid "jan" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:40 -msgid "feb" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:41 -msgid "mar" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:42 -msgid "apr" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:43 -msgid "may" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:44 -msgid "jun" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:45 -msgid "jul" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:46 -msgid "aug" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:47 -msgid "sep" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:48 -msgid "oct" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:49 -msgid "nov" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:50 -msgid "dec" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:53 -msgctxt "abbrev. month" -msgid "Jan." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:54 -msgctxt "abbrev. month" -msgid "Feb." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:55 -msgctxt "abbrev. month" -msgid "March" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:56 -msgctxt "abbrev. month" -msgid "April" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:57 -msgctxt "abbrev. month" -msgid "May" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:58 -msgctxt "abbrev. month" -msgid "June" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:59 -msgctxt "abbrev. month" -msgid "July" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:60 -msgctxt "abbrev. month" -msgid "Aug." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:61 -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:62 -msgctxt "abbrev. month" -msgid "Oct." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:63 -msgctxt "abbrev. month" -msgid "Nov." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:64 -msgctxt "abbrev. month" -msgid "Dec." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:67 -msgctxt "alt. month" -msgid "January" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:68 -msgctxt "alt. month" -msgid "February" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:69 -msgctxt "alt. month" -msgid "March" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:70 -msgctxt "alt. month" -msgid "April" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:71 -msgctxt "alt. month" -msgid "May" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:72 -msgctxt "alt. month" -msgid "June" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:73 -msgctxt "alt. month" -msgid "July" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:74 -msgctxt "alt. month" -msgid "August" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:75 -msgctxt "alt. month" -msgid "September" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:76 -msgctxt "alt. month" -msgid "October" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:77 -msgctxt "alt. month" -msgid "November" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/dates.py:78 -msgctxt "alt. month" -msgid "December" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/ipv6.py:8 -msgid "This is not a valid IPv6 address." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/text.py:137 -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -#. Translators: This string is used as a separator between list elements -#: venv/lib/python3.9/site-packages/django/utils/text.py:341 -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:135 -msgid ", " -msgstr "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:8 -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:9 -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:10 -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:11 -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:12 -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/utils/timesince.py:13 -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:111 -msgid "Forbidden" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:112 -msgid "CSRF verification failed. Request aborted." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:116 -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:122 -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:127 -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:136 -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:142 -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/csrf.py:148 -msgid "More information is available with DEBUG=True." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:44 -msgid "No year specified" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:64 -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:115 -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:214 -msgid "Date out of range" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:94 -msgid "No month specified" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:147 -msgid "No day specified" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:194 -msgid "No week specified" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:349 -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:380 -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:652 -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/dates.py:692 -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/detail.py:56 -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/list.py:70 -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/list.py:77 -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/generic/list.py:169 -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/static.py:38 -msgid "Directory indexes are not allowed here." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/static.py:40 -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/static.py:79 -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:7 -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:220 -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:206 -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:221 -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:229 -msgid "Django Documentation" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:230 -msgid "Topics, references, & how-to’s" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:238 -msgid "Tutorial: A Polling App" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:239 -msgid "Get started with Django" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:247 -msgid "Django Community" -msgstr "" - -#: venv/lib/python3.9/site-packages/django/views/templates/default_urlconf.html:248 -msgid "Connect, get help, or contribute" -msgstr "" - -#: venv/lib/python3.9/site-packages/kombu/transport/qpid.py:1311 -#, python-format -msgid "Attempting to connect to qpid with SASL mechanism %s" -msgstr "" - -#: venv/lib/python3.9/site-packages/kombu/transport/qpid.py:1316 -#, python-format -msgid "Connected to qpid with SASL mechanism %s" -msgstr "" - -#: venv/lib/python3.9/site-packages/kombu/transport/qpid.py:1334 -#, python-format -msgid "Unable to connect to qpid with SASL mechanism %s" -msgstr "" diff --git a/accounts/translation.py b/logs/.gitkeep similarity index 100% rename from accounts/translation.py rename to logs/.gitkeep diff --git a/media/default.png b/media/default.png deleted file mode 100644 index de8d9f86..00000000 Binary files a/media/default.png and /dev/null differ diff --git a/media/registration_form/README.txt b/media/registration_form/README.txt deleted file mode 100644 index 3d02b67c..00000000 --- a/media/registration_form/README.txt +++ /dev/null @@ -1 +0,0 @@ -This directory responsible for storing generated registration slip PDF files \ No newline at end of file diff --git a/media/result_sheet/README.txt b/media/result_sheet/README.txt deleted file mode 100644 index a4582ee1..00000000 --- a/media/result_sheet/README.txt +++ /dev/null @@ -1 +0,0 @@ -This directory responsible for storing generated student result PDF files \ No newline at end of file diff --git a/payments/admin.py b/payments/admin.py deleted file mode 100644 index 8c38f3f3..00000000 --- a/payments/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/payments/apps.py b/payments/apps.py deleted file mode 100644 index 7eb624c8..00000000 --- a/payments/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class PaymentsConfig(AppConfig): - name = "payments" diff --git a/payments/migrations/0001_initial.py b/payments/migrations/0001_initial.py deleted file mode 100644 index 8e085a93..00000000 --- a/payments/migrations/0001_initial.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 4.0.8 on 2024-08-31 11:51 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Invoice', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('total', models.FloatField(blank=True, null=True)), - ('amount', models.FloatField(blank=True, null=True)), - ('payment_complete', models.BooleanField(default=False)), - ('invoice_code', models.CharField(blank=True, max_length=200, null=True)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - ] diff --git a/payments/models.py b/payments/models.py deleted file mode 100644 index f6ab91a2..00000000 --- a/payments/models.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.db import models -from django.conf import settings - - -class Invoice(models.Model): - user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) - total = models.FloatField(null=True, blank=True) - amount = models.FloatField(null=True, blank=True) - payment_complete = models.BooleanField(default=False) - invoice_code = models.CharField(max_length=200, blank=True, null=True) diff --git a/payments/tests.py b/payments/tests.py deleted file mode 100644 index 7ce503c2..00000000 --- a/payments/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/payments/urls.py b/payments/urls.py deleted file mode 100644 index 04a7fb5a..00000000 --- a/payments/urls.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.urls import path -from . import views - -urlpatterns = [ - path("", views.PaymentGetwaysView.as_view(), name="payment_gateways"), - path("paypal/", views.payment_paypal, name="paypal"), - path("stripe/", views.payment_stripe, name="stripe"), - path("coinbase/", views.payment_coinbase, name="coinbase"), - path("paylike/", views.payment_paylike, name="paylike"), - path("stripe-charge/", views.stripe_charge, name="stripe_charge"), - path("gopay-charge/", views.gopay_charge, name="gopay_charge"), - path("payment-succeed/", views.payment_succeed, name="payment-succeed"), - path("complete/", views.paymentComplete, name="complete"), - path("create-invoice/", views.create_invoice, name="create_invoice"), - path("invoice-detail//", views.invoice_detail, name="invoice_detail"), -] diff --git a/payments/views.py b/payments/views.py deleted file mode 100644 index c9853015..00000000 --- a/payments/views.py +++ /dev/null @@ -1,190 +0,0 @@ -import stripe -import uuid -import json - -from django.shortcuts import render -from django.http import JsonResponse -from django.conf import settings -from django.shortcuts import redirect -from django.views.generic.base import TemplateView - -from django.http import JsonResponse - -import gopay -from gopay.enums import Recurrence, PaymentInstrument, BankSwiftCode, Currency, Language -from .models import Invoice - - -def payment_paypal(request): - return render(request, "payments/paypal.html", context={}) - - -def payment_stripe(request): - return render(request, "payments/stripe.html", context={}) - - -def payment_coinbase(request): - return render(request, "payments/coinbase.html", context={}) - - -def payment_paylike(request): - return render(request, "payments/paylike.html", context={}) - - -def payment_succeed(request): - return render(request, "payments/payment_succeed.html", context={}) - - -class PaymentGetwaysView(TemplateView): - template_name = "payments/payment_gateways.html" - - def get_context_data(self, **kwargs): - context = super(PaymentGetwaysView, self).get_context_data(**kwargs) - context["key"] = settings.STRIPE_PUBLISHABLE_KEY - context["amount"] = 500 - context["description"] = "Stripe Payment" - context["invoice_session"] = self.request.session["invoice_session"] - print(context["invoice_session"]) - return context - - -def stripe_charge(request): - stripe.api_key = settings.STRIPE_SECRET_KEY - - if request.method == "POST": - charge = stripe.Charge.create( - amount=500, - currency="eur", - description="A Django charge", - source=request.POST["stripeToken"], - ) - invoice_code = request.session["invoice_session"] - invoice = Invoice.objects.get(invoice_code=invoice_code) - invoice.payment_complete = True - invoice.save() - return redirect("completed") - # return JsonResponse({"invoice_code": invoice.invoice_code}, status=201) - # return render(request, 'payments/charge.html') - - -def gopay_charge(request): - if request.method == "POST": - user = request.user - - payments = gopay.payments( - { - "goid": "[PAYMENT_ID]", - "clientId": "[GOPAY_CLIENT_ID]", - "clientSecret": "[GOPAY_CLIENT_SECRET]", - "isProductionMode": False, - "scope": gopay.TokenScope.ALL, - "language": gopay.Language.ENGLISH, - "timeout": 30, - } - ) - - # recurrent payment must have field '' - recurrentPayment = { - "recurrence": { - "recurrence_cycle": Recurrence.DAILY, - "recurrence_period": "7", - "recurrence_date_to": "2015-12-31", - } - } - - # pre-authorized payment must have field 'preauthorization' - preauthorizedPayment = {"preauthorization": True} - - response = payments.create_payment( - { - "payer": { - "default_payment_instrument": PaymentInstrument.BANK_ACCOUNT, - "allowed_payment_instruments": [PaymentInstrument.BANK_ACCOUNT], - "default_swift": BankSwiftCode.FIO_BANKA, - "allowed_swifts": [BankSwiftCode.FIO_BANKA, BankSwiftCode.MBANK], - "contact": { - "first_name": user.first_name, - "last_name": user.last_name, - "email": user.email, - "phone_number": user.phone, - "city": "example city", - "street": "Plana 67", - "postal_code": "373 01", - "country_code": "CZE", - }, - }, - "amount": 150, - "currency": Currency.CZECH_CROWNS, - "order_number": "001", - "order_description": "pojisteni01", - "items": [ - {"name": "item01", "amount": 50}, - {"name": "item02", "amount": 100}, - ], - "additional_params": [{"name": "invoicenumber", "value": "2015001003"}], - "callback": { - "return_url": "http://www.your-url.tld/return", - "notification_url": "http://www.your-url.tld/notify", - }, - "lang": Language.CZECH, # if lang is not specified, then default lang is used - } - ) - - if response.has_succeed(): - print("\nPayment Succeed\n") - print("hooray, API returned " + str(response)) - else: - print("\nPayment Fail\n") - print( - "oops, API returned " + str(response.status_code) + ": " + str(response) - ) - return JsonResponse({"message": str(response)}) - - return JsonResponse({"message": "GET requested"}) - - -def paymentComplete(request): - print(request.is_ajax()) - if request.is_ajax() or request.method == "POST": - invoice_id = request.session["invoice_session"] - invoice = Invoice.objects.get(id=invoice_id) - invoice.payment_complete = True - invoice.save() - # return redirect('invoice', invoice.invoice_code) - body = json.loads(request.body) - print("BODY:", body) - return JsonResponse("Payment completed!", safe=False) - - -def create_invoice(request): - print(request.is_ajax()) - if request.method == "POST": - invoice = Invoice.objects.create( - user=request.user, - amount=request.POST.get("amount"), - total=26, - invoice_code=str(uuid.uuid4()), - ) - request.session["invoice_session"] = invoice.invoice_code - return redirect("payment_gateways") - # if request.is_ajax(): - # invoice = Invoice.objects.create( - # user = request.user, - # amount = 15, - # total=26, - # ) - # return JsonResponse({'invoice': invoice}, status=201) # created - - return render( - request, - "invoices.html", - context={"invoices": Invoice.objects.filter(user=request.user)}, - ) - - -def invoice_detail(request, slug): - return render( - request, - "invoice_detail.html", - context={"invoice": Invoice.objects.get(invoice_code=slug)}, - ) diff --git a/quiz/admin.py b/quiz/admin.py deleted file mode 100644 index 0b50c8c2..00000000 --- a/quiz/admin.py +++ /dev/null @@ -1,101 +0,0 @@ -from django import forms -from django.contrib import admin -from django.contrib.admin.widgets import FilteredSelectMultiple -from django.utils.translation import gettext_lazy as _ -from modeltranslation.admin import TranslationAdmin -from modeltranslation.forms import TranslationModelForm - -from .models import ( - Quiz, - Progress, - Question, - MCQuestion, - Choice, - EssayQuestion, - Sitting, -) - - -class ChoiceInline(admin.TabularInline): - model = Choice - - -class QuizAdminForm(TranslationModelForm): - questions = forms.ModelMultipleChoiceField( - queryset=Question.objects.all().select_subclasses(), - required=False, - label=_("Questions"), - widget=FilteredSelectMultiple(verbose_name=_("Questions"), is_stacked=False), - ) - - class Meta: - model = Quiz - fields = ["title_en"] - - def __init__(self, *args, **kwargs): - super(QuizAdminForm, self).__init__(*args, **kwargs) - if self.instance.pk: - self.fields["questions"].initial = ( - self.instance.question_set.all().select_subclasses() - ) - - def save(self, commit=True): - quiz = super(QuizAdminForm, self).save(commit=False) - quiz.save() - quiz.question_set.set(self.cleaned_data["questions"]) - self.save_m2m() - return quiz - - -class QuizAdmin(TranslationAdmin): - pass - # form = QuizAdminForm - # fields = ( - # "title", - # "description", - # ) - # list_display = ("title",) - # # list_filter = ('category',) - # search_fields = ( - # "description", - # "category", - # ) - - -class MCQuestionAdmin(TranslationAdmin): - list_display = ("content",) - # list_filter = ('category',) - fieldsets = [ - ("figure" "quiz" "choice_order", {"fields": ("content", "explanation")}) - ] - - search_fields = ("content", "explanation") - filter_horizontal = ("quiz",) - - inlines = [ChoiceInline] - - -class ProgressAdmin(admin.ModelAdmin): - search_fields = ( - "user", - "score", - ) - - -class EssayQuestionAdmin(admin.ModelAdmin): - list_display = ("content",) - # list_filter = ('category',) - fields = ( - "content", - "quiz", - "explanation", - ) - search_fields = ("content", "explanation") - filter_horizontal = ("quiz",) - - -admin.site.register(Quiz, QuizAdmin) -admin.site.register(MCQuestion, MCQuestionAdmin) -admin.site.register(Progress, ProgressAdmin) -admin.site.register(EssayQuestion, EssayQuestionAdmin) -admin.site.register(Sitting) diff --git a/quiz/apps.py b/quiz/apps.py deleted file mode 100644 index 0b66cefb..00000000 --- a/quiz/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class QuizConfig(AppConfig): - name = "quiz" diff --git a/quiz/forms.py b/quiz/forms.py deleted file mode 100644 index a2dde4a3..00000000 --- a/quiz/forms.py +++ /dev/null @@ -1,103 +0,0 @@ -from django import forms -from django.forms.widgets import RadioSelect, Textarea -from django.contrib.admin.widgets import FilteredSelectMultiple -from django.utils.translation import gettext_lazy as _ -from django.forms.models import inlineformset_factory -from .models import Question, Quiz, MCQuestion, Choice - - -class QuestionForm(forms.Form): - def __init__(self, question, *args, **kwargs): - super(QuestionForm, self).__init__(*args, **kwargs) - choice_list = [x for x in question.get_choices_list()] - self.fields["answers"] = forms.ChoiceField( - choices=choice_list, widget=RadioSelect - ) - - -class EssayForm(forms.Form): - def __init__(self, question, *args, **kwargs): - super(EssayForm, self).__init__(*args, **kwargs) - self.fields["answers"] = forms.CharField( - widget=Textarea(attrs={"style": "width:100%"}) - ) - - -class QuizAddForm(forms.ModelForm): - class Meta: - model = Quiz - exclude = [] - - questions = forms.ModelMultipleChoiceField( - queryset=Question.objects.all().select_subclasses(), - required=False, - label=_("Questions"), - widget=FilteredSelectMultiple(verbose_name=_("Questions"), is_stacked=False), - ) - - def __init__(self, *args, **kwargs): - super(QuizAddForm, self).__init__(*args, **kwargs) - if self.instance.pk: - self.fields["questions"].initial = ( - self.instance.question_set.all().select_subclasses() - ) - - def save(self, commit=True): - quiz = super(QuizAddForm, self).save(commit=False) - quiz.save() - quiz.question_set.set(self.cleaned_data["questions"]) - self.save_m2m() - return quiz - - -class MCQuestionForm(forms.ModelForm): - class Meta: - model = MCQuestion - exclude = () - - -class MCQuestionFormSet(forms.BaseInlineFormSet): - def clean(self): - """ - Custom validation for the formset to ensure: - 1. At least two choices are provided and not marked for deletion. - 2. At least one of the choices is marked as correct. - """ - super().clean() - - # Collect non-deleted forms - valid_forms = [ - form for form in self.forms if not form.cleaned_data.get("DELETE", True) - ] - - valid_choices = [ - "choice_text" in form.cleaned_data.keys() for form in valid_forms - ] - if not all(valid_choices): - raise forms.ValidationError("You must add a valid choice name.") - - # If all forms are deleted, raise a validation error - if len(valid_forms) < 2: - raise forms.ValidationError("You must provide at least two choices.") - - # Check if at least one of the valid forms is marked as correct - correct_choices = [ - form.cleaned_data.get("correct", False) for form in valid_forms - ] - - if not any(correct_choices): - raise forms.ValidationError("One choice must be marked as correct.") - - if correct_choices.count(True) > 1: - raise forms.ValidationError("Only one choice must be marked as correct.") - - -MCQuestionFormSet = inlineformset_factory( - MCQuestion, - Choice, - form=MCQuestionForm, - formset=MCQuestionFormSet, - fields=["choice_text", "correct"], - can_delete=True, - extra=5, -) diff --git a/quiz/migrations/0001_initial.py b/quiz/migrations/0001_initial.py deleted file mode 100644 index 7ab6fb3a..00000000 --- a/quiz/migrations/0001_initial.py +++ /dev/null @@ -1,128 +0,0 @@ -# Generated by Django 4.0.8 on 2024-08-31 11:51 - -from django.conf import settings -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion -import re - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('course', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Question', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('figure', models.ImageField(blank=True, help_text="Add an image for the question if it's necessary.", null=True, upload_to='uploads/%Y/%m/%d', verbose_name='Figure')), - ('content', models.CharField(help_text='Enter the question text that you want displayed', max_length=1000, verbose_name='Question')), - ('explanation', models.TextField(blank=True, help_text='Explanation to be shown after the question has been answered.', max_length=2000, verbose_name='Explanation')), - ], - options={ - 'verbose_name': 'Question', - 'verbose_name_plural': 'Questions', - }, - ), - migrations.CreateModel( - name='Quiz', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=60, verbose_name='Title')), - ('slug', models.SlugField(blank=True, unique=True)), - ('description', models.TextField(blank=True, help_text='A detailed description of the quiz', verbose_name='Description')), - ('category', models.TextField(blank=True, choices=[('assignment', 'Assignment'), ('exam', 'Exam'), ('practice', 'Practice Quiz')])), - ('random_order', models.BooleanField(default=False, help_text='Display the questions in a random order or as they are set?', verbose_name='Random Order')), - ('answers_at_end', models.BooleanField(default=False, help_text='Correct answer is NOT shown after question. Answers displayed at the end.', verbose_name='Answers at end')), - ('exam_paper', models.BooleanField(default=False, help_text='If yes, the result of each attempt by a user will be stored. Necessary for marking.', verbose_name='Exam Paper')), - ('single_attempt', models.BooleanField(default=False, help_text='If yes, only one attempt by a user will be permitted.', verbose_name='Single Attempt')), - ('pass_mark', models.SmallIntegerField(blank=True, default=50, help_text='Percentage required to pass exam.', validators=[django.core.validators.MaxValueValidator(100)], verbose_name='Pass Mark')), - ('draft', models.BooleanField(blank=True, default=False, help_text='If yes, the quiz is not displayed in the quiz list and can only be taken by users who can edit quizzes.', verbose_name='Draft')), - ('timestamp', models.DateTimeField(auto_now=True)), - ('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='course.course')), - ], - options={ - 'verbose_name': 'Quiz', - 'verbose_name_plural': 'Quizzes', - }, - ), - migrations.CreateModel( - name='EssayQuestion', - fields=[ - ('question_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='quiz.question')), - ], - options={ - 'verbose_name': 'Essay style question', - 'verbose_name_plural': 'Essay style questions', - }, - bases=('quiz.question',), - ), - migrations.CreateModel( - name='MCQuestion', - fields=[ - ('question_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='quiz.question')), - ('choice_order', models.CharField(blank=True, choices=[('content', 'Content'), ('random', 'Random'), ('none', 'None')], help_text='The order in which multichoice choice options are displayed to the user', max_length=30, null=True, verbose_name='Choice Order')), - ], - options={ - 'verbose_name': 'Multiple Choice Question', - 'verbose_name_plural': 'Multiple Choice Questions', - }, - bases=('quiz.question',), - ), - migrations.CreateModel( - name='Sitting', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('question_order', models.CharField(max_length=1024, validators=[django.core.validators.RegexValidator(re.compile('^\\d+(?:,\\d+)*\\Z'), code='invalid', message='Enter only digits separated by commas.')], verbose_name='Question Order')), - ('question_list', models.CharField(max_length=1024, validators=[django.core.validators.RegexValidator(re.compile('^\\d+(?:,\\d+)*\\Z'), code='invalid', message='Enter only digits separated by commas.')], verbose_name='Question List')), - ('incorrect_questions', models.CharField(blank=True, max_length=1024, validators=[django.core.validators.RegexValidator(re.compile('^\\d+(?:,\\d+)*\\Z'), code='invalid', message='Enter only digits separated by commas.')], verbose_name='Incorrect questions')), - ('current_score', models.IntegerField(verbose_name='Current Score')), - ('complete', models.BooleanField(default=False, verbose_name='Complete')), - ('user_answers', models.TextField(blank=True, default='{}', verbose_name='User Answers')), - ('start', models.DateTimeField(auto_now_add=True, verbose_name='Start')), - ('end', models.DateTimeField(blank=True, null=True, verbose_name='End')), - ('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='course.course', verbose_name='Course')), - ('quiz', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quiz.quiz', verbose_name='Quiz')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='User')), - ], - options={ - 'permissions': (('view_sittings', 'Can see completed exams.'),), - }, - ), - migrations.AddField( - model_name='question', - name='quiz', - field=models.ManyToManyField(blank=True, to='quiz.quiz', verbose_name='Quiz'), - ), - migrations.CreateModel( - name='Progress', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('score', models.CharField(max_length=1024, validators=[django.core.validators.RegexValidator(re.compile('^\\d+(?:,\\d+)*\\Z'), code='invalid', message='Enter only digits separated by commas.')], verbose_name='Score')), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='User')), - ], - options={ - 'verbose_name': 'User Progress', - 'verbose_name_plural': 'User progress records', - }, - ), - migrations.CreateModel( - name='Choice', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('choice', models.CharField(help_text='Enter the choice text that you want displayed', max_length=1000, verbose_name='Content')), - ('correct', models.BooleanField(default=False, help_text='Is this a correct answer?', verbose_name='Correct')), - ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quiz.mcquestion', verbose_name='Question')), - ], - options={ - 'verbose_name': 'Choice', - 'verbose_name_plural': 'Choices', - }, - ), - ] diff --git a/quiz/migrations/0002_choice_choice_en_choice_choice_ru_and_more.py b/quiz/migrations/0002_choice_choice_en_choice_choice_ru_and_more.py deleted file mode 100644 index c84314ba..00000000 --- a/quiz/migrations/0002_choice_choice_en_choice_choice_ru_and_more.py +++ /dev/null @@ -1,105 +0,0 @@ -# Generated by Django 4.2.16 on 2024-09-29 07:44 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("quiz", "0001_initial"), - ] - - operations = [ - migrations.AddField( - model_name="choice", - name="choice_en", - field=models.CharField( - help_text="Enter the choice text that you want displayed", - max_length=1000, - null=True, - verbose_name="Content", - ), - ), - migrations.AddField( - model_name="choice", - name="choice_ru", - field=models.CharField( - help_text="Enter the choice text that you want displayed", - max_length=1000, - null=True, - verbose_name="Content", - ), - ), - migrations.AddField( - model_name="question", - name="content_en", - field=models.CharField( - help_text="Enter the question text that you want displayed", - max_length=1000, - null=True, - verbose_name="Question", - ), - ), - migrations.AddField( - model_name="question", - name="content_ru", - field=models.CharField( - help_text="Enter the question text that you want displayed", - max_length=1000, - null=True, - verbose_name="Question", - ), - ), - migrations.AddField( - model_name="question", - name="explanation_en", - field=models.TextField( - blank=True, - help_text="Explanation to be shown after the question has been answered.", - max_length=2000, - null=True, - verbose_name="Explanation", - ), - ), - migrations.AddField( - model_name="question", - name="explanation_ru", - field=models.TextField( - blank=True, - help_text="Explanation to be shown after the question has been answered.", - max_length=2000, - null=True, - verbose_name="Explanation", - ), - ), - migrations.AddField( - model_name="quiz", - name="description_en", - field=models.TextField( - blank=True, - help_text="A detailed description of the quiz", - null=True, - verbose_name="Description", - ), - ), - migrations.AddField( - model_name="quiz", - name="description_ru", - field=models.TextField( - blank=True, - help_text="A detailed description of the quiz", - null=True, - verbose_name="Description", - ), - ), - migrations.AddField( - model_name="quiz", - name="title_en", - field=models.CharField(max_length=60, null=True, verbose_name="Title"), - ), - migrations.AddField( - model_name="quiz", - name="title_ru", - field=models.CharField(max_length=60, null=True, verbose_name="Title"), - ), - ] diff --git a/quiz/migrations/0003_choice_choice_es_choice_choice_fr_and_more.py b/quiz/migrations/0003_choice_choice_es_choice_choice_fr_and_more.py deleted file mode 100644 index 8cb5572f..00000000 --- a/quiz/migrations/0003_choice_choice_es_choice_choice_fr_and_more.py +++ /dev/null @@ -1,105 +0,0 @@ -# Generated by Django 4.2.16 on 2024-09-29 13:17 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("quiz", "0002_choice_choice_en_choice_choice_ru_and_more"), - ] - - operations = [ - migrations.AddField( - model_name="choice", - name="choice_es", - field=models.CharField( - help_text="Enter the choice text that you want displayed", - max_length=1000, - null=True, - verbose_name="Content", - ), - ), - migrations.AddField( - model_name="choice", - name="choice_fr", - field=models.CharField( - help_text="Enter the choice text that you want displayed", - max_length=1000, - null=True, - verbose_name="Content", - ), - ), - migrations.AddField( - model_name="question", - name="content_es", - field=models.CharField( - help_text="Enter the question text that you want displayed", - max_length=1000, - null=True, - verbose_name="Question", - ), - ), - migrations.AddField( - model_name="question", - name="content_fr", - field=models.CharField( - help_text="Enter the question text that you want displayed", - max_length=1000, - null=True, - verbose_name="Question", - ), - ), - migrations.AddField( - model_name="question", - name="explanation_es", - field=models.TextField( - blank=True, - help_text="Explanation to be shown after the question has been answered.", - max_length=2000, - null=True, - verbose_name="Explanation", - ), - ), - migrations.AddField( - model_name="question", - name="explanation_fr", - field=models.TextField( - blank=True, - help_text="Explanation to be shown after the question has been answered.", - max_length=2000, - null=True, - verbose_name="Explanation", - ), - ), - migrations.AddField( - model_name="quiz", - name="description_es", - field=models.TextField( - blank=True, - help_text="A detailed description of the quiz", - null=True, - verbose_name="Description", - ), - ), - migrations.AddField( - model_name="quiz", - name="description_fr", - field=models.TextField( - blank=True, - help_text="A detailed description of the quiz", - null=True, - verbose_name="Description", - ), - ), - migrations.AddField( - model_name="quiz", - name="title_es", - field=models.CharField(max_length=60, null=True, verbose_name="Title"), - ), - migrations.AddField( - model_name="quiz", - name="title_fr", - field=models.CharField(max_length=60, null=True, verbose_name="Title"), - ), - ] diff --git a/quiz/migrations/0004_alter_essayquestion_options_and_more.py b/quiz/migrations/0004_alter_essayquestion_options_and_more.py deleted file mode 100644 index bedaf3d7..00000000 --- a/quiz/migrations/0004_alter_essayquestion_options_and_more.py +++ /dev/null @@ -1,130 +0,0 @@ -# Generated by Django 4.2.16 on 2024-10-04 22:51 - -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ("course", "0004_alter_course_code_alter_course_credit_and_more"), - ("quiz", "0003_choice_choice_es_choice_choice_fr_and_more"), - ] - - operations = [ - migrations.AlterModelOptions( - name="essayquestion", - options={ - "verbose_name": "Essay Style Question", - "verbose_name_plural": "Essay Style Questions", - }, - ), - migrations.RenameField( - model_name="choice", - old_name="choice", - new_name="choice_text", - ), - migrations.RenameField( - model_name="choice", - old_name="choice_en", - new_name="choice_text_en", - ), - migrations.RenameField( - model_name="choice", - old_name="choice_es", - new_name="choice_text_es", - ), - migrations.RenameField( - model_name="choice", - old_name="choice_fr", - new_name="choice_text_fr", - ), - migrations.RenameField( - model_name="choice", - old_name="choice_ru", - new_name="choice_text_ru", - ), - migrations.AlterField( - model_name="mcquestion", - name="choice_order", - field=models.CharField( - blank=True, - choices=[ - ("content", "Content"), - ("random", "Random"), - ("none", "None"), - ], - default="random", - help_text="The order in which multiple-choice options are displayed to the user", - max_length=30, - verbose_name="Choice Order", - ), - preserve_default=False, - ), - migrations.AlterField( - model_name="question", - name="figure", - field=models.ImageField( - blank=True, - default="test", - help_text="Add an image for the question if necessary.", - upload_to="uploads/%Y/%m/%d", - verbose_name="Figure", - ), - preserve_default=False, - ), - migrations.AlterField( - model_name="quiz", - name="category", - field=models.CharField( - blank=True, - choices=[ - ("assignment", "Assignment"), - ("exam", "Exam"), - ("practice", "Practice Quiz"), - ], - max_length=20, - ), - ), - migrations.AlterField( - model_name="quiz", - name="course", - field=models.ForeignKey( - default=1, - on_delete=django.db.models.deletion.CASCADE, - to="course.course", - ), - preserve_default=False, - ), - migrations.AlterField( - model_name="quiz", - name="draft", - field=models.BooleanField( - default=False, - help_text="If yes, the quiz is not displayed in the quiz list and can only be taken by users who can edit quizzes.", - verbose_name="Draft", - ), - ), - migrations.AlterField( - model_name="quiz", - name="pass_mark", - field=models.SmallIntegerField( - default=50, - help_text="Percentage required to pass exam.", - validators=[django.core.validators.MaxValueValidator(100)], - verbose_name="Pass Mark", - ), - ), - migrations.AlterField( - model_name="sitting", - name="course", - field=models.ForeignKey( - default=1, - on_delete=django.db.models.deletion.CASCADE, - to="course.course", - verbose_name="Course", - ), - preserve_default=False, - ), - ] diff --git a/quiz/migrations/__init__.py b/quiz/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/quiz/models.py b/quiz/models.py deleted file mode 100644 index 4c8673e7..00000000 --- a/quiz/models.py +++ /dev/null @@ -1,483 +0,0 @@ -import json -import re - -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured, ValidationError -from django.core.validators import ( - MaxValueValidator, - validate_comma_separated_integer_list, -) -from django.db import models -from django.db.models import Q -from django.db.models.signals import pre_save -from django.urls import reverse -from django.utils.timezone import now -from django.utils.translation import gettext_lazy as _ -from django.dispatch import receiver -from model_utils.managers import InheritanceManager - -from course.models import Course -from core.utils import unique_slug_generator - -CHOICE_ORDER_OPTIONS = ( - ("content", _("Content")), - ("random", _("Random")), - ("none", _("None")), -) - -CATEGORY_OPTIONS = ( - ("assignment", _("Assignment")), - ("exam", _("Exam")), - ("practice", _("Practice Quiz")), -) - - -class QuizManager(models.Manager): - def search(self, query=None): - queryset = self.get_queryset() - if query: - or_lookup = ( - Q(title__icontains=query) - | Q(description__icontains=query) - | Q(category__icontains=query) - | Q(slug__icontains=query) - ) - queryset = queryset.filter(or_lookup).distinct() - return queryset - - -class Quiz(models.Model): - course = models.ForeignKey(Course, on_delete=models.CASCADE) - title = models.CharField(verbose_name=_("Title"), max_length=60) - slug = models.SlugField(unique=True, blank=True) - description = models.TextField( - verbose_name=_("Description"), - blank=True, - help_text=_("A detailed description of the quiz"), - ) - category = models.CharField(max_length=20, choices=CATEGORY_OPTIONS, blank=True) - random_order = models.BooleanField( - default=False, - verbose_name=_("Random Order"), - help_text=_("Display the questions in a random order or as they are set?"), - ) - answers_at_end = models.BooleanField( - default=False, - verbose_name=_("Answers at end"), - help_text=_( - "Correct answer is NOT shown after question. Answers displayed at the end." - ), - ) - exam_paper = models.BooleanField( - default=False, - verbose_name=_("Exam Paper"), - help_text=_( - "If yes, the result of each attempt by a user will be stored. Necessary for marking." - ), - ) - single_attempt = models.BooleanField( - default=False, - verbose_name=_("Single Attempt"), - help_text=_("If yes, only one attempt by a user will be permitted."), - ) - pass_mark = models.SmallIntegerField( - default=50, - verbose_name=_("Pass Mark"), - validators=[MaxValueValidator(100)], - help_text=_("Percentage required to pass exam."), - ) - draft = models.BooleanField( - default=False, - verbose_name=_("Draft"), - help_text=_( - "If yes, the quiz is not displayed in the quiz list and can only be taken by users who can edit quizzes." - ), - ) - timestamp = models.DateTimeField(auto_now=True) - - objects = QuizManager() - - class Meta: - verbose_name = _("Quiz") - verbose_name_plural = _("Quizzes") - - def __str__(self): - return self.title - - def save(self, *args, **kwargs): - if self.single_attempt: - self.exam_paper = True - - if not (0 <= self.pass_mark <= 100): - raise ValidationError(_("Pass mark must be between 0 and 100.")) - - super().save(*args, **kwargs) - - def get_questions(self): - return self.question_set.all().select_subclasses() - - @property - def get_max_score(self): - return self.get_questions().count() - - def get_absolute_url(self): - return reverse("quiz_index", kwargs={"slug": self.course.slug}) - - -@receiver(pre_save, sender=Quiz) -def quiz_pre_save_receiver(sender, instance, **kwargs): - if not instance.slug: - instance.slug = unique_slug_generator(instance) - - -class ProgressManager(models.Manager): - def new_progress(self, user): - new_progress = self.create(user=user, score="") - return new_progress - - -class Progress(models.Model): - user = models.OneToOneField( - settings.AUTH_USER_MODEL, verbose_name=_("User"), on_delete=models.CASCADE - ) - score = models.CharField( - max_length=1024, - verbose_name=_("Score"), - validators=[validate_comma_separated_integer_list], - ) - - objects = ProgressManager() - - class Meta: - verbose_name = _("User Progress") - verbose_name_plural = _("User progress records") - - def list_all_cat_scores(self): - return {} # Implement as needed - - def update_score(self, question, score_to_add=0, possible_to_add=0): - if not isinstance(score_to_add, int) or not isinstance(possible_to_add, int): - return _("Error"), _("Invalid score values.") - - to_find = re.escape(str(question.quiz)) + r",(?P\d+),(?P\d+)," - match = re.search(to_find, self.score, re.IGNORECASE) - - if match: - updated_score = int(match.group("score")) + abs(score_to_add) - updated_possible = int(match.group("possible")) + abs(possible_to_add) - new_score = ",".join( - [str(question.quiz), str(updated_score), str(updated_possible), ""] - ) - self.score = self.score.replace(match.group(), new_score) - self.save() - else: - self.score += ",".join( - [str(question.quiz), str(score_to_add), str(possible_to_add), ""] - ) - self.save() - - def show_exams(self): - if self.user.is_superuser: - return Sitting.objects.filter(complete=True).order_by("-end") - else: - return Sitting.objects.filter(user=self.user, complete=True).order_by( - "-end" - ) - - -class SittingManager(models.Manager): - def new_sitting(self, user, quiz, course): - if quiz.random_order: - question_set = quiz.question_set.all().select_subclasses().order_by("?") - else: - question_set = quiz.question_set.all().select_subclasses() - - question_ids = [item.id for item in question_set] - if not question_ids: - raise ImproperlyConfigured( - _( - "Question set of the quiz is empty. Please configure questions properly." - ) - ) - - questions = ",".join(map(str, question_ids)) + "," - - new_sitting = self.create( - user=user, - quiz=quiz, - course=course, - question_order=questions, - question_list=questions, - incorrect_questions="", - current_score=0, - complete=False, - user_answers="{}", - ) - return new_sitting - - def user_sitting(self, user, quiz, course): - if ( - quiz.single_attempt - and self.filter(user=user, quiz=quiz, course=course, complete=True).exists() - ): - return False - try: - sitting = self.get(user=user, quiz=quiz, course=course, complete=False) - except Sitting.DoesNotExist: - sitting = self.new_sitting(user, quiz, course) - except Sitting.MultipleObjectsReturned: - sitting = self.filter( - user=user, quiz=quiz, course=course, complete=False - ).first() - return sitting - - -class Sitting(models.Model): - user = models.ForeignKey( - settings.AUTH_USER_MODEL, verbose_name=_("User"), on_delete=models.CASCADE - ) - quiz = models.ForeignKey(Quiz, verbose_name=_("Quiz"), on_delete=models.CASCADE) - course = models.ForeignKey( - Course, verbose_name=_("Course"), on_delete=models.CASCADE - ) - question_order = models.CharField( - max_length=1024, - verbose_name=_("Question Order"), - validators=[validate_comma_separated_integer_list], - ) - question_list = models.CharField( - max_length=1024, - verbose_name=_("Question List"), - validators=[validate_comma_separated_integer_list], - ) - incorrect_questions = models.CharField( - max_length=1024, - blank=True, - verbose_name=_("Incorrect questions"), - validators=[validate_comma_separated_integer_list], - ) - current_score = models.IntegerField(verbose_name=_("Current Score")) - complete = models.BooleanField(default=False, verbose_name=_("Complete")) - user_answers = models.TextField( - blank=True, default="{}", verbose_name=_("User Answers") - ) - start = models.DateTimeField(auto_now_add=True, verbose_name=_("Start")) - end = models.DateTimeField(null=True, blank=True, verbose_name=_("End")) - - objects = SittingManager() - - class Meta: - permissions = (("view_sittings", _("Can see completed exams.")),) - - def get_first_question(self): - if not self.question_list: - return False - first_question_id = int(self.question_list.split(",", 1)[0]) - return Question.objects.get_subclass(id=first_question_id) - - def remove_first_question(self): - if not self.question_list: - return - _, remaining_questions = self.question_list.split(",", 1) - self.question_list = remaining_questions - self.save() - - def add_to_score(self, points): - self.current_score += int(points) - self.save() - - @property - def get_current_score(self): - return self.current_score - - def _question_ids(self): - return [int(q) for q in self.question_order.split(",") if q] - - @property - def get_percent_correct(self): - total_questions = len(self._question_ids()) - if total_questions == 0: - return 0 - percent = (self.current_score / total_questions) * 100 - return min(max(int(round(percent)), 0), 100) - - def mark_quiz_complete(self): - self.complete = True - self.end = now() - self.save() - - def add_incorrect_question(self, question): - incorrect_ids = self.get_incorrect_questions - incorrect_ids.append(question.id) - self.incorrect_questions = ",".join(map(str, incorrect_ids)) + "," - if self.complete: - self.add_to_score(-1) - self.save() - - @property - def get_incorrect_questions(self): - return [int(q) for q in self.incorrect_questions.split(",") if q] - - def remove_incorrect_question(self, question): - incorrect_ids = self.get_incorrect_questions - if question.id in incorrect_ids: - incorrect_ids.remove(question.id) - self.incorrect_questions = ",".join(map(str, incorrect_ids)) + "," - self.add_to_score(1) - self.save() - - @property - def check_if_passed(self): - return self.get_percent_correct >= self.quiz.pass_mark - - @property - def result_message(self): - if self.check_if_passed: - return _("You have passed this quiz, congratulations!") - else: - return _("You failed this quiz, try again.") - - def add_user_answer(self, question, guess): - user_answers = json.loads(self.user_answers) - user_answers[str(question.id)] = guess - self.user_answers = json.dumps(user_answers) - self.save() - - def get_questions(self, with_answers=False): - question_ids = self._question_ids() - questions = sorted( - self.quiz.question_set.filter(id__in=question_ids).select_subclasses(), - key=lambda q: question_ids.index(q.id), - ) - if with_answers: - user_answers = json.loads(self.user_answers) - for question in questions: - question.user_answer = user_answers.get(str(question.id)) - return questions - - @property - def questions_with_user_answers(self): - return {q: q.user_answer for q in self.get_questions(with_answers=True)} - - @property - def get_max_score(self): - return len(self._question_ids()) - - def progress(self): - answered = len(json.loads(self.user_answers)) - total = self.get_max_score - return answered, total - - -class Question(models.Model): - quiz = models.ManyToManyField(Quiz, verbose_name=_("Quiz"), blank=True) - figure = models.ImageField( - upload_to="uploads/%Y/%m/%d", - blank=True, - verbose_name=_("Figure"), - help_text=_("Add an image for the question if necessary."), - ) - content = models.CharField( - max_length=1000, - help_text=_("Enter the question text that you want displayed"), - verbose_name=_("Question"), - ) - explanation = models.TextField( - max_length=2000, - blank=True, - help_text=_("Explanation to be shown after the question has been answered."), - verbose_name=_("Explanation"), - ) - - objects = InheritanceManager() - - class Meta: - verbose_name = _("Question") - verbose_name_plural = _("Questions") - - def __str__(self): - return self.content - - -class MCQuestion(Question): - choice_order = models.CharField( - max_length=30, - choices=CHOICE_ORDER_OPTIONS, - blank=True, - help_text=_( - "The order in which multiple-choice options are displayed to the user" - ), - verbose_name=_("Choice Order"), - ) - - class Meta: - verbose_name = _("Multiple Choice Question") - verbose_name_plural = _("Multiple Choice Questions") - - def check_if_correct(self, guess): - try: - answer = Choice.objects.get(id=int(guess)) - return answer.correct - except (Choice.DoesNotExist, ValueError): - return False - - def order_choices(self, queryset): - if self.choice_order == "content": - return queryset.order_by("choice_text") - elif self.choice_order == "random": - return queryset.order_by("?") - else: - return queryset - - def get_choices(self): - return self.order_choices(Choice.objects.filter(question=self)) - - def get_choices_list(self): - return [(choice.id, choice.choice_text) for choice in self.get_choices()] - - def answer_choice_to_string(self, guess): - try: - return Choice.objects.get(id=int(guess)).choice_text - except (Choice.DoesNotExist, ValueError): - return "" - - -class Choice(models.Model): - question = models.ForeignKey( - MCQuestion, verbose_name=_("Question"), on_delete=models.CASCADE - ) - choice_text = models.CharField( - max_length=1000, - help_text=_("Enter the choice text that you want displayed"), - verbose_name=_("Content"), - ) - correct = models.BooleanField( - default=False, - help_text=_("Is this a correct answer?"), - verbose_name=_("Correct"), - ) - - class Meta: - verbose_name = _("Choice") - verbose_name_plural = _("Choices") - - def __str__(self): - return self.choice_text - - -class EssayQuestion(Question): - class Meta: - verbose_name = _("Essay Style Question") - verbose_name_plural = _("Essay Style Questions") - - def check_if_correct(self, guess): - return False # Needs manual grading - - def get_answers(self): - return False - - def get_answers_list(self): - return False - - def answer_choice_to_string(self, guess): - return str(guess) diff --git a/quiz/templatetags/__init__.py b/quiz/templatetags/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/quiz/templatetags/quiz_tags.py b/quiz/templatetags/quiz_tags.py deleted file mode 100644 index c5accedf..00000000 --- a/quiz/templatetags/quiz_tags.py +++ /dev/null @@ -1,24 +0,0 @@ -from django import template - -register = template.Library() - - -@register.inclusion_tag("quiz/correct_answer.html", takes_context=True) -def correct_answer_for_all(context, question): - """ - processes the correct answer based on a given question object - if the answer is incorrect, informs the user - """ - answers = question.get_choices() - incorrect_list = context.get("incorrect_questions", []) - if question.id in incorrect_list: - user_was_incorrect = True - else: - user_was_incorrect = False - - return {"previous": {"answers": answers}, "user_was_incorrect": user_was_incorrect} - - -@register.filter -def answer_choice_to_string(question, answer): - return question.answer_choice_to_string(answer) diff --git a/quiz/tests.py b/quiz/tests.py deleted file mode 100644 index 7ce503c2..00000000 --- a/quiz/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/quiz/translation.py b/quiz/translation.py deleted file mode 100644 index cce9c51f..00000000 --- a/quiz/translation.py +++ /dev/null @@ -1,31 +0,0 @@ -from modeltranslation.translator import register, TranslationOptions -from .models import Quiz, Question, Choice, MCQuestion - - -@register(Quiz) -class QuizTranslationOptions(TranslationOptions): - fields = ( - "title", - "description", - ) - empty_values = None - - -@register(Question) -class QuestionTranslationOptions(TranslationOptions): - fields = ( - "content", - "explanation", - ) - empty_values = None - - -@register(Choice) -class ChoiceTranslationOptions(TranslationOptions): - fields = ("choice_text",) - empty_values = None - - -@register(MCQuestion) -class MCQuestionTranslationOptions(TranslationOptions): - pass diff --git a/quiz/urls.py b/quiz/urls.py deleted file mode 100644 index 4e42e7e4..00000000 --- a/quiz/urls.py +++ /dev/null @@ -1,24 +0,0 @@ -from django.urls import path -from . import views - -urlpatterns = [ - path("/quizzes/", views.quiz_list, name="quiz_index"), - path("progress/", view=views.QuizUserProgressView.as_view(), name="quiz_progress"), - # path('marking//', view=QuizMarkingList.as_view(), name='quiz_marking'), - path("marking_list/", view=views.QuizMarkingList.as_view(), name="quiz_marking"), - path( - "marking//", - view=views.QuizMarkingDetail.as_view(), - name="quiz_marking_detail", - ), - path("//take/", view=views.QuizTake.as_view(), name="quiz_take"), - path("/quiz_add/", views.QuizCreateView.as_view(), name="quiz_create"), - path("//add/", views.QuizUpdateView.as_view(), name="quiz_update"), - path("//delete/", views.quiz_delete, name="quiz_delete"), - path( - "mc-question/add///", - views.MCQuestionCreate.as_view(), - name="mc_create", - ), - # path('mc-question/add///', MCQuestionCreate.as_view(), name='mc_create'), -] diff --git a/quiz/utils.py b/quiz/utils.py deleted file mode 100644 index e69de29b..00000000 diff --git a/quiz/views.py b/quiz/views.py deleted file mode 100644 index 263278f6..00000000 --- a/quiz/views.py +++ /dev/null @@ -1,336 +0,0 @@ -from django.contrib import messages -from django.contrib.auth.decorators import login_required -from django.db import transaction -from django.shortcuts import get_object_or_404, redirect, render -from django.utils.decorators import method_decorator -from django.views.generic import ( - CreateView, - DetailView, - FormView, - ListView, - TemplateView, - UpdateView, -) - -from accounts.decorators import lecturer_required -from .forms import ( - EssayForm, - MCQuestionForm, - MCQuestionFormSet, - QuestionForm, - QuizAddForm, -) -from .models import ( - Course, - EssayQuestion, - MCQuestion, - Progress, - Question, - Quiz, - Sitting, -) - - -# ######################################################## -# Quiz Views -# ######################################################## - - -@method_decorator([login_required, lecturer_required], name="dispatch") -class QuizCreateView(CreateView): - model = Quiz - form_class = QuizAddForm - template_name = "quiz/quiz_form.html" - - def get_initial(self): - initial = super().get_initial() - course = get_object_or_404(Course, slug=self.kwargs["slug"]) - initial["course"] = course - return initial - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["course"] = get_object_or_404(Course, slug=self.kwargs["slug"]) - return context - - def form_valid(self, form): - form.instance.course = get_object_or_404(Course, slug=self.kwargs["slug"]) - with transaction.atomic(): - self.object = form.save() - return redirect( - "mc_create", slug=self.kwargs["slug"], quiz_id=self.object.id - ) - - -@method_decorator([login_required, lecturer_required], name="dispatch") -class QuizUpdateView(UpdateView): - model = Quiz - form_class = QuizAddForm - template_name = "quiz/quiz_form.html" - - def get_object(self, queryset=None): - return get_object_or_404(Quiz, pk=self.kwargs["pk"]) - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["course"] = get_object_or_404(Course, slug=self.kwargs["slug"]) - return context - - def form_valid(self, form): - with transaction.atomic(): - self.object = form.save() - return redirect("quiz_index", self.kwargs["slug"]) - - -@login_required -@lecturer_required -def quiz_delete(request, slug, pk): - quiz = get_object_or_404(Quiz, pk=pk) - quiz.delete() - messages.success(request, "Quiz successfully deleted.") - return redirect("quiz_index", slug=slug) - - -@login_required -def quiz_list(request, slug): - course = get_object_or_404(Course, slug=slug) - quizzes = Quiz.objects.filter(course=course).order_by("-timestamp") - return render( - request, "quiz/quiz_list.html", {"quizzes": quizzes, "course": course} - ) - - -# ######################################################## -# Multiple Choice Question Views -# ######################################################## - - -@method_decorator([login_required, lecturer_required], name="dispatch") -class MCQuestionCreate(CreateView): - model = MCQuestion - form_class = MCQuestionForm - template_name = "quiz/mcquestion_form.html" - - # def get_form_kwargs(self): - # kwargs = super().get_form_kwargs() - # kwargs["quiz"] = get_object_or_404(Quiz, id=self.kwargs["quiz_id"]) - # return kwargs - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["course"] = get_object_or_404(Course, slug=self.kwargs["slug"]) - context["quiz_obj"] = get_object_or_404(Quiz, id=self.kwargs["quiz_id"]) - context["quiz_questions_count"] = Question.objects.filter( - quiz=self.kwargs["quiz_id"] - ).count() - if self.request.method == "POST": - context["formset"] = MCQuestionFormSet(self.request.POST) - else: - context["formset"] = MCQuestionFormSet() - return context - - def form_valid(self, form): - context = self.get_context_data() - formset = context["formset"] - if formset.is_valid(): - with transaction.atomic(): - # Save the MCQuestion instance without committing to the database yet - self.object = form.save(commit=False) - self.object.save() - - # Retrieve the Quiz instance - quiz = get_object_or_404(Quiz, id=self.kwargs["quiz_id"]) - - # set the many-to-many relationship - self.object.quiz.add(quiz) - - # Save the formset (choices for the question) - formset.instance = self.object - formset.save() - - if "another" in self.request.POST: - return redirect( - "mc_create", - slug=self.kwargs["slug"], - quiz_id=self.kwargs["quiz_id"], - ) - return redirect("quiz_index", slug=self.kwargs["slug"]) - else: - return self.form_invalid(form) - - -# ######################################################## -# Quiz Progress and Marking Views -# ######################################################## - - -@method_decorator([login_required], name="dispatch") -class QuizUserProgressView(TemplateView): - template_name = "quiz/progress.html" - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - progress, _ = Progress.objects.get_or_create(user=self.request.user) - context["cat_scores"] = progress.list_all_cat_scores - context["exams"] = progress.show_exams() - context["exams_counter"] = context["exams"].count() - return context - - -@method_decorator([login_required, lecturer_required], name="dispatch") -class QuizMarkingList(ListView): - model = Sitting - template_name = "quiz/quiz_marking_list.html" - - def get_queryset(self): - queryset = Sitting.objects.filter(complete=True) - if not self.request.user.is_superuser: - queryset = queryset.filter( - quiz__course__allocated_course__lecturer__pk=self.request.user.id - ) - quiz_filter = self.request.GET.get("quiz_filter") - if quiz_filter: - queryset = queryset.filter(quiz__title__icontains=quiz_filter) - user_filter = self.request.GET.get("user_filter") - if user_filter: - queryset = queryset.filter(user__username__icontains=user_filter) - return queryset - - -@method_decorator([login_required, lecturer_required], name="dispatch") -class QuizMarkingDetail(DetailView): - model = Sitting - template_name = "quiz/quiz_marking_detail.html" - - def post(self, request, *args, **kwargs): - sitting = self.get_object() - question_id = request.POST.get("qid") - if question_id: - question = Question.objects.get_subclass(id=int(question_id)) - if int(question_id) in sitting.get_incorrect_questions: - sitting.remove_incorrect_question(question) - else: - sitting.add_incorrect_question(question) - return self.get(request, *args, **kwargs) - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["questions"] = self.object.get_questions(with_answers=True) - return context - - -# ######################################################## -# Quiz Taking View -# ######################################################## - - -@method_decorator([login_required], name="dispatch") -class QuizTake(FormView): - form_class = QuestionForm - template_name = "quiz/question.html" - result_template_name = "quiz/result.html" - - def dispatch(self, request, *args, **kwargs): - self.quiz = get_object_or_404(Quiz, slug=self.kwargs["slug"]) - self.course = get_object_or_404(Course, pk=self.kwargs["pk"]) - if not Question.objects.filter(quiz=self.quiz).exists(): - messages.warning(request, "This quiz has no questions available.") - return redirect("quiz_index", slug=self.course.slug) - - self.sitting = Sitting.objects.user_sitting( - request.user, self.quiz, self.course - ) - if not self.sitting: - messages.info( - request, - "You have already completed this quiz. Only one attempt is permitted.", - ) - return redirect("quiz_index", slug=self.course.slug) - - # Set self.question and self.progress here - self.question = self.sitting.get_first_question() - self.progress = self.sitting.progress() - - return super().dispatch(request, *args, **kwargs) - - def get_form_kwargs(self): - kwargs = super().get_form_kwargs() - kwargs["question"] = self.question - return kwargs - - def get_form_class(self): - if isinstance(self.question, EssayQuestion): - return EssayForm - return self.form_class - - def form_valid(self, form): - self.form_valid_user(form) - if not self.sitting.get_first_question(): - return self.final_result_user() - return super().get(self.request) - - def form_valid_user(self, form): - progress, _ = Progress.objects.get_or_create(user=self.request.user) - guess = form.cleaned_data["answers"] - is_correct = self.question.check_if_correct(guess) - - if is_correct: - self.sitting.add_to_score(1) - progress.update_score(self.question, 1, 1) - else: - self.sitting.add_incorrect_question(self.question) - progress.update_score(self.question, 0, 1) - - if not self.quiz.answers_at_end: - self.previous = { - "previous_answer": guess, - "previous_outcome": is_correct, - "previous_question": self.question, - "answers": self.question.get_choices(), - "question_type": {self.question.__class__.__name__: True}, - } - else: - self.previous = {} - - self.sitting.add_user_answer(self.question, guess) - self.sitting.remove_first_question() - - # Update self.question and self.progress for the next question - self.question = self.sitting.get_first_question() - self.progress = self.sitting.progress() - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["question"] = self.question - context["quiz"] = self.quiz - context["course"] = self.course - if hasattr(self, "previous"): - context["previous"] = self.previous - if hasattr(self, "progress"): - context["progress"] = self.progress - return context - - def final_result_user(self): - self.sitting.mark_quiz_complete() - results = { - "course": self.course, - "quiz": self.quiz, - "score": self.sitting.get_current_score, - "max_score": self.sitting.get_max_score, - "percent": self.sitting.get_percent_correct, - "sitting": self.sitting, - "previous": getattr(self, "previous", {}), - } - - if self.quiz.answers_at_end: - results["questions"] = self.sitting.get_questions(with_answers=True) - results["incorrect_questions"] = self.sitting.get_incorrect_questions - - if ( - not self.quiz.exam_paper - or self.request.user.is_superuser - or self.request.user.is_lecturer - ): - self.sitting.delete() - - return render(self.request, self.result_template_name, results) diff --git a/requirements.in b/requirements.in new file mode 100644 index 00000000..b8c95b9e --- /dev/null +++ b/requirements.in @@ -0,0 +1,52 @@ +# Web framework +Django +djangorestframework +djangorestframework-simplejwt +django-cors-headers +django-filter +drf-spectacular + +# Cache & async tasks +redis +celery +django-redis + +# Database +psycopg2-binary + +# Config +python-decouple +python-dotenv + +# Static files +whitenoise + +# Admin +django-jet-reboot + +# Forms +crispy-bootstrap5 +django-crispy-forms + +# Payments +stripe + +# PDF generation +reportlab +xhtml2pdf +svglib +pillow + +# Testing +factory-boy +Faker + +# Logging & monitoring +structlog +sentry-sdk + +# Dev tools +pre-commit +flake8 +isort +black diff --git a/requirements.txt b/requirements.txt index 9e838cee..412497b0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,267 @@ --r requirements/local.txt +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --output-file=requirements.txt --strip-extras requirements.in +# +amqp==5.3.1 + # via kombu +arabic-reshaper==3.0.0 + # via xhtml2pdf +asgiref==3.11.0 + # via + # django + # django-cors-headers +asn1crypto==1.5.1 + # via + # oscrypto + # pyhanko + # pyhanko-certvalidator +attrs==25.4.0 + # via + # jsonschema + # referencing +billiard==4.2.4 + # via celery +black==22.12.0 + # via -r requirements.in +celery==5.6.3 + # via -r requirements.in +certifi==2025.11.12 + # via + # requests + # sentry-sdk +cffi==2.0.0 + # via cryptography +cfgv==3.5.0 + # via pre-commit +charset-normalizer==3.4.4 + # via requests +click==8.3.1 + # via + # black + # celery + # click-didyoumean + # click-plugins + # click-repl +click-didyoumean==0.3.1 + # via celery +click-plugins==1.1.1.2 + # via celery +click-repl==0.3.0 + # via celery +colorama==0.4.6 + # via click +crispy-bootstrap5==0.7 + # via -r requirements.in +cryptography==46.0.3 + # via + # pyhanko + # pyhanko-certvalidator +cssselect2==0.8.0 + # via svglib +distlib==0.4.0 + # via virtualenv +django==4.2.20 + # via + # -r requirements.in + # crispy-bootstrap5 + # django-cors-headers + # django-filter + # django-jet-reboot + # django-redis + # djangorestframework + # djangorestframework-simplejwt + # drf-spectacular +django-cors-headers==4.9.0 + # via -r requirements.in +django-crispy-forms==1.14.0 + # via + # -r requirements.in + # crispy-bootstrap5 +django-filter==23.5 + # via -r requirements.in +django-jet-reboot==1.3.10 + # via -r requirements.in +django-redis==6.0.0 + # via -r requirements.in +djangorestframework==3.16.1 + # via + # -r requirements.in + # djangorestframework-simplejwt + # drf-spectacular +djangorestframework-simplejwt==5.5.1 + # via -r requirements.in +drf-spectacular==0.29.0 + # via -r requirements.in +factory-boy==3.3.1 + # via -r requirements.in +faker==38.2.0 + # via + # -r requirements.in + # factory-boy +filelock==3.25.2 + # via + # python-discovery + # virtualenv +flake8==7.1.1 + # via -r requirements.in +html5lib==1.1 + # via xhtml2pdf +identify==2.6.18 + # via pre-commit +idna==3.11 + # via requests +inflection==0.5.1 + # via drf-spectacular +isort==5.13.2 + # via -r requirements.in +jsonschema==4.25.1 + # via drf-spectacular +jsonschema-specifications==2025.9.1 + # via jsonschema +kombu==5.6.2 + # via celery +lxml==6.0.2 + # via + # pyhanko + # svglib +mccabe==0.7.0 + # via flake8 +mypy-extensions==1.1.0 + # via black +nodeenv==1.10.0 + # via pre-commit +oscrypto==1.3.0 + # via pyhanko-certvalidator +packaging==26.0 + # via kombu +pathspec==0.12.1 + # via black +pillow==12.0.0 + # via + # -r requirements.in + # reportlab + # xhtml2pdf +platformdirs==4.5.1 + # via + # black + # python-discovery + # virtualenv +pre-commit==3.8.0 + # via -r requirements.in +prompt-toolkit==3.0.52 + # via click-repl +psycopg2-binary==2.9.11 + # via -r requirements.in +pycodestyle==2.12.1 + # via flake8 +pycparser==2.23 + # via cffi +pyflakes==3.2.0 + # via flake8 +pyhanko==0.32.0 + # via xhtml2pdf +pyhanko-certvalidator==0.29.0 + # via + # pyhanko + # xhtml2pdf +pyjwt==2.10.1 + # via djangorestframework-simplejwt +pypdf==6.4.0 + # via xhtml2pdf +python-bidi==0.6.7 + # via xhtml2pdf +python-dateutil==2.9.0.post0 + # via celery +python-decouple==3.8 + # via -r requirements.in +python-discovery==1.2.2 + # via virtualenv +python-dotenv==1.2.1 + # via -r requirements.in +pyyaml==6.0.3 + # via + # drf-spectacular + # pre-commit + # pyhanko +redis==7.4.0 + # via + # -r requirements.in + # django-redis +referencing==0.37.0 + # via + # jsonschema + # jsonschema-specifications +reportlab==4.0.4 + # via + # -r requirements.in + # svglib + # xhtml2pdf +requests==2.32.5 + # via + # pyhanko + # pyhanko-certvalidator + # stripe +rpds-py==0.30.0 + # via + # jsonschema + # referencing +sentry-sdk==2.57.0 + # via -r requirements.in +six==1.17.0 + # via + # html5lib + # python-dateutil +sqlparse==0.5.4 + # via django +stripe==5.5.0 + # via -r requirements.in +structlog==25.5.0 + # via -r requirements.in +svglib==1.5.1 + # via + # -r requirements.in + # xhtml2pdf +tinycss2==1.5.1 + # via + # cssselect2 + # svglib +typing-extensions==4.15.0 + # via referencing +tzdata==2025.2 + # via + # django + # faker + # kombu + # tzlocal +tzlocal==5.3.1 + # via + # celery + # pyhanko +uritemplate==4.2.0 + # via drf-spectacular +uritools==5.0.0 + # via pyhanko-certvalidator +urllib3==2.5.0 + # via + # requests + # sentry-sdk +vine==5.1.0 + # via + # amqp + # celery + # kombu +virtualenv==21.2.1 + # via pre-commit +wcwidth==0.6.0 + # via prompt-toolkit +webencodings==0.5.1 + # via + # cssselect2 + # html5lib + # tinycss2 +whitenoise==6.2.0 + # via -r requirements.in +xhtml2pdf==0.2.15 + # via -r requirements.in diff --git a/result/__init__.py b/result/__init__.py index e69de29b..8090dd13 100644 --- a/result/__init__.py +++ b/result/__init__.py @@ -0,0 +1,2 @@ +# result/__init__.py +default_app_config = "result.apps.ResultConfig" diff --git a/result/admin.py b/result/admin.py index c79fb16c..7cf3997c 100644 --- a/result/admin.py +++ b/result/admin.py @@ -1,23 +1,7 @@ from django.contrib import admin -from django.contrib.auth.models import Group -from .models import TakenCourse, Result +from .models import Grade_1st_module, Grade_2nd_module, Grade_semester - -class ScoreAdmin(admin.ModelAdmin): - list_display = [ - "student", - "course", - "assignment", - "mid_exam", - "quiz", - "attendance", - "final_exam", - "total", - "grade", - "comment", - ] - - -admin.site.register(TakenCourse, ScoreAdmin) -admin.site.register(Result) +admin.site.register(Grade_1st_module) +admin.site.register(Grade_2nd_module) +admin.site.register(Grade_semester) diff --git a/result/apps.py b/result/apps.py index 8afd05cf..f6510a6f 100644 --- a/result/apps.py +++ b/result/apps.py @@ -1,5 +1,10 @@ +# result/apps.py from django.apps import AppConfig class ResultConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" name = "result" + + def ready(self): + import result.signals # noqa: F401 # registers signal handlers diff --git a/result/migrations/0001_initial.py b/result/migrations/0001_initial.py index 8c2dd6a4..0ca041b6 100644 --- a/result/migrations/0001_initial.py +++ b/result/migrations/0001_initial.py @@ -1,7 +1,10 @@ -# Generated by Django 4.0.8 on 2024-08-31 11:51 +# Generated by Django 5.2.8 on 2025-12-30 04:24 + +from decimal import Decimal -from django.db import migrations, models import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): @@ -9,38 +12,310 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('accounts', '0001_initial'), - ('course', '0001_initial'), + ("accounts", "0004_add_lecturer_model"), + ("core", "0002_alter_courseallocation_lecturer"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( - name='TakenCourse', + name="Grade_1st_module", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "attendance", + models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=5 + ), + ), + ( + "activities", + models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=5 + ), + ), + ( + "exam", + models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=5 + ), + ), + ( + "total", + models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=5 + ), + ), + ( + "grade", + models.CharField( + blank=True, + choices=[ + ("A+", "A+"), + ("A", "A"), + ("A-", "A-"), + ("B+", "B+"), + ("B", "B"), + ("B-", "B-"), + ("C+", "C+"), + ("C", "C"), + ("C-", "C-"), + ("D", "D"), + ("F", "F"), + ("NG", "NG"), + ], + max_length=2, + null=True, + ), + ), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_grade_1st", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "course", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="grade_1st_courses", + to="core.course", + ), + ), + ( + "lecturer", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="grade_1st_lecturer", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "student", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="accounts.student", + ), + ), + ], + options={ + "unique_together": {("student", "course")}, + }, + ), + migrations.CreateModel( + name="Grade_2nd_module", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('assignment', models.DecimalField(decimal_places=2, default=0.0, max_digits=5)), - ('mid_exam', models.DecimalField(decimal_places=2, default=0.0, max_digits=5)), - ('quiz', models.DecimalField(decimal_places=2, default=0.0, max_digits=5)), - ('attendance', models.DecimalField(decimal_places=2, default=0.0, max_digits=5)), - ('final_exam', models.DecimalField(decimal_places=2, default=0.0, max_digits=5)), - ('total', models.DecimalField(decimal_places=2, default=0.0, max_digits=5)), - ('grade', models.CharField(blank=True, choices=[('A+', 'A+'), ('A', 'A'), ('A-', 'A-'), ('B+', 'B+'), ('B', 'B'), ('B-', 'B-'), ('C+', 'C+'), ('C', 'C'), ('C-', 'C-'), ('D', 'D'), ('F', 'F'), ('NG', 'NG')], max_length=2)), - ('point', models.DecimalField(decimal_places=2, default=0.0, max_digits=5)), - ('comment', models.CharField(blank=True, choices=[('PASS', 'PASS'), ('FAIL', 'FAIL')], max_length=200)), - ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='taken_courses', to='course.course')), - ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='accounts.student')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "attendance", + models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=5 + ), + ), + ( + "activities", + models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=5 + ), + ), + ( + "exam", + models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=5 + ), + ), + ( + "total", + models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=5 + ), + ), + ( + "grade", + models.CharField( + blank=True, + choices=[ + ("A+", "A+"), + ("A", "A"), + ("A-", "A-"), + ("B+", "B+"), + ("B", "B"), + ("B-", "B-"), + ("C+", "C+"), + ("C", "C"), + ("C-", "C-"), + ("D", "D"), + ("F", "F"), + ("NG", "NG"), + ], + max_length=2, + null=True, + ), + ), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_grade_2nd", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "course", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="grade_2nd_courses", + to="core.course", + ), + ), + ( + "lecturer", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="grade_2nd_lecturer", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "student", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="accounts.student", + ), + ), ], + options={ + "unique_together": {("student", "course")}, + }, ), migrations.CreateModel( - name='Result', + name="Grade_semester", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('gpa', models.FloatField(null=True)), - ('cgpa', models.FloatField(null=True)), - ('semester', models.CharField(choices=[('First', 'First'), ('Second', 'Second'), ('Third', 'Third')], max_length=100)), - ('session', models.CharField(blank=True, max_length=100, null=True)), - ('level', models.CharField(choices=[('Bachloar', 'Bachloar Degree'), ('Master', 'Master Degree')], max_length=25, null=True)), - ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='accounts.student')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "attendance", + models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=5 + ), + ), + ( + "activities", + models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=5 + ), + ), + ( + "exam", + models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=5 + ), + ), + ( + "total", + models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=5 + ), + ), + ( + "grade", + models.CharField( + blank=True, + choices=[ + ("A+", "A+"), + ("A", "A"), + ("A-", "A-"), + ("B+", "B+"), + ("B", "B"), + ("B-", "B-"), + ("C+", "C+"), + ("C", "C"), + ("C-", "C-"), + ("D", "D"), + ("F", "F"), + ("NG", "NG"), + ], + max_length=2, + null=True, + ), + ), + ( + "admin", + models.ForeignKey( + blank=True, + limit_choices_to={"is_superuser": True}, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="created_grade_semester", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "course", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="grade_semester_courses", + to="core.course", + ), + ), + ( + "lecturer", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="grade_semester_lecturer", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "semester", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="core.semester", + ), + ), + ( + "student", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="accounts.student", + ), + ), ], + options={ + "unique_together": {("student", "course", "semester")}, + }, ), ] diff --git a/result/migrations/0002_alter_result_level_alter_takencourse_comment_and_more.py b/result/migrations/0002_alter_result_level_alter_takencourse_comment_and_more.py deleted file mode 100644 index 22f84d75..00000000 --- a/result/migrations/0002_alter_result_level_alter_takencourse_comment_and_more.py +++ /dev/null @@ -1,70 +0,0 @@ -# Generated by Django 4.2.16 on 2024-10-04 22:51 - -from decimal import Decimal -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("result", "0001_initial"), - ] - - operations = [ - migrations.AlterField( - model_name="result", - name="level", - field=models.CharField( - choices=[("Bachelor", "Bachelor Degree"), ("Master", "Master Degree")], - max_length=25, - null=True, - ), - ), - migrations.AlterField( - model_name="takencourse", - name="comment", - field=models.CharField( - blank=True, - choices=[("PASS", "PASS"), ("FAIL", "FAIL")], - editable=False, - max_length=200, - ), - ), - migrations.AlterField( - model_name="takencourse", - name="grade", - field=models.CharField( - blank=True, - choices=[ - ("A+", "A+"), - ("A", "A"), - ("A-", "A-"), - ("B+", "B+"), - ("B", "B"), - ("B-", "B-"), - ("C+", "C+"), - ("C", "C"), - ("C-", "C-"), - ("D", "D"), - ("F", "F"), - ("NG", "NG"), - ], - editable=False, - max_length=2, - ), - ), - migrations.AlterField( - model_name="takencourse", - name="point", - field=models.DecimalField( - decimal_places=2, default=Decimal("0.00"), editable=False, max_digits=5 - ), - ), - migrations.AlterField( - model_name="takencourse", - name="total", - field=models.DecimalField( - decimal_places=2, default=Decimal("0.00"), editable=False, max_digits=5 - ), - ), - ] diff --git a/result/models.py b/result/models.py index ba036193..a66cbcd9 100644 --- a/result/models.py +++ b/result/models.py @@ -1,12 +1,7 @@ from decimal import Decimal -from django.conf import settings +from django.conf import settings from django.db import models -from django.urls import reverse - -from accounts.models import Student -from core.models import Semester -from course.models import Course A_PLUS = "A+" A = "A" @@ -58,132 +53,110 @@ (0, F), ] -GRADE_POINT_MAPPING = { - A_PLUS: 4.0, - A: 4.0, - A_MINUS: 3.75, - B_PLUS: 3.5, - B: 3.0, - B_MINUS: 2.75, - C_PLUS: 2.5, - C: 2.0, - C_MINUS: 1.75, - D: 1.0, - F: 0.0, - NG: 0.0, -} - - -class TakenCourse(models.Model): - student = models.ForeignKey(Student, on_delete=models.CASCADE) + +class Grade_1st_module(models.Model): + lecturer = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="grade_1st_lecturer", + ) + student = models.ForeignKey("accounts.Student", on_delete=models.CASCADE) course = models.ForeignKey( - Course, on_delete=models.CASCADE, related_name="taken_courses" + "core.Course", on_delete=models.CASCADE, related_name="grade_1st_courses" ) - assignment = models.DecimalField( + attendance = models.DecimalField( max_digits=5, decimal_places=2, default=Decimal("0.00") ) - mid_exam = models.DecimalField( + activities = models.DecimalField( max_digits=5, decimal_places=2, default=Decimal("0.00") ) - quiz = models.DecimalField(max_digits=5, decimal_places=2, default=Decimal("0.00")) + exam = models.DecimalField(max_digits=5, decimal_places=2, default=Decimal("0.00")) + total = models.DecimalField(max_digits=5, decimal_places=2, default=Decimal("0.00")) + grade = models.CharField(max_length=2, choices=GRADE_CHOICES, blank=True, null=True) + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_grade_1st", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, + ) + + class Meta: + unique_together = ["student", "course"] + + def __str__(self): + return f"{self.student} - {self.course} (1st Module)" + + +class Grade_2nd_module(models.Model): + lecturer = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="grade_2nd_lecturer", + ) + student = models.ForeignKey("accounts.Student", on_delete=models.CASCADE) + course = models.ForeignKey( + "core.Course", on_delete=models.CASCADE, related_name="grade_2nd_courses" + ) attendance = models.DecimalField( max_digits=5, decimal_places=2, default=Decimal("0.00") ) - final_exam = models.DecimalField( + activities = models.DecimalField( max_digits=5, decimal_places=2, default=Decimal("0.00") ) - total = models.DecimalField( - max_digits=5, decimal_places=2, default=Decimal("0.00"), editable=False + exam = models.DecimalField(max_digits=5, decimal_places=2, default=Decimal("0.00")) + total = models.DecimalField(max_digits=5, decimal_places=2, default=Decimal("0.00")) + grade = models.CharField(max_length=2, choices=GRADE_CHOICES, blank=True, null=True) + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_grade_2nd", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, ) - grade = models.CharField( - choices=GRADE_CHOICES, max_length=2, blank=True, editable=False + + class Meta: + unique_together = ["student", "course"] + + def __str__(self): + return f"{self.student} - {self.course} (2nd Module)" + + +class Grade_semester(models.Model): + lecturer = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="grade_semester_lecturer", ) - point = models.DecimalField( - max_digits=5, decimal_places=2, default=Decimal("0.00"), editable=False + semester = models.ForeignKey( + "core.Semester", on_delete=models.CASCADE, blank=True, null=True ) - comment = models.CharField( - choices=COMMENT_CHOICES, max_length=200, blank=True, editable=False + student = models.ForeignKey("accounts.Student", on_delete=models.CASCADE) + course = models.ForeignKey( + "core.Course", on_delete=models.CASCADE, related_name="grade_semester_courses" + ) + attendance = models.DecimalField( + max_digits=5, decimal_places=2, default=Decimal("0.00") + ) + activities = models.DecimalField( + max_digits=5, decimal_places=2, default=Decimal("0.00") + ) + exam = models.DecimalField(max_digits=5, decimal_places=2, default=Decimal("0.00")) + total = models.DecimalField(max_digits=5, decimal_places=2, default=Decimal("0.00")) + grade = models.CharField(max_length=2, choices=GRADE_CHOICES, blank=True, null=True) + admin = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="created_grade_semester", + limit_choices_to={"is_superuser": True}, + null=True, + blank=True, ) - def get_absolute_url(self): - return reverse("course_detail", kwargs={"slug": self.course.slug}) - - def __str__(self): - return f"{self.course.title} ({self.course.code})" - - def get_total(self): - return sum( - [ - Decimal(self.assignment), - Decimal(self.mid_exam), - Decimal(self.quiz), - Decimal(self.attendance), - Decimal(self.final_exam), - ] - ) - - def get_grade(self): - total = self.total - for boundary, grade in GRADE_BOUNDARIES: - if total >= boundary: - return grade - return NG - - def get_comment(self): - if self.grade in [F, NG]: - return FAIL - return PASS - - def get_point(self): - credit = self.course.credit - grade_point = GRADE_POINT_MAPPING.get(self.grade, 0.0) - return Decimal(credit) * Decimal(grade_point) - - def save(self, *args, **kwargs): - self.total = self.get_total() - self.grade = self.get_grade() - self.point = self.get_point() - self.comment = self.get_comment() - super().save(*args, **kwargs) - - def calculate_gpa(self): - current_semester = Semester.objects.filter(is_current_semester=True).first() - if not current_semester: - return Decimal("0.00") - - taken_courses = TakenCourse.objects.filter( - student=self.student, - course__level=self.student.level, - course__semester=current_semester.semester, - ) - - total_points = sum(tc.point for tc in taken_courses) - total_credits = sum(tc.course.credit for tc in taken_courses) - - if total_credits > 0: - gpa = total_points / Decimal(total_credits) - return round(gpa, 2) - return Decimal("0.00") - - def calculate_cgpa(self): - taken_courses = TakenCourse.objects.filter(student=self.student) - - total_points = sum(tc.point for tc in taken_courses) - total_credits = sum(tc.course.credit for tc in taken_courses) - - if total_credits > 0: - cgpa = total_points / Decimal(total_credits) - return round(cgpa, 2) - return Decimal("0.00") - - -class Result(models.Model): - student = models.ForeignKey(Student, on_delete=models.CASCADE) - gpa = models.FloatField(null=True) - cgpa = models.FloatField(null=True) - semester = models.CharField(max_length=100, choices=settings.SEMESTER_CHOICES) - session = models.CharField(max_length=100, blank=True, null=True) - level = models.CharField(max_length=25, choices=settings.LEVEL_CHOICES, null=True) + class Meta: + unique_together = ["student", "course", "semester"] def __str__(self): - return f"Result for {self.student} - Semester: {self.semester}, Level: {self.level}" + return f"{self.student} - {self.course} (Semester)" diff --git a/result/permissions.py b/result/permissions.py new file mode 100644 index 00000000..52ba6217 --- /dev/null +++ b/result/permissions.py @@ -0,0 +1,21 @@ +from rest_framework import permissions + + +class IsLecturer(permissions.BasePermission): + """ + Custom permission to only allow lecturers to access the view. + """ + + message = "Only lecturers are allowed to perform this action." + + def has_permission(self, request, view): + # Check if user is authenticated + if not request.user or not request.user.is_authenticated: + return False + + # Check if user is a lecturer + return getattr(request.user, "lecturer", False) + + def has_object_permission(self, request, view, obj): + # For object-level permissions, also check if user is lecturer + return self.has_permission(request, view) diff --git a/result/serializers.py b/result/serializers.py new file mode 100644 index 00000000..80de0854 --- /dev/null +++ b/result/serializers.py @@ -0,0 +1,216 @@ +from rest_framework import serializers + +from .models import Grade_1st_module, Grade_2nd_module, Grade_semester + + +class StudentGradeSerializer(serializers.ModelSerializer): + student_name = serializers.CharField(source="student.get_full_name", read_only=True) + student_id = serializers.CharField( + source="student.student.username", read_only=True + ) + + class Meta: + fields = ["student", "student_name", "student_id"] + + +# Сериализаторы для студентов (только чтение) +class StudentGrade1stModuleSerializer(StudentGradeSerializer): + course_title = serializers.CharField(source="course.name", read_only=True) + lecturer_name = serializers.CharField( + source="lecturer.get_full_name", read_only=True + ) + + class Meta(StudentGradeSerializer.Meta): + model = Grade_1st_module + fields = StudentGradeSerializer.Meta.fields + [ + "id", + "course", + "course_title", + "lecturer", + "lecturer_name", + "attendance", + "activities", + "exam", + "total", + "grade", + ] + read_only_fields = ["attendance", "activities", "exam", "total", "grade"] + + +class StudentGrade2ndModuleSerializer(StudentGradeSerializer): + course_title = serializers.CharField(source="course.name", read_only=True) + lecturer_name = serializers.CharField( + source="lecturer.get_full_name", read_only=True + ) + + class Meta(StudentGradeSerializer.Meta): + model = Grade_2nd_module + fields = StudentGradeSerializer.Meta.fields + [ + "id", + "course", + "course_title", + "lecturer", + "lecturer_name", + "attendance", + "activities", + "exam", + "total", + "grade", + ] + read_only_fields = ["attendance", "activities", "exam", "total", "grade"] + + +class StudentGradeSemesterSerializer(StudentGradeSerializer): + course_title = serializers.CharField(source="course.name", read_only=True) + lecturer_name = serializers.CharField( + source="lecturer.get_full_name", read_only=True + ) + semester_name = serializers.CharField(source="semester.semester", read_only=True) + + class Meta(StudentGradeSerializer.Meta): + model = Grade_semester + fields = StudentGradeSerializer.Meta.fields + [ + "id", + "course", + "course_title", + "lecturer", + "lecturer_name", + "semester", + "semester_name", + "attendance", + "activities", + "exam", + "total", + "grade", + ] + read_only_fields = ["attendance", "activities", "exam", "total", "grade"] + + +# Сериализаторы для преподавателей (можно редактировать) +class LecturerGrade1stModuleSerializer(StudentGradeSerializer): + course_title = serializers.CharField(source="course.name", read_only=True) + lecturer_name = serializers.CharField( + source="lecturer.get_full_name", read_only=True + ) + + class Meta(StudentGradeSerializer.Meta): + model = Grade_1st_module + fields = StudentGradeSerializer.Meta.fields + [ + "id", + "course", + "course_title", + "lecturer", + "lecturer_name", + "attendance", + "activities", + "exam", + "total", + "grade", + ] + + def validate(self, data): + attendance = data.get( + "attendance", self.instance.attendance if self.instance else 0 + ) + activities = data.get( + "activities", self.instance.activities if self.instance else 0 + ) + exam = data.get("exam", self.instance.exam if self.instance else 0) + + data["total"] = attendance + activities + exam + return data + + +class LecturerGrade2ndModuleSerializer(StudentGradeSerializer): + course_title = serializers.CharField(source="course.name", read_only=True) + lecturer_name = serializers.CharField( + source="lecturer.get_full_name", read_only=True + ) + + class Meta(StudentGradeSerializer.Meta): + model = Grade_2nd_module + fields = StudentGradeSerializer.Meta.fields + [ + "id", + "course", + "course_title", + "lecturer", + "lecturer_name", + "attendance", + "activities", + "exam", + "total", + "grade", + ] + + def validate(self, data): + attendance = data.get( + "attendance", self.instance.attendance if self.instance else 0 + ) + activities = data.get( + "activities", self.instance.activities if self.instance else 0 + ) + exam = data.get("exam", self.instance.exam if self.instance else 0) + + data["total"] = attendance + activities + exam + return data + + +class LecturerGradeSemesterSerializer(StudentGradeSerializer): + course_title = serializers.CharField(source="course.name", read_only=True) + lecturer_name = serializers.CharField( + source="lecturer.get_full_name", read_only=True + ) + semester_name = serializers.CharField(source="semester.semester", read_only=True) + + class Meta(StudentGradeSerializer.Meta): + model = Grade_semester + fields = StudentGradeSerializer.Meta.fields + [ + "id", + "course", + "course_title", + "lecturer", + "lecturer_name", + "semester", + "semester_name", + "attendance", + "activities", + "exam", + "total", + "grade", + ] + + def validate(self, data): + attendance = data.get( + "attendance", self.instance.attendance if self.instance else 0 + ) + activities = data.get( + "activities", self.instance.activities if self.instance else 0 + ) + exam = data.get("exam", self.instance.exam if self.instance else 0) + + data["total"] = attendance + activities + exam + return data + + +# Сериализатор для массового обновления оценок (ОСТАВЛЯЕМ ТОЛЬКО ЭТОТ) +class BulkGradeUpdateSerializer(serializers.Serializer): + student_id = serializers.IntegerField() + attendance = serializers.DecimalField( + max_digits=5, decimal_places=2, required=False + ) + activities = serializers.DecimalField( + max_digits=5, decimal_places=2, required=False + ) + exam = serializers.DecimalField(max_digits=5, decimal_places=2, required=False) + + +class BulkGradesUpdateSerializer(serializers.Serializer): + course_id = serializers.IntegerField() + grade_type = serializers.ChoiceField( + choices=["1st_module", "2nd_module", "semester"] + ) + grades = BulkGradeUpdateSerializer(many=True) + + def validate(self, data): + # Дополнительная валидация если нужно + return data diff --git a/result/signals.py b/result/signals.py new file mode 100644 index 00000000..fe56915a --- /dev/null +++ b/result/signals.py @@ -0,0 +1 @@ +# result/signals.py diff --git a/result/tests.py b/result/tests.py deleted file mode 100644 index 7ce503c2..00000000 --- a/result/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/quiz/__init__.py b/result/tests/__init__.py similarity index 100% rename from quiz/__init__.py rename to result/tests/__init__.py diff --git a/result/tests/test_views.py b/result/tests/test_views.py new file mode 100644 index 00000000..65ee1a32 --- /dev/null +++ b/result/tests/test_views.py @@ -0,0 +1,439 @@ +from decimal import Decimal + +from course.models import Course, CourseAllocation, Program +from django.contrib.auth import get_user_model +from django.urls import reverse +from rest_framework import status +from rest_framework.test import APIClient, APITestCase + +from accounts.models import Student +from core.models import Semester +from result.models import Grade_1st_module, Grade_2nd_module, Grade_semester + +User = get_user_model() + + +class ResultViewsTestCase(APITestCase): + """Тесты для views результатов""" + + def setUp(self): + """Настройка тестовых данных""" + # Создаем семестр + self.semester = Semester.objects.create( + semester="First", is_current_semester=True + ) + + # Создаем программу + self.program = Program.objects.create( + title="Computer Science", summary="CS Program" + ) + + # Создаем преподавателя + self.lecturer = User.objects.create_user( + username="lecturer1", + email="lecturer@test.com", + password="testpass123", + is_lecturer=True, + first_name="John", + last_name="Doe", + ) + + # Создаем студента + self.student_user = User.objects.create_user( + username="student1", + email="student@test.com", + password="testpass123", + is_student=True, + first_name="Jane", + last_name="Smith", + ) + + self.student = Student.objects.create( + student=self.student_user, level="100", program=self.program + ) + + # Создаем второго студента + self.student_user2 = User.objects.create_user( + username="student2", + email="student2@test.com", + password="testpass123", + is_student=True, + first_name="Bob", + last_name="Johnson", + ) + + self.student2 = Student.objects.create( + student=self.student_user2, level="100", program=self.program + ) + + # Создаем курс + self.course = Course.objects.create( + title="Introduction to Programming", + code="CS101", + credit=3, + level="100", + semester="First", + year=1, + ) + + # Создаем allocation для преподавателя + self.allocation = CourseAllocation.objects.create( + lecturer=self.lecturer, semester=self.semester + ) + self.allocation.courses.add(self.course) + + # Создаем оценки для первого модуля + self.grade_1st = Grade_1st_module.objects.create( + lecturer=self.lecturer, + student=self.student, + course=self.course, + attendance=Decimal("20.00"), + activities=Decimal("25.00"), + exam=Decimal("30.00"), + total=Decimal("75.00"), + grade="B+", + ) + + self.grade_1st_2 = Grade_1st_module.objects.create( + lecturer=self.lecturer, + student=self.student2, + course=self.course, + attendance=Decimal("15.00"), + activities=Decimal("20.00"), + exam=Decimal("25.00"), + total=Decimal("60.00"), + grade="C+", + ) + + # Создаем оценки для второго модуля + self.grade_2nd = Grade_2nd_module.objects.create( + lecturer=self.lecturer, + student=self.student, + course=self.course, + attendance=Decimal("22.00"), + activities=Decimal("28.00"), + exam=Decimal("35.00"), + total=Decimal("85.00"), + grade="A", + ) + + # Создаем семестровые оценки + self.grade_semester = Grade_semester.objects.create( + lecturer=self.lecturer, + student=self.student, + course=self.course, + semester=self.semester, + attendance=Decimal("21.00"), + activities=Decimal("26.00"), + exam=Decimal("33.00"), + total=Decimal("80.00"), + grade="A-", + ) + + self.client = APIClient() + + def test_bulk_update_as_lecturer_success(self): + """Тест: Преподаватель может массово обновить оценки""" + self.client.force_authenticate(user=self.lecturer) + + url = reverse("lecturer-bulk-grades-bulk-update") + data = { + "course_id": self.course.id, + "grade_type": "1st_module", + "grades": [ + { + "student_id": self.student.id, + "attendance": 25.00, + "activities": 30.00, + "exam": 35.00, + }, + { + "student_id": self.student2.id, + "attendance": 20.00, + "activities": 25.00, + "exam": 30.00, + }, + ], + } + + response = self.client.post(url, data, format="json") + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertIn("detail", response.data) + self.assertIn("Successfully updated", response.data["detail"]) + self.assertEqual(len(response.data["updated_grades"]), 2) + + # Проверяем, что оценки обновились + self.grade_1st.refresh_from_db() + self.assertEqual(float(self.grade_1st.attendance), 25.00) + self.assertEqual(float(self.grade_1st.activities), 30.00) + self.assertEqual(float(self.grade_1st.exam), 35.00) + self.assertEqual(float(self.grade_1st.total), 90.00) + + def test_bulk_update_without_authentication(self): + """Тест: Неавторизованный пользователь не может обновить оценки""" + url = reverse("lecturer-bulk-grades-bulk-update") + data = {"course_id": self.course.id, "grade_type": "1st_module", "grades": []} + + response = self.client.post(url, data, format="json") + self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + + def test_bulk_update_as_student_forbidden(self): + """Тест: Студент не может массово обновить оценки""" + self.client.force_authenticate(user=self.student_user) + + url = reverse("lecturer-bulk-grades-bulk-update") + data = { + "course_id": self.course.id, + "grade_type": "1st_module", + "grades": [{"student_id": self.student.id, "attendance": 25.00}], + } + + response = self.client.post(url, data, format="json") + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + self.assertIn("Only lecturers", response.data["detail"]) + + def test_bulk_update_missing_required_fields(self): + """Тест: Ошибка при отсутствии обязательных полей""" + self.client.force_authenticate(user=self.lecturer) + + url = reverse("lecturer-bulk-grades-bulk-update") + data = { + "course_id": self.course.id, + # Отсутствует grade_type + "grades": [], + } + + response = self.client.post(url, data, format="json") + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn("grade_type", response.data) + + def test_bulk_update_invalid_grade_type(self): + """Тест: Ошибка при неверном типе оценки""" + self.client.force_authenticate(user=self.lecturer) + + url = reverse("lecturer-bulk-grades-bulk-update") + data = {"course_id": self.course.id, "grade_type": "invalid_type", "grades": []} + + response = self.client.post(url, data, format="json") + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + + def test_bulk_update_nonexistent_grade(self): + """Тест: Ошибка при попытке обновить несуществующую оценку""" + self.client.force_authenticate(user=self.lecturer) + + url = reverse("lecturer-bulk-grades-bulk-update") + data = { + "course_id": self.course.id, + "grade_type": "1st_module", + "grades": [ + {"student_id": 99999, "attendance": 25.00} # Несуществующий студент + ], + } + + response = self.client.post(url, data, format="json") + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + self.assertIn("not found", response.data["detail"]) + + def test_bulk_update_2nd_module(self): + """Тест: Массовое обновление оценок второго модуля""" + self.client.force_authenticate(user=self.lecturer) + + url = reverse("lecturer-bulk-grades-bulk-update") + data = { + "course_id": self.course.id, + "grade_type": "2nd_module", + "grades": [ + { + "student_id": self.student.id, + "attendance": 24.00, + "activities": 29.00, + "exam": 37.00, + } + ], + } + + response = self.client.post(url, data, format="json") + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + # Проверяем обновление + self.grade_2nd.refresh_from_db() + self.assertEqual(float(self.grade_2nd.attendance), 24.00) + self.assertEqual(float(self.grade_2nd.activities), 29.00) + self.assertEqual(float(self.grade_2nd.exam), 37.00) + self.assertEqual(float(self.grade_2nd.total), 90.00) + + def test_bulk_update_semester(self): + """Тест: Массовое обновление семестровых оценок""" + self.client.force_authenticate(user=self.lecturer) + + url = reverse("lecturer-bulk-grades-bulk-update") + data = { + "course_id": self.course.id, + "grade_type": "semester", + "grades": [ + { + "student_id": self.student.id, + "attendance": 23.00, + "activities": 27.00, + "exam": 40.00, + } + ], + } + + response = self.client.post(url, data, format="json") + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + # Проверяем обновление + self.grade_semester.refresh_from_db() + self.assertEqual(float(self.grade_semester.attendance), 23.00) + self.assertEqual(float(self.grade_semester.activities), 27.00) + self.assertEqual(float(self.grade_semester.exam), 40.00) + self.assertEqual(float(self.grade_semester.total), 90.00) + + def test_bulk_update_partial_fields(self): + """Тест: Обновление только некоторых полей оценки""" + self.client.force_authenticate(user=self.lecturer) + + url = reverse("lecturer-bulk-grades-bulk-update") + initial_activities = float(self.grade_1st.activities) + initial_exam = float(self.grade_1st.exam) + + data = { + "course_id": self.course.id, + "grade_type": "1st_module", + "grades": [ + { + "student_id": self.student.id, + "attendance": 28.00, # Обновляем только attendance + } + ], + } + + response = self.client.post(url, data, format="json") + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + # Проверяем, что attendance обновился, а остальные поля не изменились + self.grade_1st.refresh_from_db() + self.assertEqual(float(self.grade_1st.attendance), 28.00) + self.assertEqual(float(self.grade_1st.activities), initial_activities) + self.assertEqual(float(self.grade_1st.exam), initial_exam) + + def test_grade_1st_module_list_as_lecturer(self): + """Тест: Преподаватель может получить список оценок первого модуля""" + self.client.force_authenticate(user=self.lecturer) + + url = reverse("grade-1st-modules-list") + response = self.client.get(url) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(len(response.data["results"]), 2) + + def test_grade_1st_module_list_as_student(self): + """Тест: Студент может видеть только свои оценки""" + self.client.force_authenticate(user=self.student_user) + + url = reverse("grade-1st-modules-list") + response = self.client.get(url) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(len(response.data["results"]), 1) + self.assertEqual(response.data["results"][0]["student"], self.student.id) + + def test_grade_by_course(self): + """Тест: Получение оценок по конкретному курсу""" + self.client.force_authenticate(user=self.lecturer) + + url = reverse( + "grade-1st-modules-by-course", kwargs={"course_id": self.course.id} + ) + response = self.client.get(url) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(len(response.data), 2) + + def test_my_grades_as_student(self): + """Тест: Студент получает свои семестровые оценки""" + self.client.force_authenticate(user=self.student_user) + + url = reverse("grade-semesters-my-grades") + response = self.client.get(url) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(len(response.data), 1) + + def test_my_grades_as_lecturer_forbidden(self): + """Тест: Преподаватель не может использовать my_grades endpoint""" + self.client.force_authenticate(user=self.lecturer) + + url = reverse("grade-semesters-my-grades") + response = self.client.get(url) + + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + def test_my_all_grades_as_student(self): + """Тест: Студент получает все свои оценки (все модули)""" + self.client.force_authenticate(user=self.student_user) + + url = reverse("grade-semesters-my-all-grades") + response = self.client.get(url) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertIn("first_module_grades", response.data) + self.assertIn("second_module_grades", response.data) + self.assertIn("semester_grades", response.data) + + def test_lecturer_course_grades(self): + """Тест: Преподаватель получает оценки студентов по курсу""" + self.client.force_authenticate(user=self.lecturer) + + url = reverse("lecturer-course-grades-course-grades") + response = self.client.get(url, {"course_id": self.course.id}) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertIn("first_module", response.data) + self.assertIn("second_module", response.data) + self.assertIn("semester", response.data) + + def test_lecturer_course_grades_without_course_id(self): + """Тест: Ошибка при отсутствии course_id параметра""" + self.client.force_authenticate(user=self.lecturer) + + url = reverse("lecturer-course-grades-course-grades") + response = self.client.get(url) + + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn("course_id parameter is required", response.data["detail"]) + + def test_lecturer_course_grades_as_student_forbidden(self): + """Тест: Студент не может использовать lecturer course grades endpoint""" + self.client.force_authenticate(user=self.student_user) + + url = reverse("lecturer-course-grades-course-grades") + response = self.client.get(url, {"course_id": self.course.id}) + + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + def test_grade_filtering(self): + """Тест: Фильтрация оценок""" + self.client.force_authenticate(user=self.lecturer) + + url = reverse("grade-1st-modules-list") + response = self.client.get(url, {"student": self.student.id}) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(len(response.data["results"]), 1) + self.assertEqual(response.data["results"][0]["student"], self.student.id) + + def test_grade_searching(self): + """Тест: Поиск по оценкам""" + self.client.force_authenticate(user=self.lecturer) + + url = reverse("grade-1st-modules-list") + response = self.client.get(url, {"search": "Jane"}) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertGreaterEqual(len(response.data["results"]), 1) diff --git a/result/urls.py b/result/urls.py index 5f292b3e..a6f209d1 100644 --- a/result/urls.py +++ b/result/urls.py @@ -1,21 +1,31 @@ -from django.urls import path +from django.urls import include, path +from rest_framework.routers import DefaultRouter + from .views import ( - add_score, - add_score_for, - grade_result, - assessment_result, - course_registration_form, - result_sheet_pdf_view, + Grade1stModuleViewSet, + Grade2ndModuleViewSet, + GradeSemesterViewSet, + LecturerBulkGradesViewSet, + LecturerCourseGradesViewSet, ) +router = DefaultRouter() +router.register( + r"grade-1st-modules", Grade1stModuleViewSet, basename="grade-1st-modules" +) +router.register( + r"grade-2nd-modules", Grade2ndModuleViewSet, basename="grade-2nd-modules" +) +router.register(r"grade-semesters", GradeSemesterViewSet, basename="grade-semesters") +router.register( + r"lecturer/bulk-grades", LecturerBulkGradesViewSet, basename="lecturer-bulk-grades" +) +router.register( + r"lecturer/course-grades", + LecturerCourseGradesViewSet, + basename="lecturer-course-grades", +) urlpatterns = [ - path("manage-score/", add_score, name="add_score"), - path("manage-score//", add_score_for, name="add_score_for"), - path("grade/", grade_result, name="grade_results"), - path("assessment/", assessment_result, name="ass_results"), - path("result/print//", result_sheet_pdf_view, name="result_sheet_pdf_view"), - path( - "registration/form/", course_registration_form, name="course_registration_form" - ), + path("api/", include(router.urls)), ] diff --git a/result/views.py b/result/views.py index ef2cad96..ab446817 100644 --- a/result/views.py +++ b/result/views.py @@ -1,750 +1,423 @@ -from django.shortcuts import render, get_object_or_404 -from django.contrib import messages -from django.http import HttpResponseRedirect -from django.urls import reverse_lazy -from django.conf import settings -from django.contrib.auth.decorators import login_required -from django.core.files.storage import FileSystemStorage -from django.http import HttpResponse - -from reportlab.platypus import ( - SimpleDocTemplate, - Paragraph, - Spacer, - Table, - TableStyle, - Image, +from django.db import transaction +from django_filters.rest_framework import DjangoFilterBackend +from drf_spectacular.utils import extend_schema +from rest_framework import serializers, status, viewsets +from rest_framework.decorators import action +from rest_framework.filters import OrderingFilter, SearchFilter +from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response + +from .models import Grade_1st_module, Grade_2nd_module, Grade_semester +from .serializers import ( + BulkGradesUpdateSerializer, + LecturerGrade1stModuleSerializer, + LecturerGrade2ndModuleSerializer, + LecturerGradeSemesterSerializer, + StudentGrade1stModuleSerializer, + StudentGrade2ndModuleSerializer, + StudentGradeSemesterSerializer, ) -from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle -from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER, TA_RIGHT - -# from reportlab.platypus.tables import Table -from reportlab.lib.units import inch -from reportlab.lib import colors - -from core.models import Session, Semester -from course.models import Course -from accounts.models import Student -from accounts.decorators import lecturer_required, student_required -from .models import TakenCourse, Result - - -CM = 2.54 - - -# ######################################################## -# Score Add & Add for -# ######################################################## -@login_required -@lecturer_required -def add_score(request): - """ - Shows a page where a lecturer will select a course allocated - to him for score entry. in a specific semester and session - """ - current_session = Session.objects.filter(is_current_session=True).first() - current_semester = Semester.objects.filter( - is_current_semester=True, session=current_session - ).first() - - if not current_session or not current_semester: - messages.error(request, "No active semester found.") - return render(request, "result/add_score.html") - - # semester = Course.objects.filter( - # allocated_course__lecturer__pk=request.user.id, - # semester=current_semester) - courses = Course.objects.filter( - allocated_course__lecturer__pk=request.user.id - ).filter(semester=current_semester) - context = { - "current_session": current_session, - "current_semester": current_semester, - "courses": courses, - } - return render(request, "result/add_score.html", context) - - -@login_required -@lecturer_required -def add_score_for(request, id): - """ - Shows a page where a lecturer will add score for students that - are taking courses allocated to him in a specific semester and session - """ - current_session = Session.objects.get(is_current_session=True) - current_semester = get_object_or_404( - Semester, is_current_semester=True, session=current_session - ) - if request.method == "GET": - courses = Course.objects.filter( - allocated_course__lecturer__pk=request.user.id - ).filter(semester=current_semester) - course = Course.objects.get(pk=id) - # myclass = Class.objects.get(lecturer__pk=request.user.id) - # myclass = get_object_or_404(Class, lecturer__pk=request.user.id) - - # students = TakenCourse.objects.filter( - # course__allocated_course__lecturer__pk=request.user.id).filter( - # course__id=id).filter( - # student__allocated_student__lecturer__pk=request.user.id).filter( - # course__semester=current_semester) - students = ( - TakenCourse.objects.filter( - course__allocated_course__lecturer__pk=request.user.id + + +class Grade1stModuleViewSet(viewsets.ModelViewSet): + queryset = Grade_1st_module.objects.all() + permission_classes = [IsAuthenticated] + filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] + filterset_fields = ["lecturer", "student", "course", "grade"] + search_fields = [ + "student__first_name", + "student__last_name", + "course__title", + "course__code", + ] + ordering_fields = ["student", "course", "total"] + + def get_queryset(self): + queryset = super().get_queryset() + if self.request.user.is_lecturer: + queryset = queryset.filter(lecturer=self.request.user) + elif hasattr(self.request.user, "student"): + queryset = queryset.filter(student=self.request.user.student) + return queryset + + def get_serializer_class(self): + if self.request.user.is_lecturer: + return LecturerGrade1stModuleSerializer + return StudentGrade1stModuleSerializer + + def get_permissions(self): + if hasattr(self.request.user, "student") and self.request.method not in [ + "GET", + "HEAD", + "OPTIONS", + ]: + from rest_framework.permissions import IsAdminUser + + self.permission_classes = [IsAdminUser] + return super().get_permissions() + + @action(detail=False, methods=["get"], url_path="course/(?P[^/.]+)") + def by_course(self, request, course_id=None): + """Получить оценки по конкретному курсу""" + queryset = self.get_queryset().filter(course_id=course_id) + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) + + +class Grade2ndModuleViewSet(viewsets.ModelViewSet): + queryset = Grade_2nd_module.objects.all() + permission_classes = [IsAuthenticated] + filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] + filterset_fields = ["lecturer", "student", "course", "grade"] + search_fields = [ + "student__first_name", + "student__last_name", + "course__title", + "course__code", + ] + ordering_fields = ["student", "course", "total"] + + def get_queryset(self): + queryset = super().get_queryset() + if self.request.user.is_lecturer: + queryset = queryset.filter(lecturer=self.request.user) + elif hasattr(self.request.user, "student"): + queryset = queryset.filter(student=self.request.user.student) + return queryset + + def get_serializer_class(self): + if self.request.user.is_lecturer: + return LecturerGrade2ndModuleSerializer + return StudentGrade2ndModuleSerializer + + def get_permissions(self): + if hasattr(self.request.user, "student") and self.request.method not in [ + "GET", + "HEAD", + "OPTIONS", + ]: + from rest_framework.permissions import IsAdminUser + + self.permission_classes = [IsAdminUser] + return super().get_permissions() + + @action(detail=False, methods=["get"], url_path="course/(?P[^/.]+)") + def by_course(self, request, course_id=None): + """Получить оценки по конкретному курсу""" + queryset = self.get_queryset().filter(course_id=course_id) + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) + + +class GradeSemesterViewSet(viewsets.ModelViewSet): + queryset = Grade_semester.objects.all() + permission_classes = [IsAuthenticated] + + def get_queryset(self): + queryset = super().get_queryset() + if self.request.user.is_lecturer: + queryset = queryset.filter(lecturer=self.request.user) + elif hasattr(self.request.user, "student"): + queryset = queryset.filter(student=self.request.user.student) + return queryset + + def get_serializer_class(self): + if self.request.user.is_lecturer: + return LecturerGradeSemesterSerializer + return StudentGradeSemesterSerializer + + def get_permissions(self): + if hasattr(self.request.user, "student") and self.request.method not in [ + "GET", + "HEAD", + "OPTIONS", + ]: + from rest_framework.permissions import IsAdminUser + + self.permission_classes = [IsAdminUser] + return super().get_permissions() + + @action(detail=False, methods=["get"], url_path="course/(?P[^/.]+)") + def by_course(self, request, course_id=None): + """Получить оценки по конкретному курсу""" + queryset = self.get_queryset().filter(course_id=course_id) + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) + + @action(detail=False, methods=["get"]) + def my_grades(self, request): + """Получить все оценки текущего студента""" + if not hasattr(request.user, "student"): + return Response( + {"detail": "Only students can view their grades"}, + status=status.HTTP_403_FORBIDDEN, + ) + + grades = self.get_queryset().filter(student=request.user.student) + serializer = self.get_serializer(grades, many=True) + return Response(serializer.data) + + @action(detail=False, methods=["get"]) + def my_all_grades(self, request): + """Получить все оценки студента (все модули)""" + + # Проверяем, что пользователь - студент + if not hasattr(request.user, "student_profile"): + return Response( + {"detail": "Only students can view their grades"}, + status=status.HTTP_403_FORBIDDEN, ) - .filter(course__id=id) - .filter(course__semester=current_semester) - ) - context = { - "title": "Submit Score", - "courses": courses, - "course": course, - # "myclass": myclass, - "students": students, - "current_session": current_session, - "current_semester": current_semester, + + # Получаем объект Student + student = request.user.student_profile + + grade_1st = Grade_1st_module.objects.filter(student=student) + grade_2nd = Grade_2nd_module.objects.filter(student=student) + grade_semester = Grade_semester.objects.filter(student=student) + + data = { + "first_module_grades": StudentGrade1stModuleSerializer( + grade_1st, many=True + ).data, + "second_module_grades": StudentGrade2ndModuleSerializer( + grade_2nd, many=True + ).data, + "semester_grades": StudentGradeSemesterSerializer( + grade_semester, many=True + ).data, } - return render(request, "result/add_score_for.html", context) - - if request.method == "POST": - ids = () - data = request.POST.copy() - data.pop("csrfmiddlewaretoken", None) # remove csrf_token - for key in data.keys(): - ids = ids + ( - str(key), - ) # gather all the all students id (i.e the keys) in a tuple - for s in range( - 0, len(ids) - ): # iterate over the list of student ids gathered above - student = TakenCourse.objects.get(id=ids[s]) - # print(student) - # print(student.student) - # print(student.student.program.id) - courses = ( - Course.objects.filter(level=student.student.level) - .filter(program__pk=student.student.program.id) - .filter(semester=current_semester) - ) # all courses of a specific level in current semester - total_credit_in_semester = 0 - for i in courses: - if i == courses.count(): - break - total_credit_in_semester += int(i.credit) - score = data.getlist( - ids[s] - ) # get list of score for current student in the loop - assignment = score[ - 0 - ] # subscript the list to get the fisrt value > ca score - mid_exam = score[1] # do the same for exam score - quiz = score[2] - attendance = score[3] - final_exam = score[4] - obj = TakenCourse.objects.get(pk=ids[s]) # get the current student data - obj.assignment = assignment # set current student assignment score - obj.mid_exam = mid_exam # set current student mid_exam score - obj.quiz = quiz # set current student quiz score - obj.attendance = attendance # set current student attendance score - obj.final_exam = final_exam # set current student final_exam score - - obj.total = obj.get_total() - obj.grade = obj.get_grade() - - # obj.total = obj.get_total(assignment, mid_exam, quiz, attendance, final_exam) - # obj.grade = obj.get_grade(assignment, mid_exam, quiz, attendance, final_exam) - - obj.point = obj.get_point() - obj.comment = obj.get_comment() - # obj.carry_over(obj.grade) - # obj.is_repeating() - obj.save() - gpa = obj.calculate_gpa() - cgpa = obj.calculate_cgpa() - - try: - a = Result.objects.get( - student=student.student, - semester=current_semester, - session=current_session, - level=student.student.level, - ) - a.gpa = gpa - a.cgpa = cgpa - a.save() - except: - Result.objects.get_or_create( - student=student.student, - gpa=gpa, - semester=current_semester, - session=current_session, - level=student.student.level, - ) - # try: - # a = Result.objects.get(student=student.student, - # semester=current_semester, level=student.student.level) - # a.gpa = gpa - # a.cgpa = cgpa - # a.save() - # except: - # Result.objects.get_or_create(student=student.student, gpa=gpa, - # semester=current_semester, level=student.student.level) + return Response(data) - messages.success(request, "Successfully Recorded! ") - return HttpResponseRedirect(reverse_lazy("add_score_for", kwargs={"id": id})) - return HttpResponseRedirect(reverse_lazy("add_score_for", kwargs={"id": id})) +class LecturerBulkGradesViewSet(viewsets.GenericViewSet): + """ViewSet для массового обновления оценок преподавателями""" -# ######################################################## + permission_classes = [IsAuthenticated] + def validate_grade_value(self, value, field_name): + """Валидация значения оценки""" + if value is not None and (value < 0 or value > 100): + raise serializers.ValidationError(f"{field_name} must be between 0 and 100") -@login_required -@student_required -def grade_result(request): - student = Student.objects.get(student__pk=request.user.id) - courses = TakenCourse.objects.filter(student__student__pk=request.user.id).filter( - course__level=student.level - ) - # total_credit_in_semester = 0 - results = Result.objects.filter(student__student__pk=request.user.id) + def calculate_grade(self, total): + """Расчет буквенной оценки на основе total""" + if total >= 90: + return "A" + elif total >= 80: + return "B" + elif total >= 70: + return "C" + elif total >= 60: + return "D" + else: + return "F" - result_set = set() + @extend_schema( + request=BulkGradesUpdateSerializer, + ) + @action(detail=False, methods=["post"], url_path="bulk-update") + def bulk_update(self, request): + """Массовое обновление оценок для нескольких студентов""" + if not request.user.is_lecturer: + return Response( + {"detail": "Only lecturers can update grades"}, + status=status.HTTP_403_FORBIDDEN, + ) - for result in results: - result_set.add(result.session) + serializer = BulkGradesUpdateSerializer(data=request.data) + if not serializer.is_valid(): + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - sorted_result = sorted(result_set) + course_id = serializer.validated_data["course_id"] + grade_type = serializer.validated_data["grade_type"] + grades_data = serializer.validated_data["grades"] - total_first_semester_credit = 0 - total_sec_semester_credit = 0 - for i in courses: - if i.course.semester == "First": - total_first_semester_credit += int(i.course.credit) - if i.course.semester == "Second": - total_sec_semester_credit += int(i.course.credit) + # Определяем модель в зависимости от типа оценок + if grade_type == "1st_module": + model = Grade_1st_module + elif grade_type == "2nd_module": + model = Grade_2nd_module + else: # semester + model = Grade_semester - previousCGPA = 0 - # previousLEVEL = 0 - # calculate_cgpa - for i in results: - previousLEVEL = i.level try: - a = Result.objects.get( - student__student__pk=request.user.id, - level=previousLEVEL, - semester="Second", - ) - previousCGPA = a.cgpa - break - except: - previousCGPA = 0 - - context = { - "courses": courses, - "results": results, - "sorted_result": sorted_result, - "student": student, - "total_first_semester_credit": total_first_semester_credit, - "total_sec_semester_credit": total_sec_semester_credit, - "total_first_and_second_semester_credit": total_first_semester_credit - + total_sec_semester_credit, - "previousCGPA": previousCGPA, - } - - return render(request, "result/grade_results.html", context) - - -@login_required -@student_required -def assessment_result(request): - student = Student.objects.get(student__pk=request.user.id) - courses = TakenCourse.objects.filter( - student__student__pk=request.user.id, course__level=student.level - ) - result = Result.objects.filter(student__student__pk=request.user.id) - - context = { - "courses": courses, - "result": result, - "student": student, - } - - return render(request, "result/assessment_results.html", context) - - -@login_required -@lecturer_required -def result_sheet_pdf_view(request, id): - current_semester = Semester.objects.get(is_current_semester=True) - current_session = Session.objects.get(is_current_session=True) - result = TakenCourse.objects.filter(course__pk=id) - course = get_object_or_404(Course, id=id) - no_of_pass = TakenCourse.objects.filter(course__pk=id, comment="PASS").count() - no_of_fail = TakenCourse.objects.filter(course__pk=id, comment="FAIL").count() - fname = ( - str(current_semester) - + "_semester_" - + str(current_session) - + "_" - + str(course) - + "_resultSheet.pdf" - ) - fname = fname.replace("/", "-") - flocation = settings.MEDIA_ROOT + "/result_sheet/" + fname - - doc = SimpleDocTemplate( - flocation, - rightMargin=0, - leftMargin=6.5 * CM, - topMargin=0.3 * CM, - bottomMargin=0, - ) - styles = getSampleStyleSheet() - styles.add( - ParagraphStyle(name="ParagraphTitle", fontSize=11, fontName="FreeSansBold") - ) - Story = [Spacer(1, 0.2)] - style = styles["Normal"] - - # picture = request.user.picture - # l_pic = Image(picture, 1*inch, 1*inch) - # l_pic.__setattr__("_offs_x", 200) - # l_pic.__setattr__("_offs_y", -130) - # Story.append(l_pic) - - # logo = settings.MEDIA_ROOT + "/logo/logo-mini.png" - # im_logo = Image(logo, 1*inch, 1*inch) - # im_logo.__setattr__("_offs_x", -218) - # im_logo.__setattr__("_offs_y", -60) - # Story.append(im_logo) - - print("\nsettings.MEDIA_ROOT", settings.MEDIA_ROOT) - print("\nsettings.STATICFILES_DIRS[0]", settings.STATICFILES_DIRS[0]) - logo = settings.STATICFILES_DIRS[0] + "/img/brand.png" - im = Image(logo, 1 * inch, 1 * inch) - im.__setattr__("_offs_x", -200) - im.__setattr__("_offs_y", -45) - Story.append(im) - - style = getSampleStyleSheet() - normal = style["Normal"] - normal.alignment = TA_CENTER - normal.fontName = "Helvetica" - normal.fontSize = 12 - normal.leading = 15 - title = ( - " " - + str(current_semester) - + " Semester " - + str(current_session) - + " Result Sheet" - ) - title = Paragraph(title.upper(), normal) - Story.append(title) - Story.append(Spacer(1, 0.1 * inch)) - - style = getSampleStyleSheet() - normal = style["Normal"] - normal.alignment = TA_CENTER - normal.fontName = "Helvetica" - normal.fontSize = 10 - normal.leading = 15 - title = "Course lecturer: " + request.user.get_full_name + "" - title = Paragraph(title.upper(), normal) - Story.append(title) - Story.append(Spacer(1, 0.1 * inch)) - - normal = style["Normal"] - normal.alignment = TA_CENTER - normal.fontName = "Helvetica" - normal.fontSize = 10 - normal.leading = 15 - level = result.filter(course_id=id).first() - title = "Level: " + str(level.course.level) - title = Paragraph(title.upper(), normal) - Story.append(title) - Story.append(Spacer(1, 0.6 * inch)) - - elements = [] - count = 0 - header = [("S/N", "ID NO.", "FULL NAME", "TOTAL", "GRADE", "POINT", "COMMENT")] - - table_header = Table(header, [inch], [0.5 * inch]) - table_header.setStyle( - TableStyle( - [ - ("BACKGROUND", (0, 0), (-1, -1), colors.black), - ("TEXTCOLOR", (1, 0), (-1, -1), colors.white), - ("TEXTCOLOR", (0, 0), (0, 0), colors.cyan), - ("ALIGN", (0, 0), (-1, -1), "CENTER"), - ("VALIGN", (0, 0), (-1, -1), "MIDDLE"), - ("BOX", (0, 0), (-1, -1), 1, colors.black), - ] - ) - ) - Story.append(table_header) - - for student in result: - data = [ - ( - count + 1, - student.student.student.username.upper(), - Paragraph( - student.student.student.get_full_name.capitalize(), styles["Normal"] - ), - student.total, - student.grade, - student.point, - student.comment, + with transaction.atomic(): + updated_grades = [] + + for grade_data in grades_data: + student_id = grade_data["student_id"] + + print(f"🔄 Processing grade for student_id={student_id}") + print( + f"📋 Current lecturer: {request.user} (ID: {request.user.id}, is_lecturer: {request.user.is_lecturer})" + ) + + # Проверяем существование студента + from accounts.models import Student + + try: + student = Student.objects.get(id=student_id) + print( + f"✅ Found student: {student_id} - {student.get_full_name()}" + ) + except Student.DoesNotExist: + print(f"❌ Student {student_id} not found!") + raise ValueError(f"Student with id {student_id} does not exist") + + # Проверяем существование курса + from core.models import Course + + try: + course = Course.objects.get(id=course_id) + print(f"✅ Found course: {course_id} - {course.name}") + except Course.DoesNotExist: + print(f"❌ Course {course_id} not found!") + raise ValueError(f"Course with id {course_id} does not exist") + + # Базовые параметры для поиска/создания + lookup_params = { + "lecturer": request.user, + "course": course, # Используем объект, а не ID + "student": student, # Используем объект, а не ID + } + + # Для Grade_semester добавляем текущий семестр + if grade_type == "semester": + from core.models import Semester + + current_semester = Semester.objects.filter( + is_current_semester=True + ).first() + if current_semester: + lookup_params["semester"] = current_semester + + print( + f"🔍 Looking up grade with params: lecturer={request.user.username}, course={course_id}, student={student_id}" + ) + + # Получаем или создаем объект оценки + try: + grade_obj, created = model.objects.get_or_create( + **lookup_params, + defaults={ + "attendance": 0, + "activities": 0, + "exam": 0, + "total": 0, + "admin": None, # Явно указываем None для admin (разрешено в модели) + }, + ) + except Exception as e: + print(f"❌ Error creating grade: {type(e).__name__}: {str(e)}") + print(f" Lookup params: {lookup_params}") + raise + + if created: + print(f"➕ Created new grade for student {student_id}") + else: + print(f"📝 Found existing grade for student {student_id}") + + # Обновляем поля + update_fields = [] + if "attendance" in grade_data: + grade_obj.attendance = grade_data["attendance"] + update_fields.append("attendance") + if "activities" in grade_data: + grade_obj.activities = grade_data["activities"] + update_fields.append("activities") + if "exam" in grade_data: + grade_obj.exam = grade_data["exam"] + update_fields.append("exam") + + # Пересчитываем total и сохраняем + if update_fields: + grade_obj.total = ( + grade_obj.attendance + grade_obj.activities + grade_obj.exam + ) + update_fields.append("total") + grade_obj.save(update_fields=update_fields) + + updated_grades.append( + { + "student_id": student_id, + "student_name": grade_obj.student.get_full_name(), + "attendance": grade_obj.attendance, + "activities": grade_obj.activities, + "exam": grade_obj.exam, + "total": grade_obj.total, + } + ) + + return Response( + { + "detail": f"Successfully updated {len(updated_grades)} grades", + "updated_grades": updated_grades, + } + ) + + except model.DoesNotExist: + return Response( + {"detail": "Grade record not found for one of the students"}, + status=status.HTTP_404_NOT_FOUND, ) - ] - color = colors.black - if student.grade == "F": - color = colors.red - count += 1 - - t_body = Table(data, colWidths=[inch]) - t_body.setStyle( - TableStyle( - [ - ("INNERGRID", (0, 0), (-1, -1), 0.05, colors.black), - ("BOX", (0, 0), (-1, -1), 0.1, colors.black), - ] + except Exception as e: + return Response( + {"detail": f"Error updating grades: {str(e)}"}, + status=status.HTTP_400_BAD_REQUEST, ) - ) - Story.append(t_body) - Story.append(Spacer(1, 1 * inch)) - style_right = ParagraphStyle( - name="right", parent=styles["Normal"], alignment=TA_RIGHT - ) - tbl_data = [ - [ - Paragraph("Date:_____________________________", styles["Normal"]), - Paragraph("No. of PASS: " + str(no_of_pass), style_right), - ], - [ - Paragraph( - "Siganture / Stamp: _____________________________", - styles["Normal"], - ), - Paragraph("No. of FAIL: " + str(no_of_fail), style_right), - ], - ] - tbl = Table(tbl_data) - Story.append(tbl) - - doc.build(Story) - - fs = FileSystemStorage(settings.MEDIA_ROOT + "/result_sheet") - with fs.open(fname) as pdf: - response = HttpResponse(pdf, content_type="application/pdf") - response["Content-Disposition"] = "inline; filename=" + fname + "" - return response - return response - - -@login_required -@student_required -def course_registration_form(request): - current_session = Session.objects.get(is_current_session=True) - courses = TakenCourse.objects.filter(student__student__id=request.user.id) - fname = request.user.username + ".pdf" - fname = fname.replace("/", "-") - # flocation = '/tmp/' + fname - # print(MEDIA_ROOT + "\\" + fname) - flocation = settings.MEDIA_ROOT + "/registration_form/" + fname - doc = SimpleDocTemplate( - flocation, rightMargin=15, leftMargin=15, topMargin=0, bottomMargin=0 - ) - styles = getSampleStyleSheet() - - Story = [Spacer(1, 0.5)] - Story.append(Spacer(1, 0.4 * inch)) - style = styles["Normal"] - - style = getSampleStyleSheet() - normal = style["Normal"] - normal.alignment = TA_CENTER - normal.fontName = "Helvetica" - normal.fontSize = 12 - normal.leading = 18 - title = "EZOD UNIVERSITY OF TECHNOLOGY, ADAMA" # TODO: Make this dynamic - title = Paragraph(title.upper(), normal) - Story.append(title) - style = getSampleStyleSheet() - - school = style["Normal"] - school.alignment = TA_CENTER - school.fontName = "Helvetica" - school.fontSize = 10 - school.leading = 18 - school_title = ( - "SCHOOL OF ELECTRICAL ENGINEERING & COMPUTING" # TODO: Make this dynamic - ) - school_title = Paragraph(school_title.upper(), school) - Story.append(school_title) - - style = getSampleStyleSheet() - Story.append(Spacer(1, 0.1 * inch)) - department = style["Normal"] - department.alignment = TA_CENTER - department.fontName = "Helvetica" - department.fontSize = 9 - department.leading = 18 - department_title = ( - "DEPARTMENT OF COMPUTER SCIENCE & ENGINEERING" # TODO: Make this dynamic - ) - department_title = Paragraph(department_title, department) - Story.append(department_title) - Story.append(Spacer(1, 0.3 * inch)) - - title = "STUDENT COURSE REGISTRATION FORM" - title = Paragraph(title.upper(), normal) - Story.append(title) - student = Student.objects.get(student__pk=request.user.id) - - tbl_data = [ - [ - Paragraph( - "Registration Number : " + request.user.username.upper() + "", - styles["Normal"], - ) - ], - [ - Paragraph( - "Name : " + request.user.get_full_name.upper() + "", - styles["Normal"], + +class LecturerCourseGradesViewSet(viewsets.ViewSet): + """ViewSet для получения оценок студентов по курсу""" + + permission_classes = [IsAuthenticated] + + @action(detail=False, methods=["get"], url_path="course-grades") + def course_grades(self, request): + """Получить всех студентов и их оценки по конкретному курсу""" + if not request.user.is_lecturer: + return Response( + {"detail": "Only lecturers can view course grades"}, + status=status.HTTP_403_FORBIDDEN, ) - ], - [ - Paragraph( - "Session : " + current_session.session.upper() + "", - styles["Normal"], - ), - Paragraph("Level: " + student.level + "", styles["Normal"]), - ], - ] - tbl = Table(tbl_data) - Story.append(tbl) - Story.append(Spacer(1, 0.6 * inch)) - - style = getSampleStyleSheet() - semester = style["Normal"] - semester.alignment = TA_LEFT - semester.fontName = "Helvetica" - semester.fontSize = 9 - semester.leading = 18 - semester_title = "FIRST SEMESTER" - semester_title = Paragraph(semester_title, semester) - Story.append(semester_title) - - # FIRST SEMESTER - count = 0 - header = [ - ( - "S/No", - "Course Code", - "Course Title", - "Unit", - Paragraph("Name, Siganture of course lecturer & Date", style["Normal"]), - ) - ] - table_header = Table(header, 1 * [1.4 * inch], 1 * [0.5 * inch]) - table_header.setStyle( - TableStyle( - [ - ("ALIGN", (-2, -2), (-2, -2), "CENTER"), - ("VALIGN", (-2, -2), (-2, -2), "MIDDLE"), - ("ALIGN", (1, 0), (1, 0), "CENTER"), - ("VALIGN", (1, 0), (1, 0), "MIDDLE"), - ("ALIGN", (0, 0), (0, 0), "CENTER"), - ("VALIGN", (0, 0), (0, 0), "MIDDLE"), - ("ALIGN", (-4, 0), (-4, 0), "LEFT"), - ("VALIGN", (-4, 0), (-4, 0), "MIDDLE"), - ("ALIGN", (-3, 0), (-3, 0), "LEFT"), - ("VALIGN", (-3, 0), (-3, 0), "MIDDLE"), - ("TEXTCOLOR", (0, -1), (-1, -1), colors.black), - ("INNERGRID", (0, 0), (-1, -1), 0.25, colors.black), - ("BOX", (0, 0), (-1, -1), 0.25, colors.black), - ] - ) - ) - Story.append(table_header) - - first_semester_unit = 0 - for course in courses: - if course.course.semester == settings.FIRST: - first_semester_unit += int(course.course.credit) - data = [ - ( - count + 1, - course.course.code.upper(), - Paragraph(course.course.title, style["Normal"]), - course.course.credit, - "", - ) - ] - count += 1 - table_body = Table(data, 1 * [1.4 * inch], 1 * [0.3 * inch]) - table_body.setStyle( - TableStyle( - [ - ("ALIGN", (-2, -2), (-2, -2), "CENTER"), - ("ALIGN", (1, 0), (1, 0), "CENTER"), - ("ALIGN", (0, 0), (0, 0), "CENTER"), - ("ALIGN", (-4, 0), (-4, 0), "LEFT"), - ("TEXTCOLOR", (0, -1), (-1, -1), colors.black), - ("INNERGRID", (0, 0), (-1, -1), 0.25, colors.black), - ("BOX", (0, 0), (-1, -1), 0.25, colors.black), - ] - ) + + course_id = request.query_params.get("course_id") + if not course_id: + return Response( + {"detail": "course_id parameter is required"}, + status=status.HTTP_400_BAD_REQUEST, ) - Story.append(table_body) - - style = getSampleStyleSheet() - semester = style["Normal"] - semester.alignment = TA_LEFT - semester.fontName = "Helvetica" - semester.fontSize = 8 - semester.leading = 18 - semester_title = ( - "Total Second First Credit : " + str(first_semester_unit) + "" - ) - semester_title = Paragraph(semester_title, semester) - Story.append(semester_title) - - # FIRST SEMESTER ENDS HERE - Story.append(Spacer(1, 0.6 * inch)) - - style = getSampleStyleSheet() - semester = style["Normal"] - semester.alignment = TA_LEFT - semester.fontName = "Helvetica" - semester.fontSize = 9 - semester.leading = 18 - semester_title = "SECOND SEMESTER" - semester_title = Paragraph(semester_title, semester) - Story.append(semester_title) - # SECOND SEMESTER - count = 0 - header = [ - ( - "S/No", - "Course Code", - "Course Title", - "Unit", - Paragraph( - "Name, Signature of course lecturer & Date", style["Normal"] - ), - ) - ] - table_header = Table(header, 1 * [1.4 * inch], 1 * [0.5 * inch]) - table_header.setStyle( - TableStyle( - [ - ("ALIGN", (-2, -2), (-2, -2), "CENTER"), - ("VALIGN", (-2, -2), (-2, -2), "MIDDLE"), - ("ALIGN", (1, 0), (1, 0), "CENTER"), - ("VALIGN", (1, 0), (1, 0), "MIDDLE"), - ("ALIGN", (0, 0), (0, 0), "CENTER"), - ("VALIGN", (0, 0), (0, 0), "MIDDLE"), - ("ALIGN", (-4, 0), (-4, 0), "LEFT"), - ("VALIGN", (-4, 0), (-4, 0), "MIDDLE"), - ("ALIGN", (-3, 0), (-3, 0), "LEFT"), - ("VALIGN", (-3, 0), (-3, 0), "MIDDLE"), - ("TEXTCOLOR", (0, -1), (-1, -1), colors.black), - ("INNERGRID", (0, 0), (-1, -1), 0.25, colors.black), - ("BOX", (0, 0), (-1, -1), 0.25, colors.black), - ] - ) - ) - Story.append(table_header) - - second_semester_unit = 0 - for course in courses: - if course.course.semester == settings.SECOND: - second_semester_unit += int(course.course.credit) - data = [ - ( - count + 1, - course.course.code.upper(), - Paragraph(course.course.title, style["Normal"]), - course.course.credit, - "", - ) - ] - # color = colors.black - count += 1 - table_body = Table(data, 1 * [1.4 * inch], 1 * [0.3 * inch]) - table_body.setStyle( - TableStyle( - [ - ("ALIGN", (-2, -2), (-2, -2), "CENTER"), - ("ALIGN", (1, 0), (1, 0), "CENTER"), - ("ALIGN", (0, 0), (0, 0), "CENTER"), - ("ALIGN", (-4, 0), (-4, 0), "LEFT"), - ("TEXTCOLOR", (0, -1), (-1, -1), colors.black), - ("INNERGRID", (0, 0), (-1, -1), 0.25, colors.black), - ("BOX", (0, 0), (-1, -1), 0.25, colors.black), - ] - ) + + try: + grade_1st = Grade_1st_module.objects.filter( + lecturer=request.user, course_id=course_id + ).select_related("student", "course") + + grade_2nd = Grade_2nd_module.objects.filter( + lecturer=request.user, course_id=course_id + ).select_related("student", "course") + + grade_semester = Grade_semester.objects.filter( + lecturer=request.user, course_id=course_id + ).select_related("student", "course") + + data = { + "first_module": LecturerGrade1stModuleSerializer( + grade_1st, many=True + ).data, + "second_module": LecturerGrade2ndModuleSerializer( + grade_2nd, many=True + ).data, + "semester": LecturerGradeSemesterSerializer( + grade_semester, many=True + ).data, + } + + return Response(data) + + except Exception as e: + return Response( + {"detail": f"Error retrieving grades: {str(e)}"}, + status=status.HTTP_400_BAD_REQUEST, ) - Story.append(table_body) - - style = getSampleStyleSheet() - semester = style["Normal"] - semester.alignment = TA_LEFT - semester.fontName = "Helvetica" - semester.fontSize = 8 - semester.leading = 18 - semester_title = ( - "Total Second Semester Credit : " + str(second_semester_unit) + "" - ) - semester_title = Paragraph(semester_title, semester) - Story.append(semester_title) - - Story.append(Spacer(1, 2)) - style = getSampleStyleSheet() - certification = style["Normal"] - certification.alignment = TA_JUSTIFY - certification.fontName = "Helvetica" - certification.fontSize = 8 - certification.leading = 18 - student = Student.objects.get(student__pk=request.user.id) - certification_text = ( - "CERTIFICATION OF REGISTRATION: I certify that " - + str(request.user.get_full_name.upper()) - + "\ - has been duly registered for the " - + student.level - + " level of study in the department\ - of COMPUTER SICENCE & ENGINEERING and that the courses and credits \ - registered are as approved by the senate of the University" - ) - certification_text = Paragraph(certification_text, certification) - Story.append(certification_text) - - # FIRST SEMESTER ENDS HERE - - logo = settings.STATICFILES_DIRS[0] + "/img/brand.png" - im_logo = Image(logo, 1 * inch, 1 * inch) - setattr(im_logo, "_offs_x", -218) - setattr(im_logo, "_offs_y", 480) - Story.append(im_logo) - - picture = settings.BASE_DIR + request.user.get_picture() - im = Image(picture, 1.0 * inch, 1.0 * inch) - setattr(im, "_offs_x", 218) - setattr(im, "_offs_y", 550) - Story.append(im) - - doc.build(Story) - fs = FileSystemStorage(settings.MEDIA_ROOT + "/registration_form") - with fs.open(fname) as pdf: - response = HttpResponse(pdf, content_type="application/pdf") - response["Content-Disposition"] = "inline; filename=" + fname + "" - return response - return response diff --git a/scripts/__init__.py b/scripts/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/scripts/generate_fake_accounts_data.py b/scripts/generate_fake_accounts_data.py deleted file mode 100644 index b5488a5a..00000000 --- a/scripts/generate_fake_accounts_data.py +++ /dev/null @@ -1,169 +0,0 @@ -import os -import django -from typing import List, Tuple -from django.utils import timezone -from faker import Faker -from factory.django import DjangoModelFactory -from factory import SubFactory, LazyAttribute, Iterator -from django_extensions.management.commands import runscript - -# Set up Django environment -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings") -django.setup() - -from accounts.models import User, Student, Parent, DepartmentHead, LEVEL, RELATION_SHIP -from course.models import Program - -fake = Faker() - - -class UserFactory(DjangoModelFactory): - """ - Factory for creating User instances with optional flags. - - Attributes: - username (str): The generated username. - first_name (str): The generated first name. - last_name (str): The generated last name. - email (str): The generated email. - date_joined (datetime): The current date and time. - phone (str): The generated phone number. - address (str): The generated address. - is_student (bool): Flag indicating if the user is a student. - is_lecturer (bool): Flag indicating if the user is a lecturer. - is_parent (bool): Flag indicating if the user is a parent. - is_dep_head (bool): Flag indicating if the user is a department head. - """ - - class Meta: - model = User - - username: str = LazyAttribute(lambda x: fake.user_name()) - first_name: str = LazyAttribute(lambda x: fake.first_name()) - last_name: str = LazyAttribute(lambda x: fake.last_name()) - email: str = LazyAttribute(lambda x: fake.email()) - date_joined: timezone.datetime = timezone.now() - phone: str = LazyAttribute(lambda x: fake.phone_number()) - address: str = LazyAttribute(lambda x: fake.address()) - is_student: bool = False - is_lecturer: bool = False - is_parent: bool = False - is_dep_head: bool = False - - @classmethod - def _create(cls, model_class: type, *args, **kwargs) -> User: - """ - Create a User instance with optional flags. - - Args: - model_class (type): The class of the model to create. - - Returns: - User: The created User instance. - """ - user: User = super()._create(model_class, *args, **kwargs) - - # Set the appropriate flags based on the user type - if cls.is_student: - user.is_student = True - elif cls.is_parent: - user.is_parent = True - - user.save() - return user - - -class ProgramFactory(DjangoModelFactory): - """ - Factory for creating Program instances. - - Attributes: - title (str): The generated program title. - summary (str): The generated summary. - """ - - class Meta: - model = Program - - title: str = LazyAttribute(lambda x: fake.sentence(nb_words=3)) - summary: str = LazyAttribute(lambda x: fake.text()) - - @classmethod - def _create(cls, model_class: type, *args, **kwargs) -> Program: - """ - Create a Program instance using get_or_create to avoid duplicates. - - Args: - model_class (type): The class of the model to create. - - Returns: - Program: The created Program instance. - """ - program, created = Program.objects.get_or_create( - title=kwargs.get("title"), defaults=kwargs - ) - return program - - -class StudentFactory(DjangoModelFactory): - """ - Factory for creating Student instances with associated User and Program. - - Attributes: - student (User): The associated User instance. - level (str): The level of the student. - program (Program): The associated Program instance. - """ - - class Meta: - model = Student - - student: User = SubFactory(UserFactory, is_student=True) - level: str = Iterator([choice[0] for choice in LEVEL]) - program: Program = SubFactory(ProgramFactory) - - -class ParentFactory(DjangoModelFactory): - """ - Factory for creating Parent instances with associated User, Student, and Program. - - Attributes: - user (User): The associated User instance. - student (Student): The associated Student instance. - first_name (str): The generated first name. - last_name (str): The generated last name. - phone (str): The generated phone number. - email (str): The generated email. - relation_ship (str): The relationship with the student. - """ - - class Meta: - model = Parent - - user: User = SubFactory(UserFactory, is_parent=True) - student: Student = SubFactory(StudentFactory) - first_name: str = LazyAttribute(lambda x: fake.first_name()) - last_name: str = LazyAttribute(lambda x: fake.last_name()) - phone: str = LazyAttribute(lambda x: fake.phone_number()) - email: str = LazyAttribute(lambda x: fake.email()) - relation_ship: str = Iterator([choice[0] for choice in RELATION_SHIP]) - - -def generate_fake_accounts_data( - num_programs: int, num_students: int, num_parents: int -) -> None: - """ - Generate fake data for Programs, Students, Parents, and DepartmentHeads. - - Args: - num_programs (int): Number of programs to generate. - num_students (int): Number of students to generate. - num_parents (int): Number of parents to generate. - """ - programs: List[Program] = ProgramFactory.create_batch(num_programs) - students: List[Student] = StudentFactory.create_batch(num_students) - parents: List[Parent] = ParentFactory.create_batch(num_parents) - - print(f"Created {len(programs)} programs.") - print(f"Created {len(students)} students.") - print(f"Created {len(parents)} parents.") diff --git a/scripts/generate_fake_core_data.py b/scripts/generate_fake_core_data.py deleted file mode 100644 index b76a3681..00000000 --- a/scripts/generate_fake_core_data.py +++ /dev/null @@ -1,127 +0,0 @@ -import os -import django -import random -from typing import List -from django.utils import timezone -from faker import Faker -from factory.django import DjangoModelFactory -from factory import SubFactory, LazyAttribute, Iterator, LazyFunction -from core.models import ActivityLog, NewsAndEvents, Session, Semester, SEMESTER, POST - -# Set up Django environment -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings") -django.setup() - -fake = Faker() - - -class NewsAndEventsFactory(DjangoModelFactory): - """ - Factory for creating NewsAndEvents instances. - - Attributes: - title (str): The generated title for the news or event. - summary (str): The generated summary. - posted_as (str): The type of the post, either 'News' or 'Event'. - updated_date (datetime): The generated date and time of update. - upload_time (datetime): The generated date and time of upload. - """ - - class Meta: - model = NewsAndEvents - - title: str = LazyAttribute(lambda x: fake.sentence(nb_words=4)) - summary: str = LazyAttribute(lambda x: fake.paragraph(nb_sentences=3)) - posted_as: str = LazyFunction( - lambda: fake.random_element(elements=[choice[0] for choice in POST]) - ) - # updated_date: timezone.datetime = fake.date_time_this_year() - # upload_time: timezone.datetime = fake.date_time_this_year() - - -class SessionFactory(DjangoModelFactory): - """ - Factory for creating Session instances. - - Attributes: - session (str): The generated session name. - is_current_session (bool): Flag indicating if the session is current. - next_session_begins (date): The date when the next session begins. - """ - - class Meta: - model = Session - - session: str = LazyAttribute(lambda x: str(fake.random_int(min=2020, max=2030))) - is_current_session: bool = fake.boolean(chance_of_getting_true=50) - next_session_begins = LazyAttribute(lambda x: fake.future_datetime()) - - -class SemesterFactory(DjangoModelFactory): - """ - Factory for creating Semester instances. - - Attributes: - semester (str): The generated semester name. - is_current_semester (bool): Flag indicating if the semester is current. - session (Session): The associated session. - next_semester_begins (date): The date when the next semester begins. - """ - - class Meta: - model = Semester - - semester: str = fake.random_element(elements=[choice[0] for choice in SEMESTER]) - is_current_semester: bool = fake.boolean(chance_of_getting_true=50) - session: Session = SubFactory(SessionFactory) - next_semester_begins = LazyAttribute(lambda x: fake.future_datetime()) - - -class ActivityLogFactory(DjangoModelFactory): - """ - Factory for creating ActivityLog instances. - - Attributes: - message (str): The generated log message. - """ - - class Meta: - model = ActivityLog - - message: str = LazyAttribute(lambda x: fake.text()) - - -def generate_fake_core_data( - num_news_and_events: int, - num_sessions: int, - num_semesters: int, - num_activity_logs: int, -) -> None: - """ - Generate fake data for core models: NewsAndEvents, Session, Semester, and ActivityLog. - - Args: - num_news_and_events (int): Number of NewsAndEvents instances to generate. - num_sessions (int): Number of Session instances to generate. - num_semesters (int): Number of Semester instances to generate. - num_activity_logs (int): Number of ActivityLog instances to generate. - """ - # Generate fake NewsAndEvents instances - news_and_events: List[NewsAndEvents] = NewsAndEventsFactory.create_batch( - num_news_and_events - ) - print(f"Generated {num_news_and_events} NewsAndEvents instances.") - - # Generate fake Session instances - sessions: List[Session] = SessionFactory.create_batch(num_sessions) - print(f"Generated {num_sessions} Session instances.") - - # Generate fake Semester instances - semesters: List[Semester] = SemesterFactory.create_batch(num_semesters) - print(f"Generated {num_semesters} Semester instances.") - - # Generate fake ActivityLog instances - activity_logs: List[ActivityLog] = ActivityLogFactory.create_batch( - num_activity_logs - ) - print(f"Generated {num_activity_logs} ActivityLog instances.") diff --git a/scripts/generate_fake_data.py b/scripts/generate_fake_data.py deleted file mode 100644 index 8a1aa954..00000000 --- a/scripts/generate_fake_data.py +++ /dev/null @@ -1,249 +0,0 @@ -import random -from typing import Type -from factory.django import DjangoModelFactory -from factory import SubFactory, LazyAttribute, Iterator -from faker import Faker -from django.conf import settings -from course.models import ( - Program, - Course, - CourseAllocation, - Upload, - UploadVideo, - CourseOffer, -) -from accounts.models import User, DepartmentHead -from core.models import Session - -from .generate_fake_accounts_data import UserFactory, ProgramFactory -from .generate_fake_core_data import SessionFactory - -fake = Faker() - - -class DepartmentHeadFactory(DjangoModelFactory): - class Meta: - model = DepartmentHead - - user = SubFactory(UserFactory) - department = SubFactory(ProgramFactory) - - -class ProgramFactory(DjangoModelFactory): - """ - Factory for creating Program instances. - - Attributes: - title (str): The generated title for the program. - summary (str): The generated summary for the program. - """ - - class Meta: - model = Program - - title: str = LazyAttribute(lambda x: fake.sentence(nb_words=3)) - summary: str = LazyAttribute(lambda x: fake.paragraph()) - - -class CourseFactory(DjangoModelFactory): - """ - Factory for creating Course instances. - - Attributes: - slug (str): The generated slug for the course. - title (str): The generated title for the course. - code (str): The generated code for the course. - credit (int): The generated credit for the course. - summary (str): The generated summary for the course. - program (Program): The associated program for the course. - level (str): The generated level for the course. - year (int): The generated year for the course. - semester (str): The generated semester for the course. - is_elective (bool): The flag indicating if the course is elective. - """ - - class Meta: - model = Course - - slug: str = LazyAttribute(lambda x: fake.slug()) - title: str = LazyAttribute(lambda x: fake.sentence(nb_words=4)) - code: str = LazyAttribute(lambda x: fake.unique.word()) - credit: int = LazyAttribute(lambda x: fake.random_int(min=1, max=6)) - summary: str = LazyAttribute(lambda x: fake.paragraph()) - program: Type[Program] = SubFactory(ProgramFactory) - level: str = Iterator(["Beginner", "Intermediate", "Advanced"]) - year: int = LazyAttribute(lambda x: fake.random_int(min=1, max=4)) - semester: str = Iterator([choice[0] for choice in settings.SEMESTER_CHOICES]) - is_elective: bool = LazyAttribute(lambda x: fake.boolean()) - - -class CourseAllocationFactory(DjangoModelFactory): - """ - Factory for creating CourseAllocation instances. - - Attributes: - lecturer (User): The associated lecturer for the course allocation. - session (Session): The associated session for the course allocation. - """ - - class Meta: - model = CourseAllocation - - lecturer: Type[User] = SubFactory(UserFactory, is_lecturer=True) - session: Type[Session] = SubFactory(SessionFactory) - - -class UploadFactory(DjangoModelFactory): - """ - Factory for creating Upload instances. - - Attributes: - title (str): The generated title for the upload. - course (Course): The associated course for the upload. - file (str): The generated file path for the upload. - updated_date (datetime): The generated updated date for the upload. - upload_time (datetime): The generated upload time for the upload. - """ - - class Meta: - model = Upload - - title: str = LazyAttribute(lambda x: fake.sentence(nb_words=3)) - course = SubFactory(CourseFactory) # Adjust 'yourapp' with your actual app name - file: str = LazyAttribute(lambda x: fake.file_path(extension="pdf")) - updated_date = fake.date_time_this_year() - upload_time = fake.date_time_this_year() - - -class UploadVideoFactory(DjangoModelFactory): - """ - Factory for creating UploadVideo instances. - - Attributes: - title (str): The generated title for the video upload. - slug (str): The generated slug for the video upload. - course (Course): The associated course for the video upload. - video (str): The generated video path for the video upload. - summary (str): The generated summary for the video upload. - timestamp (datetime): The generated timestamp for the video upload. - """ - - class Meta: - model = UploadVideo - - title: str = LazyAttribute(lambda x: fake.sentence(nb_words=3)) - slug: str = LazyAttribute(lambda x: fake.slug()) - course = SubFactory(CourseFactory) # Adjust 'yourapp' with your actual app name - video: str = LazyAttribute(lambda x: fake.file_path(extension="mp4")) - summary: str = LazyAttribute(lambda x: fake.paragraph()) - timestamp = fake.date_time_this_year() - - -class CourseOfferFactory(DjangoModelFactory): - """ - Factory for creating CourseOffer instances. - - Attributes: - dep_head (DepartmentHead): The associated department head for the course offer. - """ - - class Meta: - model = CourseOffer - - dep_head = SubFactory(DepartmentHeadFactory) - - -def populate_course_allocation(num_allocations: int) -> None: - """ - Populate the CourseAllocation model with fake data. - - Args: - num_allocations (int): The number of CourseAllocation instances to generate. - """ - # Fetch all available courses and sessions - courses = list(Course.objects.all()) - sessions = list(Session.objects.all()) - - if not courses: - print("No courses found. Please add some courses before running this script.") - return - - if not sessions: - print("No sessions found. Please add some sessions before running this script.") - return - - # Fetch all available users (lecturers) - lecturers = list( - User.objects.filter(is_lecturer=True) - ) # Assuming lecturers are lecturer - - if not lecturers: - print( - "No lecturers found. Please add some lecturers before running this script." - ) - return - - for _ in range(num_allocations): - lecturer = random.choice(lecturers) - session = random.choice(sessions) - - # Create a CourseAllocation instance - allocation = CourseAllocation.objects.create( - lecturer=lecturer, - session=session, - ) - - # Assign random courses to the course allocation - random_courses = random.sample( - courses, random.randint(1, len(courses)) - ) # Pick 1 to n random courses - allocation.courses.set(random_courses) - - print( - f"Created CourseAllocation for lecturer: {lecturer.username} with {len(random_courses)} courses." - ) - - print(f"Successfully populated {num_allocations} CourseAllocation instances.") - - -def generate_fake_course_data( - num_programs: int, - num_courses: int, - num_course_allocations: int, - num_uploads: int, - num_upload_videos: int, - num_course_offers: int, -) -> None: - """Generate fake data using various factories. - - Args: - num_programs (int): Number of fake programs to create. - num_courses (int): Number of fake courses to create. - num_course_allocations (int): Number of fake course allocations to create. - num_uploads (int): Number of fake uploads to create. - num_upload_videos (int): Number of fake upload videos to create. - num_course_offers (int): Number of fake course offers to create. - """ - # Generate fake programs - programs = ProgramFactory.create_batch(num_programs) - print(f"Created {len(programs)} programs.") - - # Generate fake courses - courses = CourseFactory.create_batch(num_courses) - print(f"Created {len(courses)} courses.") - - # Generate fake course allocations - course_allocations = CourseAllocationFactory.create_batch(num_course_allocations) - print(f"Created {len(course_allocations)} course allocations.") - - # Generate fake uploads - uploads = UploadFactory.create_batch(num_uploads) - print(f"Created {len(uploads)} uploads.") - - # Generate fake upload videos - upload_videos = UploadVideoFactory.create_batch(num_upload_videos) - print(f"Created {len(upload_videos)} upload videos.") - - # Generate fake course offers - course_offers = CourseOfferFactory.create_batch(num_course_offers) - print(f"Created {len(course_offers)} course offers.") diff --git a/search/__init__.py b/search/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/search/admin.py b/search/admin.py deleted file mode 100644 index 8c38f3f3..00000000 --- a/search/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/search/apps.py b/search/apps.py deleted file mode 100644 index f5400913..00000000 --- a/search/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class SearchConfig(AppConfig): - name = "search" diff --git a/search/migrations/__init__.py b/search/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/search/models.py b/search/models.py deleted file mode 100644 index 71a83623..00000000 --- a/search/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/search/templatetags/__init__.py b/search/templatetags/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/search/templatetags/class_name.py b/search/templatetags/class_name.py deleted file mode 100644 index 6061bfd4..00000000 --- a/search/templatetags/class_name.py +++ /dev/null @@ -1,8 +0,0 @@ -# search.templatetags.class_name.py -from django import template - -register = template.Library() - -@register.filter() -def class_name(value): - return value.__class__.__name__ diff --git a/search/tests.py b/search/tests.py deleted file mode 100644 index 7ce503c2..00000000 --- a/search/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/search/urls.py b/search/urls.py deleted file mode 100644 index 28969857..00000000 --- a/search/urls.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.urls import path -from .views import SearchView - -urlpatterns = [ - path("", SearchView.as_view(), name="query"), -] diff --git a/search/views.py b/search/views.py deleted file mode 100644 index eae2e078..00000000 --- a/search/views.py +++ /dev/null @@ -1,38 +0,0 @@ -from itertools import chain -from django.views.generic import ListView -from core.models import NewsAndEvents -from course.models import Program, Course -from quiz.models import Quiz - - -class SearchView(ListView): - template_name = "search/search_view.html" - paginate_by = 20 - count = 0 - - def get_context_data(self, *args, **kwargs): - context = super().get_context_data(*args, **kwargs) - context["count"] = self.count or 0 - context["query"] = self.request.GET.get("q") - return context - - def get_queryset(self): - request = self.request - query = request.GET.get("q", None) - - if query is not None: - news_events_results = NewsAndEvents.objects.search(query) - program_results = Program.objects.search(query) - course_results = Course.objects.search(query) - quiz_results = Quiz.objects.search(query) - - # combine querysets - queryset_chain = chain( - news_events_results, program_results, course_results, quiz_results - ) - queryset = sorted( - queryset_chain, key=lambda instance: instance.pk, reverse=True - ) - self.count = len(queryset) # since queryset is actually a list - return queryset - return NewsAndEvents.objects.none() # just an empty queryset as default diff --git a/skyfront b/skyfront new file mode 160000 index 00000000..567700f4 --- /dev/null +++ b/skyfront @@ -0,0 +1 @@ +Subproject commit 567700f4030bf79439cc0fbb20d35dfc3e2e33fd diff --git a/static/css/style.min.css b/static/css/style.min.css deleted file mode 100644 index 85a0a3d2..00000000 --- a/static/css/style.min.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:"Rubik";font-style:normal;font-weight:300;src:url("../fonts/rubik-v14-latin/rubik-v14-latin-300.eot");src:local(""),url("../fonts/rubik-v14-latin/rubik-v14-latin-300.eot?#iefix") format("embedded-opentype"),url("../fonts/rubik-v14-latin/rubik-v14-latin-300.woff2") format("woff2"),url("../fonts/rubik-v14-latin/rubik-v14-latin-300.woff") format("woff"),url("../fonts/rubik-v14-latin/rubik-v14-latin-300.ttf") format("truetype"),url("../fonts/rubik-v14-latin/rubik-v14-latin-300.svg#Rubik") format("svg")}:root{--primary: #f8d270}*,body{font-family:"Rubik",sans-serif}body{background-color:#f3f2f2}::-webkit-scrollbar{width:.8vw;height:.8vw}::-webkit-scrollbar-track{background:#f3f2f2;border-radius:.5vw}::-webkit-scrollbar-thumb{background:#ccc;border-radius:.5vw}::-webkit-scrollbar-thumb:hover{background:#999}::-moz-selection{background-color:var(--primary);color:#000}::selection{background-color:var(--primary);color:#000}a{color:var(--bs-primary);text-decoration:none}table .info{margin-left:-240px}video{max-width:100%;box-shadow:0px 2px 5px 0px rgba(0,0,0,.16),0px 2px 10px 0px rgba(0,0,0,.12)}.dim{box-shadow:0 0 0 10000px rgba(0,0,0,.5) !important;box-shadow:0 0 0 100vmax rgba(0,0,0,.5) !important}.table{width:100%;border-collapse:collapse}.table th{background-color:#f2f2f2}.table td,.table th{vertical-align:middle;padding:8px;border:1px solid #ddd;text-align:left}.table tbody>tr>td>a{display:flex;color:#2196f3;padding:.5rem 1rem;transition:.2s}.table tbody>tr>td>a:hover{background-color:rgba(157,220,223,.3);border-radius:.2em}.table tbody>tr>td>a:focus{box-shadow:0 0 0 .3rem rgba(127,190,193,.5)}.table input{padding:10px;max-width:130px;border-style:none;border:1px solid #bbb;border-radius:.25rem;transition:.3s}.table input:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.table .dropdown #dropdownMenuButton{color:#999}.table-title{text-transform:uppercase;font-size:16px;padding:10px;margin:10px 0;color:#2196f3}#main{padding-top:65px;padding-bottom:3rem;padding-left:300px;transition:.5s}@media(max-width: 800px){#main{padding-top:115px}}#top-navbar{position:fixed;top:0;right:0;left:300px;-webkit-margin-start:-10px;z-index:90;background:#f5f5f5;box-shadow:0px 2px 5px 0px rgba(0,0,0,.1);transition:.3s}#top-navbar .nav-wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}#top-navbar .nav-wrapper .form-header{display:flex;flex:.8}#top-navbar .nav-wrapper .form-header .au-input{flex:.9}#top-navbar .nav-wrapper .form-header button{flex:.1}#top-navbar .nav-wrapper .toggle-btn{cursor:pointer;padding:.2rem .5rem}#top-navbar .nav-wrapper .toggle-btn:hover{background-color:#fff}#top-navbar.toggle-active{left:0}@media(max-width: 800px){#top-navbar .nav-wrapper .form-header{order:2}#top-navbar .nav-wrapper .toggle-btn{order:1}#top-navbar .nav-wrapper .dropdown{order:3}}.manage-wrap{position:fixed;bottom:0;right:0;left:300px;padding:.5rem;z-index:10;background-color:rgba(255,255,255,.8);border-top:1px solid #6c757d;transition:.3s}.manage-wrap.toggle-active{left:0}.au-input{display:flex;width:auto;line-height:40px;border:1px solid #e5e5e5;font-family:inherit;font-size:13px;color:#666;padding:0 17px;border-radius:3px;transition:all .2s ease}.au-input:focus{border:1px solid #343a40}.au-input--xl{min-width:935px}@media(max-width: 1600px){.au-input--xl{min-width:500px}}@media(max-width: 1000px){.au-input--xl{min-width:150px}}@media(max-width: 767px){.au-input--xl{min-width:150px;max-height:45px}}@media(max-width: 800px){.nav-wrapper .form-header{order:1;width:100%}.nav-wrapper .form-header .au-input--xl{width:100%}.nav-wrapper .toggle-btn{order:2}.nav-wrapper .dropdown{order:3}}.avatar{width:40px;height:40px;border-radius:50%;overflow:hidden}.avatar img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.avatar img:hover{filter:contrast(0.9)}.avatar.avatar-md{width:60px;height:60px}.avatar.avatar-lg{width:80px;height:80px}.dropdown-menu{box-shadow:0 0 15px 0 rgba(0,0,0,.3)}.dropdown-menu .dropdown-item{padding-top:8px;padding-bottom:8px}@keyframes grow-top{0%{transform:scale(0.8)}100%{transform:scale(1)}}#side-nav{width:300px;position:fixed;left:0;top:0;bottom:0;display:flex;flex-direction:column;justify-content:space-between;z-index:100;overflow-y:auto;resize:horizontal;background-color:#fff;box-shadow:0px 2px 5px 0px rgba(0,0,0,.16),0px 2px 10px 0px rgba(0,0,0,.12);transition:.3s}#side-nav i{margin-right:8px}#side-nav footer{margin-top:4rem}#side-nav .top-side{background:#f5f5f5;box-shadow:0px 2px 5px 0px rgba(0,0,0,.1);margin-bottom:10px;padding:.5rem 2rem}#side-nav .top-side .desktop-hide{display:none}#side-nav .top-side .desktop-hide .toggle-btn{position:absolute;top:0;right:0;left:0;background-color:#fff;color:#f2f2f2;padding:0 1rem;border-radius:2px;cursor:pointer;margin-left:auto;transition:.5s}#side-nav .top-side .desktop-hide .toggle-btn i{color:#999;margin:0 auto}#side-nav .top-side .desktop-hide .toggle-btn i:hover{color:#666;transition:.2s}#side-nav .top-side .logo img{width:90%}#side-nav ul{padding:0}#side-nav ul li{list-style:none}#side-nav ul li:last-child{border-bottom:none}#side-nav ul li a{display:flex;align-items:center;padding:.8rem 1rem;color:#666;border-radius:0 2em 2em 0;transition:.25s}#side-nav ul li a:hover{color:#007bff;background:rgba(0,111,255,.1)}#side-nav ul li.active a{background:var(--bs-primary);color:#fff}#side-nav.toggle-active{box-shadow:0px 0px 0px 0px #dbdbdb;left:-300px}@media screen and (max-width: 1150px){#side-nav .top-side{padding-top:3rem}#side-nav .top-side .desktop-hide{display:block}}#main.toggle-active{box-shadow:0px 0px 0px 0px #dbdbdb;padding-left:0px}@media screen and (max-width: 1150px){#side-nav{left:-300px}#side-nav.toggle-active{left:0;box-shadow:0 0 0 10000px rgba(0,0,0,.5)}#main{padding-left:0}#top-navbar{left:0}.manage-wrap{left:0}}#input-nav{display:flex;flex-wrap:wrap;align-items:center;padding:.3rem .9rem;margin-bottom:1rem;color:#fd7e14;border-radius:3px;background-color:#fff !important;box-shadow:inset 0 0 2.5rem rgba(0,0,0,.2)}#input-nav a{color:#007bff}#input-nav a:hover{text-decoration:underline}#input-nav a::after{content:">";color:#666;margin:0 5px;vertical-align:middle}.footer{top:100%;bottom:0;display:block;text-align:center;justify-content:center;padding:.75rem 1.25rem;margin-top:4rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.1)}.footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.title-1{position:relative;display:inline-flex;align-items:center;font-family:inherit;text-transform:capitalize;font-weight:700;font-size:24px;margin-bottom:16px;border-radius:.2em}.title-1::before{content:"";position:absolute;bottom:0;right:-5px;width:50%;height:15px;z-index:-1;border-radius:1px;background-color:rgba(83,126,226,.2);animation:lineAnim 1s ease-in forwards}.title-1 i{margin-right:8px}@keyframes lineAnim{0%{width:0px;height:4px}60%{width:50%;height:4px}100%{width:50%;height:15px}}.form-title{display:flex;align-items:center;justify-content:center;font-weight:400;font-size:17px;padding:10px;background:linear-gradient(40deg, #45cafc, #303f9f);color:#fff;text-align:center;margin-bottom:10px}.form-title i{margin-right:8px}.news{background:linear-gradient(40deg, #45cafc, #303f9f) !important;color:#fff}.events{background:linear-gradient(40deg, #ad86f6, #572ca7) !important;color:#fff}.allocate-btn{text-align:center;width:auto;padding:10px 20px;cursor:pointer;color:#5c6ac4;border:1px solid #ddd;border-radius:2rem;transition:.2s}.allocate-btn:hover{background:#ddd}.link{color:#2196f3;margin-top:40px;transition:.2s}.link:hover{color:#0b21ad}.score-wrapper{position:relative;display:flex;width:7rem;height:7rem;overflow:hidden;font-size:.75rem;background-color:#d5dce4;border-radius:50%;box-shadow:0px 0px 3px 10px #f0f0f0}.score-wrapper>.score-wrapper-bar{position:absolute;bottom:0;width:100%;transition:width 6s ease}.score-wrapper>.score-wrapper-text{position:absolute;font-size:20px;height:100%;width:100%;z-index:1;color:#fff;display:flex;justify-content:center;align-items:center}.score-wrapper .bg-success{background-color:#6cbd45 !important}.score-wrapper .bg-warning{background-color:#ffc107 !important}.score-wrapper .bg-danger{background-color:#f53d3d !important}.bg-sub-info{background-color:#35b6cc !important;color:#fff}.main-progress{animation:main-progress1 7s ease-in-out forwards}@keyframes main-progress1{0%{transform:scale(0)}95%{transform:scale(0)}100%{transform:scale(1)}}#progress-card{display:flex;align-items:center;justify-content:center;position:fixed;top:0;left:0;right:0;bottom:0;z-index:9999;overflow:hidden;background:#fff}.loader{position:relative;display:flex;justify-content:center;align-items:center;line-height:5.6;animation:loader-in-out 7s ease-in-out forwards}@keyframes loader-in-out{0%{transform:scale(0)}10%{transform:scale(1)}95%{transform:scale(1)}100%{transform:scale(0)}}.progress-bar{animation:loader-bar ease-in-out 3s forwards}@keyframes loader-bar{0%,10%{width:0%}50%,70%{width:50%}80%,95%{width:97%}100%{width:100%}}@media screen and (max-width: 500px){.content-center{display:block}.mobile-hide-500{display:none}.save-btn{font-size:14px}.title-1{font-size:20px}}@media screen and (max-width: 450px){.mobile-hide-450{display:none}}.edit-btn i{margin-right:10px}@media screen and (max-width: 450px){.edit-btn i{margin-right:0}}.switch.switch-text{position:relative;display:inline-block;vertical-align:top;width:48px;height:24px;background-color:rgba(0,0,0,0);cursor:pointer}.switch.switch-text .switch-input{position:absolute;top:0;left:0;opacity:0}.switch.switch-text .switch-label{position:relative;display:block;height:inherit;font-size:10px;font-weight:600;text-transform:uppercase;background-color:#dc3545;border-radius:2px;transition:opacity background-color .15s ease-out}.switch.switch-text .switch-label::before,.switch.switch-text .switch-label::after{position:absolute;top:50%;width:50%;margin-top:-0.5em;line-height:1;text-align:center;transition:inherit}.switch.switch-text .switch-label::before{right:1px;color:#e9ecef;content:attr(data-off)}.switch.switch-text .switch-label::after{left:1px;color:#fff;content:attr(data-on);opacity:0}.switch.switch-text .switch-input:checked~.switch-label::before{opacity:0}.switch.switch-text .switch-input:checked~.switch-label::after{opacity:1}.switch.switch-text .switch-handle{position:absolute;top:2px;left:2px;width:20px;height:20px;background:#fff;border-color:#fff;border-radius:1px;transition:left .15s ease-out}.switch.switch-text .switch-input:checked~.switch-handle{left:26px}.switch.switch-text.switch-lg{width:56px;height:28px}.switch.switch-text.switch-lg .switch-label{font-size:12px}.switch.switch-text.switch-lg .switch-handle{width:24px;height:24px}.switch.switch-text.switch-lg .switch-input:checked~.switch-handle{left:30px}.switch.switch-text.switch-sm{width:40px;height:20px}.switch.switch-text.switch-sm .switch-label{font-size:8px}.switch.switch-text.switch-sm .switch-handle{width:16px;height:16px}.switch.switch-text.switch-sm .switch-input:checked~.switch-handle{left:22px}.switch.switch-text.switch-xs{width:32px;height:16px}.switch.switch-text.switch-xs .switch-label{font-size:7px}.switch.switch-text.switch-xs .switch-handle{width:12px;height:12px}.switch.switch-text.switch-xs .switch-input:checked~.switch-handle{left:18px}.switch-pill .switch-label,.switch.switch-3d .switch-label,.switch-pill .switch-handle,.switch.switch-3d .switch-handle{border-radius:50em !important}.switch-pill .switch-label::before,.switch.switch-3d .switch-label::before{right:2px !important}.switch-pill .switch-label::after,.switch.switch-3d .switch-label::after{left:2px !important}.switch-success>.switch-input:checked~.switch-label{background:#28a745 !important;border-color:#1e7e34}.switch-success>.switch-input:checked~.switch-handle{border-color:#1e7e34}.switch-success-outline>.switch-input:checked~.switch-label{background:#fff !important;border-color:#28a745}.switch-success-outline>.switch-input:checked~.switch-label::after{color:#28a745}.switch-success-outline>.switch-input:checked~.switch-handle{border-color:#28a745}.switch-success-outline-alt>.switch-input:checked~.switch-label{background:#fff !important;border-color:#28a745}.switch-success-outline-alt>.switch-input:checked~.switch-label::after{color:#28a745}.switch-success-outline-alt>.switch-input:checked~.switch-handle{background:#28a745 !important;border-color:#28a745}.fas,.fa{font-size:16px;display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;background-color:rgba(0,0,0,.093);border-radius:50%}.fas.unstyled,.fa.unstyled{background-color:unset;border-radius:unset}.card-count .fas,.card-count .fa{font-size:24px;display:initial;align-items:initial;justify-content:initial;width:initial;height:initial;background-color:initial;border-radius:initial}.card-count{display:flex;flex-direction:column;align-items:center;justify-content:center}.card-count .text-right{display:flex;flex-direction:row-reverse;align-items:flex-end;gap:5px}.card-count .text-right h2{margin:0}@media(min-width: 800px){.card-count{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.card-count .text-right{display:block;text-align:end}.card-count .text-right h2{margin:0}.card-count .fas,.card-count .fa{border-right:1px solid #ddd}.users-count .card-count h3{border-right:1px solid #e6e6e6}}.chart-wrap{position:relative;padding:1rem;transition:.5s;background-color:#fff;border-radius:10px}.fa-expand-alt{display:none;position:absolute;top:.5rem;right:.5rem;padding:.5rem;cursor:pointer;transition:.3s}.fa-expand-alt:hover{background-color:#f1f1f1}.chart-wrap:hover{box-shadow:0 0 0 1px inset #666}.chart-wrap:hover .fa-expand-alt{display:block}.expand{transform:translateY(100%);position:fixed;bottom:0;top:3rem;left:0;right:0;width:100%;z-index:999;flex:0 0 100%;background-color:#fff;box-shadow:0 0 0 10000px rgba(0,0,0,.5) !important;box-shadow:0 0 0 100vmax rgba(0,0,0,.5) !important;transform-origin:bottom left;animation:popupAnim forwards alternate .5s ease-in-out;overflow:auto}.expand .fa-expand-alt{display:block}@keyframes popupAnim{from{transform:translateY(100%)}to{transform:translateY(0)}}.users-count .card-count{width:100%;height:100%;display:flex;justify-content:space-between;align-items:center;background-color:#fff}.users-count .card-count h2{font-weight:1000}.users-count .card-count h3{flex:0 0 40%}.users-count .card-count h3 i{display:inline-flex;width:60px;height:60px;display:flex;align-items:center;justify-content:center;border-radius:50%}.bg-light-aqua{background-color:rgba(32,177,177,.8) !important;box-shadow:0 0 0 10px rgba(32,177,177,.2) !important;color:#fff !important}.bg-light-orange{background-color:rgba(253,174,28,.8) !important;box-shadow:0 0 0 10px rgba(253,174,28,.2) !important;color:#fff !important}.bg-light-purple{background-color:rgba(203,31,255,.8) !important;box-shadow:0 0 0 10px rgba(203,31,255,.2) !important;color:#fff !important}.bg-light-red{background-color:rgba(255,19,157,.8) !important;box-shadow:0 0 0 10px rgba(255,19,157,.2) !important;color:#fff !important}.activities ul{padding-left:.5rem}.activities ul li{list-style-type:disc}.top-side{background-size:cover;background-position:top center}.color-indicator{display:inline-block;width:10px;height:10px;border-radius:2px}.bg-purple{background-color:#6f42c1}.card-header-ne{position:relative;display:flex;align-items:center;justify-content:space-between}.card-header-ne .title{vertical-align:middle}.text-danger{color:red}.user-picture{width:100px;height:100px;border:3px solid #fff;margin-top:-50px;-o-object-fit:cover;object-fit:cover}.dashboard-description strong{font-weight:600}.card .h5{font-size:1.25rem;color:#333;margin-top:15px;margin-bottom:15px}.text-danger{color:red}.bg-light-warning{background-color:#fcd96f !important}#progress-main{display:none}.class-item{display:block;border-left:4px solid #6cbd45;padding:1rem !important;background:#f8f9fa;border-radius:3px;box-shadow:0px 2px 5px 0px rgba(0,0,0,.3);transition:.5s}.class-item:hover{transform:translateX(15px)}.class-item p{padding:2px;margin:0;color:#b4b4b4;transition:.5s}.class-item a{padding:2px;color:#343a40;text-decoration:none;transition:.5s}/*# sourceMappingURL=style.min.css.map */ \ No newline at end of file diff --git a/static/css/style.min.css.map b/static/css/style.min.css.map deleted file mode 100644 index b046f8be..00000000 --- a/static/css/style.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../scss/style.scss"],"names":[],"mappings":"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","file":"style.min.css"} \ No newline at end of file diff --git a/static/fonts/rubik-v14-latin/rubik-v14-latin-300.eot b/static/fonts/rubik-v14-latin/rubik-v14-latin-300.eot deleted file mode 100644 index a83d0259..00000000 Binary files a/static/fonts/rubik-v14-latin/rubik-v14-latin-300.eot and /dev/null differ diff --git a/static/fonts/rubik-v14-latin/rubik-v14-latin-300.svg b/static/fonts/rubik-v14-latin/rubik-v14-latin-300.svg deleted file mode 100644 index 32ef9d3e..00000000 --- a/static/fonts/rubik-v14-latin/rubik-v14-latin-300.svg +++ /dev/null @@ -1,453 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/fonts/rubik-v14-latin/rubik-v14-latin-300.ttf b/static/fonts/rubik-v14-latin/rubik-v14-latin-300.ttf deleted file mode 100644 index 9b18046b..00000000 Binary files a/static/fonts/rubik-v14-latin/rubik-v14-latin-300.ttf and /dev/null differ diff --git a/static/fonts/rubik-v14-latin/rubik-v14-latin-300.woff b/static/fonts/rubik-v14-latin/rubik-v14-latin-300.woff deleted file mode 100644 index 599f830a..00000000 Binary files a/static/fonts/rubik-v14-latin/rubik-v14-latin-300.woff and /dev/null differ diff --git a/static/fonts/rubik-v14-latin/rubik-v14-latin-300.woff2 b/static/fonts/rubik-v14-latin/rubik-v14-latin-300.woff2 deleted file mode 100644 index 3eab1dd1..00000000 Binary files a/static/fonts/rubik-v14-latin/rubik-v14-latin-300.woff2 and /dev/null differ diff --git a/static/fonts/rubik-v14-latin/rubik-v14-latin-regular.eot b/static/fonts/rubik-v14-latin/rubik-v14-latin-regular.eot deleted file mode 100644 index b5559eee..00000000 Binary files a/static/fonts/rubik-v14-latin/rubik-v14-latin-regular.eot and /dev/null differ diff --git a/static/fonts/rubik-v14-latin/rubik-v14-latin-regular.svg b/static/fonts/rubik-v14-latin/rubik-v14-latin-regular.svg deleted file mode 100644 index 8f465486..00000000 --- a/static/fonts/rubik-v14-latin/rubik-v14-latin-regular.svg +++ /dev/null @@ -1,453 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/fonts/rubik-v14-latin/rubik-v14-latin-regular.ttf b/static/fonts/rubik-v14-latin/rubik-v14-latin-regular.ttf deleted file mode 100644 index e11b0ebb..00000000 Binary files a/static/fonts/rubik-v14-latin/rubik-v14-latin-regular.ttf and /dev/null differ diff --git a/static/fonts/rubik-v14-latin/rubik-v14-latin-regular.woff b/static/fonts/rubik-v14-latin/rubik-v14-latin-regular.woff deleted file mode 100644 index b8e79e18..00000000 Binary files a/static/fonts/rubik-v14-latin/rubik-v14-latin-regular.woff and /dev/null differ diff --git a/static/fonts/rubik-v14-latin/rubik-v14-latin-regular.woff2 b/static/fonts/rubik-v14-latin/rubik-v14-latin-regular.woff2 deleted file mode 100644 index 13bc82fd..00000000 Binary files a/static/fonts/rubik-v14-latin/rubik-v14-latin-regular.woff2 and /dev/null differ diff --git a/static/fonts/webfonts/fa-brands-400.eot b/static/fonts/webfonts/fa-brands-400.eot deleted file mode 100644 index e4ccce2d..00000000 Binary files a/static/fonts/webfonts/fa-brands-400.eot and /dev/null differ diff --git a/static/fonts/webfonts/fa-brands-400.svg b/static/fonts/webfonts/fa-brands-400.svg deleted file mode 100644 index eb0f26fc..00000000 --- a/static/fonts/webfonts/fa-brands-400.svg +++ /dev/null @@ -1,3570 +0,0 @@ - - - - - -Created by FontForge 20190801 at Tue Feb 4 18:05:39 2020 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/fonts/webfonts/fa-brands-400.ttf b/static/fonts/webfonts/fa-brands-400.ttf deleted file mode 100644 index 08622a3b..00000000 Binary files a/static/fonts/webfonts/fa-brands-400.ttf and /dev/null differ diff --git a/static/fonts/webfonts/fa-brands-400.woff b/static/fonts/webfonts/fa-brands-400.woff deleted file mode 100644 index a43870c2..00000000 Binary files a/static/fonts/webfonts/fa-brands-400.woff and /dev/null differ diff --git a/static/fonts/webfonts/fa-brands-400.woff2 b/static/fonts/webfonts/fa-brands-400.woff2 deleted file mode 100644 index 3c5189de..00000000 Binary files a/static/fonts/webfonts/fa-brands-400.woff2 and /dev/null differ diff --git a/static/fonts/webfonts/fa-regular-400.eot b/static/fonts/webfonts/fa-regular-400.eot deleted file mode 100644 index dbc06a4a..00000000 Binary files a/static/fonts/webfonts/fa-regular-400.eot and /dev/null differ diff --git a/static/fonts/webfonts/fa-regular-400.svg b/static/fonts/webfonts/fa-regular-400.svg deleted file mode 100644 index 273a9841..00000000 --- a/static/fonts/webfonts/fa-regular-400.svg +++ /dev/null @@ -1,803 +0,0 @@ - - - - - -Created by FontForge 20190801 at Tue Feb 4 18:05:39 2020 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/fonts/webfonts/fa-regular-400.ttf b/static/fonts/webfonts/fa-regular-400.ttf deleted file mode 100644 index 4b6fdef6..00000000 Binary files a/static/fonts/webfonts/fa-regular-400.ttf and /dev/null differ diff --git a/static/fonts/webfonts/fa-regular-400.woff b/static/fonts/webfonts/fa-regular-400.woff deleted file mode 100644 index f17953a7..00000000 Binary files a/static/fonts/webfonts/fa-regular-400.woff and /dev/null differ diff --git a/static/fonts/webfonts/fa-regular-400.woff2 b/static/fonts/webfonts/fa-regular-400.woff2 deleted file mode 100644 index 1f796c75..00000000 Binary files a/static/fonts/webfonts/fa-regular-400.woff2 and /dev/null differ diff --git a/static/fonts/webfonts/fa-solid-900.eot b/static/fonts/webfonts/fa-solid-900.eot deleted file mode 100644 index 550f8f02..00000000 Binary files a/static/fonts/webfonts/fa-solid-900.eot and /dev/null differ diff --git a/static/fonts/webfonts/fa-solid-900.svg b/static/fonts/webfonts/fa-solid-900.svg deleted file mode 100644 index 6933b2b5..00000000 --- a/static/fonts/webfonts/fa-solid-900.svg +++ /dev/null @@ -1,4700 +0,0 @@ - - - - - -Created by FontForge 20190801 at Tue Feb 4 18:05:39 2020 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/fonts/webfonts/fa-solid-900.ttf b/static/fonts/webfonts/fa-solid-900.ttf deleted file mode 100644 index 9dd8c7fd..00000000 Binary files a/static/fonts/webfonts/fa-solid-900.ttf and /dev/null differ diff --git a/static/fonts/webfonts/fa-solid-900.woff b/static/fonts/webfonts/fa-solid-900.woff deleted file mode 100644 index 3c9ef934..00000000 Binary files a/static/fonts/webfonts/fa-solid-900.woff and /dev/null differ diff --git a/static/fonts/webfonts/fa-solid-900.woff2 b/static/fonts/webfonts/fa-solid-900.woff2 deleted file mode 100644 index ba7507b1..00000000 Binary files a/static/fonts/webfonts/fa-solid-900.woff2 and /dev/null differ diff --git a/static/img/brand-filled.png b/static/img/brand-filled.png deleted file mode 100644 index f8ee2237..00000000 Binary files a/static/img/brand-filled.png and /dev/null differ diff --git a/static/img/brand.png b/static/img/brand.png deleted file mode 100644 index 5000aab5..00000000 Binary files a/static/img/brand.png and /dev/null differ diff --git a/static/img/brand.svg b/static/img/brand.svg deleted file mode 100644 index 7741a5e4..00000000 --- a/static/img/brand.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/static/img/dotted.jpg b/static/img/dotted.jpg deleted file mode 100644 index f8da00e8..00000000 Binary files a/static/img/dotted.jpg and /dev/null differ diff --git a/static/img/favicon.png b/static/img/favicon.png deleted file mode 100644 index 07a194c8..00000000 Binary files a/static/img/favicon.png and /dev/null differ diff --git a/static/img/screenshot.png b/static/img/screenshot.png deleted file mode 100644 index f0751fcc..00000000 Binary files a/static/img/screenshot.png and /dev/null differ diff --git a/static/js/main.js b/static/js/main.js deleted file mode 100644 index 3c0dab80..00000000 --- a/static/js/main.js +++ /dev/null @@ -1,89 +0,0 @@ -"use strict"; - -// side navigation bar -function toggleSidebar() { - document.getElementById("side-nav").classList.toggle("toggle-active"); - document.getElementById("main").classList.toggle("toggle-active"); - document.getElementById("top-navbar").classList.toggle("toggle-active"); - document.querySelector(".manage-wrap").classList.toggle("toggle-active"); -} - -// ################################# -// popup - -var c = 0; -function pop() { - if (c == 0) { - document.getElementById("popup-box").style.display = "block"; - c = 1; - } else { - document.getElementById("popup-box").style.display = "none"; - c = 0; - } -} - -// const popupMessagesButtons = document.querySelectorAll('popup-btn-messages') - -// popupMessagesButtons.forEach(button, () => { -// button.addEventListener('click', () => { -// document.getElementById('popup-box-messages').style.display = 'none'; -// }) -// }) - -// const popupMessagesButtom = document.getElementById('popup-btn-messages') -// popupMessagesButtom.addEventListener('click', () => { -// document.getElementById('popup-box-messages').style.display = 'none'; -// }) -// ################################## - -// Example starter JavaScript for disabling form submissions if there are invalid fields -// Fetch all the forms we want to apply custom Bootstrap validation styles to -var forms = document.getElementsByClassName("needs-validation"); - -// Loop over them and prevent submission -Array.prototype.filter.call(forms, function (form) { - form.addEventListener( - "submit", - function (event) { - if (form.checkValidity() === false) { - event.preventDefault(); - event.stopPropagation(); - } - form.classList.add("was-validated"); - }, - false - ); -}); -// ################################## - -// extend and collapse -function showCourses(btn) { - var btn = $(btn); - - if (collapsed) { - btn.html('Collapse '); - $(".hide").css("max-height", "unset"); - $(".white-shadow").css({ background: "unset", "z-index": "0" }); - } else { - btn.html('Expand '); - $(".hide").css("max-height", "150"); - $(".white-shadow").css({ - background: "linear-gradient(transparent 50%, rgba(255,255,255,.8) 80%)", - "z-index": "2", - }); - } - collapsed = !collapsed; -} - -$(document).ready(function () { - $("#primary-search").focus(function () { - $("#top-navbar").attr("class", "dim"); - $("#side-nav").css("pointer-events", "none"); - $("#main-content").css("pointer-events", "none"); - }); - $("#primary-search").focusout(function () { - $("#top-navbar").removeAttr("class"); - $("#side-nav").css("pointer-events", "auto"); - $("#main-content").css("pointer-events", "auto"); - }); -}); diff --git a/static/scss/style.scss b/static/scss/style.scss deleted file mode 100644 index 11c54467..00000000 --- a/static/scss/style.scss +++ /dev/null @@ -1,1256 +0,0 @@ -/* rubik-300 - latin */ -@font-face { - font-family: "Rubik"; - font-style: normal; - font-weight: 300; - src: url("../fonts/rubik-v14-latin/rubik-v14-latin-300.eot"); /* IE9 Compat Modes */ - src: local(""), - url("../fonts/rubik-v14-latin/rubik-v14-latin-300.eot?#iefix") - format("embedded-opentype"), - /* IE6-IE8 */ url("../fonts/rubik-v14-latin/rubik-v14-latin-300.woff2") - format("woff2"), - /* Super Modern Browsers */ - url("../fonts/rubik-v14-latin/rubik-v14-latin-300.woff") format("woff"), - /* Modern Browsers */ - url("../fonts/rubik-v14-latin/rubik-v14-latin-300.ttf") format("truetype"), - /* Safari, Android, iOS */ - url("../fonts/rubik-v14-latin/rubik-v14-latin-300.svg#Rubik") - format("svg"); /* Legacy iOS */ -} - -:root { - --primary: #f8d270; -} - -*, -body { - font-family: "Rubik", sans-serif; -} -body { - background-color: #f3f2f2; -} - -/* width */ -::-webkit-scrollbar { - width: 0.8vw; - height: 0.8vw; -} - -/* Track */ -::-webkit-scrollbar-track { - background: #f3f2f2; - border-radius: 0.5vw; -} - -/* Handle */ -::-webkit-scrollbar-thumb { - background: #ccc; - border-radius: 0.5vw; -} - -/* Handle on hover */ -::-webkit-scrollbar-thumb:hover { - background: #999; -} - -/* Override the text selection highlight color */ -::selection { - background-color: var( - --primary - ); /* Custom background color for selected text */ - color: #000; /* Custom text color for selected text */ -} - -a { - color: var(--bs-primary); - text-decoration: none; -} - -table .info { - margin-left: -240px; -} - -video { - max-width: 100%; - -webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), - 0 2px 10px 0 rgba(0, 0, 0, 0.12); - box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.16), - 0px 2px 10px 0px rgba(0, 0, 0, 0.12); -} - -.dim { - /* For Internet Explorer */ - box-shadow: 0 0 0 10000px rgba(0, 0, 0, 0.5) !important; - /* For other browsers */ - box-shadow: 0 0 0 100vmax rgba(0, 0, 0, 0.5) !important; -} - -.table { - width: 100%; - border-collapse: collapse; - th { - background-color: #f2f2f2; - } - td, - th { - vertical-align: middle; - padding: 8px; - border: 1px solid #ddd; /* Add thin borders for separation */ - text-align: left; - } - tbody > tr > td > a { - display: flex; - color: #2196f3; - padding: 0.5rem 1rem; - transition: 0.2s; - - &:hover { - background-color: rgba(157, 220, 223, 0.3); - border-radius: 0.2em; - } - &:focus { - box-shadow: 0 0 0 0.3rem rgba(127, 190, 193, 0.5); - } - } - input { - padding: 10px; - max-width: 130px; - border-style: none; - border: 1px solid #bbbbbb; - border-radius: 0.25rem; - transition: 0.3s; - - &:focus { - color: #495057; - background-color: #fff; - border-color: #80bdff; - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); - } - } - .dropdown #dropdownMenuButton { - color: #999; - } -} - -.table-title { - text-transform: uppercase; - font-size: 16px; - padding: 10px; - margin: 10px 0; - color: #2196f3; -} - -// Main content -// ###################################################### -#main { - // background-color: rgba(0, 0, 0, 0.05); - padding-top: 65px; - padding-bottom: 3rem; - padding-left: 300px; - transition: 0.5s; -} -@media (max-width: 800px) { - #main { - padding-top: 115px; - } -} - -/*====================================== - //--//--> Top Navigation - ======================================*/ -#top-navbar { - position: fixed; - top: 0; - right: 0; - left: 300px; - -webkit-margin-start: -10px; - z-index: 90; - /*padding: 0.4rem 1rem;*/ - background: #f5f5f5; - box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.1); - transition: 0.3s; - - .nav-wrapper { - // height: 56px; - display: flex; - flex-wrap: wrap; - justify-content: space-between; - align-items: center; - - .form-header { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - flex: 0.8; - - .au-input { - flex: 0.9; - } - button { - flex: 0.1; - } - } - .toggle-btn { - cursor: pointer; - padding: 0.2rem 0.5rem; - &:hover { - background-color: #fff; - } - } - } - &.toggle-active { - left: 0; - } -} - -@media (max-width: 800px) { - #top-navbar .nav-wrapper .form-header { - order: 2; - } - #top-navbar .nav-wrapper .toggle-btn { - order: 1; - } - #top-navbar .nav-wrapper .dropdown { - order: 3; - } -} - -// ************* Manage actions wrapper ************* -.manage-wrap { - position: fixed; - bottom: 0; - right: 0; - left: 300px; - padding: 0.5rem; - z-index: 10; - background-color: rgba(255, 255, 255, 0.8); - border-top: 1px solid #6c757d; - transition: 0.3s; - - &.toggle-active { - left: 0; - } -} - -/* ########################## Form ########################## */ -.au-input { - display: flex; - width: auto; - line-height: 40px; - border: 1px solid #e5e5e5; - font-family: inherit; - font-size: 13px; - color: #666; - padding: 0 17px; - border-radius: 3px; - transition: all 0.2s ease; -} -.au-input:focus { - border: 1px solid #343a40; -} -.au-input--xl { - min-width: 935px; -} - -@media (max-width: 1600px) { - .au-input--xl { - min-width: 500px; - } -} - -@media (max-width: 1000px) { - .au-input--xl { - min-width: 150px; - } -} - -@media (max-width: 767px) { - .au-input--xl { - min-width: 150px; - max-height: 45px; - } -} - -@media (max-width: 800px) { - .nav-wrapper .form-header { - -ms-flex-order: 1; - order: 1; - width: 100%; - } - .nav-wrapper .form-header .au-input--xl { - width: 100%; - } - .nav-wrapper .toggle-btn { - -ms-flex-order: 2; - order: 2; - } - .nav-wrapper .dropdown { - -ms-flex-order: 3; - order: 3; - } -} - -/* #################################################################### */ - -.avatar { - width: 40px; - height: 40px; - border-radius: 50%; - overflow: hidden; - img { - width: 100%; - height: 100%; - object-fit: cover; - &:hover { - filter: contrast(0.9); - } - } - &.avatar-md { - width: 60px; - height: 60px; - } - &.avatar-lg { - width: 80px; - height: 80px; - } -} - -/*====================================== - //--//--> Drop Down Navigation - ======================================*/ - -.dropdown-menu { - box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.3); - // transform-origin: top; - // animation: grow-top 0.2s ease-in-out forwards; - .dropdown-item { - padding-top: 8px; - padding-bottom: 8px; - } -} - -@keyframes grow-top { - 0% { - transform: scale(0.8); - } - 100% { - transform: scale(1); - } -} - -/*====================================== - //--//--> Side Navigation - ======================================*/ -#side-nav { - width: 300px; - position: fixed; - left: 0; - top: 0; - bottom: 0; - display: flex; - flex-direction: column; - justify-content: space-between; - z-index: 100; - overflow-y: auto; - resize: horizontal; - background-color: #fff; - -webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), - 0 2px 10px 0 rgba(0, 0, 0, 0.12); - box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.16), - 0px 2px 10px 0px rgba(0, 0, 0, 0.12); - transition: 0.3s; - // padding-bottom: 300px; - i { - margin-right: 8px; - } - footer { - margin-top: 4rem; - } - .top-side { - background: #f5f5f5; - -webkit-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.1); - box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.1); - margin-bottom: 10px; - padding: 0.5rem 2rem; - - .desktop-hide { - display: none; - - .toggle-btn { - position: absolute; - top: 0; - right: 0; - left: 0; - background-color: #fff; - color: #f2f2f2; - padding: 0 1rem; - border-radius: 2px; - cursor: pointer; - margin-left: auto; - transition: 0.5s; - - i { - color: #999; - margin: 0 auto; - - &:hover { - color: #666; - transition: 0.2s; - } - } - } - } - .logo img { - width: 90%; - } - } - ul { - padding: 0; - li { - list-style: none; - // border-bottom: 0.5px solid #eee; - - &:last-child { - border-bottom: none; - } - a { - display: flex; - align-items: center; - padding: 0.8rem 1rem; - color: #666; - border-radius: 0 2em 2em 0; - transition: 0.25s; - - &:hover { - color: #007bff; - background: rgba(0, 111, 255, 0.1); - } - } - &.active a { - // color: #007bff; - background: var(--bs-primary); - color: #fff; - } - } - } - &.toggle-active { - box-shadow: 0px 0px 0px 0px #dbdbdb; - left: -300px; - } -} - -@media screen and (max-width: 1150px) { - #side-nav .top-side { - padding-top: 3rem; - } - #side-nav .top-side .desktop-hide { - display: block; - } -} -#main.toggle-active { - box-shadow: 0px 0px 0px 0px #dbdbdb; - padding-left: 0px; -} - -@media screen and (max-width: 1150px) { - #side-nav { - left: -300px; - } - #side-nav.toggle-active { - left: 0; - -webkit-box-shadow: 0 0 0 10000px rgba(0, 0, 0, 0.5); - box-shadow: 0 0 0 10000px rgba(0, 0, 0, 0.5); - } - #main { - padding-left: 0; - } - #top-navbar { - left: 0; - } - .manage-wrap { - left: 0; - } -} - -/*====================================== - //--//--> Breadcrump - ======================================*/ -#input-nav { - display: flex; - flex-wrap: wrap; - align-items: center; - padding: 0.3rem 0.9rem; - margin-bottom: 1rem; - color: #fd7e14; - border-radius: 3px; - background-color: #fff !important; - box-shadow: inset 0 0 2.5rem rgba(0, 0, 0, 0.2); - - a { - color: #007bff; - &:hover { - text-decoration: underline; - } - &::after { - content: ">"; - color: #666; - margin: 0 5px; - vertical-align: middle; - } - } -} - -/*====================================== - //--//--> End Navigation - ======================================*/ -.footer { - top: 100%; - bottom: 0; - display: block; - text-align: center; - justify-content: center; - padding: 0.75rem 1.25rem; - margin-top: 4rem; - background-color: rgba(0, 0, 0, 0.03); - border-top: 1px solid rgba(0, 0, 0, 0.1); - - &:last-child { - border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); - } -} - -.title-1 { - position: relative; - display: inline-flex; - align-items: center; - font-family: inherit; - text-transform: capitalize; - font-weight: 700; - font-size: 24px; - margin-bottom: 16px; - border-radius: 0.2em; - - &::before { - content: ""; - position: absolute; - bottom: 0; - right: -5px; - width: 50%; - height: 15px; - z-index: -1; - border-radius: 1px; - background-color: rgba(83, 126, 226, 0.2); - animation: lineAnim 1s ease-in forwards; - } - i { - margin-right: 8px; - } -} - -@keyframes lineAnim { - 0% { - width: 0px; - height: 4px; - } - 60% { - width: 50%; - height: 4px; - } - 100% { - width: 50%; - height: 15px; - } -} - -.form-title { - display: flex; - align-items: center; - justify-content: center; - font-weight: 400; - font-size: 17px; - padding: 10px; - background: -o-linear-gradient(50deg, #45cafc, #303f9f); - background: linear-gradient(40deg, #45cafc, #303f9f); - color: #fff; - text-align: center; - margin-bottom: 10px; - i { - margin-right: 8px; - } -} - -.news { - background: -o-linear-gradient(50deg, #45cafc, #303f9f) !important; - background: linear-gradient(40deg, #45cafc, #303f9f) !important; - color: #fff; -} -.events { - background: -o-linear-gradient(50deg, #ad86f6, #572ca7) !important; - background: linear-gradient(40deg, #ad86f6, #572ca7) !important; - color: #fff; -} - -.allocate-btn { - /* flex: 1; */ - text-align: center; - width: auto; - /* min-width: 50px; */ - padding: 10px 20px; - /* margin: 5px auto; */ - cursor: pointer; - color: #5c6ac4; - border: 1px solid #ddd; - border-radius: 2rem; - transition: 0.2s; -} -.allocate-btn:hover { - background: #ddd; -} - -.link { - color: #2196f3; - margin-top: 40px; - transition: 0.2s; -} -.link:hover { - color: #0b21ad; -} - -/* ################################################################################################# */ -.score-wrapper { - position: relative; - display: -ms-flexbox; - display: flex; - width: 7rem; - height: 7rem; - overflow: hidden; - font-size: 0.75rem; - background-color: #d5dce4; - border-radius: 50%; - box-shadow: 0px 0px 3px 10px #f0f0f0; /* full side shadow */ -} - -.score-wrapper > .score-wrapper-bar { - position: absolute; - bottom: 0; - width: 100%; - transition: width 6s ease; -} - -.score-wrapper > .score-wrapper-text { - position: absolute; - font-size: 20px; - height: 100%; - width: 100%; - z-index: 1; - color: #fff; - display: flex; - justify-content: center; - align-items: center; -} - -.score-wrapper .bg-success { - background-color: #6cbd45 !important; -} -.score-wrapper .bg-warning { - background-color: #ffc107 !important; -} -.score-wrapper .bg-danger { - background-color: #f53d3d !important; -} -.bg-sub-info { - background-color: rgb(53, 182, 204) !important; - color: #fff; -} -.main-progress { - animation: main-progress1 7s ease-in-out forwards; -} -@keyframes main-progress1 { - 0% { - transform: scale(0); - } - 95% { - transform: scale(0); - } - 100% { - transform: scale(1); - } -} - -#progress-card { - display: flex; - align-items: center; - justify-content: center; - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: 9999; - overflow: hidden; - background: #fff; -} -/* ############################################################### */ -/* loader */ -.loader { - position: relative; - display: flex; - justify-content: center; - align-items: center; - line-height: 5.6; - animation: loader-in-out 7s ease-in-out forwards; -} -@keyframes loader-in-out { - 0% { - transform: scale(0); - } - 10% { - transform: scale(1); - } - 95% { - transform: scale(1); - } - 100% { - transform: scale(0); - } -} - -.progress-bar { - animation: loader-bar ease-in-out 3s forwards; -} -@keyframes loader-bar { - 0%, - 10% { - width: 0%; - } - 50%, - 70% { - width: 50%; - } - 80%, - 95% { - width: 97%; - } - 100% { - width: 100%; - } -} - -@media screen and (max-width: 500px) { - .content-center { - display: block; - } - .mobile-hide-500 { - display: none; - } - .save-btn { - font-size: 14px; - } - .title-1 { - font-size: 20px; - } -} - -@media screen and (max-width: 450px) { - .mobile-hide-450 { - display: none; - } - /* .drop-down{ - display: block; - } */ -} -@media screen and (min-width: 450px) { -} -.edit-btn i { - margin-right: 10px; -} - -@media screen and (max-width: 450px) { - .edit-btn i { - margin-right: 0; - } -} - -/* =============================================== */ -/* switch */ -/* ================================================== */ - -.switch.switch-text { - position: relative; - display: inline-block; - vertical-align: top; - width: 48px; - height: 24px; - background-color: transparent; - cursor: pointer; -} - -.switch.switch-text .switch-input { - position: absolute; - top: 0; - left: 0; - opacity: 0; -} - -.switch.switch-text .switch-label { - position: relative; - display: block; - height: inherit; - font-size: 10px; - font-weight: 600; - text-transform: uppercase; - background-color: #dc3545; - /* border: 1px solid #f2f2f2; */ - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - transition: opacity background-color 0.15s ease-out; -} - -.switch.switch-text .switch-label::before, -.switch.switch-text .switch-label::after { - position: absolute; - top: 50%; - width: 50%; - margin-top: -0.5em; - line-height: 1; - text-align: center; - -webkit-transition: inherit; - -o-transition: inherit; - -moz-transition: inherit; - transition: inherit; -} - -.switch.switch-text .switch-label::before { - right: 1px; - color: #e9ecef; - content: attr(data-off); -} - -.switch.switch-text .switch-label::after { - left: 1px; - color: #fff; - content: attr(data-on); - opacity: 0; -} - -.switch.switch-text .switch-input:checked ~ .switch-label::before { - opacity: 0; -} - -.switch.switch-text .switch-input:checked ~ .switch-label::after { - opacity: 1; -} - -.switch.switch-text .switch-handle { - position: absolute; - top: 2px; - left: 2px; - width: 20px; - height: 20px; - background: #fff; - border-color: #fff; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-transition: left 0.15s ease-out; - -o-transition: left 0.15s ease-out; - -moz-transition: left 0.15s ease-out; - transition: left 0.15s ease-out; -} - -.switch.switch-text .switch-input:checked ~ .switch-handle { - left: 26px; -} - -.switch.switch-text.switch-lg { - width: 56px; - height: 28px; -} - -.switch.switch-text.switch-lg .switch-label { - font-size: 12px; -} - -.switch.switch-text.switch-lg .switch-handle { - width: 24px; - height: 24px; -} - -.switch.switch-text.switch-lg .switch-input:checked ~ .switch-handle { - left: 30px; -} - -.switch.switch-text.switch-sm { - width: 40px; - height: 20px; -} - -.switch.switch-text.switch-sm .switch-label { - font-size: 8px; -} - -.switch.switch-text.switch-sm .switch-handle { - width: 16px; - height: 16px; -} - -.switch.switch-text.switch-sm .switch-input:checked ~ .switch-handle { - left: 22px; -} - -.switch.switch-text.switch-xs { - width: 32px; - height: 16px; -} - -.switch.switch-text.switch-xs .switch-label { - font-size: 7px; -} - -.switch.switch-text.switch-xs .switch-handle { - width: 12px; - height: 12px; -} - -.switch.switch-text.switch-xs .switch-input:checked ~ .switch-handle { - left: 18px; -} - -.switch-pill .switch-label, -.switch.switch-3d .switch-label, -.switch-pill .switch-handle, -.switch.switch-3d .switch-handle { - -webkit-border-radius: 50em !important; - -moz-border-radius: 50em !important; - border-radius: 50em !important; -} - -.switch-pill .switch-label::before, -.switch.switch-3d .switch-label::before { - right: 2px !important; -} - -.switch-pill .switch-label::after, -.switch.switch-3d .switch-label::after { - left: 2px !important; -} - -.switch-success > .switch-input:checked ~ .switch-label { - background: #28a745 !important; - border-color: #1e7e34; -} - -.switch-success > .switch-input:checked ~ .switch-handle { - border-color: #1e7e34; -} - -.switch-success-outline > .switch-input:checked ~ .switch-label { - background: #fff !important; - border-color: #28a745; -} - -.switch-success-outline > .switch-input:checked ~ .switch-label::after { - color: #28a745; -} - -.switch-success-outline > .switch-input:checked ~ .switch-handle { - border-color: #28a745; -} - -.switch-success-outline-alt > .switch-input:checked ~ .switch-label { - background: #fff !important; - border-color: #28a745; -} - -.switch-success-outline-alt > .switch-input:checked ~ .switch-label::after { - color: #28a745; -} - -.switch-success-outline-alt > .switch-input:checked ~ .switch-handle { - background: #28a745 !important; - border-color: #28a745; -} - -.fas, -.fa { - font-size: 16px; - display: inline-flex; - align-items: center; - justify-content: center; - width: 34px; - height: 34px; - background-color: rgba(0, 0, 0, 0.093); - border-radius: 50%; - &.unstyled { - background-color: unset; - border-radius: unset; - } -} - -/* Exclude styles for .fas and .fa elements inside dashboard page */ -.card-count .fas, -.card-count .fa { - font-size: 24px; - display: initial; - align-items: initial; - justify-content: initial; - width: initial; - height: initial; - background-color: initial; - border-radius: initial; -} -.card-count { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - .text-right { - display: flex; - flex-direction: row-reverse; - align-items: flex-end; - gap: 5px; - h2 { - margin: 0; - } - } -} -@media (min-width: 800px) { - .card-count { - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; - .text-right { - display: block; - text-align: end; - h2 { - margin: 0; - } - } - } - .card-count .fas, - .card-count .fa { - border-right: 1px solid #ddd; - } - .users-count .card-count h3 { - border-right: 1px solid rgb(230, 230, 230); - } -} - -.chart-wrap { - position: relative; - padding: 1rem; - transition: 0.5s; - background-color: #fff; - border-radius: 10px; -} - -.fa-expand-alt { - display: none; - position: absolute; - top: 0.5rem; - right: 0.5rem; - padding: 0.5rem; - cursor: pointer; - transition: 0.3s; -} - -.fa-expand-alt:hover { - background-color: #f1f1f1; -} - -.chart-wrap:hover { - box-shadow: 0 0 0 1px inset #666; -} - -.chart-wrap:hover .fa-expand-alt { - display: block; -} - -.expand { - transform: translateY(100%); - position: fixed; - bottom: 0; - top: 3rem; - left: 0; - right: 0; - width: 100%; - z-index: 999; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - background-color: #fff; - /* For Internet Explorer */ - box-shadow: 0 0 0 10000px rgba(0, 0, 0, 0.5) !important; - /* For other browsers */ - box-shadow: 0 0 0 100vmax rgba(0, 0, 0, 0.5) !important; - transform-origin: bottom left; - animation: popupAnim forwards alternate 0.5s ease-in-out; - overflow: auto; -} - -.expand .fa-expand-alt { - display: block; -} - -@keyframes popupAnim { - from { - transform: translateY(100%); - } - - to { - transform: translateY(0); - } -} - -.users-count .card-count { - width: 100%; - height: 100%; - display: flex; - justify-content: space-between; - align-items: center; - background-color: #fff; -} - -.users-count .card-count h2 { - font-weight: 1000; -} - -.users-count .card-count h3 { - flex: 0 0 40%; -} - -.users-count .card-count h3 i { - display: inline-flex; - width: 60px; - height: 60px; - display: flex; - align-items: center; - justify-content: center; - border-radius: 50%; -} - -.bg-light-aqua { - background-color: rgba(32, 177, 177, 0.8) !important; - box-shadow: 0 0 0 10px rgba(32, 177, 177, 0.2) !important; - color: #fff !important; -} - -.bg-light-orange { - background-color: rgba(253, 174, 28, 0.8) !important; - box-shadow: 0 0 0 10px rgba(253, 174, 28, 0.2) !important; - color: #fff !important; -} - -.bg-light-purple { - background-color: rgba(203, 31, 255, 0.8) !important; - box-shadow: 0 0 0 10px rgba(203, 31, 255, 0.2) !important; - color: #fff !important; -} - -.bg-light-red { - background-color: rgba(255, 19, 157, 0.8) !important; - box-shadow: 0 0 0 10px rgba(255, 19, 157, 0.2) !important; - color: #fff !important; -} - -.activities ul { - padding-left: 0.5rem; -} - -.activities ul li { - list-style-type: disc; -} - -.top-side { - background-size: cover; - background-position: top center; -} - -.color-indicator { - display: inline-block; - width: 10px; - height: 10px; - border-radius: 2px; -} - -.bg-purple { - background-color: #6f42c1; -} - -.card-header-ne { - position: relative; - display: flex; - align-items: center; - justify-content: space-between; -} - -.card-header-ne .title { - vertical-align: middle; -} - -.text-danger { - color: red; -} - -.user-picture { - width: 100px; - height: 100px; - border: 3px solid #fff; - margin-top: -50px; - object-fit: cover; -} - -/* Specific to the .dashboard-description class */ -.dashboard-description strong { - font-weight: 600; -} - -/* Adjustments for headers within cards */ -.card .h5 { - font-size: 1.25rem; - color: #333; - margin-top: 15px; - margin-bottom: 15px; -} - -.text-danger { - color: red; -} - -.bg-light-warning { - background-color: rgb(252, 217, 111) !important; -} - -#progress-main { - display: none; -} - -.class-item { - display: block; - border-left: 4px solid #6cbd45; - padding: 1rem !important; - background: #f8f9fa; - border-radius: 3px; - box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.3); - transition: 0.5s; - &:hover { - transform: translateX(15px); - } - p { - padding: 2px; - margin: 0; - color: #b4b4b4; - transition: 0.5s; - } - a { - padding: 2px; - color: #343a40; - text-decoration: none; - transition: 0.5s; - } -} diff --git a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.css b/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.css deleted file mode 100644 index 411dbb8a..00000000 --- a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.css +++ /dev/null @@ -1,4085 +0,0 @@ -/*! - * Bootstrap Grid v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -.container, -.container-fluid, -.container-xxl, -.container-xl, -.container-lg, -.container-md, -.container-sm { - --bs-gutter-x: 1.5rem; - --bs-gutter-y: 0; - width: 100%; - padding-right: calc(var(--bs-gutter-x) * 0.5); - padding-left: calc(var(--bs-gutter-x) * 0.5); - margin-right: auto; - margin-left: auto; -} - -@media (min-width: 576px) { - .container-sm, .container { - max-width: 540px; - } -} -@media (min-width: 768px) { - .container-md, .container-sm, .container { - max-width: 720px; - } -} -@media (min-width: 992px) { - .container-lg, .container-md, .container-sm, .container { - max-width: 960px; - } -} -@media (min-width: 1200px) { - .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1140px; - } -} -@media (min-width: 1400px) { - .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1320px; - } -} -:root { - --bs-breakpoint-xs: 0; - --bs-breakpoint-sm: 576px; - --bs-breakpoint-md: 768px; - --bs-breakpoint-lg: 992px; - --bs-breakpoint-xl: 1200px; - --bs-breakpoint-xxl: 1400px; -} - -.row { - --bs-gutter-x: 1.5rem; - --bs-gutter-y: 0; - display: flex; - flex-wrap: wrap; - margin-top: calc(-1 * var(--bs-gutter-y)); - margin-right: calc(-0.5 * var(--bs-gutter-x)); - margin-left: calc(-0.5 * var(--bs-gutter-x)); -} -.row > * { - box-sizing: border-box; - flex-shrink: 0; - width: 100%; - max-width: 100%; - padding-right: calc(var(--bs-gutter-x) * 0.5); - padding-left: calc(var(--bs-gutter-x) * 0.5); - margin-top: var(--bs-gutter-y); -} - -.col { - flex: 1 0 0%; -} - -.row-cols-auto > * { - flex: 0 0 auto; - width: auto; -} - -.row-cols-1 > * { - flex: 0 0 auto; - width: 100%; -} - -.row-cols-2 > * { - flex: 0 0 auto; - width: 50%; -} - -.row-cols-3 > * { - flex: 0 0 auto; - width: 33.33333333%; -} - -.row-cols-4 > * { - flex: 0 0 auto; - width: 25%; -} - -.row-cols-5 > * { - flex: 0 0 auto; - width: 20%; -} - -.row-cols-6 > * { - flex: 0 0 auto; - width: 16.66666667%; -} - -.col-auto { - flex: 0 0 auto; - width: auto; -} - -.col-1 { - flex: 0 0 auto; - width: 8.33333333%; -} - -.col-2 { - flex: 0 0 auto; - width: 16.66666667%; -} - -.col-3 { - flex: 0 0 auto; - width: 25%; -} - -.col-4 { - flex: 0 0 auto; - width: 33.33333333%; -} - -.col-5 { - flex: 0 0 auto; - width: 41.66666667%; -} - -.col-6 { - flex: 0 0 auto; - width: 50%; -} - -.col-7 { - flex: 0 0 auto; - width: 58.33333333%; -} - -.col-8 { - flex: 0 0 auto; - width: 66.66666667%; -} - -.col-9 { - flex: 0 0 auto; - width: 75%; -} - -.col-10 { - flex: 0 0 auto; - width: 83.33333333%; -} - -.col-11 { - flex: 0 0 auto; - width: 91.66666667%; -} - -.col-12 { - flex: 0 0 auto; - width: 100%; -} - -.offset-1 { - margin-left: 8.33333333%; -} - -.offset-2 { - margin-left: 16.66666667%; -} - -.offset-3 { - margin-left: 25%; -} - -.offset-4 { - margin-left: 33.33333333%; -} - -.offset-5 { - margin-left: 41.66666667%; -} - -.offset-6 { - margin-left: 50%; -} - -.offset-7 { - margin-left: 58.33333333%; -} - -.offset-8 { - margin-left: 66.66666667%; -} - -.offset-9 { - margin-left: 75%; -} - -.offset-10 { - margin-left: 83.33333333%; -} - -.offset-11 { - margin-left: 91.66666667%; -} - -.g-0, -.gx-0 { - --bs-gutter-x: 0; -} - -.g-0, -.gy-0 { - --bs-gutter-y: 0; -} - -.g-1, -.gx-1 { - --bs-gutter-x: 0.25rem; -} - -.g-1, -.gy-1 { - --bs-gutter-y: 0.25rem; -} - -.g-2, -.gx-2 { - --bs-gutter-x: 0.5rem; -} - -.g-2, -.gy-2 { - --bs-gutter-y: 0.5rem; -} - -.g-3, -.gx-3 { - --bs-gutter-x: 1rem; -} - -.g-3, -.gy-3 { - --bs-gutter-y: 1rem; -} - -.g-4, -.gx-4 { - --bs-gutter-x: 1.5rem; -} - -.g-4, -.gy-4 { - --bs-gutter-y: 1.5rem; -} - -.g-5, -.gx-5 { - --bs-gutter-x: 3rem; -} - -.g-5, -.gy-5 { - --bs-gutter-y: 3rem; -} - -@media (min-width: 576px) { - .col-sm { - flex: 1 0 0%; - } - .row-cols-sm-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-sm-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-sm-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-sm-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-sm-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-sm-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-sm-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-sm-auto { - flex: 0 0 auto; - width: auto; - } - .col-sm-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-sm-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-sm-3 { - flex: 0 0 auto; - width: 25%; - } - .col-sm-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-sm-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-sm-6 { - flex: 0 0 auto; - width: 50%; - } - .col-sm-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-sm-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-sm-9 { - flex: 0 0 auto; - width: 75%; - } - .col-sm-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-sm-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-sm-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-sm-0 { - margin-left: 0; - } - .offset-sm-1 { - margin-left: 8.33333333%; - } - .offset-sm-2 { - margin-left: 16.66666667%; - } - .offset-sm-3 { - margin-left: 25%; - } - .offset-sm-4 { - margin-left: 33.33333333%; - } - .offset-sm-5 { - margin-left: 41.66666667%; - } - .offset-sm-6 { - margin-left: 50%; - } - .offset-sm-7 { - margin-left: 58.33333333%; - } - .offset-sm-8 { - margin-left: 66.66666667%; - } - .offset-sm-9 { - margin-left: 75%; - } - .offset-sm-10 { - margin-left: 83.33333333%; - } - .offset-sm-11 { - margin-left: 91.66666667%; - } - .g-sm-0, - .gx-sm-0 { - --bs-gutter-x: 0; - } - .g-sm-0, - .gy-sm-0 { - --bs-gutter-y: 0; - } - .g-sm-1, - .gx-sm-1 { - --bs-gutter-x: 0.25rem; - } - .g-sm-1, - .gy-sm-1 { - --bs-gutter-y: 0.25rem; - } - .g-sm-2, - .gx-sm-2 { - --bs-gutter-x: 0.5rem; - } - .g-sm-2, - .gy-sm-2 { - --bs-gutter-y: 0.5rem; - } - .g-sm-3, - .gx-sm-3 { - --bs-gutter-x: 1rem; - } - .g-sm-3, - .gy-sm-3 { - --bs-gutter-y: 1rem; - } - .g-sm-4, - .gx-sm-4 { - --bs-gutter-x: 1.5rem; - } - .g-sm-4, - .gy-sm-4 { - --bs-gutter-y: 1.5rem; - } - .g-sm-5, - .gx-sm-5 { - --bs-gutter-x: 3rem; - } - .g-sm-5, - .gy-sm-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 768px) { - .col-md { - flex: 1 0 0%; - } - .row-cols-md-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-md-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-md-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-md-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-md-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-md-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-md-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-md-auto { - flex: 0 0 auto; - width: auto; - } - .col-md-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-md-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-md-3 { - flex: 0 0 auto; - width: 25%; - } - .col-md-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-md-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-md-6 { - flex: 0 0 auto; - width: 50%; - } - .col-md-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-md-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-md-9 { - flex: 0 0 auto; - width: 75%; - } - .col-md-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-md-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-md-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-md-0 { - margin-left: 0; - } - .offset-md-1 { - margin-left: 8.33333333%; - } - .offset-md-2 { - margin-left: 16.66666667%; - } - .offset-md-3 { - margin-left: 25%; - } - .offset-md-4 { - margin-left: 33.33333333%; - } - .offset-md-5 { - margin-left: 41.66666667%; - } - .offset-md-6 { - margin-left: 50%; - } - .offset-md-7 { - margin-left: 58.33333333%; - } - .offset-md-8 { - margin-left: 66.66666667%; - } - .offset-md-9 { - margin-left: 75%; - } - .offset-md-10 { - margin-left: 83.33333333%; - } - .offset-md-11 { - margin-left: 91.66666667%; - } - .g-md-0, - .gx-md-0 { - --bs-gutter-x: 0; - } - .g-md-0, - .gy-md-0 { - --bs-gutter-y: 0; - } - .g-md-1, - .gx-md-1 { - --bs-gutter-x: 0.25rem; - } - .g-md-1, - .gy-md-1 { - --bs-gutter-y: 0.25rem; - } - .g-md-2, - .gx-md-2 { - --bs-gutter-x: 0.5rem; - } - .g-md-2, - .gy-md-2 { - --bs-gutter-y: 0.5rem; - } - .g-md-3, - .gx-md-3 { - --bs-gutter-x: 1rem; - } - .g-md-3, - .gy-md-3 { - --bs-gutter-y: 1rem; - } - .g-md-4, - .gx-md-4 { - --bs-gutter-x: 1.5rem; - } - .g-md-4, - .gy-md-4 { - --bs-gutter-y: 1.5rem; - } - .g-md-5, - .gx-md-5 { - --bs-gutter-x: 3rem; - } - .g-md-5, - .gy-md-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 992px) { - .col-lg { - flex: 1 0 0%; - } - .row-cols-lg-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-lg-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-lg-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-lg-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-lg-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-lg-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-lg-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-lg-auto { - flex: 0 0 auto; - width: auto; - } - .col-lg-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-lg-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-lg-3 { - flex: 0 0 auto; - width: 25%; - } - .col-lg-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-lg-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-lg-6 { - flex: 0 0 auto; - width: 50%; - } - .col-lg-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-lg-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-lg-9 { - flex: 0 0 auto; - width: 75%; - } - .col-lg-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-lg-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-lg-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-lg-0 { - margin-left: 0; - } - .offset-lg-1 { - margin-left: 8.33333333%; - } - .offset-lg-2 { - margin-left: 16.66666667%; - } - .offset-lg-3 { - margin-left: 25%; - } - .offset-lg-4 { - margin-left: 33.33333333%; - } - .offset-lg-5 { - margin-left: 41.66666667%; - } - .offset-lg-6 { - margin-left: 50%; - } - .offset-lg-7 { - margin-left: 58.33333333%; - } - .offset-lg-8 { - margin-left: 66.66666667%; - } - .offset-lg-9 { - margin-left: 75%; - } - .offset-lg-10 { - margin-left: 83.33333333%; - } - .offset-lg-11 { - margin-left: 91.66666667%; - } - .g-lg-0, - .gx-lg-0 { - --bs-gutter-x: 0; - } - .g-lg-0, - .gy-lg-0 { - --bs-gutter-y: 0; - } - .g-lg-1, - .gx-lg-1 { - --bs-gutter-x: 0.25rem; - } - .g-lg-1, - .gy-lg-1 { - --bs-gutter-y: 0.25rem; - } - .g-lg-2, - .gx-lg-2 { - --bs-gutter-x: 0.5rem; - } - .g-lg-2, - .gy-lg-2 { - --bs-gutter-y: 0.5rem; - } - .g-lg-3, - .gx-lg-3 { - --bs-gutter-x: 1rem; - } - .g-lg-3, - .gy-lg-3 { - --bs-gutter-y: 1rem; - } - .g-lg-4, - .gx-lg-4 { - --bs-gutter-x: 1.5rem; - } - .g-lg-4, - .gy-lg-4 { - --bs-gutter-y: 1.5rem; - } - .g-lg-5, - .gx-lg-5 { - --bs-gutter-x: 3rem; - } - .g-lg-5, - .gy-lg-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 1200px) { - .col-xl { - flex: 1 0 0%; - } - .row-cols-xl-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-xl-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-xl-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-xl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-xl-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-xl-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-xl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xl-auto { - flex: 0 0 auto; - width: auto; - } - .col-xl-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-xl-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xl-3 { - flex: 0 0 auto; - width: 25%; - } - .col-xl-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-xl-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-xl-6 { - flex: 0 0 auto; - width: 50%; - } - .col-xl-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-xl-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-xl-9 { - flex: 0 0 auto; - width: 75%; - } - .col-xl-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-xl-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-xl-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-xl-0 { - margin-left: 0; - } - .offset-xl-1 { - margin-left: 8.33333333%; - } - .offset-xl-2 { - margin-left: 16.66666667%; - } - .offset-xl-3 { - margin-left: 25%; - } - .offset-xl-4 { - margin-left: 33.33333333%; - } - .offset-xl-5 { - margin-left: 41.66666667%; - } - .offset-xl-6 { - margin-left: 50%; - } - .offset-xl-7 { - margin-left: 58.33333333%; - } - .offset-xl-8 { - margin-left: 66.66666667%; - } - .offset-xl-9 { - margin-left: 75%; - } - .offset-xl-10 { - margin-left: 83.33333333%; - } - .offset-xl-11 { - margin-left: 91.66666667%; - } - .g-xl-0, - .gx-xl-0 { - --bs-gutter-x: 0; - } - .g-xl-0, - .gy-xl-0 { - --bs-gutter-y: 0; - } - .g-xl-1, - .gx-xl-1 { - --bs-gutter-x: 0.25rem; - } - .g-xl-1, - .gy-xl-1 { - --bs-gutter-y: 0.25rem; - } - .g-xl-2, - .gx-xl-2 { - --bs-gutter-x: 0.5rem; - } - .g-xl-2, - .gy-xl-2 { - --bs-gutter-y: 0.5rem; - } - .g-xl-3, - .gx-xl-3 { - --bs-gutter-x: 1rem; - } - .g-xl-3, - .gy-xl-3 { - --bs-gutter-y: 1rem; - } - .g-xl-4, - .gx-xl-4 { - --bs-gutter-x: 1.5rem; - } - .g-xl-4, - .gy-xl-4 { - --bs-gutter-y: 1.5rem; - } - .g-xl-5, - .gx-xl-5 { - --bs-gutter-x: 3rem; - } - .g-xl-5, - .gy-xl-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 1400px) { - .col-xxl { - flex: 1 0 0%; - } - .row-cols-xxl-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-xxl-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-xxl-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-xxl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-xxl-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-xxl-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-xxl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xxl-auto { - flex: 0 0 auto; - width: auto; - } - .col-xxl-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-xxl-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xxl-3 { - flex: 0 0 auto; - width: 25%; - } - .col-xxl-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-xxl-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-xxl-6 { - flex: 0 0 auto; - width: 50%; - } - .col-xxl-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-xxl-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-xxl-9 { - flex: 0 0 auto; - width: 75%; - } - .col-xxl-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-xxl-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-xxl-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-xxl-0 { - margin-left: 0; - } - .offset-xxl-1 { - margin-left: 8.33333333%; - } - .offset-xxl-2 { - margin-left: 16.66666667%; - } - .offset-xxl-3 { - margin-left: 25%; - } - .offset-xxl-4 { - margin-left: 33.33333333%; - } - .offset-xxl-5 { - margin-left: 41.66666667%; - } - .offset-xxl-6 { - margin-left: 50%; - } - .offset-xxl-7 { - margin-left: 58.33333333%; - } - .offset-xxl-8 { - margin-left: 66.66666667%; - } - .offset-xxl-9 { - margin-left: 75%; - } - .offset-xxl-10 { - margin-left: 83.33333333%; - } - .offset-xxl-11 { - margin-left: 91.66666667%; - } - .g-xxl-0, - .gx-xxl-0 { - --bs-gutter-x: 0; - } - .g-xxl-0, - .gy-xxl-0 { - --bs-gutter-y: 0; - } - .g-xxl-1, - .gx-xxl-1 { - --bs-gutter-x: 0.25rem; - } - .g-xxl-1, - .gy-xxl-1 { - --bs-gutter-y: 0.25rem; - } - .g-xxl-2, - .gx-xxl-2 { - --bs-gutter-x: 0.5rem; - } - .g-xxl-2, - .gy-xxl-2 { - --bs-gutter-y: 0.5rem; - } - .g-xxl-3, - .gx-xxl-3 { - --bs-gutter-x: 1rem; - } - .g-xxl-3, - .gy-xxl-3 { - --bs-gutter-y: 1rem; - } - .g-xxl-4, - .gx-xxl-4 { - --bs-gutter-x: 1.5rem; - } - .g-xxl-4, - .gy-xxl-4 { - --bs-gutter-y: 1.5rem; - } - .g-xxl-5, - .gx-xxl-5 { - --bs-gutter-x: 3rem; - } - .g-xxl-5, - .gy-xxl-5 { - --bs-gutter-y: 3rem; - } -} -.d-inline { - display: inline !important; -} - -.d-inline-block { - display: inline-block !important; -} - -.d-block { - display: block !important; -} - -.d-grid { - display: grid !important; -} - -.d-inline-grid { - display: inline-grid !important; -} - -.d-table { - display: table !important; -} - -.d-table-row { - display: table-row !important; -} - -.d-table-cell { - display: table-cell !important; -} - -.d-flex { - display: flex !important; -} - -.d-inline-flex { - display: inline-flex !important; -} - -.d-none { - display: none !important; -} - -.flex-fill { - flex: 1 1 auto !important; -} - -.flex-row { - flex-direction: row !important; -} - -.flex-column { - flex-direction: column !important; -} - -.flex-row-reverse { - flex-direction: row-reverse !important; -} - -.flex-column-reverse { - flex-direction: column-reverse !important; -} - -.flex-grow-0 { - flex-grow: 0 !important; -} - -.flex-grow-1 { - flex-grow: 1 !important; -} - -.flex-shrink-0 { - flex-shrink: 0 !important; -} - -.flex-shrink-1 { - flex-shrink: 1 !important; -} - -.flex-wrap { - flex-wrap: wrap !important; -} - -.flex-nowrap { - flex-wrap: nowrap !important; -} - -.flex-wrap-reverse { - flex-wrap: wrap-reverse !important; -} - -.justify-content-start { - justify-content: flex-start !important; -} - -.justify-content-end { - justify-content: flex-end !important; -} - -.justify-content-center { - justify-content: center !important; -} - -.justify-content-between { - justify-content: space-between !important; -} - -.justify-content-around { - justify-content: space-around !important; -} - -.justify-content-evenly { - justify-content: space-evenly !important; -} - -.align-items-start { - align-items: flex-start !important; -} - -.align-items-end { - align-items: flex-end !important; -} - -.align-items-center { - align-items: center !important; -} - -.align-items-baseline { - align-items: baseline !important; -} - -.align-items-stretch { - align-items: stretch !important; -} - -.align-content-start { - align-content: flex-start !important; -} - -.align-content-end { - align-content: flex-end !important; -} - -.align-content-center { - align-content: center !important; -} - -.align-content-between { - align-content: space-between !important; -} - -.align-content-around { - align-content: space-around !important; -} - -.align-content-stretch { - align-content: stretch !important; -} - -.align-self-auto { - align-self: auto !important; -} - -.align-self-start { - align-self: flex-start !important; -} - -.align-self-end { - align-self: flex-end !important; -} - -.align-self-center { - align-self: center !important; -} - -.align-self-baseline { - align-self: baseline !important; -} - -.align-self-stretch { - align-self: stretch !important; -} - -.order-first { - order: -1 !important; -} - -.order-0 { - order: 0 !important; -} - -.order-1 { - order: 1 !important; -} - -.order-2 { - order: 2 !important; -} - -.order-3 { - order: 3 !important; -} - -.order-4 { - order: 4 !important; -} - -.order-5 { - order: 5 !important; -} - -.order-last { - order: 6 !important; -} - -.m-0 { - margin: 0 !important; -} - -.m-1 { - margin: 0.25rem !important; -} - -.m-2 { - margin: 0.5rem !important; -} - -.m-3 { - margin: 1rem !important; -} - -.m-4 { - margin: 1.5rem !important; -} - -.m-5 { - margin: 3rem !important; -} - -.m-auto { - margin: auto !important; -} - -.mx-0 { - margin-right: 0 !important; - margin-left: 0 !important; -} - -.mx-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; -} - -.mx-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; -} - -.mx-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; -} - -.mx-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; -} - -.mx-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; -} - -.mx-auto { - margin-right: auto !important; - margin-left: auto !important; -} - -.my-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; -} - -.my-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; -} - -.my-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; -} - -.my-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; -} - -.my-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; -} - -.my-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; -} - -.my-auto { - margin-top: auto !important; - margin-bottom: auto !important; -} - -.mt-0 { - margin-top: 0 !important; -} - -.mt-1 { - margin-top: 0.25rem !important; -} - -.mt-2 { - margin-top: 0.5rem !important; -} - -.mt-3 { - margin-top: 1rem !important; -} - -.mt-4 { - margin-top: 1.5rem !important; -} - -.mt-5 { - margin-top: 3rem !important; -} - -.mt-auto { - margin-top: auto !important; -} - -.me-0 { - margin-right: 0 !important; -} - -.me-1 { - margin-right: 0.25rem !important; -} - -.me-2 { - margin-right: 0.5rem !important; -} - -.me-3 { - margin-right: 1rem !important; -} - -.me-4 { - margin-right: 1.5rem !important; -} - -.me-5 { - margin-right: 3rem !important; -} - -.me-auto { - margin-right: auto !important; -} - -.mb-0 { - margin-bottom: 0 !important; -} - -.mb-1 { - margin-bottom: 0.25rem !important; -} - -.mb-2 { - margin-bottom: 0.5rem !important; -} - -.mb-3 { - margin-bottom: 1rem !important; -} - -.mb-4 { - margin-bottom: 1.5rem !important; -} - -.mb-5 { - margin-bottom: 3rem !important; -} - -.mb-auto { - margin-bottom: auto !important; -} - -.ms-0 { - margin-left: 0 !important; -} - -.ms-1 { - margin-left: 0.25rem !important; -} - -.ms-2 { - margin-left: 0.5rem !important; -} - -.ms-3 { - margin-left: 1rem !important; -} - -.ms-4 { - margin-left: 1.5rem !important; -} - -.ms-5 { - margin-left: 3rem !important; -} - -.ms-auto { - margin-left: auto !important; -} - -.p-0 { - padding: 0 !important; -} - -.p-1 { - padding: 0.25rem !important; -} - -.p-2 { - padding: 0.5rem !important; -} - -.p-3 { - padding: 1rem !important; -} - -.p-4 { - padding: 1.5rem !important; -} - -.p-5 { - padding: 3rem !important; -} - -.px-0 { - padding-right: 0 !important; - padding-left: 0 !important; -} - -.px-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; -} - -.px-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; -} - -.px-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; -} - -.px-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; -} - -.px-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; -} - -.py-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; -} - -.py-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; -} - -.py-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; -} - -.py-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; -} - -.py-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; -} - -.py-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; -} - -.pt-0 { - padding-top: 0 !important; -} - -.pt-1 { - padding-top: 0.25rem !important; -} - -.pt-2 { - padding-top: 0.5rem !important; -} - -.pt-3 { - padding-top: 1rem !important; -} - -.pt-4 { - padding-top: 1.5rem !important; -} - -.pt-5 { - padding-top: 3rem !important; -} - -.pe-0 { - padding-right: 0 !important; -} - -.pe-1 { - padding-right: 0.25rem !important; -} - -.pe-2 { - padding-right: 0.5rem !important; -} - -.pe-3 { - padding-right: 1rem !important; -} - -.pe-4 { - padding-right: 1.5rem !important; -} - -.pe-5 { - padding-right: 3rem !important; -} - -.pb-0 { - padding-bottom: 0 !important; -} - -.pb-1 { - padding-bottom: 0.25rem !important; -} - -.pb-2 { - padding-bottom: 0.5rem !important; -} - -.pb-3 { - padding-bottom: 1rem !important; -} - -.pb-4 { - padding-bottom: 1.5rem !important; -} - -.pb-5 { - padding-bottom: 3rem !important; -} - -.ps-0 { - padding-left: 0 !important; -} - -.ps-1 { - padding-left: 0.25rem !important; -} - -.ps-2 { - padding-left: 0.5rem !important; -} - -.ps-3 { - padding-left: 1rem !important; -} - -.ps-4 { - padding-left: 1.5rem !important; -} - -.ps-5 { - padding-left: 3rem !important; -} - -@media (min-width: 576px) { - .d-sm-inline { - display: inline !important; - } - .d-sm-inline-block { - display: inline-block !important; - } - .d-sm-block { - display: block !important; - } - .d-sm-grid { - display: grid !important; - } - .d-sm-inline-grid { - display: inline-grid !important; - } - .d-sm-table { - display: table !important; - } - .d-sm-table-row { - display: table-row !important; - } - .d-sm-table-cell { - display: table-cell !important; - } - .d-sm-flex { - display: flex !important; - } - .d-sm-inline-flex { - display: inline-flex !important; - } - .d-sm-none { - display: none !important; - } - .flex-sm-fill { - flex: 1 1 auto !important; - } - .flex-sm-row { - flex-direction: row !important; - } - .flex-sm-column { - flex-direction: column !important; - } - .flex-sm-row-reverse { - flex-direction: row-reverse !important; - } - .flex-sm-column-reverse { - flex-direction: column-reverse !important; - } - .flex-sm-grow-0 { - flex-grow: 0 !important; - } - .flex-sm-grow-1 { - flex-grow: 1 !important; - } - .flex-sm-shrink-0 { - flex-shrink: 0 !important; - } - .flex-sm-shrink-1 { - flex-shrink: 1 !important; - } - .flex-sm-wrap { - flex-wrap: wrap !important; - } - .flex-sm-nowrap { - flex-wrap: nowrap !important; - } - .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-sm-start { - justify-content: flex-start !important; - } - .justify-content-sm-end { - justify-content: flex-end !important; - } - .justify-content-sm-center { - justify-content: center !important; - } - .justify-content-sm-between { - justify-content: space-between !important; - } - .justify-content-sm-around { - justify-content: space-around !important; - } - .justify-content-sm-evenly { - justify-content: space-evenly !important; - } - .align-items-sm-start { - align-items: flex-start !important; - } - .align-items-sm-end { - align-items: flex-end !important; - } - .align-items-sm-center { - align-items: center !important; - } - .align-items-sm-baseline { - align-items: baseline !important; - } - .align-items-sm-stretch { - align-items: stretch !important; - } - .align-content-sm-start { - align-content: flex-start !important; - } - .align-content-sm-end { - align-content: flex-end !important; - } - .align-content-sm-center { - align-content: center !important; - } - .align-content-sm-between { - align-content: space-between !important; - } - .align-content-sm-around { - align-content: space-around !important; - } - .align-content-sm-stretch { - align-content: stretch !important; - } - .align-self-sm-auto { - align-self: auto !important; - } - .align-self-sm-start { - align-self: flex-start !important; - } - .align-self-sm-end { - align-self: flex-end !important; - } - .align-self-sm-center { - align-self: center !important; - } - .align-self-sm-baseline { - align-self: baseline !important; - } - .align-self-sm-stretch { - align-self: stretch !important; - } - .order-sm-first { - order: -1 !important; - } - .order-sm-0 { - order: 0 !important; - } - .order-sm-1 { - order: 1 !important; - } - .order-sm-2 { - order: 2 !important; - } - .order-sm-3 { - order: 3 !important; - } - .order-sm-4 { - order: 4 !important; - } - .order-sm-5 { - order: 5 !important; - } - .order-sm-last { - order: 6 !important; - } - .m-sm-0 { - margin: 0 !important; - } - .m-sm-1 { - margin: 0.25rem !important; - } - .m-sm-2 { - margin: 0.5rem !important; - } - .m-sm-3 { - margin: 1rem !important; - } - .m-sm-4 { - margin: 1.5rem !important; - } - .m-sm-5 { - margin: 3rem !important; - } - .m-sm-auto { - margin: auto !important; - } - .mx-sm-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-sm-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-sm-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-sm-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-sm-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-sm-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-sm-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-sm-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-sm-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-sm-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-sm-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-sm-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-sm-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-sm-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-sm-0 { - margin-top: 0 !important; - } - .mt-sm-1 { - margin-top: 0.25rem !important; - } - .mt-sm-2 { - margin-top: 0.5rem !important; - } - .mt-sm-3 { - margin-top: 1rem !important; - } - .mt-sm-4 { - margin-top: 1.5rem !important; - } - .mt-sm-5 { - margin-top: 3rem !important; - } - .mt-sm-auto { - margin-top: auto !important; - } - .me-sm-0 { - margin-right: 0 !important; - } - .me-sm-1 { - margin-right: 0.25rem !important; - } - .me-sm-2 { - margin-right: 0.5rem !important; - } - .me-sm-3 { - margin-right: 1rem !important; - } - .me-sm-4 { - margin-right: 1.5rem !important; - } - .me-sm-5 { - margin-right: 3rem !important; - } - .me-sm-auto { - margin-right: auto !important; - } - .mb-sm-0 { - margin-bottom: 0 !important; - } - .mb-sm-1 { - margin-bottom: 0.25rem !important; - } - .mb-sm-2 { - margin-bottom: 0.5rem !important; - } - .mb-sm-3 { - margin-bottom: 1rem !important; - } - .mb-sm-4 { - margin-bottom: 1.5rem !important; - } - .mb-sm-5 { - margin-bottom: 3rem !important; - } - .mb-sm-auto { - margin-bottom: auto !important; - } - .ms-sm-0 { - margin-left: 0 !important; - } - .ms-sm-1 { - margin-left: 0.25rem !important; - } - .ms-sm-2 { - margin-left: 0.5rem !important; - } - .ms-sm-3 { - margin-left: 1rem !important; - } - .ms-sm-4 { - margin-left: 1.5rem !important; - } - .ms-sm-5 { - margin-left: 3rem !important; - } - .ms-sm-auto { - margin-left: auto !important; - } - .p-sm-0 { - padding: 0 !important; - } - .p-sm-1 { - padding: 0.25rem !important; - } - .p-sm-2 { - padding: 0.5rem !important; - } - .p-sm-3 { - padding: 1rem !important; - } - .p-sm-4 { - padding: 1.5rem !important; - } - .p-sm-5 { - padding: 3rem !important; - } - .px-sm-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-sm-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-sm-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-sm-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-sm-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-sm-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-sm-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-sm-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-sm-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-sm-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-sm-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-sm-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-sm-0 { - padding-top: 0 !important; - } - .pt-sm-1 { - padding-top: 0.25rem !important; - } - .pt-sm-2 { - padding-top: 0.5rem !important; - } - .pt-sm-3 { - padding-top: 1rem !important; - } - .pt-sm-4 { - padding-top: 1.5rem !important; - } - .pt-sm-5 { - padding-top: 3rem !important; - } - .pe-sm-0 { - padding-right: 0 !important; - } - .pe-sm-1 { - padding-right: 0.25rem !important; - } - .pe-sm-2 { - padding-right: 0.5rem !important; - } - .pe-sm-3 { - padding-right: 1rem !important; - } - .pe-sm-4 { - padding-right: 1.5rem !important; - } - .pe-sm-5 { - padding-right: 3rem !important; - } - .pb-sm-0 { - padding-bottom: 0 !important; - } - .pb-sm-1 { - padding-bottom: 0.25rem !important; - } - .pb-sm-2 { - padding-bottom: 0.5rem !important; - } - .pb-sm-3 { - padding-bottom: 1rem !important; - } - .pb-sm-4 { - padding-bottom: 1.5rem !important; - } - .pb-sm-5 { - padding-bottom: 3rem !important; - } - .ps-sm-0 { - padding-left: 0 !important; - } - .ps-sm-1 { - padding-left: 0.25rem !important; - } - .ps-sm-2 { - padding-left: 0.5rem !important; - } - .ps-sm-3 { - padding-left: 1rem !important; - } - .ps-sm-4 { - padding-left: 1.5rem !important; - } - .ps-sm-5 { - padding-left: 3rem !important; - } -} -@media (min-width: 768px) { - .d-md-inline { - display: inline !important; - } - .d-md-inline-block { - display: inline-block !important; - } - .d-md-block { - display: block !important; - } - .d-md-grid { - display: grid !important; - } - .d-md-inline-grid { - display: inline-grid !important; - } - .d-md-table { - display: table !important; - } - .d-md-table-row { - display: table-row !important; - } - .d-md-table-cell { - display: table-cell !important; - } - .d-md-flex { - display: flex !important; - } - .d-md-inline-flex { - display: inline-flex !important; - } - .d-md-none { - display: none !important; - } - .flex-md-fill { - flex: 1 1 auto !important; - } - .flex-md-row { - flex-direction: row !important; - } - .flex-md-column { - flex-direction: column !important; - } - .flex-md-row-reverse { - flex-direction: row-reverse !important; - } - .flex-md-column-reverse { - flex-direction: column-reverse !important; - } - .flex-md-grow-0 { - flex-grow: 0 !important; - } - .flex-md-grow-1 { - flex-grow: 1 !important; - } - .flex-md-shrink-0 { - flex-shrink: 0 !important; - } - .flex-md-shrink-1 { - flex-shrink: 1 !important; - } - .flex-md-wrap { - flex-wrap: wrap !important; - } - .flex-md-nowrap { - flex-wrap: nowrap !important; - } - .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-md-start { - justify-content: flex-start !important; - } - .justify-content-md-end { - justify-content: flex-end !important; - } - .justify-content-md-center { - justify-content: center !important; - } - .justify-content-md-between { - justify-content: space-between !important; - } - .justify-content-md-around { - justify-content: space-around !important; - } - .justify-content-md-evenly { - justify-content: space-evenly !important; - } - .align-items-md-start { - align-items: flex-start !important; - } - .align-items-md-end { - align-items: flex-end !important; - } - .align-items-md-center { - align-items: center !important; - } - .align-items-md-baseline { - align-items: baseline !important; - } - .align-items-md-stretch { - align-items: stretch !important; - } - .align-content-md-start { - align-content: flex-start !important; - } - .align-content-md-end { - align-content: flex-end !important; - } - .align-content-md-center { - align-content: center !important; - } - .align-content-md-between { - align-content: space-between !important; - } - .align-content-md-around { - align-content: space-around !important; - } - .align-content-md-stretch { - align-content: stretch !important; - } - .align-self-md-auto { - align-self: auto !important; - } - .align-self-md-start { - align-self: flex-start !important; - } - .align-self-md-end { - align-self: flex-end !important; - } - .align-self-md-center { - align-self: center !important; - } - .align-self-md-baseline { - align-self: baseline !important; - } - .align-self-md-stretch { - align-self: stretch !important; - } - .order-md-first { - order: -1 !important; - } - .order-md-0 { - order: 0 !important; - } - .order-md-1 { - order: 1 !important; - } - .order-md-2 { - order: 2 !important; - } - .order-md-3 { - order: 3 !important; - } - .order-md-4 { - order: 4 !important; - } - .order-md-5 { - order: 5 !important; - } - .order-md-last { - order: 6 !important; - } - .m-md-0 { - margin: 0 !important; - } - .m-md-1 { - margin: 0.25rem !important; - } - .m-md-2 { - margin: 0.5rem !important; - } - .m-md-3 { - margin: 1rem !important; - } - .m-md-4 { - margin: 1.5rem !important; - } - .m-md-5 { - margin: 3rem !important; - } - .m-md-auto { - margin: auto !important; - } - .mx-md-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-md-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-md-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-md-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-md-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-md-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-md-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-md-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-md-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-md-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-md-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-md-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-md-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-md-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-md-0 { - margin-top: 0 !important; - } - .mt-md-1 { - margin-top: 0.25rem !important; - } - .mt-md-2 { - margin-top: 0.5rem !important; - } - .mt-md-3 { - margin-top: 1rem !important; - } - .mt-md-4 { - margin-top: 1.5rem !important; - } - .mt-md-5 { - margin-top: 3rem !important; - } - .mt-md-auto { - margin-top: auto !important; - } - .me-md-0 { - margin-right: 0 !important; - } - .me-md-1 { - margin-right: 0.25rem !important; - } - .me-md-2 { - margin-right: 0.5rem !important; - } - .me-md-3 { - margin-right: 1rem !important; - } - .me-md-4 { - margin-right: 1.5rem !important; - } - .me-md-5 { - margin-right: 3rem !important; - } - .me-md-auto { - margin-right: auto !important; - } - .mb-md-0 { - margin-bottom: 0 !important; - } - .mb-md-1 { - margin-bottom: 0.25rem !important; - } - .mb-md-2 { - margin-bottom: 0.5rem !important; - } - .mb-md-3 { - margin-bottom: 1rem !important; - } - .mb-md-4 { - margin-bottom: 1.5rem !important; - } - .mb-md-5 { - margin-bottom: 3rem !important; - } - .mb-md-auto { - margin-bottom: auto !important; - } - .ms-md-0 { - margin-left: 0 !important; - } - .ms-md-1 { - margin-left: 0.25rem !important; - } - .ms-md-2 { - margin-left: 0.5rem !important; - } - .ms-md-3 { - margin-left: 1rem !important; - } - .ms-md-4 { - margin-left: 1.5rem !important; - } - .ms-md-5 { - margin-left: 3rem !important; - } - .ms-md-auto { - margin-left: auto !important; - } - .p-md-0 { - padding: 0 !important; - } - .p-md-1 { - padding: 0.25rem !important; - } - .p-md-2 { - padding: 0.5rem !important; - } - .p-md-3 { - padding: 1rem !important; - } - .p-md-4 { - padding: 1.5rem !important; - } - .p-md-5 { - padding: 3rem !important; - } - .px-md-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-md-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-md-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-md-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-md-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-md-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-md-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-md-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-md-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-md-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-md-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-md-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-md-0 { - padding-top: 0 !important; - } - .pt-md-1 { - padding-top: 0.25rem !important; - } - .pt-md-2 { - padding-top: 0.5rem !important; - } - .pt-md-3 { - padding-top: 1rem !important; - } - .pt-md-4 { - padding-top: 1.5rem !important; - } - .pt-md-5 { - padding-top: 3rem !important; - } - .pe-md-0 { - padding-right: 0 !important; - } - .pe-md-1 { - padding-right: 0.25rem !important; - } - .pe-md-2 { - padding-right: 0.5rem !important; - } - .pe-md-3 { - padding-right: 1rem !important; - } - .pe-md-4 { - padding-right: 1.5rem !important; - } - .pe-md-5 { - padding-right: 3rem !important; - } - .pb-md-0 { - padding-bottom: 0 !important; - } - .pb-md-1 { - padding-bottom: 0.25rem !important; - } - .pb-md-2 { - padding-bottom: 0.5rem !important; - } - .pb-md-3 { - padding-bottom: 1rem !important; - } - .pb-md-4 { - padding-bottom: 1.5rem !important; - } - .pb-md-5 { - padding-bottom: 3rem !important; - } - .ps-md-0 { - padding-left: 0 !important; - } - .ps-md-1 { - padding-left: 0.25rem !important; - } - .ps-md-2 { - padding-left: 0.5rem !important; - } - .ps-md-3 { - padding-left: 1rem !important; - } - .ps-md-4 { - padding-left: 1.5rem !important; - } - .ps-md-5 { - padding-left: 3rem !important; - } -} -@media (min-width: 992px) { - .d-lg-inline { - display: inline !important; - } - .d-lg-inline-block { - display: inline-block !important; - } - .d-lg-block { - display: block !important; - } - .d-lg-grid { - display: grid !important; - } - .d-lg-inline-grid { - display: inline-grid !important; - } - .d-lg-table { - display: table !important; - } - .d-lg-table-row { - display: table-row !important; - } - .d-lg-table-cell { - display: table-cell !important; - } - .d-lg-flex { - display: flex !important; - } - .d-lg-inline-flex { - display: inline-flex !important; - } - .d-lg-none { - display: none !important; - } - .flex-lg-fill { - flex: 1 1 auto !important; - } - .flex-lg-row { - flex-direction: row !important; - } - .flex-lg-column { - flex-direction: column !important; - } - .flex-lg-row-reverse { - flex-direction: row-reverse !important; - } - .flex-lg-column-reverse { - flex-direction: column-reverse !important; - } - .flex-lg-grow-0 { - flex-grow: 0 !important; - } - .flex-lg-grow-1 { - flex-grow: 1 !important; - } - .flex-lg-shrink-0 { - flex-shrink: 0 !important; - } - .flex-lg-shrink-1 { - flex-shrink: 1 !important; - } - .flex-lg-wrap { - flex-wrap: wrap !important; - } - .flex-lg-nowrap { - flex-wrap: nowrap !important; - } - .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-lg-start { - justify-content: flex-start !important; - } - .justify-content-lg-end { - justify-content: flex-end !important; - } - .justify-content-lg-center { - justify-content: center !important; - } - .justify-content-lg-between { - justify-content: space-between !important; - } - .justify-content-lg-around { - justify-content: space-around !important; - } - .justify-content-lg-evenly { - justify-content: space-evenly !important; - } - .align-items-lg-start { - align-items: flex-start !important; - } - .align-items-lg-end { - align-items: flex-end !important; - } - .align-items-lg-center { - align-items: center !important; - } - .align-items-lg-baseline { - align-items: baseline !important; - } - .align-items-lg-stretch { - align-items: stretch !important; - } - .align-content-lg-start { - align-content: flex-start !important; - } - .align-content-lg-end { - align-content: flex-end !important; - } - .align-content-lg-center { - align-content: center !important; - } - .align-content-lg-between { - align-content: space-between !important; - } - .align-content-lg-around { - align-content: space-around !important; - } - .align-content-lg-stretch { - align-content: stretch !important; - } - .align-self-lg-auto { - align-self: auto !important; - } - .align-self-lg-start { - align-self: flex-start !important; - } - .align-self-lg-end { - align-self: flex-end !important; - } - .align-self-lg-center { - align-self: center !important; - } - .align-self-lg-baseline { - align-self: baseline !important; - } - .align-self-lg-stretch { - align-self: stretch !important; - } - .order-lg-first { - order: -1 !important; - } - .order-lg-0 { - order: 0 !important; - } - .order-lg-1 { - order: 1 !important; - } - .order-lg-2 { - order: 2 !important; - } - .order-lg-3 { - order: 3 !important; - } - .order-lg-4 { - order: 4 !important; - } - .order-lg-5 { - order: 5 !important; - } - .order-lg-last { - order: 6 !important; - } - .m-lg-0 { - margin: 0 !important; - } - .m-lg-1 { - margin: 0.25rem !important; - } - .m-lg-2 { - margin: 0.5rem !important; - } - .m-lg-3 { - margin: 1rem !important; - } - .m-lg-4 { - margin: 1.5rem !important; - } - .m-lg-5 { - margin: 3rem !important; - } - .m-lg-auto { - margin: auto !important; - } - .mx-lg-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-lg-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-lg-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-lg-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-lg-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-lg-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-lg-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-lg-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-lg-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-lg-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-lg-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-lg-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-lg-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-lg-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-lg-0 { - margin-top: 0 !important; - } - .mt-lg-1 { - margin-top: 0.25rem !important; - } - .mt-lg-2 { - margin-top: 0.5rem !important; - } - .mt-lg-3 { - margin-top: 1rem !important; - } - .mt-lg-4 { - margin-top: 1.5rem !important; - } - .mt-lg-5 { - margin-top: 3rem !important; - } - .mt-lg-auto { - margin-top: auto !important; - } - .me-lg-0 { - margin-right: 0 !important; - } - .me-lg-1 { - margin-right: 0.25rem !important; - } - .me-lg-2 { - margin-right: 0.5rem !important; - } - .me-lg-3 { - margin-right: 1rem !important; - } - .me-lg-4 { - margin-right: 1.5rem !important; - } - .me-lg-5 { - margin-right: 3rem !important; - } - .me-lg-auto { - margin-right: auto !important; - } - .mb-lg-0 { - margin-bottom: 0 !important; - } - .mb-lg-1 { - margin-bottom: 0.25rem !important; - } - .mb-lg-2 { - margin-bottom: 0.5rem !important; - } - .mb-lg-3 { - margin-bottom: 1rem !important; - } - .mb-lg-4 { - margin-bottom: 1.5rem !important; - } - .mb-lg-5 { - margin-bottom: 3rem !important; - } - .mb-lg-auto { - margin-bottom: auto !important; - } - .ms-lg-0 { - margin-left: 0 !important; - } - .ms-lg-1 { - margin-left: 0.25rem !important; - } - .ms-lg-2 { - margin-left: 0.5rem !important; - } - .ms-lg-3 { - margin-left: 1rem !important; - } - .ms-lg-4 { - margin-left: 1.5rem !important; - } - .ms-lg-5 { - margin-left: 3rem !important; - } - .ms-lg-auto { - margin-left: auto !important; - } - .p-lg-0 { - padding: 0 !important; - } - .p-lg-1 { - padding: 0.25rem !important; - } - .p-lg-2 { - padding: 0.5rem !important; - } - .p-lg-3 { - padding: 1rem !important; - } - .p-lg-4 { - padding: 1.5rem !important; - } - .p-lg-5 { - padding: 3rem !important; - } - .px-lg-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-lg-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-lg-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-lg-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-lg-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-lg-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-lg-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-lg-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-lg-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-lg-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-lg-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-lg-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-lg-0 { - padding-top: 0 !important; - } - .pt-lg-1 { - padding-top: 0.25rem !important; - } - .pt-lg-2 { - padding-top: 0.5rem !important; - } - .pt-lg-3 { - padding-top: 1rem !important; - } - .pt-lg-4 { - padding-top: 1.5rem !important; - } - .pt-lg-5 { - padding-top: 3rem !important; - } - .pe-lg-0 { - padding-right: 0 !important; - } - .pe-lg-1 { - padding-right: 0.25rem !important; - } - .pe-lg-2 { - padding-right: 0.5rem !important; - } - .pe-lg-3 { - padding-right: 1rem !important; - } - .pe-lg-4 { - padding-right: 1.5rem !important; - } - .pe-lg-5 { - padding-right: 3rem !important; - } - .pb-lg-0 { - padding-bottom: 0 !important; - } - .pb-lg-1 { - padding-bottom: 0.25rem !important; - } - .pb-lg-2 { - padding-bottom: 0.5rem !important; - } - .pb-lg-3 { - padding-bottom: 1rem !important; - } - .pb-lg-4 { - padding-bottom: 1.5rem !important; - } - .pb-lg-5 { - padding-bottom: 3rem !important; - } - .ps-lg-0 { - padding-left: 0 !important; - } - .ps-lg-1 { - padding-left: 0.25rem !important; - } - .ps-lg-2 { - padding-left: 0.5rem !important; - } - .ps-lg-3 { - padding-left: 1rem !important; - } - .ps-lg-4 { - padding-left: 1.5rem !important; - } - .ps-lg-5 { - padding-left: 3rem !important; - } -} -@media (min-width: 1200px) { - .d-xl-inline { - display: inline !important; - } - .d-xl-inline-block { - display: inline-block !important; - } - .d-xl-block { - display: block !important; - } - .d-xl-grid { - display: grid !important; - } - .d-xl-inline-grid { - display: inline-grid !important; - } - .d-xl-table { - display: table !important; - } - .d-xl-table-row { - display: table-row !important; - } - .d-xl-table-cell { - display: table-cell !important; - } - .d-xl-flex { - display: flex !important; - } - .d-xl-inline-flex { - display: inline-flex !important; - } - .d-xl-none { - display: none !important; - } - .flex-xl-fill { - flex: 1 1 auto !important; - } - .flex-xl-row { - flex-direction: row !important; - } - .flex-xl-column { - flex-direction: column !important; - } - .flex-xl-row-reverse { - flex-direction: row-reverse !important; - } - .flex-xl-column-reverse { - flex-direction: column-reverse !important; - } - .flex-xl-grow-0 { - flex-grow: 0 !important; - } - .flex-xl-grow-1 { - flex-grow: 1 !important; - } - .flex-xl-shrink-0 { - flex-shrink: 0 !important; - } - .flex-xl-shrink-1 { - flex-shrink: 1 !important; - } - .flex-xl-wrap { - flex-wrap: wrap !important; - } - .flex-xl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-xl-start { - justify-content: flex-start !important; - } - .justify-content-xl-end { - justify-content: flex-end !important; - } - .justify-content-xl-center { - justify-content: center !important; - } - .justify-content-xl-between { - justify-content: space-between !important; - } - .justify-content-xl-around { - justify-content: space-around !important; - } - .justify-content-xl-evenly { - justify-content: space-evenly !important; - } - .align-items-xl-start { - align-items: flex-start !important; - } - .align-items-xl-end { - align-items: flex-end !important; - } - .align-items-xl-center { - align-items: center !important; - } - .align-items-xl-baseline { - align-items: baseline !important; - } - .align-items-xl-stretch { - align-items: stretch !important; - } - .align-content-xl-start { - align-content: flex-start !important; - } - .align-content-xl-end { - align-content: flex-end !important; - } - .align-content-xl-center { - align-content: center !important; - } - .align-content-xl-between { - align-content: space-between !important; - } - .align-content-xl-around { - align-content: space-around !important; - } - .align-content-xl-stretch { - align-content: stretch !important; - } - .align-self-xl-auto { - align-self: auto !important; - } - .align-self-xl-start { - align-self: flex-start !important; - } - .align-self-xl-end { - align-self: flex-end !important; - } - .align-self-xl-center { - align-self: center !important; - } - .align-self-xl-baseline { - align-self: baseline !important; - } - .align-self-xl-stretch { - align-self: stretch !important; - } - .order-xl-first { - order: -1 !important; - } - .order-xl-0 { - order: 0 !important; - } - .order-xl-1 { - order: 1 !important; - } - .order-xl-2 { - order: 2 !important; - } - .order-xl-3 { - order: 3 !important; - } - .order-xl-4 { - order: 4 !important; - } - .order-xl-5 { - order: 5 !important; - } - .order-xl-last { - order: 6 !important; - } - .m-xl-0 { - margin: 0 !important; - } - .m-xl-1 { - margin: 0.25rem !important; - } - .m-xl-2 { - margin: 0.5rem !important; - } - .m-xl-3 { - margin: 1rem !important; - } - .m-xl-4 { - margin: 1.5rem !important; - } - .m-xl-5 { - margin: 3rem !important; - } - .m-xl-auto { - margin: auto !important; - } - .mx-xl-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-xl-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-xl-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-xl-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-xl-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-xl-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-xl-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-xl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-xl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-xl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-xl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-xl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-xl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-xl-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-xl-0 { - margin-top: 0 !important; - } - .mt-xl-1 { - margin-top: 0.25rem !important; - } - .mt-xl-2 { - margin-top: 0.5rem !important; - } - .mt-xl-3 { - margin-top: 1rem !important; - } - .mt-xl-4 { - margin-top: 1.5rem !important; - } - .mt-xl-5 { - margin-top: 3rem !important; - } - .mt-xl-auto { - margin-top: auto !important; - } - .me-xl-0 { - margin-right: 0 !important; - } - .me-xl-1 { - margin-right: 0.25rem !important; - } - .me-xl-2 { - margin-right: 0.5rem !important; - } - .me-xl-3 { - margin-right: 1rem !important; - } - .me-xl-4 { - margin-right: 1.5rem !important; - } - .me-xl-5 { - margin-right: 3rem !important; - } - .me-xl-auto { - margin-right: auto !important; - } - .mb-xl-0 { - margin-bottom: 0 !important; - } - .mb-xl-1 { - margin-bottom: 0.25rem !important; - } - .mb-xl-2 { - margin-bottom: 0.5rem !important; - } - .mb-xl-3 { - margin-bottom: 1rem !important; - } - .mb-xl-4 { - margin-bottom: 1.5rem !important; - } - .mb-xl-5 { - margin-bottom: 3rem !important; - } - .mb-xl-auto { - margin-bottom: auto !important; - } - .ms-xl-0 { - margin-left: 0 !important; - } - .ms-xl-1 { - margin-left: 0.25rem !important; - } - .ms-xl-2 { - margin-left: 0.5rem !important; - } - .ms-xl-3 { - margin-left: 1rem !important; - } - .ms-xl-4 { - margin-left: 1.5rem !important; - } - .ms-xl-5 { - margin-left: 3rem !important; - } - .ms-xl-auto { - margin-left: auto !important; - } - .p-xl-0 { - padding: 0 !important; - } - .p-xl-1 { - padding: 0.25rem !important; - } - .p-xl-2 { - padding: 0.5rem !important; - } - .p-xl-3 { - padding: 1rem !important; - } - .p-xl-4 { - padding: 1.5rem !important; - } - .p-xl-5 { - padding: 3rem !important; - } - .px-xl-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-xl-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-xl-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-xl-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-xl-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-xl-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-xl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-xl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-xl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-xl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-xl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-xl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-xl-0 { - padding-top: 0 !important; - } - .pt-xl-1 { - padding-top: 0.25rem !important; - } - .pt-xl-2 { - padding-top: 0.5rem !important; - } - .pt-xl-3 { - padding-top: 1rem !important; - } - .pt-xl-4 { - padding-top: 1.5rem !important; - } - .pt-xl-5 { - padding-top: 3rem !important; - } - .pe-xl-0 { - padding-right: 0 !important; - } - .pe-xl-1 { - padding-right: 0.25rem !important; - } - .pe-xl-2 { - padding-right: 0.5rem !important; - } - .pe-xl-3 { - padding-right: 1rem !important; - } - .pe-xl-4 { - padding-right: 1.5rem !important; - } - .pe-xl-5 { - padding-right: 3rem !important; - } - .pb-xl-0 { - padding-bottom: 0 !important; - } - .pb-xl-1 { - padding-bottom: 0.25rem !important; - } - .pb-xl-2 { - padding-bottom: 0.5rem !important; - } - .pb-xl-3 { - padding-bottom: 1rem !important; - } - .pb-xl-4 { - padding-bottom: 1.5rem !important; - } - .pb-xl-5 { - padding-bottom: 3rem !important; - } - .ps-xl-0 { - padding-left: 0 !important; - } - .ps-xl-1 { - padding-left: 0.25rem !important; - } - .ps-xl-2 { - padding-left: 0.5rem !important; - } - .ps-xl-3 { - padding-left: 1rem !important; - } - .ps-xl-4 { - padding-left: 1.5rem !important; - } - .ps-xl-5 { - padding-left: 3rem !important; - } -} -@media (min-width: 1400px) { - .d-xxl-inline { - display: inline !important; - } - .d-xxl-inline-block { - display: inline-block !important; - } - .d-xxl-block { - display: block !important; - } - .d-xxl-grid { - display: grid !important; - } - .d-xxl-inline-grid { - display: inline-grid !important; - } - .d-xxl-table { - display: table !important; - } - .d-xxl-table-row { - display: table-row !important; - } - .d-xxl-table-cell { - display: table-cell !important; - } - .d-xxl-flex { - display: flex !important; - } - .d-xxl-inline-flex { - display: inline-flex !important; - } - .d-xxl-none { - display: none !important; - } - .flex-xxl-fill { - flex: 1 1 auto !important; - } - .flex-xxl-row { - flex-direction: row !important; - } - .flex-xxl-column { - flex-direction: column !important; - } - .flex-xxl-row-reverse { - flex-direction: row-reverse !important; - } - .flex-xxl-column-reverse { - flex-direction: column-reverse !important; - } - .flex-xxl-grow-0 { - flex-grow: 0 !important; - } - .flex-xxl-grow-1 { - flex-grow: 1 !important; - } - .flex-xxl-shrink-0 { - flex-shrink: 0 !important; - } - .flex-xxl-shrink-1 { - flex-shrink: 1 !important; - } - .flex-xxl-wrap { - flex-wrap: wrap !important; - } - .flex-xxl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xxl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-xxl-start { - justify-content: flex-start !important; - } - .justify-content-xxl-end { - justify-content: flex-end !important; - } - .justify-content-xxl-center { - justify-content: center !important; - } - .justify-content-xxl-between { - justify-content: space-between !important; - } - .justify-content-xxl-around { - justify-content: space-around !important; - } - .justify-content-xxl-evenly { - justify-content: space-evenly !important; - } - .align-items-xxl-start { - align-items: flex-start !important; - } - .align-items-xxl-end { - align-items: flex-end !important; - } - .align-items-xxl-center { - align-items: center !important; - } - .align-items-xxl-baseline { - align-items: baseline !important; - } - .align-items-xxl-stretch { - align-items: stretch !important; - } - .align-content-xxl-start { - align-content: flex-start !important; - } - .align-content-xxl-end { - align-content: flex-end !important; - } - .align-content-xxl-center { - align-content: center !important; - } - .align-content-xxl-between { - align-content: space-between !important; - } - .align-content-xxl-around { - align-content: space-around !important; - } - .align-content-xxl-stretch { - align-content: stretch !important; - } - .align-self-xxl-auto { - align-self: auto !important; - } - .align-self-xxl-start { - align-self: flex-start !important; - } - .align-self-xxl-end { - align-self: flex-end !important; - } - .align-self-xxl-center { - align-self: center !important; - } - .align-self-xxl-baseline { - align-self: baseline !important; - } - .align-self-xxl-stretch { - align-self: stretch !important; - } - .order-xxl-first { - order: -1 !important; - } - .order-xxl-0 { - order: 0 !important; - } - .order-xxl-1 { - order: 1 !important; - } - .order-xxl-2 { - order: 2 !important; - } - .order-xxl-3 { - order: 3 !important; - } - .order-xxl-4 { - order: 4 !important; - } - .order-xxl-5 { - order: 5 !important; - } - .order-xxl-last { - order: 6 !important; - } - .m-xxl-0 { - margin: 0 !important; - } - .m-xxl-1 { - margin: 0.25rem !important; - } - .m-xxl-2 { - margin: 0.5rem !important; - } - .m-xxl-3 { - margin: 1rem !important; - } - .m-xxl-4 { - margin: 1.5rem !important; - } - .m-xxl-5 { - margin: 3rem !important; - } - .m-xxl-auto { - margin: auto !important; - } - .mx-xxl-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-xxl-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-xxl-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-xxl-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-xxl-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-xxl-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-xxl-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-xxl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-xxl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-xxl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-xxl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-xxl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-xxl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-xxl-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-xxl-0 { - margin-top: 0 !important; - } - .mt-xxl-1 { - margin-top: 0.25rem !important; - } - .mt-xxl-2 { - margin-top: 0.5rem !important; - } - .mt-xxl-3 { - margin-top: 1rem !important; - } - .mt-xxl-4 { - margin-top: 1.5rem !important; - } - .mt-xxl-5 { - margin-top: 3rem !important; - } - .mt-xxl-auto { - margin-top: auto !important; - } - .me-xxl-0 { - margin-right: 0 !important; - } - .me-xxl-1 { - margin-right: 0.25rem !important; - } - .me-xxl-2 { - margin-right: 0.5rem !important; - } - .me-xxl-3 { - margin-right: 1rem !important; - } - .me-xxl-4 { - margin-right: 1.5rem !important; - } - .me-xxl-5 { - margin-right: 3rem !important; - } - .me-xxl-auto { - margin-right: auto !important; - } - .mb-xxl-0 { - margin-bottom: 0 !important; - } - .mb-xxl-1 { - margin-bottom: 0.25rem !important; - } - .mb-xxl-2 { - margin-bottom: 0.5rem !important; - } - .mb-xxl-3 { - margin-bottom: 1rem !important; - } - .mb-xxl-4 { - margin-bottom: 1.5rem !important; - } - .mb-xxl-5 { - margin-bottom: 3rem !important; - } - .mb-xxl-auto { - margin-bottom: auto !important; - } - .ms-xxl-0 { - margin-left: 0 !important; - } - .ms-xxl-1 { - margin-left: 0.25rem !important; - } - .ms-xxl-2 { - margin-left: 0.5rem !important; - } - .ms-xxl-3 { - margin-left: 1rem !important; - } - .ms-xxl-4 { - margin-left: 1.5rem !important; - } - .ms-xxl-5 { - margin-left: 3rem !important; - } - .ms-xxl-auto { - margin-left: auto !important; - } - .p-xxl-0 { - padding: 0 !important; - } - .p-xxl-1 { - padding: 0.25rem !important; - } - .p-xxl-2 { - padding: 0.5rem !important; - } - .p-xxl-3 { - padding: 1rem !important; - } - .p-xxl-4 { - padding: 1.5rem !important; - } - .p-xxl-5 { - padding: 3rem !important; - } - .px-xxl-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-xxl-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-xxl-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-xxl-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-xxl-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-xxl-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-xxl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-xxl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-xxl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-xxl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-xxl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-xxl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-xxl-0 { - padding-top: 0 !important; - } - .pt-xxl-1 { - padding-top: 0.25rem !important; - } - .pt-xxl-2 { - padding-top: 0.5rem !important; - } - .pt-xxl-3 { - padding-top: 1rem !important; - } - .pt-xxl-4 { - padding-top: 1.5rem !important; - } - .pt-xxl-5 { - padding-top: 3rem !important; - } - .pe-xxl-0 { - padding-right: 0 !important; - } - .pe-xxl-1 { - padding-right: 0.25rem !important; - } - .pe-xxl-2 { - padding-right: 0.5rem !important; - } - .pe-xxl-3 { - padding-right: 1rem !important; - } - .pe-xxl-4 { - padding-right: 1.5rem !important; - } - .pe-xxl-5 { - padding-right: 3rem !important; - } - .pb-xxl-0 { - padding-bottom: 0 !important; - } - .pb-xxl-1 { - padding-bottom: 0.25rem !important; - } - .pb-xxl-2 { - padding-bottom: 0.5rem !important; - } - .pb-xxl-3 { - padding-bottom: 1rem !important; - } - .pb-xxl-4 { - padding-bottom: 1.5rem !important; - } - .pb-xxl-5 { - padding-bottom: 3rem !important; - } - .ps-xxl-0 { - padding-left: 0 !important; - } - .ps-xxl-1 { - padding-left: 0.25rem !important; - } - .ps-xxl-2 { - padding-left: 0.5rem !important; - } - .ps-xxl-3 { - padding-left: 1rem !important; - } - .ps-xxl-4 { - padding-left: 1.5rem !important; - } - .ps-xxl-5 { - padding-left: 3rem !important; - } -} -@media print { - .d-print-inline { - display: inline !important; - } - .d-print-inline-block { - display: inline-block !important; - } - .d-print-block { - display: block !important; - } - .d-print-grid { - display: grid !important; - } - .d-print-inline-grid { - display: inline-grid !important; - } - .d-print-table { - display: table !important; - } - .d-print-table-row { - display: table-row !important; - } - .d-print-table-cell { - display: table-cell !important; - } - .d-print-flex { - display: flex !important; - } - .d-print-inline-flex { - display: inline-flex !important; - } - .d-print-none { - display: none !important; - } -} - -/*# sourceMappingURL=bootstrap-grid.css.map */ \ No newline at end of file diff --git a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.css.map b/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.css.map deleted file mode 100644 index 76a689ac..00000000 --- a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","bootstrap-grid.css","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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EE,mBAAA;EJ6+BR;EI1+BM;;IAEE,mBAAA;EJ4+BR;AACF;AKpiCQ;EAOI,0BAAA;ALgiCZ;;AKviCQ;EAOI,gCAAA;ALoiCZ;;AK3iCQ;EAOI,yBAAA;ALwiCZ;;AK/iCQ;EAOI,wBAAA;AL4iCZ;;AKnjCQ;EAOI,+BAAA;ALgjCZ;;AKvjCQ;EAOI,yBAAA;ALojCZ;;AK3jCQ;EAOI,6BAAA;ALwjCZ;;AK/jCQ;EAOI,8BAAA;AL4jCZ;;AKnkCQ;EAOI,wBAAA;ALgkCZ;;AKvkCQ;EAOI,+BAAA;ALokCZ;;AK3kCQ;EAOI,wBAAA;ALwkCZ;;AK/kCQ;EAOI,yBAAA;AL4kCZ;;AKnlCQ;EAOI,8BAAA;ALglCZ;;AKvlCQ;EAOI,iCAAA;ALolCZ;;AK3lCQ;EAOI,sCAAA;ALwlCZ;;AK/lCQ;EAOI,yCAAA;AL4lCZ;;AKnmCQ;EAOI,uBAAA;ALgmCZ;;AKvmCQ;EAOI,uBAAA;ALomCZ;;AK3mCQ;EAOI,yBAAA;ALwmCZ;;AK/mCQ;EAOI,yBAAA;AL4mCZ;;AKnnCQ;EAOI,0BAAA;ALgnCZ;;AKvnCQ;EAOI,4BAAA;ALonCZ;;AK3nCQ;EAOI,kCAAA;ALwnCZ;;AK/nCQ;EAOI,sCAAA;AL4nCZ;;AKnoCQ;EAOI,oCAAA;ALgoCZ;;AKvoCQ;EAOI,kCAAA;ALooCZ;;AK3oCQ;EAOI,yCAAA;ALwoCZ;;AK/oCQ;EAOI,wCAAA;AL4oCZ;;AKnpCQ;EAOI,wCAAA;ALgpCZ;;AKvpCQ;EAOI,kCAAA;ALopCZ;;AK3pCQ;EAOI,gCAAA;ALwpCZ;;AK/pCQ;EAOI,8BAAA;AL4pCZ;;AKnqCQ;EAOI,gCAAA;ALgqCZ;;AKvqCQ;EAOI,+BAAA;ALoqCZ;;AK3qCQ;EAOI,oCAAA;ALwqCZ;;AK/qCQ;EAOI,kCAAA;AL4qCZ;;AKnrCQ;EAOI,gCAAA;ALgrCZ;;AKvrCQ;EAOI,uCAAA;ALorCZ;;AK3rCQ;EAOI,sCAAA;ALwrCZ;;AK/rCQ;EAOI,iCAAA;AL4rCZ;;AKnsCQ;EAOI,2BAAA;ALgsCZ;;AKvsCQ;EAOI,iCAAA;ALosCZ;;AK3sCQ;EAOI,+BAAA;ALwsCZ;;AK/sCQ;EAOI,6BAAA;AL4sCZ;;AKntCQ;EA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;AL8iDZ;;AKrjDQ;EAOI,4BAAA;ALkjDZ;;AKzjDQ;EAOI,2BAAA;ALsjDZ;;AK7jDQ;EAOI,iCAAA;AL0jDZ;;AKjkDQ;EAOI,gCAAA;AL8jDZ;;AKrkDQ;EAOI,8BAAA;ALkkDZ;;AKzkDQ;EAOI,gCAAA;ALskDZ;;AK7kDQ;EAOI,8BAAA;AL0kDZ;;AKjlDQ;EAOI,4BAAA;AL8kDZ;;AKrlDQ;EAOI,kCAAA;ALklDZ;;AKzlDQ;EAOI,iCAAA;ALslDZ;;AK7lDQ;EAOI,+BAAA;AL0lDZ;;AKjmDQ;EAOI,iCAAA;AL8lDZ;;AKrmDQ;EAOI,+BAAA;ALkmDZ;;AKzmDQ;EAOI,0BAAA;ALsmDZ;;AK7mDQ;EAOI,gCAAA;AL0mDZ;;AKjnDQ;EAOI,+BAAA;AL8mDZ;;AKrnDQ;EAOI,6BAAA;ALknDZ;;AKznDQ;EAOI,+BAAA;ALsnDZ;;AK7nDQ;EAOI,6BAAA;AL0nDZ;;ACpoDI;EIGI;IAOI,0BAAA;EL+nDV;EKtoDM;IAOI,gCAAA;ELkoDV;EKzoDM;IAOI,yBAAA;ELqoDV;EK5oDM;IAOI,wBAAA;ELwoDV;EK/oDM;IAOI,+BAAA;EL2oDV;EKlpDM;IAOI,yBAAA;EL8oDV;EKrpDM;IAOI,6BAAA;ELipDV;EKxpDM;IAOI,8BAAA;ELopDV;EK3pDM;IAOI,wBAAA;ELupDV;EK9pDM;IAOI,+BAAA;EL0pDV;EKjqDM;IAOI,wBAAA;EL6pDV;EKpqDM;IAOI,yBAAA;ELgqDV;EKvqDM;IAOI,8BAAA;ELmqDV;EK1qDM;IAOI,iCAAA;ELsqDV;EK7qDM;IAOI,sCAAA;ELyqDV;EKhrDM;IAOI,yCAAA;EL4qDV;EKnrDM;IAOI,uBAAA;EL+qDV;EKtrDM;IAOI,uBAAA;ELkrDV;EKzrDM;IAOI,yBAAA;ELqrDV;EK5rDM;IAOI,yBAAA;ELwrDV;EK/rDM;IAOI,0BAAA;EL2rDV;EKlsDM;IAOI,4BAAA;EL8rDV;EKrsDM;IAOI,kCAAA;ELisDV;EKxsDM;IAOI,sCAAA;ELosDV;EK3sDM;IAOI,oCAAA;ELusDV;EK9sDM;IAOI,kCAAA;EL0sDV;EKjtDM;IAOI,yCAAA;EL6sDV;EKptDM;IAOI,wCAAA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nEV;EK/nEM;IAOI,yCAAA;EL2nEV;EKloEM;IAOI,uBAAA;EL8nEV;EKroEM;IAOI,uBAAA;ELioEV;EKxoEM;IAOI,yBAAA;ELooEV;EK3oEM;IAOI,yBAAA;ELuoEV;EK9oEM;IAOI,0BAAA;EL0oEV;EKjpEM;IAOI,4BAAA;EL6oEV;EKppEM;IAOI,kCAAA;ELgpEV;EKvpEM;IAOI,sCAAA;ELmpEV;EK1pEM;IAOI,oCAAA;ELspEV;EK7pEM;IAOI,kCAAA;ELypEV;EKhqEM;IAOI,yCAAA;EL4pEV;EKnqEM;IAOI,wCAAA;EL+pEV;EKtqEM;IAOI,wCAAA;ELkqEV;EKzqEM;IAOI,kCAAA;ELqqEV;EK5qEM;IAOI,gCAAA;ELwqEV;EK/qEM;IAOI,8BAAA;EL2qEV;EKlrEM;IAOI,gCAAA;EL8qEV;EKrrEM;IAOI,+BAAA;ELirEV;EKxrEM;IAOI,oCAAA;ELorEV;EK3rEM;IAOI,kCAAA;ELurEV;EK9rEM;IAOI,gCAAA;EL0rEV;EKjsEM;IAOI,uCAAA;EL6rEV;EKpsEM;IAOI,sCAAA;ELgsEV;EKvsEM;IAOI,iCAAA;ELmsEV;EK1sEM;IAOI,2BAAA;ELssEV;EK7sEM;IAOI,iCAAA;ELysEV;EKhtEM;IAOI,+BAAA;EL4sEV;EKntEM;IAOI,6BAAA;EL+sEV;EKttEM;IAOI,+BAAA;ELktEV;EKztEM;IAOI,8BAAA;ELqtEV;EK5tEM;IAOI,oBAAA;ELwtEV;EK/tEM;IAOI,mBAAA;EL2tEV;EKluEM;IAOI,mBAAA;EL8tEV;EKruEM;IAOI,mBAAA;ELiuEV;EKxuEM;IAOI,mBAAA;ELouEV;EK3uEM;IAOI,mBAAA;ELuuEV;EK9uEM;IAOI,mBAAA;EL0uEV;EKjvEM;IAOI,mBAAA;EL6uEV;EKpvEM;IAOI,oBAAA;ELgvEV;EKvvEM;IAOI,0BAAA;ELmvEV;EK1vEM;IAOI,yBAAA;ELsvEV;EK7vEM;IAOI,uBAAA;ELyvEV;EKhwEM;IAOI,yBAAA;EL4vEV;EKnwEM;IAOI,uBAAA;EL+vEV;EKtwEM;IAOI,uBAAA;ELkwEV;EKzwEM;IAOI,0BAAA;IAAA,yBAAA;ELswEV;EK7wEM;IAO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EKviFM;IAOI,yBAAA;ELmiFV;EK1iFM;IAOI,wBAAA;ELsiFV;EK7iFM;IAOI,+BAAA;ELyiFV;EKhjFM;IAOI,yBAAA;EL4iFV;EKnjFM;IAOI,6BAAA;EL+iFV;EKtjFM;IAOI,8BAAA;ELkjFV;EKzjFM;IAOI,wBAAA;ELqjFV;EK5jFM;IAOI,+BAAA;ELwjFV;EK/jFM;IAOI,wBAAA;EL2jFV;EKlkFM;IAOI,yBAAA;EL8jFV;EKrkFM;IAOI,8BAAA;ELikFV;EKxkFM;IAOI,iCAAA;ELokFV;EK3kFM;IAOI,sCAAA;ELukFV;EK9kFM;IAOI,yCAAA;EL0kFV;EKjlFM;IAOI,uBAAA;EL6kFV;EKplFM;IAOI,uBAAA;ELglFV;EKvlFM;IAOI,yBAAA;ELmlFV;EK1lFM;IAOI,yBAAA;ELslFV;EK7lFM;IAOI,0BAAA;ELylFV;EKhmFM;IAOI,4BAAA;EL4lFV;EKnmFM;IAOI,kCAAA;EL+lFV;EKtmFM;IAOI,sCAAA;ELkmFV;EKzmFM;IAOI,oCAAA;ELqmFV;EK5mFM;IAOI,kCAAA;ELwmFV;EK/mFM;IAOI,yCAAA;EL2mFV;EKlnFM;IAOI,wCAAA;EL8mFV;EKrnFM;IAOI,wCAAA;ELinFV;EKxnFM;IAOI,kCAAA;ELonFV;EK3nFM;IAOI,gCAAA;ELunFV;EK9nFM;IAOI,8BAAA;EL0nFV;EKjoFM;IAOI,gCAAA;EL6nFV;EKpoFM;IAOI,+BAAA;ELgoFV;EKvoFM;IAOI,oCAAA;ELmoFV;EK1oFM;IAOI,kCAAA;ELsoFV;EK7oFM;IAOI,gCAAA;ELyoFV;EKhpFM;IAOI,uCAAA;EL4oFV;EKnpFM;IAOI,sCAAA;EL+oFV;EKtpFM;IAOI,iCAAA;ELkpFV;EKzpFM;IAOI,2BAAA;ELqpFV;EK5pFM;IAOI,iCAAA;ELwpFV;EK/pFM;IAOI,+BAAA;EL2pFV;EKlqFM;IAOI,6BAAA;EL8pFV;EKrqFM;IAOI,+BAAA;ELiqFV;EKxqFM;IAOI,8BAAA;ELoqFV;EK3qFM;IAOI,oBAAA;ELuqFV;EK9qFM;IAOI,mBAAA;EL0qFV;EKjrFM;IAOI,mBAAA;EL6qFV;EKprFM;IAOI,mBAAA;ELgrFV;EKvrFM;IAOI,mBAAA;ELmrFV;EK1rFM;IAOI,mBAAA;ELsrFV;EK7rFM;IAOI,mBAAA;ELyrFV;EKhsFM;IAOI,mBAAA;EL4rFV;EKnsFM;IAOI,oBAAA;EL+rFV;EKtsFM;IAOI,0BAAA;ELksFV;EKzsFM;IAOI,yBAAA;ELqsFV;EK5sFM;IAOI,uBAAA;ELwsFV;EK/sFM;IAOI,yBAAA;EL2sFV;EKltFM;IAOI,uBAAA;EL8sFV;EKrtFM;IAOI,uBAAA;ELitFV;EKxtFM;IAOI,0BAAA;IAAA,yBAAA;ELqtFV;EK5tFM;IAOI,gCAAA;IAAA,+BAAA;ELytFV;EKhuFM;IAOI,+BAAA;IAAA,8BAAA;EL6tFV;EKpuFM;IAOI,6BAAA;IAAA,4BAAA;ELiuFV;EKxuFM;IAOI,+BAAA;IAAA,8BAAA;ELquFV;EK5uFM;IAOI,6BAAA;IAAA,4BAAA;ELyuFV;EKhvFM;IAOI,6BAAA;IAAA,4BAAA;EL6uFV;EKpvFM;IAOI,wBAAA;IAAA,2BAAA;ELivFV;EKxvFM;IAOI,8BAAA;IAAA,iCAAA;ELqvFV;EK5vFM;IAOI,6BAAA;IAAA,gCAAA;ELyvFV;EKhwFM;IAOI,2BAAA;IAAA,8BAAA;EL6vFV;EKpwFM;IAOI,6BAAA;IAAA,gCAAA;ELiwFV;EKxwFM;IAOI,2BAAA;IAAA,8BAAA;ELqwFV;EK5wFM;IAOI,2BAAA;IAAA,8BAAA;ELywFV;EKhxFM;IAOI,wBAAA;EL4wFV;EKnxFM;IAOI,8BAAA;EL+wFV;EKtxFM;IAOI,6BAAA;ELkxFV;EKzxFM;IAOI,2BAAA;ELqxFV;EK5xFM;IAOI,6BAAA;ELwxFV;EK/xFM;IAOI,2BAAA;EL2xFV;EKlyFM;IAOI,2BAAA;EL8xFV;EKryFM;IAOI,0BAAA;ELiyFV;EKxyFM;IAOI,gCAAA;ELoyFV;EK3yFM;IAOI,+BAAA;ELuyFV;EK9yFM;IAOI,6BAAA;EL0yFV;EKjzFM;IAOI,+BAAA;EL6yFV;EKpzFM;IAOI,6BAAA;ELgzFV;EKvzFM;IAOI,6BAAA;ELmzFV;EK1zFM;IAOI,2BAAA;ELszFV;EK7zFM;IAOI,iCAAA;ELyzFV;EKh0FM;IAOI,gCAAA;EL4zFV;EKn0FM;IAOI,8BAAA;EL+zFV;EKt0FM;IAOI,gCAAA;ELk0FV;EKz0FM;IAOI,8BAAA;ELq0FV;EK50FM;IAOI,8BAAA;ELw0FV;EK/0FM;IAOI,yBAAA;EL20FV;EKl1FM;IAOI,+BAAA;EL80FV;EKr1FM;IAOI,8BAAA;ELi1FV;EKx1FM;IAOI,4BAAA;ELo1FV;EK31FM;IAOI,8BAAA;ELu1FV;EK91FM;IAOI,4BAAA;EL01FV;EKj2FM;IAOI,4BAAA;EL61FV;EKp2FM;IAOI,qBAAA;ELg2FV;EKv2FM;IAOI,2BAAA;ELm2FV;EK12FM;IAOI,0BAAA;ELs2FV;EK72FM;IAOI,wBAAA;ELy2FV;EKh3FM;IAOI,0BAAA;EL42FV;EKn3FM;IAOI,wBAAA;EL+2FV;EKt3FM;IAOI,2BAAA;IAAA,0BAAA;ELm3FV;EK13FM;IAOI,iCAAA;IAAA,gCAAA;ELu3FV;EK93FM;IAOI,gCAAA;IAAA,+BAAA;EL23FV;EKl4FM;IAOI,8BAAA;IAAA,6BAAA;EL+3FV;EKt4FM;IAOI,gCAAA;IAAA,+BAAA;ELm4FV;EK14FM;IAOI,8BAAA;IAAA,6BAAA;ELu4FV;EK94FM;IAOI,yBAAA;IAAA,4BAAA;EL24FV;EKl5FM;IAOI,+BAAA;IAAA,kCAAA;EL+4FV;EKt5FM;IAOI,8BAAA;IAAA,iCAAA;ELm5FV;EK15FM;IAOI,4BAAA;IAAA,+BAAA;ELu5FV;EK95FM;IAOI,8BAAA;IAAA,iCAAA;EL25FV;EKl6FM;IAOI,4BAAA;IAAA,+BAAA;EL+5FV;EKt6FM;IAOI,yBAAA;ELk6FV;EKz6FM;IAOI,+BAAA;ELq6FV;EK56FM;IAOI,8BAAA;ELw6FV;EK/6FM;IAOI,4BAAA;EL26FV;EKl7FM;IAOI,8BAAA;EL86FV;EKr7FM;IAOI,4BAAA;ELi7FV;EKx7FM;IAOI,2BAAA;ELo7FV;EK37FM;IAOI,iCAAA;ELu7FV;EK97FM;IAOI,gCAAA;EL07FV;EKj8FM;IAOI,8BAAA;EL67FV;EKp8FM;IAOI,gCAAA;ELg8FV;EKv8FM;IAOI,8BAAA;ELm8FV;EK18FM;IAOI,4BAAA;ELs8FV;EK78FM;IAOI,kCAAA;ELy8FV;EKh9FM;IAOI,iCAAA;EL48FV;EKn9FM;IAOI,+BAAA;EL+8FV;EKt9FM;IAOI,iCAAA;ELk9FV;EKz9FM;IAOI,+BAAA;ELq9FV;EK59FM;IAOI,0BAAA;ELw9FV;EK/9FM;IAOI,gCAAA;EL29FV;EKl+FM;IAOI,+BAAA;EL89FV;EKr+FM;IAOI,6BAAA;ELi+FV;EKx+FM;IAOI,+BAAA;ELo+FV;EK3+FM;IAOI,6BAAA;ELu+FV;AACF;ACl/FI;EIGI;IAOI,0BAAA;EL4+FV;EKn/FM;IAOI,gCAAA;EL++FV;EKt/FM;IAOI,yBAAA;ELk/FV;EKz/FM;IAOI,wBAAA;ELq/FV;EK5/FM;IAOI,+BAAA;ELw/FV;EK//FM;IAOI,yBAAA;EL2/FV;EKlgGM;IAOI,6BAAA;EL8/FV;EKrgGM;IAOI,8BAAA;ELigGV;EKxgGM;IAOI,wBAAA;ELogGV;EK3gGM;IAOI,+BAAA;ELugGV;EK9gGM;IAOI,wBAAA;EL0gGV;EKjhGM;IAOI,yBAAA;EL6gGV;EKphGM;IAOI,8BAAA;ELghGV;EKvhGM;IAOI,iCAAA;ELmhGV;EK1hGM;IAOI,sCAAA;ELshGV;EK7hGM;IAOI,yCAAA;ELyhGV;EKhiGM;IAOI,uBAAA;EL4hGV;EKniGM;IAOI,uBAAA;EL+hGV;EKtiGM;IAOI,yBAAA;ELkiGV;EKziGM;IAOI,yBAAA;ELqiGV;EK5iGM;IAOI,0BAAA;ELwiGV;EK/iGM;IAOI,4BAAA;EL2iGV;EKljGM;IAOI,kCAAA;EL8iGV;EKrjGM;IAOI,sCAAA;ELijGV;EKxjGM;IAOI,oCAAA;ELojGV;EK3jGM;IAOI,kCAAA;ELujGV;EK9jGM;IAOI,yCAAA;EL0jGV;EKjkGM;IAOI,wCAAA;EL6jGV;EKpkGM;IAOI,wCAAA;ELgkGV;EKvkGM;IAOI,kCAAA;ELmkGV;EK1kGM;IAOI,gCAAA;ELskGV;EK7kGM;IAOI,8BAAA;ELykGV;EKhlGM;IAOI,gCAAA;EL4kGV;EKnlGM;IAOI,+BAAA;EL+kGV;EKtlGM;IAOI,oCAAA;ELklGV;EKzlGM;IAOI,kCAAA;ELqlGV;EK5lGM;IAOI,gCAAA;ELwlGV;EK/l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ELi3GV;EKx3GM;IAOI,+BAAA;ELo3GV;EK33GM;IAOI,8BAAA;ELu3GV;EK93GM;IAOI,4BAAA;EL03GV;EKj4GM;IAOI,8BAAA;EL63GV;EKp4GM;IAOI,4BAAA;ELg4GV;EKv4GM;IAOI,2BAAA;ELm4GV;EK14GM;IAOI,iCAAA;ELs4GV;EK74GM;IAOI,gCAAA;ELy4GV;EKh5GM;IAOI,8BAAA;EL44GV;EKn5GM;IAOI,gCAAA;EL+4GV;EKt5GM;IAOI,8BAAA;ELk5GV;EKz5GM;IAOI,4BAAA;ELq5GV;EK55GM;IAOI,kCAAA;ELw5GV;EK/5GM;IAOI,iCAAA;EL25GV;EKl6GM;IAOI,+BAAA;EL85GV;EKr6GM;IAOI,iCAAA;ELi6GV;EKx6GM;IAOI,+BAAA;ELo6GV;EK36GM;IAOI,0BAAA;ELu6GV;EK96GM;IAOI,gCAAA;EL06GV;EKj7GM;IAOI,+BAAA;EL66GV;EKp7GM;IAOI,6BAAA;ELg7GV;EKv7GM;IAOI,+BAAA;ELm7GV;EK17GM;IAOI,6BAAA;ELs7GV;AACF;ACj8GI;EIGI;IAOI,0BAAA;EL27GV;EKl8GM;IAOI,gCAAA;EL87GV;EKr8GM;IAOI,yBAAA;ELi8GV;EKx8GM;IAOI,wBAAA;ELo8GV;EK38GM;IAOI,+BAAA;ELu8GV;EK98GM;IAOI,yBAAA;EL08GV;EKj9GM;IAOI,6BAAA;EL68GV;EKp9GM;IAOI,8BAAA;ELg9GV;EKv9GM;IAOI,wBAAA;ELm9GV;EK19GM;IAOI,+BAAA;ELs9GV;EK79GM;IAOI,wBAAA;ELy9GV;EKh+GM;IAOI,yBAAA;EL49GV;EKn+GM;IAOI,8BAAA;EL+9GV;EKt+GM;IAOI,iCAAA;ELk+GV;EKz+GM;IAOI,sCAAA;ELq+GV;EK5+GM;IAOI,yCAAA;ELw+GV;EK/+GM;IAOI,uBAAA;EL2+GV;EKl/GM;IAOI,uBAAA;EL8+GV;EKr/GM;IAOI,yBAAA;ELi/GV;EKx/GM;IAOI,yBAAA;ELo/GV;EK3/GM;IAOI,0BAAA;ELu/GV;EK9/GM;IAOI,4BAAA;EL0/GV;EKjgHM;IAOI,kCAAA;EL6/GV;EKpgHM;IAOI,sCAAA;ELggHV;EKvgHM;IAOI,oCAAA;ELmgHV;EK1gHM;IAOI,kCAAA;ELsgHV;EK7gHM;IAOI,yCAAA;ELygHV;EKhhHM;IAOI,wCAAA;EL4gHV;EKnhHM;IAOI,wCAAA;EL+gHV;EKthHM;IAOI,kCAAA;ELkhHV;EKzhHM;IAOI,gCAAA;ELqhHV;EK5hHM;IAOI,8BAAA;ELwhHV;EK/hHM;IAOI,gCAAA;EL2hHV;EKliHM;IAOI,+BAAA;EL8hHV;EKriHM;IAOI,oCAAA;ELiiHV;EKxiHM;IAOI,kCAAA;ELoiHV;EK3iHM;IAOI,gCAAA;ELuiHV;EK9iHM;IAOI,uCAAA;EL0iHV;EKjjHM;IAOI,sCAAA;EL6iHV;EKpjHM;IAOI,iCAAA;ELgjHV;EKvjHM;IAOI,2BAAA;ELmjHV;EK1jHM;IAOI,iCAAA;ELsjHV;EK7jHM;IAOI,+BAAA;ELyjHV;EKhkHM;IAOI,6BAAA;EL4jHV;EKnkHM;IAOI,+BAAA;EL+jHV;EKtkHM;IAOI,8BAAA;ELkkHV;EKzkHM;IAOI,oBAAA;ELqkHV;EK5kHM;IAOI,mBAAA;ELwkHV;EK/kHM;IAOI,mBAAA;EL2kHV;EKllHM;IAOI,mBAAA;EL8kHV;EKrlHM;IAOI,mBAAA;ELilHV;EKxlHM;IAOI,mBAAA;ELolHV;EK3lHM;IAOI,mBAAA;ELulHV;EK9lHM;IAOI,mBAAA;EL0lHV;EKjmHM;IAOI,oBAAA;EL6lHV;EKpmHM;IAOI,0BAAA;ELgmHV;EKvmHM;IAOI,yBAAA;ELmmHV;EK1mHM;IAOI,uBAAA;ELsmHV;EK7mHM;IAOI,yBAAA;ELymHV;EKhnHM;IAOI,uBAAA;EL4mHV;EKnnHM;IAOI,uBAAA;EL+mHV;EKtnHM;IAOI,0BAAA;IAAA,yBAAA;ELmnHV;EK1nHM;IAOI,gCAAA;IAAA,+BAAA;ELunHV;EK9nHM;IAOI,+BAAA;IAAA,8BAAA;EL2nHV;EKloHM;IAOI,6BAAA;IAAA,4BAAA;EL+nHV;EKtoHM;IAOI,+BAAA;IAAA,8BAAA;ELmoHV;EK1oHM;IAOI,6BAAA;IAAA,4BAAA;ELuoHV;EK9oHM;IAOI,6BAAA;IAAA,4BAAA;EL2oHV;EKlpHM;IAOI,wBAAA;IAAA,2BAAA;EL+oHV;EKtpHM;IAOI,8BAAA;IAAA,iCAAA;ELmpHV;EK1pHM;IAOI,6BAAA;IAAA,gCAAA;ELupHV;EK9pHM;IAOI,2BAAA;IAAA,8BAAA;EL2pHV;EKlqHM;IAOI,6BAAA;IAAA,gCAAA;EL+pHV;EKtqHM;IAOI,2BAAA;IAAA,8BAAA;ELmqHV;EK1qHM;IAOI,2BAAA;IAAA,8BAAA;ELuqHV;EK9qHM;IAOI,wBAAA;EL0qHV;EKjrHM;IAOI,8BAAA;EL6qHV;EKprHM;IAOI,6BAAA;ELgrHV;EKvrHM;IAOI,2BAAA;ELmrHV;EK1rHM;IAOI,6BAAA;ELsrHV;EK7rHM;IAOI,2BAAA;ELyrHV;EKhsHM;IAOI,2BAAA;EL4rHV;EKnsHM;IAOI,0BAAA;EL+rHV;EKtsHM;IAOI,gCAAA;ELksHV;EKzsHM;IAOI,+BAAA;ELqsHV;EK5sHM;IAOI,6BAAA;ELwsHV;EK/sHM;IAOI,+BAAA;EL2sHV;EKltHM;IAOI,6BAAA;EL8sHV;EKrtHM;IAOI,6BAAA;ELitHV;EKxtHM;IAOI,2BAAA;ELotHV;EK3tHM;IAOI,iCAAA;ELutHV;EK9tHM;IAOI,gCAAA;EL0tHV;EKjuHM;IAOI,8BAAA;EL6tHV;EKpuHM;IAOI,gCAAA;ELguHV;EKvuHM;IAOI,8BAAA;ELmuHV;EK1uHM;IAOI,8BAAA;ELsuHV;EK7uHM;IAOI,yBAAA;ELyuHV;EKhvHM;IAOI,+BAAA;EL4uHV;EKnvHM;IAOI,8BAAA;EL+uHV;EKtvHM;IAOI,4BAAA;ELkvHV;EKzvHM;IAOI,8BAAA;ELqvHV;EK5vHM;IAOI,4BAAA;ELwvHV;EK/vHM;IAOI,4BAAA;EL2vHV;EKlwHM;IAOI,qBAAA;EL8vHV;EKrwHM;IAOI,2BAAA;ELiwHV;EKxwHM;IAOI,0BAAA;ELowHV;EK3wHM;IAOI,wBAAA;ELuwHV;EK9wHM;IAOI,0BAAA;EL0wHV;EKjxHM;IAOI,wBAAA;EL6wHV;EKpxHM;IAOI,2BAAA;IAAA,0BAAA;ELixHV;EKxxHM;IAOI,iCAAA;IAAA,gCAAA;ELqxHV;EK5xHM;IAOI,gCAAA;IAAA,+BAAA;ELyxHV;EKhyHM;IAOI,8BAAA;IAAA,6BAAA;EL6xHV;EKpyHM;IAOI,gCAAA;IAAA,+BAAA;ELiyHV;EKxyHM;IAOI,8BAAA;IAAA,6BAAA;ELqyHV;EK5yHM;IAOI,yBAAA;IAAA,4BAAA;ELyyHV;EKhzHM;IAOI,+BAAA;IAAA,kCAAA;EL6yHV;EKpzHM;IAOI,8BAAA;IAAA,iCAAA;ELizHV;EKxzHM;IAOI,4BAAA;IAAA,+BAAA;ELqzHV;EK5zHM;IAOI,8BAAA;IAAA,iCAAA;ELyzHV;EKh0HM;IAOI,4BAAA;IAAA,+BAAA;EL6zHV;EKp0HM;IAOI,yBAAA;ELg0HV;EKv0HM;IAOI,+BAAA;ELm0HV;EK10HM;IAOI,8BAAA;ELs0HV;EK70HM;IAOI,4BAAA;ELy0HV;EKh1HM;IAOI,8BAAA;EL40HV;EKn1HM;IAOI,4BAAA;EL+0HV;EKt1HM;IAOI,2BAAA;ELk1HV;EKz1HM;IAOI,iCAAA;ELq1HV;EK51HM;IAOI,gCAAA;ELw1HV;EK/1HM;IAOI,8BAAA;EL21HV;EKl2HM;IAOI,gCAAA;EL81HV;EKr2HM;IAOI,8BAAA;ELi2HV;EKx2HM;IAOI,4BAAA;ELo2HV;EK32HM;IAOI,kCAAA;ELu2HV;EK92HM;IAOI,iCAAA;EL02HV;EKj3HM;IAOI,+BAAA;EL62HV;EKp3HM;IAOI,iCAAA;ELg3HV;EKv3HM;IAOI,+BAAA;ELm3HV;EK13HM;IAOI,0BAAA;ELs3HV;EK73HM;IAOI,gCAAA;ELy3HV;EKh4HM;IAOI,+BAAA;EL43HV;EKn4HM;IAOI,6BAAA;EL+3HV;EKt4HM;IAOI,+BAAA;ELk4HV;EKz4HM;IAOI,6BAAA;ELq4HV;AACF;AMz6HA;ED4BQ;IAOI,0BAAA;EL04HV;EKj5HM;IAOI,gCAAA;EL64HV;EKp5HM;IAOI,yBAAA;ELg5HV;EKv5HM;IAOI,wBAAA;ELm5HV;EK15HM;IAOI,+BAAA;ELs5HV;EK75HM;IAOI,yBAAA;ELy5HV;EKh6HM;IAOI,6BAAA;EL45HV;EKn6HM;IAOI,8BAAA;EL+5HV;EKt6HM;IAOI,wBAAA;ELk6HV;EKz6HM;IAOI,+BAAA;ELq6HV;EK56HM;IAOI,wBAAA;ELw6HV;AACF","file":"bootstrap-grid.css","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","/*!\n * Bootstrap Grid v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-right: 0 !important;\n }\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n .me-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n .ms-sm-auto {\n margin-left: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-right: 0 !important;\n }\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n .me-md-3 {\n margin-right: 1rem !important;\n }\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n .me-md-5 {\n margin-right: 3rem !important;\n }\n .me-md-auto {\n margin-right: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-left: 0 !important;\n }\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n .ms-md-auto {\n margin-left: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-right: 0 !important;\n }\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-left: 0 !important;\n }\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-right: 0 !important;\n }\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n .me-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n .ms-lg-auto {\n margin-left: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-right: 0 !important;\n }\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n .me-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n .ms-xl-auto {\n margin-left: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n .me-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// scss-docs-start theme-text-variables\n$primary-text-emphasis: shade-color($primary, 60%) !default;\n$secondary-text-emphasis: shade-color($secondary, 60%) !default;\n$success-text-emphasis: shade-color($success, 60%) !default;\n$info-text-emphasis: shade-color($info, 60%) !default;\n$warning-text-emphasis: shade-color($warning, 60%) !default;\n$danger-text-emphasis: shade-color($danger, 60%) !default;\n$light-text-emphasis: $gray-700 !default;\n$dark-text-emphasis: $gray-700 !default;\n// scss-docs-end theme-text-variables\n\n// scss-docs-start theme-bg-subtle-variables\n$primary-bg-subtle: tint-color($primary, 80%) !default;\n$secondary-bg-subtle: tint-color($secondary, 80%) !default;\n$success-bg-subtle: tint-color($success, 80%) !default;\n$info-bg-subtle: tint-color($info, 80%) !default;\n$warning-bg-subtle: tint-color($warning, 80%) !default;\n$danger-bg-subtle: tint-color($danger, 80%) !default;\n$light-bg-subtle: mix($gray-100, $white) !default;\n$dark-bg-subtle: $gray-400 !default;\n// scss-docs-end theme-bg-subtle-variables\n\n// scss-docs-start theme-border-subtle-variables\n$primary-border-subtle: tint-color($primary, 60%) !default;\n$secondary-border-subtle: tint-color($secondary, 60%) !default;\n$success-border-subtle: tint-color($success, 60%) !default;\n$info-border-subtle: tint-color($info, 60%) !default;\n$warning-border-subtle: tint-color($warning, 60%) !default;\n$danger-border-subtle: tint-color($danger, 60%) !default;\n$light-border-subtle: $gray-200 !default;\n$dark-border-subtle: $gray-500 !default;\n// scss-docs-end theme-border-subtle-variables\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n$enable-dark-mode: true !default;\n$color-mode-type: data !default; // `data` or `media-query`\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-text-align: null !default;\n$body-color: $gray-900 !default;\n$body-bg: $white !default;\n\n$body-secondary-color: rgba($body-color, .75) !default;\n$body-secondary-bg: $gray-200 !default;\n\n$body-tertiary-color: rgba($body-color, .5) !default;\n$body-tertiary-bg: $gray-100 !default;\n\n$body-emphasis-color: $black !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Icon links\n// scss-docs-start icon-link-variables\n$icon-link-gap: .375rem !default;\n$icon-link-underline-offset: .25em !default;\n$icon-link-icon-size: 1em !default;\n$icon-link-icon-transition: .2s ease-in-out transform !default;\n$icon-link-icon-transform: translate3d(.25em, 0, 0) !default;\n// scss-docs-end icon-link-variables\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-xxl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n// fusv-disable\n$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0\n// fusv-enable\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start focus-ring-variables\n$focus-ring-width: .25rem !default;\n$focus-ring-opacity: .25 !default;\n$focus-ring-color: rgba($primary, $focus-ring-opacity) !default;\n$focus-ring-blur: 0 !default;\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;\n// scss-docs-end focus-ring-variables\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-medium: 500 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: inherit !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n// fusv-disable\n$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0\n// fusv-enable\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: var(--#{$prefix}border-width) !default;\n$hr-opacity: .25 !default;\n\n// scss-docs-start vr-variables\n$vr-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end vr-variables\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-color: $body-color !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}emphasis-color) !default;\n$table-bg: var(--#{$prefix}body-bg) !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;\n\n$table-border-factor: .2 !default;\n$table-border-width: var(--#{$prefix}border-width) !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: var(--#{$prefix}secondary-color) !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: $focus-ring-width !default;\n$input-btn-focus-color-opacity: $focus-ring-opacity !default;\n$input-btn-focus-color: $focus-ring-color !default;\n$input-btn-focus-blur: $focus-ring-blur !default;\n$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-color: var(--#{$prefix}body-color) !default;\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: var(--#{$prefix}border-radius) !default;\n$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: var(--#{$prefix}body-bg) !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$input-disabled-border-color: null !default;\n\n$input-color: var(--#{$prefix}body-color) !default;\n$input-border-color: var(--#{$prefix}border-color) !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$input-border-radius: var(--#{$prefix}border-radius) !default;\n$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: var(--#{$prefix}secondary-color) !default;\n$input-plaintext-color: var(--#{$prefix}body-color) !default;\n\n$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $input-disabled-bg !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: var(--#{$prefix}secondary-bg) !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default;\n$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-height: 1.5em !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-label-disabled-color: $gray-600 !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-colors\n$form-valid-color: $form-feedback-valid-color !default;\n$form-valid-border-color: $form-feedback-valid-color !default;\n$form-invalid-color: $form-feedback-invalid-color !default;\n$form-invalid-border-color: $form-feedback-invalid-color !default;\n// scss-docs-end form-validation-colors\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": var(--#{$prefix}form-valid-color),\n \"icon\": $form-feedback-icon-valid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}success),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-valid-border-color),\n ),\n \"invalid\": (\n \"color\": var(--#{$prefix}form-invalid-color),\n \"icon\": $form-feedback-icon-invalid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}danger),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-invalid-border-color),\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n// scss-docs-start zindex-levels-map\n$zindex-levels: (\n n1: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3\n) !default;\n// scss-docs-end zindex-levels-map\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default;\n$nav-link-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$nav-tabs-border-color: var(--#{$prefix}border-color) !default;\n$nav-tabs-border-width: var(--#{$prefix}border-width) !default;\n$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default;\n$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default;\n$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-underline-gap: 1rem !default;\n$nav-underline-border-width: .125rem !default;\n$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;\n$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;\n$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;\n$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;\n$navbar-light-icon-color: rgba($body-color, .75) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-icon-color: $navbar-dark-color !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: var(--#{$prefix}body-color) !default;\n$dropdown-bg: var(--#{$prefix}body-bg) !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: var(--#{$prefix}border-radius) !default;\n$dropdown-border-width: var(--#{$prefix}border-width) !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$dropdown-link-color: var(--#{$prefix}body-color) !default;\n$dropdown-link-hover-color: $dropdown-link-color !default;\n$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: var(--#{$prefix}body-bg) !default;\n$pagination-border-radius: var(--#{$prefix}border-radius) !default;\n$pagination-border-width: var(--#{$prefix}border-width) !default;\n$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list\n$pagination-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-focus-box-shadow: $focus-ring-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this?\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $component-active-bg !default;\n\n$pagination-disabled-color: var(--#{$prefix}secondary-color) !default;\n$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-disabled-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-title-color: null !default;\n$card-subtitle-color: null !default;\n$card-border-width: var(--#{$prefix}border-width) !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: var(--#{$prefix}border-radius) !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: var(--#{$prefix}body-bg) !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: var(--#{$prefix}body-color) !default;\n$accordion-bg: var(--#{$prefix}body-bg) !default;\n$accordion-border-width: var(--#{$prefix}border-width) !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: var(--#{$prefix}border-radius) !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: var(--#{$prefix}body-color) !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default;\n$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $body-color !default;\n$accordion-icon-active-color: $primary-text-emphasis !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: var(--#{$prefix}body-bg) !default;\n$tooltip-bg: var(--#{$prefix}emphasis-color) !default;\n$tooltip-border-radius: var(--#{$prefix}border-radius) !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: var(--#{$prefix}body-bg) !default;\n$popover-max-width: 276px !default;\n$popover-border-width: var(--#{$prefix}border-width) !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$popover-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: var(--#{$prefix}secondary-bg) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: var(--#{$prefix}body-color) !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-border-width: var(--#{$prefix}border-width) !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: var(--#{$prefix}border-radius) !default;\n$toast-box-shadow: var(--#{$prefix}box-shadow) !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: var(--#{$prefix}secondary-color) !default;\n$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-header-border-color: $toast-border-color !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: var(--#{$prefix}border-radius) !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: var(--#{$prefix}body-bg) !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: var(--#{$prefix}border-width) !default;\n$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default;\n$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: var(--#{$prefix}border-radius) !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: var(--#{$prefix}border-width) !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n// fusv-disable\n$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6\n// fusv-enable\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: var(--#{$prefix}secondary-bg) !default;\n$progress-border-radius: var(--#{$prefix}border-radius) !default;\n$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: var(--#{$prefix}body-color) !default;\n$list-group-bg: var(--#{$prefix}body-bg) !default;\n$list-group-border-color: var(--#{$prefix}border-color) !default;\n$list-group-border-width: var(--#{$prefix}border-width) !default;\n$list-group-border-radius: var(--#{$prefix}border-radius) !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n// fusv-disable\n$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0\n$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0\n// fusv-enable\n\n$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: var(--#{$prefix}secondary-color) !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: var(--#{$prefix}secondary-color) !default;\n$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default;\n\n$list-group-action-active-color: var(--#{$prefix}body-color) !default;\n$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: var(--#{$prefix}body-bg) !default;\n$thumbnail-border-width: var(--#{$prefix}border-width) !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: var(--#{$prefix}border-radius) !default;\n$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,\") !default;\n$btn-close-focus-shadow: $focus-ring-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: var(--#{$prefix}body-bg) !default;\n$offcanvas-color: var(--#{$prefix}body-color) !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n","// Row\n//\n// Rows contain your columns.\n\n:root {\n @each $name, $value in $grid-breakpoints {\n --#{$prefix}breakpoint-#{$name}: #{$value};\n }\n}\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file diff --git a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.min.css b/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.min.css deleted file mode 100644 index 46f0a449..00000000 --- a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap Grid v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}@media (min-width:576px){.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}}@media (min-width:768px){.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}}@media (min-width:992px){.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}}@media (min-width:1200px){.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}}@media (min-width:1400px){.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} -/*# sourceMappingURL=bootstrap-grid.min.css.map */ \ No newline at end of file diff --git a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.min.css.map b/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.min.css.map deleted file mode 100644 index c88c6c5d..00000000 --- a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_containers.scss","dist/css/bootstrap-grid.css","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","/*!\n * Bootstrap Grid v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-right: 0 !important;\n }\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n .me-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n .ms-sm-auto {\n margin-left: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-right: 0 !important;\n }\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n .me-md-3 {\n margin-right: 1rem !important;\n }\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n .me-md-5 {\n margin-right: 3rem !important;\n }\n .me-md-auto {\n margin-right: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-left: 0 !important;\n }\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n .ms-md-auto {\n margin-left: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-right: 0 !important;\n }\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-left: 0 !important;\n }\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-right: 0 !important;\n }\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n .me-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n .ms-lg-auto {\n margin-left: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-right: 0 !important;\n }\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n .me-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n .ms-xl-auto {\n margin-left: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n .me-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Row\n//\n// Rows contain your columns.\n\n:root {\n @each $name, $value in $grid-breakpoints {\n --#{$prefix}breakpoint-#{$name}: #{$value};\n }\n}\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file diff --git a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.rtl.css b/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.rtl.css deleted file mode 100644 index fa3ec34a..00000000 --- a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.rtl.css +++ /dev/null @@ -1,4084 +0,0 @@ -/*! - * Bootstrap Grid v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -.container, -.container-fluid, -.container-xxl, -.container-xl, -.container-lg, -.container-md, -.container-sm { - --bs-gutter-x: 1.5rem; - --bs-gutter-y: 0; - width: 100%; - padding-left: calc(var(--bs-gutter-x) * 0.5); - padding-right: calc(var(--bs-gutter-x) * 0.5); - margin-left: auto; - margin-right: auto; -} - -@media (min-width: 576px) { - .container-sm, .container { - max-width: 540px; - } -} -@media (min-width: 768px) { - .container-md, .container-sm, .container { - max-width: 720px; - } -} -@media (min-width: 992px) { - .container-lg, .container-md, .container-sm, .container { - max-width: 960px; - } -} -@media (min-width: 1200px) { - .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1140px; - } -} -@media (min-width: 1400px) { - .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1320px; - } -} -:root { - --bs-breakpoint-xs: 0; - --bs-breakpoint-sm: 576px; - --bs-breakpoint-md: 768px; - --bs-breakpoint-lg: 992px; - --bs-breakpoint-xl: 1200px; - --bs-breakpoint-xxl: 1400px; -} - -.row { - --bs-gutter-x: 1.5rem; - --bs-gutter-y: 0; - display: flex; - flex-wrap: wrap; - margin-top: calc(-1 * var(--bs-gutter-y)); - margin-left: calc(-0.5 * var(--bs-gutter-x)); - margin-right: calc(-0.5 * var(--bs-gutter-x)); -} -.row > * { - box-sizing: border-box; - flex-shrink: 0; - width: 100%; - max-width: 100%; - padding-left: calc(var(--bs-gutter-x) * 0.5); - padding-right: calc(var(--bs-gutter-x) * 0.5); - margin-top: var(--bs-gutter-y); -} - -.col { - flex: 1 0 0%; -} - -.row-cols-auto > * { - flex: 0 0 auto; - width: auto; -} - -.row-cols-1 > * { - flex: 0 0 auto; - width: 100%; -} - -.row-cols-2 > * { - flex: 0 0 auto; - width: 50%; -} - -.row-cols-3 > * { - flex: 0 0 auto; - width: 33.33333333%; -} - -.row-cols-4 > * { - flex: 0 0 auto; - width: 25%; -} - -.row-cols-5 > * { - flex: 0 0 auto; - width: 20%; -} - -.row-cols-6 > * { - flex: 0 0 auto; - width: 16.66666667%; -} - -.col-auto { - flex: 0 0 auto; - width: auto; -} - -.col-1 { - flex: 0 0 auto; - width: 8.33333333%; -} - -.col-2 { - flex: 0 0 auto; - width: 16.66666667%; -} - -.col-3 { - flex: 0 0 auto; - width: 25%; -} - -.col-4 { - flex: 0 0 auto; - width: 33.33333333%; -} - -.col-5 { - flex: 0 0 auto; - width: 41.66666667%; -} - -.col-6 { - flex: 0 0 auto; - width: 50%; -} - -.col-7 { - flex: 0 0 auto; - width: 58.33333333%; -} - -.col-8 { - flex: 0 0 auto; - width: 66.66666667%; -} - -.col-9 { - flex: 0 0 auto; - width: 75%; -} - -.col-10 { - flex: 0 0 auto; - width: 83.33333333%; -} - -.col-11 { - flex: 0 0 auto; - width: 91.66666667%; -} - -.col-12 { - flex: 0 0 auto; - width: 100%; -} - -.offset-1 { - margin-right: 8.33333333%; -} - -.offset-2 { - margin-right: 16.66666667%; -} - -.offset-3 { - margin-right: 25%; -} - -.offset-4 { - margin-right: 33.33333333%; -} - -.offset-5 { - margin-right: 41.66666667%; -} - -.offset-6 { - margin-right: 50%; -} - -.offset-7 { - margin-right: 58.33333333%; -} - -.offset-8 { - margin-right: 66.66666667%; -} - -.offset-9 { - margin-right: 75%; -} - -.offset-10 { - margin-right: 83.33333333%; -} - -.offset-11 { - margin-right: 91.66666667%; -} - -.g-0, -.gx-0 { - --bs-gutter-x: 0; -} - -.g-0, -.gy-0 { - --bs-gutter-y: 0; -} - -.g-1, -.gx-1 { - --bs-gutter-x: 0.25rem; -} - -.g-1, -.gy-1 { - --bs-gutter-y: 0.25rem; -} - -.g-2, -.gx-2 { - --bs-gutter-x: 0.5rem; -} - -.g-2, -.gy-2 { - --bs-gutter-y: 0.5rem; -} - -.g-3, -.gx-3 { - --bs-gutter-x: 1rem; -} - -.g-3, -.gy-3 { - --bs-gutter-y: 1rem; -} - -.g-4, -.gx-4 { - --bs-gutter-x: 1.5rem; -} - -.g-4, -.gy-4 { - --bs-gutter-y: 1.5rem; -} - -.g-5, -.gx-5 { - --bs-gutter-x: 3rem; -} - -.g-5, -.gy-5 { - --bs-gutter-y: 3rem; -} - -@media (min-width: 576px) { - .col-sm { - flex: 1 0 0%; - } - .row-cols-sm-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-sm-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-sm-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-sm-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-sm-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-sm-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-sm-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-sm-auto { - flex: 0 0 auto; - width: auto; - } - .col-sm-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-sm-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-sm-3 { - flex: 0 0 auto; - width: 25%; - } - .col-sm-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-sm-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-sm-6 { - flex: 0 0 auto; - width: 50%; - } - .col-sm-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-sm-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-sm-9 { - flex: 0 0 auto; - width: 75%; - } - .col-sm-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-sm-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-sm-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-sm-0 { - margin-right: 0; - } - .offset-sm-1 { - margin-right: 8.33333333%; - } - .offset-sm-2 { - margin-right: 16.66666667%; - } - .offset-sm-3 { - margin-right: 25%; - } - .offset-sm-4 { - margin-right: 33.33333333%; - } - .offset-sm-5 { - margin-right: 41.66666667%; - } - .offset-sm-6 { - margin-right: 50%; - } - .offset-sm-7 { - margin-right: 58.33333333%; - } - .offset-sm-8 { - margin-right: 66.66666667%; - } - .offset-sm-9 { - margin-right: 75%; - } - .offset-sm-10 { - margin-right: 83.33333333%; - } - .offset-sm-11 { - margin-right: 91.66666667%; - } - .g-sm-0, - .gx-sm-0 { - --bs-gutter-x: 0; - } - .g-sm-0, - .gy-sm-0 { - --bs-gutter-y: 0; - } - .g-sm-1, - .gx-sm-1 { - --bs-gutter-x: 0.25rem; - } - .g-sm-1, - .gy-sm-1 { - --bs-gutter-y: 0.25rem; - } - .g-sm-2, - .gx-sm-2 { - --bs-gutter-x: 0.5rem; - } - .g-sm-2, - .gy-sm-2 { - --bs-gutter-y: 0.5rem; - } - .g-sm-3, - .gx-sm-3 { - --bs-gutter-x: 1rem; - } - .g-sm-3, - .gy-sm-3 { - --bs-gutter-y: 1rem; - } - .g-sm-4, - .gx-sm-4 { - --bs-gutter-x: 1.5rem; - } - .g-sm-4, - .gy-sm-4 { - --bs-gutter-y: 1.5rem; - } - .g-sm-5, - .gx-sm-5 { - --bs-gutter-x: 3rem; - } - .g-sm-5, - .gy-sm-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 768px) { - .col-md { - flex: 1 0 0%; - } - .row-cols-md-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-md-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-md-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-md-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-md-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-md-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-md-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-md-auto { - flex: 0 0 auto; - width: auto; - } - .col-md-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-md-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-md-3 { - flex: 0 0 auto; - width: 25%; - } - .col-md-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-md-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-md-6 { - flex: 0 0 auto; - width: 50%; - } - .col-md-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-md-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-md-9 { - flex: 0 0 auto; - width: 75%; - } - .col-md-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-md-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-md-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-md-0 { - margin-right: 0; - } - .offset-md-1 { - margin-right: 8.33333333%; - } - .offset-md-2 { - margin-right: 16.66666667%; - } - .offset-md-3 { - margin-right: 25%; - } - .offset-md-4 { - margin-right: 33.33333333%; - } - .offset-md-5 { - margin-right: 41.66666667%; - } - .offset-md-6 { - margin-right: 50%; - } - .offset-md-7 { - margin-right: 58.33333333%; - } - .offset-md-8 { - margin-right: 66.66666667%; - } - .offset-md-9 { - margin-right: 75%; - } - .offset-md-10 { - margin-right: 83.33333333%; - } - .offset-md-11 { - margin-right: 91.66666667%; - } - .g-md-0, - .gx-md-0 { - --bs-gutter-x: 0; - } - .g-md-0, - .gy-md-0 { - --bs-gutter-y: 0; - } - .g-md-1, - .gx-md-1 { - --bs-gutter-x: 0.25rem; - } - .g-md-1, - .gy-md-1 { - --bs-gutter-y: 0.25rem; - } - .g-md-2, - .gx-md-2 { - --bs-gutter-x: 0.5rem; - } - .g-md-2, - .gy-md-2 { - --bs-gutter-y: 0.5rem; - } - .g-md-3, - .gx-md-3 { - --bs-gutter-x: 1rem; - } - .g-md-3, - .gy-md-3 { - --bs-gutter-y: 1rem; - } - .g-md-4, - .gx-md-4 { - --bs-gutter-x: 1.5rem; - } - .g-md-4, - .gy-md-4 { - --bs-gutter-y: 1.5rem; - } - .g-md-5, - .gx-md-5 { - --bs-gutter-x: 3rem; - } - .g-md-5, - .gy-md-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 992px) { - .col-lg { - flex: 1 0 0%; - } - .row-cols-lg-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-lg-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-lg-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-lg-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-lg-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-lg-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-lg-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-lg-auto { - flex: 0 0 auto; - width: auto; - } - .col-lg-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-lg-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-lg-3 { - flex: 0 0 auto; - width: 25%; - } - .col-lg-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-lg-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-lg-6 { - flex: 0 0 auto; - width: 50%; - } - .col-lg-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-lg-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-lg-9 { - flex: 0 0 auto; - width: 75%; - } - .col-lg-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-lg-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-lg-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-lg-0 { - margin-right: 0; - } - .offset-lg-1 { - margin-right: 8.33333333%; - } - .offset-lg-2 { - margin-right: 16.66666667%; - } - .offset-lg-3 { - margin-right: 25%; - } - .offset-lg-4 { - margin-right: 33.33333333%; - } - .offset-lg-5 { - margin-right: 41.66666667%; - } - .offset-lg-6 { - margin-right: 50%; - } - .offset-lg-7 { - margin-right: 58.33333333%; - } - .offset-lg-8 { - margin-right: 66.66666667%; - } - .offset-lg-9 { - margin-right: 75%; - } - .offset-lg-10 { - margin-right: 83.33333333%; - } - .offset-lg-11 { - margin-right: 91.66666667%; - } - .g-lg-0, - .gx-lg-0 { - --bs-gutter-x: 0; - } - .g-lg-0, - .gy-lg-0 { - --bs-gutter-y: 0; - } - .g-lg-1, - .gx-lg-1 { - --bs-gutter-x: 0.25rem; - } - .g-lg-1, - .gy-lg-1 { - --bs-gutter-y: 0.25rem; - } - .g-lg-2, - .gx-lg-2 { - --bs-gutter-x: 0.5rem; - } - .g-lg-2, - .gy-lg-2 { - --bs-gutter-y: 0.5rem; - } - .g-lg-3, - .gx-lg-3 { - --bs-gutter-x: 1rem; - } - .g-lg-3, - .gy-lg-3 { - --bs-gutter-y: 1rem; - } - .g-lg-4, - .gx-lg-4 { - --bs-gutter-x: 1.5rem; - } - .g-lg-4, - .gy-lg-4 { - --bs-gutter-y: 1.5rem; - } - .g-lg-5, - .gx-lg-5 { - --bs-gutter-x: 3rem; - } - .g-lg-5, - .gy-lg-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 1200px) { - .col-xl { - flex: 1 0 0%; - } - .row-cols-xl-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-xl-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-xl-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-xl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-xl-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-xl-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-xl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xl-auto { - flex: 0 0 auto; - width: auto; - } - .col-xl-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-xl-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xl-3 { - flex: 0 0 auto; - width: 25%; - } - .col-xl-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-xl-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-xl-6 { - flex: 0 0 auto; - width: 50%; - } - .col-xl-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-xl-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-xl-9 { - flex: 0 0 auto; - width: 75%; - } - .col-xl-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-xl-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-xl-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-xl-0 { - margin-right: 0; - } - .offset-xl-1 { - margin-right: 8.33333333%; - } - .offset-xl-2 { - margin-right: 16.66666667%; - } - .offset-xl-3 { - margin-right: 25%; - } - .offset-xl-4 { - margin-right: 33.33333333%; - } - .offset-xl-5 { - margin-right: 41.66666667%; - } - .offset-xl-6 { - margin-right: 50%; - } - .offset-xl-7 { - margin-right: 58.33333333%; - } - .offset-xl-8 { - margin-right: 66.66666667%; - } - .offset-xl-9 { - margin-right: 75%; - } - .offset-xl-10 { - margin-right: 83.33333333%; - } - .offset-xl-11 { - margin-right: 91.66666667%; - } - .g-xl-0, - .gx-xl-0 { - --bs-gutter-x: 0; - } - .g-xl-0, - .gy-xl-0 { - --bs-gutter-y: 0; - } - .g-xl-1, - .gx-xl-1 { - --bs-gutter-x: 0.25rem; - } - .g-xl-1, - .gy-xl-1 { - --bs-gutter-y: 0.25rem; - } - .g-xl-2, - .gx-xl-2 { - --bs-gutter-x: 0.5rem; - } - .g-xl-2, - .gy-xl-2 { - --bs-gutter-y: 0.5rem; - } - .g-xl-3, - .gx-xl-3 { - --bs-gutter-x: 1rem; - } - .g-xl-3, - .gy-xl-3 { - --bs-gutter-y: 1rem; - } - .g-xl-4, - .gx-xl-4 { - --bs-gutter-x: 1.5rem; - } - .g-xl-4, - .gy-xl-4 { - --bs-gutter-y: 1.5rem; - } - .g-xl-5, - .gx-xl-5 { - --bs-gutter-x: 3rem; - } - .g-xl-5, - .gy-xl-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 1400px) { - .col-xxl { - flex: 1 0 0%; - } - .row-cols-xxl-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-xxl-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-xxl-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-xxl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-xxl-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-xxl-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-xxl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xxl-auto { - flex: 0 0 auto; - width: auto; - } - .col-xxl-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-xxl-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xxl-3 { - flex: 0 0 auto; - width: 25%; - } - .col-xxl-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-xxl-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-xxl-6 { - flex: 0 0 auto; - width: 50%; - } - .col-xxl-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-xxl-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-xxl-9 { - flex: 0 0 auto; - width: 75%; - } - .col-xxl-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-xxl-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-xxl-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-xxl-0 { - margin-right: 0; - } - .offset-xxl-1 { - margin-right: 8.33333333%; - } - .offset-xxl-2 { - margin-right: 16.66666667%; - } - .offset-xxl-3 { - margin-right: 25%; - } - .offset-xxl-4 { - margin-right: 33.33333333%; - } - .offset-xxl-5 { - margin-right: 41.66666667%; - } - .offset-xxl-6 { - margin-right: 50%; - } - .offset-xxl-7 { - margin-right: 58.33333333%; - } - .offset-xxl-8 { - margin-right: 66.66666667%; - } - .offset-xxl-9 { - margin-right: 75%; - } - .offset-xxl-10 { - margin-right: 83.33333333%; - } - .offset-xxl-11 { - margin-right: 91.66666667%; - } - .g-xxl-0, - .gx-xxl-0 { - --bs-gutter-x: 0; - } - .g-xxl-0, - .gy-xxl-0 { - --bs-gutter-y: 0; - } - .g-xxl-1, - .gx-xxl-1 { - --bs-gutter-x: 0.25rem; - } - .g-xxl-1, - .gy-xxl-1 { - --bs-gutter-y: 0.25rem; - } - .g-xxl-2, - .gx-xxl-2 { - --bs-gutter-x: 0.5rem; - } - .g-xxl-2, - .gy-xxl-2 { - --bs-gutter-y: 0.5rem; - } - .g-xxl-3, - .gx-xxl-3 { - --bs-gutter-x: 1rem; - } - .g-xxl-3, - .gy-xxl-3 { - --bs-gutter-y: 1rem; - } - .g-xxl-4, - .gx-xxl-4 { - --bs-gutter-x: 1.5rem; - } - .g-xxl-4, - .gy-xxl-4 { - --bs-gutter-y: 1.5rem; - } - .g-xxl-5, - .gx-xxl-5 { - --bs-gutter-x: 3rem; - } - .g-xxl-5, - .gy-xxl-5 { - --bs-gutter-y: 3rem; - } -} -.d-inline { - display: inline !important; -} - -.d-inline-block { - display: inline-block !important; -} - -.d-block { - display: block !important; -} - -.d-grid { - display: grid !important; -} - -.d-inline-grid { - display: inline-grid !important; -} - -.d-table { - display: table !important; -} - -.d-table-row { - display: table-row !important; -} - -.d-table-cell { - display: table-cell !important; -} - -.d-flex { - display: flex !important; -} - -.d-inline-flex { - display: inline-flex !important; -} - -.d-none { - display: none !important; -} - -.flex-fill { - flex: 1 1 auto !important; -} - -.flex-row { - flex-direction: row !important; -} - -.flex-column { - flex-direction: column !important; -} - -.flex-row-reverse { - flex-direction: row-reverse !important; -} - -.flex-column-reverse { - flex-direction: column-reverse !important; -} - -.flex-grow-0 { - flex-grow: 0 !important; -} - -.flex-grow-1 { - flex-grow: 1 !important; -} - -.flex-shrink-0 { - flex-shrink: 0 !important; -} - -.flex-shrink-1 { - flex-shrink: 1 !important; -} - -.flex-wrap { - flex-wrap: wrap !important; -} - -.flex-nowrap { - flex-wrap: nowrap !important; -} - -.flex-wrap-reverse { - flex-wrap: wrap-reverse !important; -} - -.justify-content-start { - justify-content: flex-start !important; -} - -.justify-content-end { - justify-content: flex-end !important; -} - -.justify-content-center { - justify-content: center !important; -} - -.justify-content-between { - justify-content: space-between !important; -} - -.justify-content-around { - justify-content: space-around !important; -} - -.justify-content-evenly { - justify-content: space-evenly !important; -} - -.align-items-start { - align-items: flex-start !important; -} - -.align-items-end { - align-items: flex-end !important; -} - -.align-items-center { - align-items: center !important; -} - -.align-items-baseline { - align-items: baseline !important; -} - -.align-items-stretch { - align-items: stretch !important; -} - -.align-content-start { - align-content: flex-start !important; -} - -.align-content-end { - align-content: flex-end !important; -} - -.align-content-center { - align-content: center !important; -} - -.align-content-between { - align-content: space-between !important; -} - -.align-content-around { - align-content: space-around !important; -} - -.align-content-stretch { - align-content: stretch !important; -} - -.align-self-auto { - align-self: auto !important; -} - -.align-self-start { - align-self: flex-start !important; -} - -.align-self-end { - align-self: flex-end !important; -} - -.align-self-center { - align-self: center !important; -} - -.align-self-baseline { - align-self: baseline !important; -} - -.align-self-stretch { - align-self: stretch !important; -} - -.order-first { - order: -1 !important; -} - -.order-0 { - order: 0 !important; -} - -.order-1 { - order: 1 !important; -} - -.order-2 { - order: 2 !important; -} - -.order-3 { - order: 3 !important; -} - -.order-4 { - order: 4 !important; -} - -.order-5 { - order: 5 !important; -} - -.order-last { - order: 6 !important; -} - -.m-0 { - margin: 0 !important; -} - -.m-1 { - margin: 0.25rem !important; -} - -.m-2 { - margin: 0.5rem !important; -} - -.m-3 { - margin: 1rem !important; -} - -.m-4 { - margin: 1.5rem !important; -} - -.m-5 { - margin: 3rem !important; -} - -.m-auto { - margin: auto !important; -} - -.mx-0 { - margin-left: 0 !important; - margin-right: 0 !important; -} - -.mx-1 { - margin-left: 0.25rem !important; - margin-right: 0.25rem !important; -} - -.mx-2 { - margin-left: 0.5rem !important; - margin-right: 0.5rem !important; -} - -.mx-3 { - margin-left: 1rem !important; - margin-right: 1rem !important; -} - -.mx-4 { - margin-left: 1.5rem !important; - margin-right: 1.5rem !important; -} - -.mx-5 { - margin-left: 3rem !important; - margin-right: 3rem !important; -} - -.mx-auto { - margin-left: auto !important; - margin-right: auto !important; -} - -.my-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; -} - -.my-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; -} - -.my-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; -} - -.my-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; -} - -.my-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; -} - -.my-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; -} - -.my-auto { - margin-top: auto !important; - margin-bottom: auto !important; -} - -.mt-0 { - margin-top: 0 !important; -} - -.mt-1 { - margin-top: 0.25rem !important; -} - -.mt-2 { - margin-top: 0.5rem !important; -} - -.mt-3 { - margin-top: 1rem !important; -} - -.mt-4 { - margin-top: 1.5rem !important; -} - -.mt-5 { - margin-top: 3rem !important; -} - -.mt-auto { - margin-top: auto !important; -} - -.me-0 { - margin-left: 0 !important; -} - -.me-1 { - margin-left: 0.25rem !important; -} - -.me-2 { - margin-left: 0.5rem !important; -} - -.me-3 { - margin-left: 1rem !important; -} - -.me-4 { - margin-left: 1.5rem !important; -} - -.me-5 { - margin-left: 3rem !important; -} - -.me-auto { - margin-left: auto !important; -} - -.mb-0 { - margin-bottom: 0 !important; -} - -.mb-1 { - margin-bottom: 0.25rem !important; -} - -.mb-2 { - margin-bottom: 0.5rem !important; -} - -.mb-3 { - margin-bottom: 1rem !important; -} - -.mb-4 { - margin-bottom: 1.5rem !important; -} - -.mb-5 { - margin-bottom: 3rem !important; -} - -.mb-auto { - margin-bottom: auto !important; -} - -.ms-0 { - margin-right: 0 !important; -} - -.ms-1 { - margin-right: 0.25rem !important; -} - -.ms-2 { - margin-right: 0.5rem !important; -} - -.ms-3 { - margin-right: 1rem !important; -} - -.ms-4 { - margin-right: 1.5rem !important; -} - -.ms-5 { - margin-right: 3rem !important; -} - -.ms-auto { - margin-right: auto !important; -} - -.p-0 { - padding: 0 !important; -} - -.p-1 { - padding: 0.25rem !important; -} - -.p-2 { - padding: 0.5rem !important; -} - -.p-3 { - padding: 1rem !important; -} - -.p-4 { - padding: 1.5rem !important; -} - -.p-5 { - padding: 3rem !important; -} - -.px-0 { - padding-left: 0 !important; - padding-right: 0 !important; -} - -.px-1 { - padding-left: 0.25rem !important; - padding-right: 0.25rem !important; -} - -.px-2 { - padding-left: 0.5rem !important; - padding-right: 0.5rem !important; -} - -.px-3 { - padding-left: 1rem !important; - padding-right: 1rem !important; -} - -.px-4 { - padding-left: 1.5rem !important; - padding-right: 1.5rem !important; -} - -.px-5 { - padding-left: 3rem !important; - padding-right: 3rem !important; -} - -.py-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; -} - -.py-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; -} - -.py-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; -} - -.py-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; -} - -.py-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; -} - -.py-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; -} - -.pt-0 { - padding-top: 0 !important; -} - -.pt-1 { - padding-top: 0.25rem !important; -} - -.pt-2 { - padding-top: 0.5rem !important; -} - -.pt-3 { - padding-top: 1rem !important; -} - -.pt-4 { - padding-top: 1.5rem !important; -} - -.pt-5 { - padding-top: 3rem !important; -} - -.pe-0 { - padding-left: 0 !important; -} - -.pe-1 { - padding-left: 0.25rem !important; -} - -.pe-2 { - padding-left: 0.5rem !important; -} - -.pe-3 { - padding-left: 1rem !important; -} - -.pe-4 { - padding-left: 1.5rem !important; -} - -.pe-5 { - padding-left: 3rem !important; -} - -.pb-0 { - padding-bottom: 0 !important; -} - -.pb-1 { - padding-bottom: 0.25rem !important; -} - -.pb-2 { - padding-bottom: 0.5rem !important; -} - -.pb-3 { - padding-bottom: 1rem !important; -} - -.pb-4 { - padding-bottom: 1.5rem !important; -} - -.pb-5 { - padding-bottom: 3rem !important; -} - -.ps-0 { - padding-right: 0 !important; -} - -.ps-1 { - padding-right: 0.25rem !important; -} - -.ps-2 { - padding-right: 0.5rem !important; -} - -.ps-3 { - padding-right: 1rem !important; -} - -.ps-4 { - padding-right: 1.5rem !important; -} - -.ps-5 { - padding-right: 3rem !important; -} - -@media (min-width: 576px) { - .d-sm-inline { - display: inline !important; - } - .d-sm-inline-block { - display: inline-block !important; - } - .d-sm-block { - display: block !important; - } - .d-sm-grid { - display: grid !important; - } - .d-sm-inline-grid { - display: inline-grid !important; - } - .d-sm-table { - display: table !important; - } - .d-sm-table-row { - display: table-row !important; - } - .d-sm-table-cell { - display: table-cell !important; - } - .d-sm-flex { - display: flex !important; - } - .d-sm-inline-flex { - display: inline-flex !important; - } - .d-sm-none { - display: none !important; - } - .flex-sm-fill { - flex: 1 1 auto !important; - } - .flex-sm-row { - flex-direction: row !important; - } - .flex-sm-column { - flex-direction: column !important; - } - .flex-sm-row-reverse { - flex-direction: row-reverse !important; - } - .flex-sm-column-reverse { - flex-direction: column-reverse !important; - } - .flex-sm-grow-0 { - flex-grow: 0 !important; - } - .flex-sm-grow-1 { - flex-grow: 1 !important; - } - .flex-sm-shrink-0 { - flex-shrink: 0 !important; - } - .flex-sm-shrink-1 { - flex-shrink: 1 !important; - } - .flex-sm-wrap { - flex-wrap: wrap !important; - } - .flex-sm-nowrap { - flex-wrap: nowrap !important; - } - .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-sm-start { - justify-content: flex-start !important; - } - .justify-content-sm-end { - justify-content: flex-end !important; - } - .justify-content-sm-center { - justify-content: center !important; - } - .justify-content-sm-between { - justify-content: space-between !important; - } - .justify-content-sm-around { - justify-content: space-around !important; - } - .justify-content-sm-evenly { - justify-content: space-evenly !important; - } - .align-items-sm-start { - align-items: flex-start !important; - } - .align-items-sm-end { - align-items: flex-end !important; - } - .align-items-sm-center { - align-items: center !important; - } - .align-items-sm-baseline { - align-items: baseline !important; - } - .align-items-sm-stretch { - align-items: stretch !important; - } - .align-content-sm-start { - align-content: flex-start !important; - } - .align-content-sm-end { - align-content: flex-end !important; - } - .align-content-sm-center { - align-content: center !important; - } - .align-content-sm-between { - align-content: space-between !important; - } - .align-content-sm-around { - align-content: space-around !important; - } - .align-content-sm-stretch { - align-content: stretch !important; - } - .align-self-sm-auto { - align-self: auto !important; - } - .align-self-sm-start { - align-self: flex-start !important; - } - .align-self-sm-end { - align-self: flex-end !important; - } - .align-self-sm-center { - align-self: center !important; - } - .align-self-sm-baseline { - align-self: baseline !important; - } - .align-self-sm-stretch { - align-self: stretch !important; - } - .order-sm-first { - order: -1 !important; - } - .order-sm-0 { - order: 0 !important; - } - .order-sm-1 { - order: 1 !important; - } - .order-sm-2 { - order: 2 !important; - } - .order-sm-3 { - order: 3 !important; - } - .order-sm-4 { - order: 4 !important; - } - .order-sm-5 { - order: 5 !important; - } - .order-sm-last { - order: 6 !important; - } - .m-sm-0 { - margin: 0 !important; - } - .m-sm-1 { - margin: 0.25rem !important; - } - .m-sm-2 { - margin: 0.5rem !important; - } - .m-sm-3 { - margin: 1rem !important; - } - .m-sm-4 { - margin: 1.5rem !important; - } - .m-sm-5 { - margin: 3rem !important; - } - .m-sm-auto { - margin: auto !important; - } - .mx-sm-0 { - margin-left: 0 !important; - margin-right: 0 !important; - } - .mx-sm-1 { - margin-left: 0.25rem !important; - margin-right: 0.25rem !important; - } - .mx-sm-2 { - margin-left: 0.5rem !important; - margin-right: 0.5rem !important; - } - .mx-sm-3 { - margin-left: 1rem !important; - margin-right: 1rem !important; - } - .mx-sm-4 { - margin-left: 1.5rem !important; - margin-right: 1.5rem !important; - } - .mx-sm-5 { - margin-left: 3rem !important; - margin-right: 3rem !important; - } - .mx-sm-auto { - margin-left: auto !important; - margin-right: auto !important; - } - .my-sm-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-sm-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-sm-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-sm-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-sm-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-sm-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-sm-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-sm-0 { - margin-top: 0 !important; - } - .mt-sm-1 { - margin-top: 0.25rem !important; - } - .mt-sm-2 { - margin-top: 0.5rem !important; - } - .mt-sm-3 { - margin-top: 1rem !important; - } - .mt-sm-4 { - margin-top: 1.5rem !important; - } - .mt-sm-5 { - margin-top: 3rem !important; - } - .mt-sm-auto { - margin-top: auto !important; - } - .me-sm-0 { - margin-left: 0 !important; - } - .me-sm-1 { - margin-left: 0.25rem !important; - } - .me-sm-2 { - margin-left: 0.5rem !important; - } - .me-sm-3 { - margin-left: 1rem !important; - } - .me-sm-4 { - margin-left: 1.5rem !important; - } - .me-sm-5 { - margin-left: 3rem !important; - } - .me-sm-auto { - margin-left: auto !important; - } - .mb-sm-0 { - margin-bottom: 0 !important; - } - .mb-sm-1 { - margin-bottom: 0.25rem !important; - } - .mb-sm-2 { - margin-bottom: 0.5rem !important; - } - .mb-sm-3 { - margin-bottom: 1rem !important; - } - .mb-sm-4 { - margin-bottom: 1.5rem !important; - } - .mb-sm-5 { - margin-bottom: 3rem !important; - } - .mb-sm-auto { - margin-bottom: auto !important; - } - .ms-sm-0 { - margin-right: 0 !important; - } - .ms-sm-1 { - margin-right: 0.25rem !important; - } - .ms-sm-2 { - margin-right: 0.5rem !important; - } - .ms-sm-3 { - margin-right: 1rem !important; - } - .ms-sm-4 { - margin-right: 1.5rem !important; - } - .ms-sm-5 { - margin-right: 3rem !important; - } - .ms-sm-auto { - margin-right: auto !important; - } - .p-sm-0 { - padding: 0 !important; - } - .p-sm-1 { - padding: 0.25rem !important; - } - .p-sm-2 { - padding: 0.5rem !important; - } - .p-sm-3 { - padding: 1rem !important; - } - .p-sm-4 { - padding: 1.5rem !important; - } - .p-sm-5 { - padding: 3rem !important; - } - .px-sm-0 { - padding-left: 0 !important; - padding-right: 0 !important; - } - .px-sm-1 { - padding-left: 0.25rem !important; - padding-right: 0.25rem !important; - } - .px-sm-2 { - padding-left: 0.5rem !important; - padding-right: 0.5rem !important; - } - .px-sm-3 { - padding-left: 1rem !important; - padding-right: 1rem !important; - } - .px-sm-4 { - padding-left: 1.5rem !important; - padding-right: 1.5rem !important; - } - .px-sm-5 { - padding-left: 3rem !important; - padding-right: 3rem !important; - } - .py-sm-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-sm-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-sm-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-sm-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-sm-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-sm-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-sm-0 { - padding-top: 0 !important; - } - .pt-sm-1 { - padding-top: 0.25rem !important; - } - .pt-sm-2 { - padding-top: 0.5rem !important; - } - .pt-sm-3 { - padding-top: 1rem !important; - } - .pt-sm-4 { - padding-top: 1.5rem !important; - } - .pt-sm-5 { - padding-top: 3rem !important; - } - .pe-sm-0 { - padding-left: 0 !important; - } - .pe-sm-1 { - padding-left: 0.25rem !important; - } - .pe-sm-2 { - padding-left: 0.5rem !important; - } - .pe-sm-3 { - padding-left: 1rem !important; - } - .pe-sm-4 { - padding-left: 1.5rem !important; - } - .pe-sm-5 { - padding-left: 3rem !important; - } - .pb-sm-0 { - padding-bottom: 0 !important; - } - .pb-sm-1 { - padding-bottom: 0.25rem !important; - } - .pb-sm-2 { - padding-bottom: 0.5rem !important; - } - .pb-sm-3 { - padding-bottom: 1rem !important; - } - .pb-sm-4 { - padding-bottom: 1.5rem !important; - } - .pb-sm-5 { - padding-bottom: 3rem !important; - } - .ps-sm-0 { - padding-right: 0 !important; - } - .ps-sm-1 { - padding-right: 0.25rem !important; - } - .ps-sm-2 { - padding-right: 0.5rem !important; - } - .ps-sm-3 { - padding-right: 1rem !important; - } - .ps-sm-4 { - padding-right: 1.5rem !important; - } - .ps-sm-5 { - padding-right: 3rem !important; - } -} -@media (min-width: 768px) { - .d-md-inline { - display: inline !important; - } - .d-md-inline-block { - display: inline-block !important; - } - .d-md-block { - display: block !important; - } - .d-md-grid { - display: grid !important; - } - .d-md-inline-grid { - display: inline-grid !important; - } - .d-md-table { - display: table !important; - } - .d-md-table-row { - display: table-row !important; - } - .d-md-table-cell { - display: table-cell !important; - } - .d-md-flex { - display: flex !important; - } - .d-md-inline-flex { - display: inline-flex !important; - } - .d-md-none { - display: none !important; - } - .flex-md-fill { - flex: 1 1 auto !important; - } - .flex-md-row { - flex-direction: row !important; - } - .flex-md-column { - flex-direction: column !important; - } - .flex-md-row-reverse { - flex-direction: row-reverse !important; - } - .flex-md-column-reverse { - flex-direction: column-reverse !important; - } - .flex-md-grow-0 { - flex-grow: 0 !important; - } - .flex-md-grow-1 { - flex-grow: 1 !important; - } - .flex-md-shrink-0 { - flex-shrink: 0 !important; - } - .flex-md-shrink-1 { - flex-shrink: 1 !important; - } - .flex-md-wrap { - flex-wrap: wrap !important; - } - .flex-md-nowrap { - flex-wrap: nowrap !important; - } - .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-md-start { - justify-content: flex-start !important; - } - .justify-content-md-end { - justify-content: flex-end !important; - } - .justify-content-md-center { - justify-content: center !important; - } - .justify-content-md-between { - justify-content: space-between !important; - } - .justify-content-md-around { - justify-content: space-around !important; - } - .justify-content-md-evenly { - justify-content: space-evenly !important; - } - .align-items-md-start { - align-items: flex-start !important; - } - .align-items-md-end { - align-items: flex-end !important; - } - .align-items-md-center { - align-items: center !important; - } - .align-items-md-baseline { - align-items: baseline !important; - } - .align-items-md-stretch { - align-items: stretch !important; - } - .align-content-md-start { - align-content: flex-start !important; - } - .align-content-md-end { - align-content: flex-end !important; - } - .align-content-md-center { - align-content: center !important; - } - .align-content-md-between { - align-content: space-between !important; - } - .align-content-md-around { - align-content: space-around !important; - } - .align-content-md-stretch { - align-content: stretch !important; - } - .align-self-md-auto { - align-self: auto !important; - } - .align-self-md-start { - align-self: flex-start !important; - } - .align-self-md-end { - align-self: flex-end !important; - } - .align-self-md-center { - align-self: center !important; - } - .align-self-md-baseline { - align-self: baseline !important; - } - .align-self-md-stretch { - align-self: stretch !important; - } - .order-md-first { - order: -1 !important; - } - .order-md-0 { - order: 0 !important; - } - .order-md-1 { - order: 1 !important; - } - .order-md-2 { - order: 2 !important; - } - .order-md-3 { - order: 3 !important; - } - .order-md-4 { - order: 4 !important; - } - .order-md-5 { - order: 5 !important; - } - .order-md-last { - order: 6 !important; - } - .m-md-0 { - margin: 0 !important; - } - .m-md-1 { - margin: 0.25rem !important; - } - .m-md-2 { - margin: 0.5rem !important; - } - .m-md-3 { - margin: 1rem !important; - } - .m-md-4 { - margin: 1.5rem !important; - } - .m-md-5 { - margin: 3rem !important; - } - .m-md-auto { - margin: auto !important; - } - .mx-md-0 { - margin-left: 0 !important; - margin-right: 0 !important; - } - .mx-md-1 { - margin-left: 0.25rem !important; - margin-right: 0.25rem !important; - } - .mx-md-2 { - margin-left: 0.5rem !important; - margin-right: 0.5rem !important; - } - .mx-md-3 { - margin-left: 1rem !important; - margin-right: 1rem !important; - } - .mx-md-4 { - margin-left: 1.5rem !important; - margin-right: 1.5rem !important; - } - .mx-md-5 { - margin-left: 3rem !important; - margin-right: 3rem !important; - } - .mx-md-auto { - margin-left: auto !important; - margin-right: auto !important; - } - .my-md-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-md-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-md-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-md-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-md-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-md-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-md-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-md-0 { - margin-top: 0 !important; - } - .mt-md-1 { - margin-top: 0.25rem !important; - } - .mt-md-2 { - margin-top: 0.5rem !important; - } - .mt-md-3 { - margin-top: 1rem !important; - } - .mt-md-4 { - margin-top: 1.5rem !important; - } - .mt-md-5 { - margin-top: 3rem !important; - } - .mt-md-auto { - margin-top: auto !important; - } - .me-md-0 { - margin-left: 0 !important; - } - .me-md-1 { - margin-left: 0.25rem !important; - } - .me-md-2 { - margin-left: 0.5rem !important; - } - .me-md-3 { - margin-left: 1rem !important; - } - .me-md-4 { - margin-left: 1.5rem !important; - } - .me-md-5 { - margin-left: 3rem !important; - } - .me-md-auto { - margin-left: auto !important; - } - .mb-md-0 { - margin-bottom: 0 !important; - } - .mb-md-1 { - margin-bottom: 0.25rem !important; - } - .mb-md-2 { - margin-bottom: 0.5rem !important; - } - .mb-md-3 { - margin-bottom: 1rem !important; - } - .mb-md-4 { - margin-bottom: 1.5rem !important; - } - .mb-md-5 { - margin-bottom: 3rem !important; - } - .mb-md-auto { - margin-bottom: auto !important; - } - .ms-md-0 { - margin-right: 0 !important; - } - .ms-md-1 { - margin-right: 0.25rem !important; - } - .ms-md-2 { - margin-right: 0.5rem !important; - } - .ms-md-3 { - margin-right: 1rem !important; - } - .ms-md-4 { - margin-right: 1.5rem !important; - } - .ms-md-5 { - margin-right: 3rem !important; - } - .ms-md-auto { - margin-right: auto !important; - } - .p-md-0 { - padding: 0 !important; - } - .p-md-1 { - padding: 0.25rem !important; - } - .p-md-2 { - padding: 0.5rem !important; - } - .p-md-3 { - padding: 1rem !important; - } - .p-md-4 { - padding: 1.5rem !important; - } - .p-md-5 { - padding: 3rem !important; - } - .px-md-0 { - padding-left: 0 !important; - padding-right: 0 !important; - } - .px-md-1 { - padding-left: 0.25rem !important; - padding-right: 0.25rem !important; - } - .px-md-2 { - padding-left: 0.5rem !important; - padding-right: 0.5rem !important; - } - .px-md-3 { - padding-left: 1rem !important; - padding-right: 1rem !important; - } - .px-md-4 { - padding-left: 1.5rem !important; - padding-right: 1.5rem !important; - } - .px-md-5 { - padding-left: 3rem !important; - padding-right: 3rem !important; - } - .py-md-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-md-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-md-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-md-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-md-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-md-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-md-0 { - padding-top: 0 !important; - } - .pt-md-1 { - padding-top: 0.25rem !important; - } - .pt-md-2 { - padding-top: 0.5rem !important; - } - .pt-md-3 { - padding-top: 1rem !important; - } - .pt-md-4 { - padding-top: 1.5rem !important; - } - .pt-md-5 { - padding-top: 3rem !important; - } - .pe-md-0 { - padding-left: 0 !important; - } - .pe-md-1 { - padding-left: 0.25rem !important; - } - .pe-md-2 { - padding-left: 0.5rem !important; - } - .pe-md-3 { - padding-left: 1rem !important; - } - .pe-md-4 { - padding-left: 1.5rem !important; - } - .pe-md-5 { - padding-left: 3rem !important; - } - .pb-md-0 { - padding-bottom: 0 !important; - } - .pb-md-1 { - padding-bottom: 0.25rem !important; - } - .pb-md-2 { - padding-bottom: 0.5rem !important; - } - .pb-md-3 { - padding-bottom: 1rem !important; - } - .pb-md-4 { - padding-bottom: 1.5rem !important; - } - .pb-md-5 { - padding-bottom: 3rem !important; - } - .ps-md-0 { - padding-right: 0 !important; - } - .ps-md-1 { - padding-right: 0.25rem !important; - } - .ps-md-2 { - padding-right: 0.5rem !important; - } - .ps-md-3 { - padding-right: 1rem !important; - } - .ps-md-4 { - padding-right: 1.5rem !important; - } - .ps-md-5 { - padding-right: 3rem !important; - } -} -@media (min-width: 992px) { - .d-lg-inline { - display: inline !important; - } - .d-lg-inline-block { - display: inline-block !important; - } - .d-lg-block { - display: block !important; - } - .d-lg-grid { - display: grid !important; - } - .d-lg-inline-grid { - display: inline-grid !important; - } - .d-lg-table { - display: table !important; - } - .d-lg-table-row { - display: table-row !important; - } - .d-lg-table-cell { - display: table-cell !important; - } - .d-lg-flex { - display: flex !important; - } - .d-lg-inline-flex { - display: inline-flex !important; - } - .d-lg-none { - display: none !important; - } - .flex-lg-fill { - flex: 1 1 auto !important; - } - .flex-lg-row { - flex-direction: row !important; - } - .flex-lg-column { - flex-direction: column !important; - } - .flex-lg-row-reverse { - flex-direction: row-reverse !important; - } - .flex-lg-column-reverse { - flex-direction: column-reverse !important; - } - .flex-lg-grow-0 { - flex-grow: 0 !important; - } - .flex-lg-grow-1 { - flex-grow: 1 !important; - } - .flex-lg-shrink-0 { - flex-shrink: 0 !important; - } - .flex-lg-shrink-1 { - flex-shrink: 1 !important; - } - .flex-lg-wrap { - flex-wrap: wrap !important; - } - .flex-lg-nowrap { - flex-wrap: nowrap !important; - } - .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-lg-start { - justify-content: flex-start !important; - } - .justify-content-lg-end { - justify-content: flex-end !important; - } - .justify-content-lg-center { - justify-content: center !important; - } - .justify-content-lg-between { - justify-content: space-between !important; - } - .justify-content-lg-around { - justify-content: space-around !important; - } - .justify-content-lg-evenly { - justify-content: space-evenly !important; - } - .align-items-lg-start { - align-items: flex-start !important; - } - .align-items-lg-end { - align-items: flex-end !important; - } - .align-items-lg-center { - align-items: center !important; - } - .align-items-lg-baseline { - align-items: baseline !important; - } - .align-items-lg-stretch { - align-items: stretch !important; - } - .align-content-lg-start { - align-content: flex-start !important; - } - .align-content-lg-end { - align-content: flex-end !important; - } - .align-content-lg-center { - align-content: center !important; - } - .align-content-lg-between { - align-content: space-between !important; - } - .align-content-lg-around { - align-content: space-around !important; - } - .align-content-lg-stretch { - align-content: stretch !important; - } - .align-self-lg-auto { - align-self: auto !important; - } - .align-self-lg-start { - align-self: flex-start !important; - } - .align-self-lg-end { - align-self: flex-end !important; - } - .align-self-lg-center { - align-self: center !important; - } - .align-self-lg-baseline { - align-self: baseline !important; - } - .align-self-lg-stretch { - align-self: stretch !important; - } - .order-lg-first { - order: -1 !important; - } - .order-lg-0 { - order: 0 !important; - } - .order-lg-1 { - order: 1 !important; - } - .order-lg-2 { - order: 2 !important; - } - .order-lg-3 { - order: 3 !important; - } - .order-lg-4 { - order: 4 !important; - } - .order-lg-5 { - order: 5 !important; - } - .order-lg-last { - order: 6 !important; - } - .m-lg-0 { - margin: 0 !important; - } - .m-lg-1 { - margin: 0.25rem !important; - } - .m-lg-2 { - margin: 0.5rem !important; - } - .m-lg-3 { - margin: 1rem !important; - } - .m-lg-4 { - margin: 1.5rem !important; - } - .m-lg-5 { - margin: 3rem !important; - } - .m-lg-auto { - margin: auto !important; - } - .mx-lg-0 { - margin-left: 0 !important; - margin-right: 0 !important; - } - .mx-lg-1 { - margin-left: 0.25rem !important; - margin-right: 0.25rem !important; - } - .mx-lg-2 { - margin-left: 0.5rem !important; - margin-right: 0.5rem !important; - } - .mx-lg-3 { - margin-left: 1rem !important; - margin-right: 1rem !important; - } - .mx-lg-4 { - margin-left: 1.5rem !important; - margin-right: 1.5rem !important; - } - .mx-lg-5 { - margin-left: 3rem !important; - margin-right: 3rem !important; - } - .mx-lg-auto { - margin-left: auto !important; - margin-right: auto !important; - } - .my-lg-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-lg-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-lg-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-lg-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-lg-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-lg-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-lg-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-lg-0 { - margin-top: 0 !important; - } - .mt-lg-1 { - margin-top: 0.25rem !important; - } - .mt-lg-2 { - margin-top: 0.5rem !important; - } - .mt-lg-3 { - margin-top: 1rem !important; - } - .mt-lg-4 { - margin-top: 1.5rem !important; - } - .mt-lg-5 { - margin-top: 3rem !important; - } - .mt-lg-auto { - margin-top: auto !important; - } - .me-lg-0 { - margin-left: 0 !important; - } - .me-lg-1 { - margin-left: 0.25rem !important; - } - .me-lg-2 { - margin-left: 0.5rem !important; - } - .me-lg-3 { - margin-left: 1rem !important; - } - .me-lg-4 { - margin-left: 1.5rem !important; - } - .me-lg-5 { - margin-left: 3rem !important; - } - .me-lg-auto { - margin-left: auto !important; - } - .mb-lg-0 { - margin-bottom: 0 !important; - } - .mb-lg-1 { - margin-bottom: 0.25rem !important; - } - .mb-lg-2 { - margin-bottom: 0.5rem !important; - } - .mb-lg-3 { - margin-bottom: 1rem !important; - } - .mb-lg-4 { - margin-bottom: 1.5rem !important; - } - .mb-lg-5 { - margin-bottom: 3rem !important; - } - .mb-lg-auto { - margin-bottom: auto !important; - } - .ms-lg-0 { - margin-right: 0 !important; - } - .ms-lg-1 { - margin-right: 0.25rem !important; - } - .ms-lg-2 { - margin-right: 0.5rem !important; - } - .ms-lg-3 { - margin-right: 1rem !important; - } - .ms-lg-4 { - margin-right: 1.5rem !important; - } - .ms-lg-5 { - margin-right: 3rem !important; - } - .ms-lg-auto { - margin-right: auto !important; - } - .p-lg-0 { - padding: 0 !important; - } - .p-lg-1 { - padding: 0.25rem !important; - } - .p-lg-2 { - padding: 0.5rem !important; - } - .p-lg-3 { - padding: 1rem !important; - } - .p-lg-4 { - padding: 1.5rem !important; - } - .p-lg-5 { - padding: 3rem !important; - } - .px-lg-0 { - padding-left: 0 !important; - padding-right: 0 !important; - } - .px-lg-1 { - padding-left: 0.25rem !important; - padding-right: 0.25rem !important; - } - .px-lg-2 { - padding-left: 0.5rem !important; - padding-right: 0.5rem !important; - } - .px-lg-3 { - padding-left: 1rem !important; - padding-right: 1rem !important; - } - .px-lg-4 { - padding-left: 1.5rem !important; - padding-right: 1.5rem !important; - } - .px-lg-5 { - padding-left: 3rem !important; - padding-right: 3rem !important; - } - .py-lg-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-lg-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-lg-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-lg-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-lg-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-lg-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-lg-0 { - padding-top: 0 !important; - } - .pt-lg-1 { - padding-top: 0.25rem !important; - } - .pt-lg-2 { - padding-top: 0.5rem !important; - } - .pt-lg-3 { - padding-top: 1rem !important; - } - .pt-lg-4 { - padding-top: 1.5rem !important; - } - .pt-lg-5 { - padding-top: 3rem !important; - } - .pe-lg-0 { - padding-left: 0 !important; - } - .pe-lg-1 { - padding-left: 0.25rem !important; - } - .pe-lg-2 { - padding-left: 0.5rem !important; - } - .pe-lg-3 { - padding-left: 1rem !important; - } - .pe-lg-4 { - padding-left: 1.5rem !important; - } - .pe-lg-5 { - padding-left: 3rem !important; - } - .pb-lg-0 { - padding-bottom: 0 !important; - } - .pb-lg-1 { - padding-bottom: 0.25rem !important; - } - .pb-lg-2 { - padding-bottom: 0.5rem !important; - } - .pb-lg-3 { - padding-bottom: 1rem !important; - } - .pb-lg-4 { - padding-bottom: 1.5rem !important; - } - .pb-lg-5 { - padding-bottom: 3rem !important; - } - .ps-lg-0 { - padding-right: 0 !important; - } - .ps-lg-1 { - padding-right: 0.25rem !important; - } - .ps-lg-2 { - padding-right: 0.5rem !important; - } - .ps-lg-3 { - padding-right: 1rem !important; - } - .ps-lg-4 { - padding-right: 1.5rem !important; - } - .ps-lg-5 { - padding-right: 3rem !important; - } -} -@media (min-width: 1200px) { - .d-xl-inline { - display: inline !important; - } - .d-xl-inline-block { - display: inline-block !important; - } - .d-xl-block { - display: block !important; - } - .d-xl-grid { - display: grid !important; - } - .d-xl-inline-grid { - display: inline-grid !important; - } - .d-xl-table { - display: table !important; - } - .d-xl-table-row { - display: table-row !important; - } - .d-xl-table-cell { - display: table-cell !important; - } - .d-xl-flex { - display: flex !important; - } - .d-xl-inline-flex { - display: inline-flex !important; - } - .d-xl-none { - display: none !important; - } - .flex-xl-fill { - flex: 1 1 auto !important; - } - .flex-xl-row { - flex-direction: row !important; - } - .flex-xl-column { - flex-direction: column !important; - } - .flex-xl-row-reverse { - flex-direction: row-reverse !important; - } - .flex-xl-column-reverse { - flex-direction: column-reverse !important; - } - .flex-xl-grow-0 { - flex-grow: 0 !important; - } - .flex-xl-grow-1 { - flex-grow: 1 !important; - } - .flex-xl-shrink-0 { - flex-shrink: 0 !important; - } - .flex-xl-shrink-1 { - flex-shrink: 1 !important; - } - .flex-xl-wrap { - flex-wrap: wrap !important; - } - .flex-xl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-xl-start { - justify-content: flex-start !important; - } - .justify-content-xl-end { - justify-content: flex-end !important; - } - .justify-content-xl-center { - justify-content: center !important; - } - .justify-content-xl-between { - justify-content: space-between !important; - } - .justify-content-xl-around { - justify-content: space-around !important; - } - .justify-content-xl-evenly { - justify-content: space-evenly !important; - } - .align-items-xl-start { - align-items: flex-start !important; - } - .align-items-xl-end { - align-items: flex-end !important; - } - .align-items-xl-center { - align-items: center !important; - } - .align-items-xl-baseline { - align-items: baseline !important; - } - .align-items-xl-stretch { - align-items: stretch !important; - } - .align-content-xl-start { - align-content: flex-start !important; - } - .align-content-xl-end { - align-content: flex-end !important; - } - .align-content-xl-center { - align-content: center !important; - } - .align-content-xl-between { - align-content: space-between !important; - } - .align-content-xl-around { - align-content: space-around !important; - } - .align-content-xl-stretch { - align-content: stretch !important; - } - .align-self-xl-auto { - align-self: auto !important; - } - .align-self-xl-start { - align-self: flex-start !important; - } - .align-self-xl-end { - align-self: flex-end !important; - } - .align-self-xl-center { - align-self: center !important; - } - .align-self-xl-baseline { - align-self: baseline !important; - } - .align-self-xl-stretch { - align-self: stretch !important; - } - .order-xl-first { - order: -1 !important; - } - .order-xl-0 { - order: 0 !important; - } - .order-xl-1 { - order: 1 !important; - } - .order-xl-2 { - order: 2 !important; - } - .order-xl-3 { - order: 3 !important; - } - .order-xl-4 { - order: 4 !important; - } - .order-xl-5 { - order: 5 !important; - } - .order-xl-last { - order: 6 !important; - } - .m-xl-0 { - margin: 0 !important; - } - .m-xl-1 { - margin: 0.25rem !important; - } - .m-xl-2 { - margin: 0.5rem !important; - } - .m-xl-3 { - margin: 1rem !important; - } - .m-xl-4 { - margin: 1.5rem !important; - } - .m-xl-5 { - margin: 3rem !important; - } - .m-xl-auto { - margin: auto !important; - } - .mx-xl-0 { - margin-left: 0 !important; - margin-right: 0 !important; - } - .mx-xl-1 { - margin-left: 0.25rem !important; - margin-right: 0.25rem !important; - } - .mx-xl-2 { - margin-left: 0.5rem !important; - margin-right: 0.5rem !important; - } - .mx-xl-3 { - margin-left: 1rem !important; - margin-right: 1rem !important; - } - .mx-xl-4 { - margin-left: 1.5rem !important; - margin-right: 1.5rem !important; - } - .mx-xl-5 { - margin-left: 3rem !important; - margin-right: 3rem !important; - } - .mx-xl-auto { - margin-left: auto !important; - margin-right: auto !important; - } - .my-xl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-xl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-xl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-xl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-xl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-xl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-xl-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-xl-0 { - margin-top: 0 !important; - } - .mt-xl-1 { - margin-top: 0.25rem !important; - } - .mt-xl-2 { - margin-top: 0.5rem !important; - } - .mt-xl-3 { - margin-top: 1rem !important; - } - .mt-xl-4 { - margin-top: 1.5rem !important; - } - .mt-xl-5 { - margin-top: 3rem !important; - } - .mt-xl-auto { - margin-top: auto !important; - } - .me-xl-0 { - margin-left: 0 !important; - } - .me-xl-1 { - margin-left: 0.25rem !important; - } - .me-xl-2 { - margin-left: 0.5rem !important; - } - .me-xl-3 { - margin-left: 1rem !important; - } - .me-xl-4 { - margin-left: 1.5rem !important; - } - .me-xl-5 { - margin-left: 3rem !important; - } - .me-xl-auto { - margin-left: auto !important; - } - .mb-xl-0 { - margin-bottom: 0 !important; - } - .mb-xl-1 { - margin-bottom: 0.25rem !important; - } - .mb-xl-2 { - margin-bottom: 0.5rem !important; - } - .mb-xl-3 { - margin-bottom: 1rem !important; - } - .mb-xl-4 { - margin-bottom: 1.5rem !important; - } - .mb-xl-5 { - margin-bottom: 3rem !important; - } - .mb-xl-auto { - margin-bottom: auto !important; - } - .ms-xl-0 { - margin-right: 0 !important; - } - .ms-xl-1 { - margin-right: 0.25rem !important; - } - .ms-xl-2 { - margin-right: 0.5rem !important; - } - .ms-xl-3 { - margin-right: 1rem !important; - } - .ms-xl-4 { - margin-right: 1.5rem !important; - } - .ms-xl-5 { - margin-right: 3rem !important; - } - .ms-xl-auto { - margin-right: auto !important; - } - .p-xl-0 { - padding: 0 !important; - } - .p-xl-1 { - padding: 0.25rem !important; - } - .p-xl-2 { - padding: 0.5rem !important; - } - .p-xl-3 { - padding: 1rem !important; - } - .p-xl-4 { - padding: 1.5rem !important; - } - .p-xl-5 { - padding: 3rem !important; - } - .px-xl-0 { - padding-left: 0 !important; - padding-right: 0 !important; - } - .px-xl-1 { - padding-left: 0.25rem !important; - padding-right: 0.25rem !important; - } - .px-xl-2 { - padding-left: 0.5rem !important; - padding-right: 0.5rem !important; - } - .px-xl-3 { - padding-left: 1rem !important; - padding-right: 1rem !important; - } - .px-xl-4 { - padding-left: 1.5rem !important; - padding-right: 1.5rem !important; - } - .px-xl-5 { - padding-left: 3rem !important; - padding-right: 3rem !important; - } - .py-xl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-xl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-xl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-xl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-xl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-xl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-xl-0 { - padding-top: 0 !important; - } - .pt-xl-1 { - padding-top: 0.25rem !important; - } - .pt-xl-2 { - padding-top: 0.5rem !important; - } - .pt-xl-3 { - padding-top: 1rem !important; - } - .pt-xl-4 { - padding-top: 1.5rem !important; - } - .pt-xl-5 { - padding-top: 3rem !important; - } - .pe-xl-0 { - padding-left: 0 !important; - } - .pe-xl-1 { - padding-left: 0.25rem !important; - } - .pe-xl-2 { - padding-left: 0.5rem !important; - } - .pe-xl-3 { - padding-left: 1rem !important; - } - .pe-xl-4 { - padding-left: 1.5rem !important; - } - .pe-xl-5 { - padding-left: 3rem !important; - } - .pb-xl-0 { - padding-bottom: 0 !important; - } - .pb-xl-1 { - padding-bottom: 0.25rem !important; - } - .pb-xl-2 { - padding-bottom: 0.5rem !important; - } - .pb-xl-3 { - padding-bottom: 1rem !important; - } - .pb-xl-4 { - padding-bottom: 1.5rem !important; - } - .pb-xl-5 { - padding-bottom: 3rem !important; - } - .ps-xl-0 { - padding-right: 0 !important; - } - .ps-xl-1 { - padding-right: 0.25rem !important; - } - .ps-xl-2 { - padding-right: 0.5rem !important; - } - .ps-xl-3 { - padding-right: 1rem !important; - } - .ps-xl-4 { - padding-right: 1.5rem !important; - } - .ps-xl-5 { - padding-right: 3rem !important; - } -} -@media (min-width: 1400px) { - .d-xxl-inline { - display: inline !important; - } - .d-xxl-inline-block { - display: inline-block !important; - } - .d-xxl-block { - display: block !important; - } - .d-xxl-grid { - display: grid !important; - } - .d-xxl-inline-grid { - display: inline-grid !important; - } - .d-xxl-table { - display: table !important; - } - .d-xxl-table-row { - display: table-row !important; - } - .d-xxl-table-cell { - display: table-cell !important; - } - .d-xxl-flex { - display: flex !important; - } - .d-xxl-inline-flex { - display: inline-flex !important; - } - .d-xxl-none { - display: none !important; - } - .flex-xxl-fill { - flex: 1 1 auto !important; - } - .flex-xxl-row { - flex-direction: row !important; - } - .flex-xxl-column { - flex-direction: column !important; - } - .flex-xxl-row-reverse { - flex-direction: row-reverse !important; - } - .flex-xxl-column-reverse { - flex-direction: column-reverse !important; - } - .flex-xxl-grow-0 { - flex-grow: 0 !important; - } - .flex-xxl-grow-1 { - flex-grow: 1 !important; - } - .flex-xxl-shrink-0 { - flex-shrink: 0 !important; - } - .flex-xxl-shrink-1 { - flex-shrink: 1 !important; - } - .flex-xxl-wrap { - flex-wrap: wrap !important; - } - .flex-xxl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xxl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-xxl-start { - justify-content: flex-start !important; - } - .justify-content-xxl-end { - justify-content: flex-end !important; - } - .justify-content-xxl-center { - justify-content: center !important; - } - .justify-content-xxl-between { - justify-content: space-between !important; - } - .justify-content-xxl-around { - justify-content: space-around !important; - } - .justify-content-xxl-evenly { - justify-content: space-evenly !important; - } - .align-items-xxl-start { - align-items: flex-start !important; - } - .align-items-xxl-end { - align-items: flex-end !important; - } - .align-items-xxl-center { - align-items: center !important; - } - .align-items-xxl-baseline { - align-items: baseline !important; - } - .align-items-xxl-stretch { - align-items: stretch !important; - } - .align-content-xxl-start { - align-content: flex-start !important; - } - .align-content-xxl-end { - align-content: flex-end !important; - } - .align-content-xxl-center { - align-content: center !important; - } - .align-content-xxl-between { - align-content: space-between !important; - } - .align-content-xxl-around { - align-content: space-around !important; - } - .align-content-xxl-stretch { - align-content: stretch !important; - } - .align-self-xxl-auto { - align-self: auto !important; - } - .align-self-xxl-start { - align-self: flex-start !important; - } - .align-self-xxl-end { - align-self: flex-end !important; - } - .align-self-xxl-center { - align-self: center !important; - } - .align-self-xxl-baseline { - align-self: baseline !important; - } - .align-self-xxl-stretch { - align-self: stretch !important; - } - .order-xxl-first { - order: -1 !important; - } - .order-xxl-0 { - order: 0 !important; - } - .order-xxl-1 { - order: 1 !important; - } - .order-xxl-2 { - order: 2 !important; - } - .order-xxl-3 { - order: 3 !important; - } - .order-xxl-4 { - order: 4 !important; - } - .order-xxl-5 { - order: 5 !important; - } - .order-xxl-last { - order: 6 !important; - } - .m-xxl-0 { - margin: 0 !important; - } - .m-xxl-1 { - margin: 0.25rem !important; - } - .m-xxl-2 { - margin: 0.5rem !important; - } - .m-xxl-3 { - margin: 1rem !important; - } - .m-xxl-4 { - margin: 1.5rem !important; - } - .m-xxl-5 { - margin: 3rem !important; - } - .m-xxl-auto { - margin: auto !important; - } - .mx-xxl-0 { - margin-left: 0 !important; - margin-right: 0 !important; - } - .mx-xxl-1 { - margin-left: 0.25rem !important; - margin-right: 0.25rem !important; - } - .mx-xxl-2 { - margin-left: 0.5rem !important; - margin-right: 0.5rem !important; - } - .mx-xxl-3 { - margin-left: 1rem !important; - margin-right: 1rem !important; - } - .mx-xxl-4 { - margin-left: 1.5rem !important; - margin-right: 1.5rem !important; - } - .mx-xxl-5 { - margin-left: 3rem !important; - margin-right: 3rem !important; - } - .mx-xxl-auto { - margin-left: auto !important; - margin-right: auto !important; - } - .my-xxl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-xxl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-xxl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-xxl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-xxl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-xxl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-xxl-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-xxl-0 { - margin-top: 0 !important; - } - .mt-xxl-1 { - margin-top: 0.25rem !important; - } - .mt-xxl-2 { - margin-top: 0.5rem !important; - } - .mt-xxl-3 { - margin-top: 1rem !important; - } - .mt-xxl-4 { - margin-top: 1.5rem !important; - } - .mt-xxl-5 { - margin-top: 3rem !important; - } - .mt-xxl-auto { - margin-top: auto !important; - } - .me-xxl-0 { - margin-left: 0 !important; - } - .me-xxl-1 { - margin-left: 0.25rem !important; - } - .me-xxl-2 { - margin-left: 0.5rem !important; - } - .me-xxl-3 { - margin-left: 1rem !important; - } - .me-xxl-4 { - margin-left: 1.5rem !important; - } - .me-xxl-5 { - margin-left: 3rem !important; - } - .me-xxl-auto { - margin-left: auto !important; - } - .mb-xxl-0 { - margin-bottom: 0 !important; - } - .mb-xxl-1 { - margin-bottom: 0.25rem !important; - } - .mb-xxl-2 { - margin-bottom: 0.5rem !important; - } - .mb-xxl-3 { - margin-bottom: 1rem !important; - } - .mb-xxl-4 { - margin-bottom: 1.5rem !important; - } - .mb-xxl-5 { - margin-bottom: 3rem !important; - } - .mb-xxl-auto { - margin-bottom: auto !important; - } - .ms-xxl-0 { - margin-right: 0 !important; - } - .ms-xxl-1 { - margin-right: 0.25rem !important; - } - .ms-xxl-2 { - margin-right: 0.5rem !important; - } - .ms-xxl-3 { - margin-right: 1rem !important; - } - .ms-xxl-4 { - margin-right: 1.5rem !important; - } - .ms-xxl-5 { - margin-right: 3rem !important; - } - .ms-xxl-auto { - margin-right: auto !important; - } - .p-xxl-0 { - padding: 0 !important; - } - .p-xxl-1 { - padding: 0.25rem !important; - } - .p-xxl-2 { - padding: 0.5rem !important; - } - .p-xxl-3 { - padding: 1rem !important; - } - .p-xxl-4 { - padding: 1.5rem !important; - } - .p-xxl-5 { - padding: 3rem !important; - } - .px-xxl-0 { - padding-left: 0 !important; - padding-right: 0 !important; - } - .px-xxl-1 { - padding-left: 0.25rem !important; - padding-right: 0.25rem !important; - } - .px-xxl-2 { - padding-left: 0.5rem !important; - padding-right: 0.5rem !important; - } - .px-xxl-3 { - padding-left: 1rem !important; - padding-right: 1rem !important; - } - .px-xxl-4 { - padding-left: 1.5rem !important; - padding-right: 1.5rem !important; - } - .px-xxl-5 { - padding-left: 3rem !important; - padding-right: 3rem !important; - } - .py-xxl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-xxl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-xxl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-xxl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-xxl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-xxl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-xxl-0 { - padding-top: 0 !important; - } - .pt-xxl-1 { - padding-top: 0.25rem !important; - } - .pt-xxl-2 { - padding-top: 0.5rem !important; - } - .pt-xxl-3 { - padding-top: 1rem !important; - } - .pt-xxl-4 { - padding-top: 1.5rem !important; - } - .pt-xxl-5 { - padding-top: 3rem !important; - } - .pe-xxl-0 { - padding-left: 0 !important; - } - .pe-xxl-1 { - padding-left: 0.25rem !important; - } - .pe-xxl-2 { - padding-left: 0.5rem !important; - } - .pe-xxl-3 { - padding-left: 1rem !important; - } - .pe-xxl-4 { - padding-left: 1.5rem !important; - } - .pe-xxl-5 { - padding-left: 3rem !important; - } - .pb-xxl-0 { - padding-bottom: 0 !important; - } - .pb-xxl-1 { - padding-bottom: 0.25rem !important; - } - .pb-xxl-2 { - padding-bottom: 0.5rem !important; - } - .pb-xxl-3 { - padding-bottom: 1rem !important; - } - .pb-xxl-4 { - padding-bottom: 1.5rem !important; - } - .pb-xxl-5 { - padding-bottom: 3rem !important; - } - .ps-xxl-0 { - padding-right: 0 !important; - } - .ps-xxl-1 { - padding-right: 0.25rem !important; - } - .ps-xxl-2 { - padding-right: 0.5rem !important; - } - .ps-xxl-3 { - padding-right: 1rem !important; - } - .ps-xxl-4 { - padding-right: 1.5rem !important; - } - .ps-xxl-5 { - padding-right: 3rem !important; - } -} -@media print { - .d-print-inline { - display: inline !important; - } - .d-print-inline-block { - display: inline-block !important; - } - .d-print-block { - display: block !important; - } - .d-print-grid { - display: grid !important; - } - .d-print-inline-grid { - display: inline-grid !important; - } - .d-print-table { - display: table !important; - } - .d-print-table-row { - display: table-row !important; - } - .d-print-table-cell { - display: table-cell !important; - } - .d-print-flex { - display: flex !important; - } - .d-print-inline-flex { - display: inline-flex !important; - } - .d-print-none { - display: none !important; - } -} -/*# sourceMappingURL=bootstrap-grid.rtl.css.map */ \ No newline at end of file diff --git a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.rtl.css.map b/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.rtl.css.map deleted file mode 100644 index 08430325..00000000 --- a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.rtl.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","bootstrap-grid.css","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"AACE;;;;EAAA;ACKA;;;;;;;ECHA,qBAAA;EACA,gBAAA;EACA,WAAA;EACA,4CAAA;EACA,6CAAA;EACA,iBAAA;EACA,kBAAA;ACUF;;AC4CI;EH5CE;IACE,gBIkee;EF9drB;AACF;ACsCI;EH5CE;IACE,gBIkee;EFzdrB;AACF;ACiCI;EH5CE;IACE,gBIkee;EFpdrB;AACF;AC4BI;EH5CE;IACE,iBIkee;EF/crB;AACF;ACuBI;EH5CE;IACE,iBIkee;EF1crB;AACF;AGzCA;EAEI,qBAAA;EAAA,yBAAA;EAAA,yBAAA;EAAA,yBAAA;EAAA,0BAAA;EAAA,2BAAA;AH+CJ;;AG1CE;ECNA,qBAAA;EACA,gBAAA;EACA,aAAA;EACA,eAAA;EAEA,yCAAA;EACA,4CAAA;EACA,6CAAA;AJmDF;AGjDI;ECGF,sBAAA;EAIA,cAAA;EACA,WAAA;EACA,eAAA;EACA,4CAAA;EACA,6CAAA;EACA,8BAAA;AJ8CF;;AICM;EACE,YAAA;AJER;;AICM;EApCJ,cAAA;EACA,WAAA;AJuCF;;AIzBE;EACE,cAAA;EACA,WAAA;AJ4BJ;;AI9BE;EACE,cAAA;EACA,UAAA;AJiCJ;;AInCE;EACE,cAAA;EACA,mBAAA;AJsCJ;;AIxCE;EACE,cAAA;EACA,UAAA;AJ2CJ;;AI7CE;EACE,cAAA;EACA,UAAA;AJgDJ;;AIlDE;EACE,cAAA;EACA,mBAAA;AJqDJ;;AItBM;EAhDJ,cAAA;EACA,WAAA;AJ0EF;;AIrBU;EAhEN,cAAA;EACA,kBAAA;AJyFJ;;AI1BU;EAhEN,cAAA;EACA,mBAAA;AJ8FJ;;AI/BU;EAhEN,cAAA;EACA,UAAA;AJmGJ;;AIpCU;EAhEN,cAAA;EACA,mBAAA;AJwGJ;;AIzCU;EAhEN,cAAA;EACA,mBAAA;AJ6GJ;;AI9CU;EAhEN,cAAA;EACA,UAAA;AJkHJ;;AInDU;EAhEN,cAAA;EACA,mBAAA;AJuHJ;;AIxDU;EAhEN,cAAA;EACA,mBAAA;AJ4HJ;;AI7DU;EAhEN,cAAA;EACA,UAAA;AJiIJ;;AIlEU;EAhEN,cAAA;EACA,mBAAA;AJsIJ;;AIvEU;EAhEN,cAAA;EACA,mBAAA;AJ2IJ;;AI5EU;EAhEN,cAAA;EACA,WAAA;AJgJJ;;AIzEY;EAxDV,yBAAA;AJqIF;;AI7EY;EAxDV,0BAAA;AJyIF;;AIjFY;EAxDV,iBAAA;AJ6IF;;AIrFY;EAxDV,0BAAA;AJiJF;;AIzFY;EAxDV,0BAAA;AJqJF;;AI7FY;EAxDV,iBAAA;AJyJF;;AIjGY;EAxDV,0BAAA;AJ6JF;;AIrGY;EAxDV,0BAAA;AJiKF;;AIzGY;EAxDV,iBAAA;AJqKF;;AI7GY;EAxDV,0BAAA;AJyKF;;AIjHY;EAxDV,0BAAA;AJ6KF;;AI1GQ;;EAEE,gBAAA;AJ6GV;;AI1GQ;;EAEE,gBAAA;AJ6GV;;AIpHQ;;EAEE,sBAAA;AJuHV;;AIpHQ;;EAEE,sBAAA;AJuHV;;AI9HQ;;EAEE,qBAAA;AJiIV;;AI9HQ;;EAEE,qBAAA;AJiIV;;AIxIQ;;EAEE,mBAAA;AJ2IV;;AIxIQ;;EAEE,mBAAA;AJ2IV;;AIlJQ;;EAEE,qBAAA;AJqJV;;AIlJQ;;EAEE,qBAAA;AJqJV;;AI5JQ;;EAEE,mBAAA;AJ+JV;;AI5JQ;;EAEE,mBAAA;AJ+JV;;ACzNI;EGUE;IACE,YAAA;EJmNN;EIhNI;IApCJ,cAAA;IACA,WAAA;EJuPA;EIzOA;IACE,cAAA;IACA,WAAA;EJ2OF;EI7OA;IACE,cAAA;IACA,UAAA;EJ+OF;EIjPA;IACE,cAAA;IACA,mBAAA;EJmPF;EIrPA;IACE,cAAA;IACA,UAAA;EJuPF;EIzPA;IACE,cAAA;IACA,UAAA;EJ2PF;EI7PA;IACE,cAAA;IACA,mBAAA;EJ+PF;EIhOI;IAhDJ,cAAA;IACA,WAAA;EJmRA;EI9NQ;IAhEN,cAAA;IACA,kBAAA;EJiSF;EIlOQ;IAhEN,cAAA;IACA,mBAAA;EJqSF;EItOQ;IAhEN,cAAA;IACA,UAAA;EJySF;EI1OQ;IAhEN,cAAA;IACA,mBAAA;EJ6SF;EI9OQ;IAhEN,cAAA;IACA,mBAAA;EJiTF;EIlPQ;IAhEN,cAAA;IACA,UAAA;EJqTF;EItPQ;IAhEN,cAAA;IACA,mBAAA;EJyTF;EI1PQ;IAhEN,cAAA;IACA,mBAAA;EJ6TF;EI9PQ;IAhEN,cAAA;IACA,UAAA;EJiUF;EIlQQ;IAhEN,cAAA;IACA,mBAAA;EJqUF;EItQQ;IAhEN,cAAA;IACA,mBAAA;EJyUF;EI1QQ;IAhEN,cAAA;IACA,WAAA;EJ6UF;EItQU;IAxDV,eAAA;EJiUA;EIzQU;IAxDV,yBAAA;EJoUA;EI5QU;IAxDV,0BAAA;EJuUA;EI/QU;IAxDV,iBAAA;EJ0UA;EIlRU;IAxDV,0BAAA;EJ6UA;EIrRU;IAxDV,0BAAA;EJgVA;EIxRU;IAxDV,iBAAA;EJmVA;EI3RU;IAxDV,0BAAA;EJsVA;EI9RU;IAxDV,0BAAA;EJyVA;EIjSU;IAxDV,iBAAA;EJ4VA;EIpSU;IAxDV,0BAAA;EJ+VA;EIvSU;IAxDV,0BAAA;EJkWA;EI/RM;;IAEE,gBAAA;EJiSR;EI9RM;;IAEE,gBAAA;EJgSR;EIvSM;;IAEE,sBAAA;EJySR;EItSM;;IAEE,sBAAA;EJwSR;EI/SM;;IAEE,qBAAA;EJiTR;EI9SM;;IAEE,qBAAA;EJgTR;EIvTM;;IAEE,mBAAA;EJyTR;EItTM;;IAEE,mBAAA;EJwTR;EI/TM;;IAEE,qBAAA;EJiUR;EI9TM;;IAEE,qBAAA;EJgUR;EIvUM;;IAEE,mBAAA;EJyUR;EItUM;;IAEE,mBAAA;EJwUR;AACF;ACnYI;EGUE;IACE,YAAA;EJ4XN;EIzXI;IApCJ,cAAA;IACA,WAAA;EJgaA;EIlZA;IACE,cAAA;IACA,WAAA;EJoZF;EItZA;IACE,cAAA;IACA,UAAA;EJwZF;EI1ZA;IACE,cAAA;IACA,mBAAA;EJ4ZF;EI9ZA;IACE,cAAA;IACA,UAAA;EJgaF;EIlaA;IACE,cAAA;IACA,UAAA;EJoaF;EItaA;IACE,cAAA;IACA,mBAAA;EJwaF;EIzYI;IAhDJ,cAAA;IACA,WAAA;EJ4bA;EIvYQ;IAhEN,cAAA;IACA,kBAAA;EJ0cF;EI3YQ;IAhEN,cAAA;IACA,mBAAA;EJ8cF;EI/YQ;IAhEN,cAAA;IACA,UAAA;EJkdF;EInZQ;IAhEN,cAAA;IACA,mBAAA;EJsdF;EIvZQ;IAhEN,cAAA;IACA,mBAAA;EJ0dF;EI3ZQ;IAhEN,cAAA;IACA,UAAA;EJ8dF;EI/ZQ;IAhEN,cAAA;IACA,mBAAA;EJkeF;EInaQ;IAhEN,cAAA;IACA,mBAAA;EJseF;EIvaQ;IAhEN,cAAA;IACA,UAAA;EJ0eF;EI3aQ;IAhEN,cAAA;IACA,mBAAA;EJ8eF;EI/aQ;IAhEN,cAAA;IACA,mBAAA;EJkfF;EInbQ;IAhEN,cAAA;IACA,WAAA;EJsfF;EI/aU;IAxDV,eAAA;EJ0eA;EIlbU;IAxDV,yBAAA;EJ6eA;EIrbU;IAxDV,0BAAA;EJgfA;EIxbU;IAxDV,iBAAA;EJmfA;EI3bU;IAxDV,0BAAA;EJsfA;EI9bU;IAxDV,0BAAA;EJyfA;EIjcU;IAxDV,iBAAA;EJ4fA;EIpcU;IAxDV,0BAAA;EJ+fA;EIvcU;IAxDV,0BAAA;EJkgBA;EI1cU;IAxDV,iBAAA;EJqgBA;EI7cU;IAxDV,0BAAA;EJwgBA;EIhdU;IAxDV,0BAAA;EJ2gBA;EIxcM;;IAEE,gBAAA;EJ0cR;EIvcM;;IAEE,gBAAA;EJycR;EIhdM;;IAEE,sBAAA;EJkdR;EI/cM;;IAEE,sBAAA;EJidR;EIxdM;;IAEE,qBAAA;EJ0dR;EIvdM;;IAEE,qBAAA;EJydR;EIheM;;IAEE,mBAAA;EJkeR;EI/dM;;IAEE,mBAAA;EJieR;EIxeM;;IAEE,qBAAA;EJ0eR;EIveM;;IAEE,qBAAA;EJyeR;EIhfM;;IAEE,mBAAA;EJkfR;EI/eM;;IAEE,mBAAA;EJifR;AACF;AC5iBI;EGUE;IACE,YAAA;EJqiBN;EIliBI;IApCJ,cAAA;IACA,WAAA;EJykBA;EI3jBA;IACE,cAAA;IACA,WAAA;EJ6jBF;EI/jBA;IACE,cAAA;IACA,UAAA;EJikBF;EInkBA;IACE,cAAA;IACA,mBAAA;EJqkBF;EIvkBA;IACE,cAAA;IACA,UAAA;EJykBF;EI3kBA;IACE,cAAA;IACA,UAAA;EJ6kBF;EI/kBA;IACE,cAAA;IACA,mBAAA;EJilBF;EIljBI;IAhDJ,cAAA;IACA,WAAA;EJqmBA;EIhjBQ;IAhEN,cAAA;IACA,kBAAA;EJmnBF;EIpjBQ;IAhEN,cAAA;IACA,mBAAA;EJunBF;EIxjBQ;IAhEN,cAAA;IACA,UAAA;EJ2nBF;EI5jBQ;IAhEN,cAAA;IACA,mBAAA;EJ+nBF;EIhkBQ;IAhEN,cAAA;IACA,mBAAA;EJmoBF;EIpkBQ;IAhEN,cAAA;IACA,UAAA;EJuoBF;EIxkBQ;IAhEN,cAAA;IACA,mBAAA;EJ2oBF;EI5kBQ;IAhEN,cAAA;IACA,mBAAA;EJ+oBF;EIhlBQ;IAhEN,cAAA;IACA,UAAA;EJmpBF;EIplBQ;IAhEN,cAAA;IACA,mBAAA;EJupBF;EIxlBQ;IAhEN,cAAA;IACA,mBAAA;EJ2pBF;EI5lBQ;IAhEN,cAAA;IACA,WAAA;EJ+pBF;EIxlBU;IAxDV,eAAA;EJmpBA;EI3lBU;IAxDV,yBAAA;EJspBA;EI9lBU;IAxDV,0BAAA;EJypBA;EIjmBU;IAxDV,iBAAA;EJ4pBA;EIpmBU;IAxDV,0BAAA;EJ+pBA;EIvmBU;IAxDV,0BAAA;EJkqBA;EI1mBU;IAxDV,iBAAA;EJqqBA;EI7mBU;IAxDV,0BAAA;EJwqBA;EIhnBU;IAxDV,0BAAA;EJ2qBA;EInnBU;IAxDV,iBAAA;EJ8qBA;EItnBU;IAxDV,0BAAA;EJirBA;EIznBU;IAxDV,0BAAA;EJorBA;EIjnBM;;IAEE,gBAAA;EJmnBR;EIhnBM;;IAEE,gBAAA;EJknBR;EIznBM;;IAEE,sBAAA;EJ2nBR;EIxnBM;;IAEE,sBAAA;EJ0nBR;EIjoBM;;IAEE,qBAAA;EJmoBR;EIhoBM;;IAEE,qBAAA;EJkoBR;EIzoBM;;IAEE,mBAAA;EJ2oBR;EIxoBM;;IAEE,mBAAA;EJ0oBR;EIjpBM;;IAEE,qBAAA;EJmpBR;EIhpBM;;IAEE,qBAAA;EJkpBR;EIzpBM;;IAEE,mBAAA;EJ2pBR;EIxpBM;;IAEE,mBAAA;EJ0pBR;AACF;ACrtBI;EGUE;IACE,YAAA;EJ8sBN;EI3sBI;IApCJ,cAAA;IACA,WAAA;EJkvBA;EIpuBA;IACE,cAAA;IACA,WAAA;EJsuBF;EIxuBA;IACE,cAAA;IACA,UAAA;EJ0uBF;EI5uBA;IACE,cAAA;IACA,mBAAA;EJ8uBF;EIhvBA;IACE,cAAA;IACA,UAAA;EJkvBF;EIpvBA;IACE,cAAA;IACA,UAAA;EJsvBF;EIxvBA;IACE,cAAA;IACA,mBAAA;EJ0vBF;EI3tBI;IAhDJ,cAAA;IACA,WAAA;EJ8wBA;EIztBQ;IAhEN,cAAA;IACA,kBAAA;EJ4xBF;EI7tBQ;IAhEN,cAAA;IACA,mBAAA;EJgyBF;EIjuBQ;IAhEN,cAAA;IACA,UAAA;EJoyBF;EIruBQ;IAhEN,cAAA;IACA,mBAAA;EJwyBF;EIzuBQ;IAhEN,cAAA;IACA,mBAAA;EJ4yBF;EI7uBQ;IAhEN,cAAA;IACA,UAAA;EJgzBF;EIjvBQ;IAhEN,cAAA;IACA,mBAAA;EJozBF;EIrvBQ;IAhEN,cAAA;IACA,mBAAA;EJwzBF;EIzvBQ;IAhEN,cAAA;IACA,UAAA;EJ4zBF;EI7vBQ;IAhEN,cAAA;IACA,mBAAA;EJg0BF;EIjwBQ;IAhEN,cAAA;IACA,mBAAA;EJo0BF;EIrwBQ;IAhEN,cAAA;IACA,WAAA;EJw0BF;EIjwBU;IAxDV,eAAA;EJ4zBA;EIpwBU;IAxDV,yBAAA;EJ+zBA;EIvwBU;IAxDV,0BAAA;EJk0BA;EI1wBU;IAxDV,iBAAA;EJq0BA;EI7wBU;IAxDV,0BAAA;EJw0BA;EIhxBU;IAxDV,0BAAA;EJ20BA;EInxBU;IAxDV,iBAAA;EJ80BA;EItxBU;IAxDV,0BAAA;EJi1BA;EIzxBU;IAxDV,0BAAA;EJo1BA;EI5xBU;IAxDV,iBAAA;EJu1BA;EI/xBU;IAxDV,0BAAA;EJ01BA;EIlyBU;IAxDV,0BAAA;EJ61BA;EI1xBM;;IAEE,gBAAA;EJ4xBR;EIzxBM;;IAEE,gBAAA;EJ2xBR;EIlyBM;;IAEE,sBAAA;EJoyBR;EIjyBM;;IAEE,sBAAA;EJmyBR;EI1yBM;;IAEE,qBAAA;EJ4yBR;EIzyBM;;IAEE,qBAAA;EJ2yBR;EIlzBM;;IAEE,mBAAA;EJozBR;EIjzBM;;IAEE,mBAAA;EJmzBR;EI1zBM;;IAEE,qBAAA;EJ4zBR;EIzzBM;;IAEE,qBAAA;EJ2zBR;EIl0BM;;IAEE,mBAAA;EJo0BR;EIj0BM;;IAEE,mBAAA;EJm0BR;AACF;AC93BI;EGUE;IACE,YAAA;EJu3BN;EIp3BI;IApCJ,cAAA;IACA,WAAA;EJ25BA;EI74BA;IACE,cAAA;IACA,WAAA;EJ+4BF;EIj5BA;IACE,cAAA;IACA,UAAA;EJm5BF;EIr5BA;IACE,cAAA;IACA,mBAAA;EJu5BF;EIz5BA;IACE,cAAA;IACA,UAAA;EJ25BF;EI75BA;IACE,cAAA;IACA,UAAA;EJ+5BF;EIj6BA;IACE,cAAA;IACA,mBAAA;EJm6BF;EIp4BI;IAhDJ,cAAA;IACA,WAAA;EJu7BA;EIl4BQ;IAhEN,cAAA;IACA,kBAAA;EJq8BF;EIt4BQ;IAhEN,cAAA;IACA,mBAAA;EJy8BF;EI14BQ;IAhEN,cAAA;IACA,UAAA;EJ68BF;EI94BQ;IAhEN,cAAA;IACA,mBAAA;EJi9BF;EIl5BQ;IAhEN,cAAA;IACA,mBAAA;EJq9BF;EIt5BQ;IAhEN,cAAA;IACA,UAAA;EJy9BF;EI15BQ;IAhEN,cAAA;IACA,mBAAA;EJ69BF;EI95BQ;IAhEN,cAAA;IACA,mBAAA;EJi+BF;EIl6BQ;IAhEN,cAAA;IACA,UAAA;EJq+BF;EIt6BQ;IAhEN,cAAA;IACA,mBAAA;EJy+BF;EI16BQ;IAhEN,cAAA;IACA,mBAAA;EJ6+BF;EI96BQ;IAhEN,cAAA;IACA,WAAA;EJi/BF;EI16BU;IAxDV,eAAA;EJq+BA;EI76BU;IAxDV,yBAAA;EJw+BA;EIh7BU;IAxDV,0BAAA;EJ2+BA;EIn7BU;IAxDV,iBAAA;EJ8+BA;EIt7BU;IAxDV,0BAAA;EJi/BA;EIz7BU;IAxDV,0BAAA;EJo/BA;EI57BU;IAxDV,iBAAA;EJu/BA;EI/7BU;IAxDV,0BAAA;EJ0/BA;EIl8BU;IAxDV,0BAAA;EJ6/BA;EIr8BU;IAxDV,iBAAA;EJggCA;EIx8BU;IAxDV,0BAAA;EJmgCA;EI38BU;IAxDV,0BAAA;EJsgCA;EIn8BM;;IAEE,gBAAA;EJq8BR;EIl8BM;;IAEE,gBAAA;EJo8BR;EI38BM;;IAEE,sBAAA;EJ68BR;EI18BM;;IAEE,sBAAA;EJ48BR;EIn9BM;;IAEE,qBAAA;EJq9BR;EIl9BM;;IAEE,qBAAA;EJo9BR;EI39BM;;IAEE,mBAAA;EJ69BR;EI19BM;;IAEE,mBAAA;EJ49BR;EIn+BM;;IAEE,qBAAA;EJq+BR;EIl+BM;;IAEE,qBAAA;EJo+BR;EI3+BM;;IAEE,mBAAA;EJ6+BR;EI1+BM;;IAEE,mBAAA;EJ4+BR;AACF;AKpiCQ;EAOI,0BAAA;ALgiCZ;;AKviCQ;EAOI,gCAAA;ALoiCZ;;AK3iCQ;EAOI,yBAAA;ALwiCZ;;AK/iCQ;EAOI,wBAAA;AL4iCZ;;AKnjCQ;EAOI,+BAAA;ALgjCZ;;AKvjCQ;EAOI,yBAAA;ALojCZ;;AK3jCQ;EAOI,6BAAA;ALwjCZ;;AK/jCQ;EAOI,8BAAA;AL4jCZ;;AKnkCQ;EAOI,wBAAA;ALgkCZ;;AKvkCQ;EAOI,+BAAA;ALokCZ;;AK3kCQ;EAOI,wBAAA;ALwkCZ;;AK/kCQ;EAOI,yBAAA;AL4kCZ;;AKnlCQ;EAOI,8BAAA;ALglCZ;;AKvlCQ;EAOI,iCAAA;ALolCZ;;AK3lCQ;EAOI,sCAAA;ALwlCZ;;AK/lCQ;EAOI,yCAAA;AL4lCZ;;AKnmCQ;EAOI,uBAAA;ALgmCZ;;AKvmCQ;EAOI,uBAAA;ALomCZ;;AK3mCQ;EAOI,yBAAA;ALwmCZ;;AK/mCQ;EAOI,yBAAA;AL4mCZ;;AKnnCQ;EAOI,0BAAA;ALgnCZ;;AKvnCQ;EAOI,4BAAA;ALonCZ;;AK3nCQ;EAOI,kCAAA;ALwnCZ;;AK/nCQ;EAOI,sCAAA;AL4nCZ;;AKnoCQ;EAOI,oCAAA;ALgoCZ;;AKvoCQ;EAOI,kCAAA;ALooCZ;;AK3oCQ;EAOI,yCAAA;ALwoCZ;;AK/oCQ;EAOI,wCAAA;AL4oCZ;;AKnpCQ;EAOI,wCAAA;ALgpCZ;;AKvpCQ;EAOI,kCAAA;ALopCZ;;AK3pCQ;EAOI,gCAAA;ALwpCZ;;AK/pCQ;EAOI,8BAAA;AL4pCZ;;AKnqCQ;EAOI,gCAAA;ALgqCZ;;AKvqCQ;EAOI,+BAAA;ALoqCZ;;AK3qCQ;EAOI,oCAAA;ALwqCZ;;AK/qCQ;EAOI,kCAAA;AL4qCZ;;AKnrCQ;EAOI,gCAAA;ALgrCZ;;AKvrCQ;EAOI,uCAAA;ALorCZ;;AK3rCQ;EAOI,sCAAA;ALwrCZ;;AK/rCQ;EAOI,iCAAA;AL4rCZ;;AKnsCQ;EAOI,2BAAA;ALgsCZ;;AKvsCQ;EAOI,iCAAA;ALosCZ;;AK3sCQ;EAOI,+BAAA;ALwsCZ;;AK/sCQ;EAOI,6BAAA;AL4sCZ;;AKntCQ;EA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;AL8iDZ;;AKrjDQ;EAOI,4BAAA;ALkjDZ;;AKzjDQ;EAOI,0BAAA;ALsjDZ;;AK7jDQ;EAOI,gCAAA;AL0jDZ;;AKjkDQ;EAOI,+BAAA;AL8jDZ;;AKrkDQ;EAOI,6BAAA;ALkkDZ;;AKzkDQ;EAOI,+BAAA;ALskDZ;;AK7kDQ;EAOI,6BAAA;AL0kDZ;;AKjlDQ;EAOI,4BAAA;AL8kDZ;;AKrlDQ;EAOI,kCAAA;ALklDZ;;AKzlDQ;EAOI,iCAAA;ALslDZ;;AK7lDQ;EAOI,+BAAA;AL0lDZ;;AKjmDQ;EAOI,iCAAA;AL8lDZ;;AKrmDQ;EAOI,+BAAA;ALkmDZ;;AKzmDQ;EAOI,2BAAA;ALsmDZ;;AK7mDQ;EAOI,iCAAA;AL0mDZ;;AKjnDQ;EAOI,gCAAA;AL8mDZ;;AKrnDQ;EAOI,8BAAA;ALknDZ;;AKznDQ;EAOI,gCAAA;ALsnDZ;;AK7nDQ;EAOI,8BAAA;AL0nDZ;;ACpoDI;EIGI;IAOI,0BAAA;EL+nDV;EKtoDM;IAOI,gCAAA;ELkoDV;EKzoDM;IAOI,yBAAA;ELqoDV;EK5oDM;IAOI,wBAAA;ELwoDV;EK/oDM;IAOI,+BAAA;EL2oDV;EKlpDM;IAOI,yBAAA;EL8oDV;EKrpDM;IAOI,6BAAA;ELipDV;EKxpDM;IAOI,8BAAA;ELopDV;EK3pDM;IAOI,wBAAA;ELupDV;EK9pDM;IAOI,+BAAA;EL0pDV;EKjqDM;IAOI,wBAAA;EL6pDV;EKpqDM;IAOI,yBAAA;ELgqDV;EKvqDM;IAOI,8BAAA;ELmqDV;EK1qDM;IAOI,iCAAA;ELsqDV;EK7qDM;IAOI,sCAAA;ELyqDV;EKhrDM;IAOI,yCAAA;EL4qDV;EKnrDM;IAOI,uBAAA;EL+qDV;EKtrDM;IAOI,uBAAA;ELkrDV;EKzrDM;IAOI,yBAAA;ELqrDV;EK5rDM;IAOI,yBAAA;ELwrDV;EK/rDM;IAOI,0BAAA;EL2rDV;EKlsDM;IAOI,4BAAA;EL8rDV;EKrsDM;IAOI,kCAAA;ELisDV;EKxsDM;IAOI,sCAAA;ELosDV;EK3sDM;IAOI,oCAAA;ELusDV;EK9sDM;IAOI,kCAAA;EL0sDV;EKjtDM;IAOI,yCAAA;EL6sDV;EKptDM;IAOI,wCAAA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nEV;EK/nEM;IAOI,yCAAA;EL2nEV;EKloEM;IAOI,uBAAA;EL8nEV;EKroEM;IAOI,uBAAA;ELioEV;EKxoEM;IAOI,yBAAA;ELooEV;EK3oEM;IAOI,yBAAA;ELuoEV;EK9oEM;IAOI,0BAAA;EL0oEV;EKjpEM;IAOI,4BAAA;EL6oEV;EKppEM;IAOI,kCAAA;ELgpEV;EKvpEM;IAOI,sCAAA;ELmpEV;EK1pEM;IAOI,oCAAA;ELspEV;EK7pEM;IAOI,kCAAA;ELypEV;EKhqEM;IAOI,yCAAA;EL4pEV;EKnqEM;IAOI,wCAAA;EL+pEV;EKtqEM;IAOI,wCAAA;ELkqEV;EKzqEM;IAOI,kCAAA;ELqqEV;EK5qEM;IAOI,gCAAA;ELwqEV;EK/qEM;IAOI,8BAAA;EL2qEV;EKlrEM;IAOI,gCAAA;EL8qEV;EKrrEM;IAOI,+BAAA;ELirEV;EKxrEM;IAOI,oCAAA;ELorEV;EK3rEM;IAOI,kCAAA;ELurEV;EK9rEM;IAOI,gCAAA;EL0rEV;EKjsEM;IAOI,uCAAA;EL6rEV;EKpsEM;IAOI,sCAAA;ELgsEV;EKvsEM;IAOI,iCAAA;ELmsEV;EK1sEM;IAOI,2BAAA;ELssEV;EK7sEM;IAOI,iCAAA;ELysEV;EKhtEM;IAOI,+BAAA;EL4sEV;EKntEM;IAOI,6BAAA;EL+sEV;EKttEM;IAOI,+BAAA;ELktEV;EKztEM;IAOI,8BAAA;ELqtEV;EK5tEM;IAOI,oBAAA;ELwtEV;EK/tEM;IAOI,mBAAA;EL2tEV;EKluEM;IAOI,mBAAA;EL8tEV;EKruEM;IAOI,mBAAA;ELiuEV;EKxuEM;IAOI,mBAAA;ELouEV;EK3uEM;IAOI,mBAAA;ELuuEV;EK9uEM;IAOI,mBAAA;EL0uEV;EKjvEM;IAOI,mBAAA;EL6uEV;EKpvEM;IAOI,oBAAA;ELgvEV;EKvvEM;IAOI,0BAAA;ELmvEV;EK1vEM;IAOI,yBAAA;ELsvEV;EK7vEM;IAOI,uBAAA;ELyvEV;EKhwEM;IAOI,yBAAA;EL4vEV;EKnwEM;IAOI,uBAAA;EL+vEV;EKtwEM;IAOI,uBAAA;ELkwEV;EKzwEM;IAOI,yBAAA;IAAA,0BAAA;ELswEV;EK7wEM;IAO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EKviFM;IAOI,yBAAA;ELmiFV;EK1iFM;IAOI,wBAAA;ELsiFV;EK7iFM;IAOI,+BAAA;ELyiFV;EKhjFM;IAOI,yBAAA;EL4iFV;EKnjFM;IAOI,6BAAA;EL+iFV;EKtjFM;IAOI,8BAAA;ELkjFV;EKzjFM;IAOI,wBAAA;ELqjFV;EK5jFM;IAOI,+BAAA;ELwjFV;EK/jFM;IAOI,wBAAA;EL2jFV;EKlkFM;IAOI,yBAAA;EL8jFV;EKrkFM;IAOI,8BAAA;ELikFV;EKxkFM;IAOI,iCAAA;ELokFV;EK3kFM;IAOI,sCAAA;ELukFV;EK9kFM;IAOI,yCAAA;EL0kFV;EKjlFM;IAOI,uBAAA;EL6kFV;EKplFM;IAOI,uBAAA;ELglFV;EKvlFM;IAOI,yBAAA;ELmlFV;EK1lFM;IAOI,yBAAA;ELslFV;EK7lFM;IAOI,0BAAA;ELylFV;EKhmFM;IAOI,4BAAA;EL4lFV;EKnmFM;IAOI,kCAAA;EL+lFV;EKtmFM;IAOI,sCAAA;ELkmFV;EKzmFM;IAOI,oCAAA;ELqmFV;EK5mFM;IAOI,kCAAA;ELwmFV;EK/mFM;IAOI,yCAAA;EL2mFV;EKlnFM;IAOI,wCAAA;EL8mFV;EKrnFM;IAOI,wCAAA;ELinFV;EKxnFM;IAOI,kCAAA;ELonFV;EK3nFM;IAOI,gCAAA;ELunFV;EK9nFM;IAOI,8BAAA;EL0nFV;EKjoFM;IAOI,gCAAA;EL6nFV;EKpoFM;IAOI,+BAAA;ELgoFV;EKvoFM;IAOI,oCAAA;ELmoFV;EK1oFM;IAOI,kCAAA;ELsoFV;EK7oFM;IAOI,gCAAA;ELyoFV;EKhpFM;IAOI,uCAAA;EL4oFV;EKnpFM;IAOI,sCAAA;EL+oFV;EKtpFM;IAOI,iCAAA;ELkpFV;EKzpFM;IAOI,2BAAA;ELqpFV;EK5pFM;IAOI,iCAAA;ELwpFV;EK/pFM;IAOI,+BAAA;EL2pFV;EKlqFM;IAOI,6BAAA;EL8pFV;EKrqFM;IAOI,+BAAA;ELiqFV;EKxqFM;IAOI,8BAAA;ELoqFV;EK3qFM;IAOI,oBAAA;ELuqFV;EK9qFM;IAOI,mBAAA;EL0qFV;EKjrFM;IAOI,mBAAA;EL6qFV;EKprFM;IAOI,mBAAA;ELgrFV;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AAA;ELy8FV;EKh9FM;IAOI,iCAAA;EL48FV;EKn9FM;IAOI,+BAAA;EL+8FV;EKt9FM;IAOI,iCAAA;ELk9FV;EKz9FM;IAOI,+BAAA;ELq9FV;EK59FM;IAOI,2BAAA;ELw9FV;EK/9FM;IAOI,iCAAA;EL29FV;EKl+FM;IAOI,gCAAA;EL89FV;EKr+FM;IAOI,8BAAA;ELi+FV;EKx+FM;IAOI,gCAAA;ELo+FV;EK3+FM;IAOI,8BAAA;ELu+FV;AACF;ACl/FI;EIGI;IAOI,0BAAA;EL4+FV;EKn/FM;IAOI,gCAAA;EL++FV;EKt/FM;IAOI,yBAAA;ELk/FV;EKz/FM;IAOI,wBAAA;ELq/FV;EK5/FM;IAOI,+BAAA;ELw/FV;EK//FM;IAOI,yBAAA;EL2/FV;EKlgGM;IAOI,6BAAA;EL8/FV;EKrgGM;IAOI,8BAAA;ELigGV;EKxgGM;IAOI,wBAAA;ELogGV;EK3gGM;IAOI,+BAAA;ELugGV;EK9gGM;IAOI,wBAAA;EL0gGV;EKjhGM;IAOI,yBAAA;EL6gGV;EKphGM;IAOI,8BAAA;ELghGV;EKvhGM;IAOI,iCAAA;ELmhGV;EK1hGM;IAOI,sCAAA;ELshGV;EK7hGM;IAOI,yCAAA;ELyhGV;EKhiGM;IAOI,uBAAA;EL4hGV;EKniGM;IAOI,uBAAA;EL+hGV;EKtiGM;IAOI,yBAAA;ELkiGV;EKziGM;IAOI,yBAAA;ELqiGV;EK5iGM;IAOI,0BAAA;ELwiGV;EK/iGM;IAOI,4BAAA;EL2iGV;EKljGM;IAOI,kCAAA;EL8iGV;EKrjGM;IAOI,sCAAA;ELijGV;EKxjGM;IAOI,oCAAA;ELojGV;EK3jGM;IAOI,kCAAA;ELujGV;EK9jGM;IAOI,yCAAA;EL0jGV;EKjkGM;IAOI,wCAAA;EL6jGV;EKpkGM;IAOI,wCAAA;ELgkGV;EKvkGM;IAOI,kCAAA;ELmkGV;EK1kGM;IAOI,gCAAA;ELskGV;EK7kGM;IAOI,8BAAA;ELykGV;EKhlGM;IAOI,gCAAA;EL4kGV;EKnlGM;IAOI,+BAAA;EL+kGV;EKtlGM;IAOI,oCAAA;ELklGV;EKzlGM;IAOI,kCAAA;ELqlGV;EK5lGM;IAOI,gCAAA;ELwlGV;EK/l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ELi3GV;EKx3GM;IAOI,+BAAA;ELo3GV;EK33GM;IAOI,8BAAA;ELu3GV;EK93GM;IAOI,4BAAA;EL03GV;EKj4GM;IAOI,8BAAA;EL63GV;EKp4GM;IAOI,4BAAA;ELg4GV;EKv4GM;IAOI,0BAAA;ELm4GV;EK14GM;IAOI,gCAAA;ELs4GV;EK74GM;IAOI,+BAAA;ELy4GV;EKh5GM;IAOI,6BAAA;EL44GV;EKn5GM;IAOI,+BAAA;EL+4GV;EKt5GM;IAOI,6BAAA;ELk5GV;EKz5GM;IAOI,4BAAA;ELq5GV;EK55GM;IAOI,kCAAA;ELw5GV;EK/5GM;IAOI,iCAAA;EL25GV;EKl6GM;IAOI,+BAAA;EL85GV;EKr6GM;IAOI,iCAAA;ELi6GV;EKx6GM;IAOI,+BAAA;ELo6GV;EK36GM;IAOI,2BAAA;ELu6GV;EK96GM;IAOI,iCAAA;EL06GV;EKj7GM;IAOI,gCAAA;EL66GV;EKp7GM;IAOI,8BAAA;ELg7GV;EKv7GM;IAOI,gCAAA;ELm7GV;EK17GM;IAOI,8BAAA;ELs7GV;AACF;ACj8GI;EIGI;IAOI,0BAAA;EL27GV;EKl8GM;IAOI,gCAAA;EL87GV;EKr8GM;IAOI,yBAAA;ELi8GV;EKx8GM;IAOI,wBAAA;ELo8GV;EK38GM;IAOI,+BAAA;ELu8GV;EK98GM;IAOI,yBAAA;EL08GV;EKj9GM;IAOI,6BAAA;EL68GV;EKp9GM;IAOI,8BAAA;ELg9GV;EKv9GM;IAOI,wBAAA;ELm9GV;EK19GM;IAOI,+BAAA;ELs9GV;EK79GM;IAOI,wBAAA;ELy9GV;EKh+GM;IAOI,yBAAA;EL49GV;EKn+GM;IAOI,8BAAA;EL+9GV;EKt+GM;IAOI,iCAAA;ELk+GV;EKz+GM;IAOI,sCAAA;ELq+GV;EK5+GM;IAOI,yCAAA;ELw+GV;EK/+GM;IAOI,uBAAA;EL2+GV;EKl/GM;IAOI,uBAAA;EL8+GV;EKr/GM;IAOI,yBAAA;ELi/GV;EKx/GM;IAOI,yBAAA;ELo/GV;EK3/GM;IAOI,0BAAA;ELu/GV;EK9/GM;IAOI,4BAAA;EL0/GV;EKjgHM;IAOI,kCAAA;EL6/GV;EKpgHM;IAOI,sCAAA;ELggHV;EKvgHM;IAOI,oCAAA;ELmgHV;EK1gHM;IAOI,kCAAA;ELsgHV;EK7gHM;IAOI,yCAAA;ELygHV;EKhhHM;IAOI,wCAAA;EL4gHV;EKnhHM;IAOI,wCAAA;EL+gHV;EKthHM;IAOI,kCAAA;ELkhHV;EKzhHM;IAOI,gCAAA;ELqhHV;EK5hHM;IAOI,8BAAA;ELwhHV;EK/hHM;IAOI,gCAAA;EL2hHV;EKliHM;IAOI,+BAAA;EL8hHV;EKriHM;IAOI,oCAAA;ELiiHV;EKxiHM;IAOI,kCAAA;ELoiHV;EK3iHM;IAOI,gCAAA;ELuiHV;EK9iHM;IAOI,uCAAA;EL0iHV;EKjjHM;IAOI,sCAAA;EL6iHV;EKpjHM;IAOI,iCAAA;ELgjHV;EKvjHM;IAOI,2BAAA;ELmjHV;EK1jHM;IAOI,iCAAA;ELsjHV;EK7jHM;IAOI,+BAAA;ELyjHV;EKhkHM;IAOI,6BAAA;EL4jHV;EKnkHM;IAOI,+BAAA;EL+jHV;EKtkHM;IAOI,8BAAA;ELkkHV;EKzkHM;IAOI,oBAAA;ELqkHV;EK5kHM;IAOI,mBAAA;ELwkHV;EK/kHM;IAOI,mBAAA;EL2kHV;EKllHM;IAOI,mBAAA;EL8kHV;EKrlHM;IAOI,mBAAA;ELilHV;EKxlHM;IAOI,mBAAA;ELolHV;EK3lHM;IAOI,mBAAA;ELulHV;EK9lHM;IAOI,mBAAA;EL0lHV;EKjmHM;IAOI,oBAAA;EL6lHV;EKpmHM;IAOI,0BAAA;ELgmHV;EKvmHM;IAOI,yBAAA;ELmmHV;EK1mHM;IAOI,uBAAA;ELsmHV;EK7mHM;IAOI,yBAAA;ELymHV;EKhnHM;IAOI,uBAAA;EL4mHV;EKnnHM;IAOI,uBAAA;EL+mHV;EKtnHM;IAOI,yBAAA;IAAA,0BAAA;ELmnHV;EK1nHM;IAOI,+BAAA;IAAA,gCAAA;ELunHV;EK9nHM;IAOI,8BAAA;IAAA,+BAAA;EL2nHV;EKloHM;IAOI,4BAAA;IAAA,6BAAA;EL+nHV;EKtoHM;IAOI,8BAAA;IAAA,+BAAA;ELmoHV;EK1oHM;IAOI,4BAAA;IAAA,6BAAA;ELuoHV;EK9oHM;IAOI,4BAAA;IAAA,6BAAA;EL2oHV;EKlpHM;IAOI,wBAAA;IAAA,2BAAA;EL+oHV;EKtpHM;IAOI,8BAAA;IAAA,iCAAA;ELmpHV;EK1pHM;IAOI,6BAAA;IAAA,gCAAA;ELupHV;EK9pHM;IAOI,2BAAA;IAAA,8BAAA;EL2pHV;EKlqHM;IAOI,6BAAA;IAAA,gCAAA;EL+pHV;EKtqHM;IAOI,2BAAA;IAAA,8BAAA;ELmqHV;EK1qHM;IAOI,2BAAA;IAAA,8BAAA;ELuqHV;EK9qHM;IAOI,wBAAA;EL0qHV;EKjrHM;IAOI,8BAAA;EL6qHV;EKprHM;IAOI,6BAAA;ELgrHV;EKvrHM;IAOI,2BAAA;ELmrHV;EK1rHM;IAOI,6BAAA;ELsrHV;EK7rHM;IAOI,2BAAA;ELyrHV;EKhsHM;IAOI,2BAAA;EL4rHV;EKnsHM;IAOI,yBAAA;EL+rHV;EKtsHM;IAOI,+BAAA;ELksHV;EKzsHM;IAOI,8BAAA;ELqsHV;EK5sHM;IAOI,4BAAA;ELwsHV;EK/sHM;IAOI,8BAAA;EL2sHV;EKltHM;IAOI,4BAAA;EL8sHV;EKrtHM;IAOI,4BAAA;ELitHV;EKxtHM;IAOI,2BAAA;ELotHV;EK3tHM;IAOI,iCAAA;ELutHV;EK9tHM;IAOI,gCAAA;EL0tHV;EKjuHM;IAOI,8BAAA;EL6tHV;EKpuHM;IAOI,gCAAA;ELguHV;EKvuHM;IAOI,8BAAA;ELmuHV;EK1uHM;IAOI,8BAAA;ELsuHV;EK7uHM;IAOI,0BAAA;ELyuHV;EKhvHM;IAOI,gCAAA;EL4uHV;EKnvHM;IAOI,+BAAA;EL+uHV;EKtvHM;IAOI,6BAAA;ELkvHV;EKzvHM;IAOI,+BAAA;ELqvHV;EK5vHM;IAOI,6BAAA;ELwvHV;EK/vHM;IAOI,6BAAA;EL2vHV;EKlwHM;IAOI,qBAAA;EL8vHV;EKrwHM;IAOI,2BAAA;ELiwHV;EKxwHM;IAOI,0BAAA;ELowHV;EK3wHM;IAOI,wBAAA;ELuwHV;EK9wHM;IAOI,0BAAA;EL0wHV;EKjxHM;IAOI,wBAAA;EL6wHV;EKpxHM;IAOI,0BAAA;IAAA,2BAAA;ELixHV;EKxxHM;IAOI,gCAAA;IAAA,iCAAA;ELqxHV;EK5xHM;IAOI,+BAAA;IAAA,gCAAA;ELyxHV;EKhyHM;IAOI,6BAAA;IAAA,8BAAA;EL6xHV;EKpyHM;IAOI,+BAAA;IAAA,gCAAA;ELiyHV;EKxyHM;IAOI,6BAAA;IAAA,8BAAA;ELqyHV;EK5yHM;IAOI,yBAAA;IAAA,4BAAA;ELyyHV;EKhzHM;IAOI,+BAAA;IAAA,kCAAA;EL6yHV;EKpzHM;IAOI,8BAAA;IAAA,iCAAA;ELizHV;EKxzHM;IAOI,4BAAA;IAAA,+BAAA;ELqzHV;EK5zHM;IAOI,8BAAA;IAAA,iCAAA;ELyzHV;EKh0HM;IAOI,4BAAA;IAAA,+BAAA;EL6zHV;EKp0HM;IAOI,yBAAA;ELg0HV;EKv0HM;IAOI,+BAAA;ELm0HV;EK10HM;IAOI,8BAAA;ELs0HV;EK70HM;IAOI,4BAAA;ELy0HV;EKh1HM;IAOI,8BAAA;EL40HV;EKn1HM;IAOI,4BAAA;EL+0HV;EKt1HM;IAOI,0BAAA;ELk1HV;EKz1HM;IAOI,gCAAA;ELq1HV;EK51HM;IAOI,+BAAA;ELw1HV;EK/1HM;IAOI,6BAAA;EL21HV;EKl2HM;IAOI,+BAAA;EL81HV;EKr2HM;IAOI,6BAAA;ELi2HV;EKx2HM;IAOI,4BAAA;ELo2HV;EK32HM;IAOI,kCAAA;ELu2HV;EK92HM;IAOI,iCAAA;EL02HV;EKj3HM;IAOI,+BAAA;EL62HV;EKp3HM;IAOI,iCAAA;ELg3HV;EKv3HM;IAOI,+BAAA;ELm3HV;EK13HM;IAOI,2BAAA;ELs3HV;EK73HM;IAOI,iCAAA;ELy3HV;EKh4HM;IAOI,gCAAA;EL43HV;EKn4HM;IAOI,8BAAA;EL+3HV;EKt4HM;IAOI,gCAAA;ELk4HV;EKz4HM;IAOI,8BAAA;ELq4HV;AACF;AMz6HA;ED4BQ;IAOI,0BAAA;EL04HV;EKj5HM;IAOI,gCAAA;EL64HV;EKp5HM;IAOI,yBAAA;ELg5HV;EKv5HM;IAOI,wBAAA;ELm5HV;EK15HM;IAOI,+BAAA;ELs5HV;EK75HM;IAOI,yBAAA;ELy5HV;EKh6HM;IAOI,6BAAA;EL45HV;EKn6HM;IAOI,8BAAA;EL+5HV;EKt6HM;IAOI,wBAAA;ELk6HV;EKz6HM;IAOI,+BAAA;ELq6HV;EK56HM;IAOI,wBAAA;ELw6HV;AACF","file":"bootstrap-grid.rtl.css","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","/*!\n * Bootstrap Grid v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-right: 0 !important;\n }\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n .me-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n .ms-sm-auto {\n margin-left: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-right: 0 !important;\n }\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n .me-md-3 {\n margin-right: 1rem !important;\n }\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n .me-md-5 {\n margin-right: 3rem !important;\n }\n .me-md-auto {\n margin-right: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-left: 0 !important;\n }\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n .ms-md-auto {\n margin-left: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-right: 0 !important;\n }\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-left: 0 !important;\n }\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-right: 0 !important;\n }\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n .me-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n .ms-lg-auto {\n margin-left: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-right: 0 !important;\n }\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n .me-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n .ms-xl-auto {\n margin-left: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n .me-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// scss-docs-start theme-text-variables\n$primary-text-emphasis: shade-color($primary, 60%) !default;\n$secondary-text-emphasis: shade-color($secondary, 60%) !default;\n$success-text-emphasis: shade-color($success, 60%) !default;\n$info-text-emphasis: shade-color($info, 60%) !default;\n$warning-text-emphasis: shade-color($warning, 60%) !default;\n$danger-text-emphasis: shade-color($danger, 60%) !default;\n$light-text-emphasis: $gray-700 !default;\n$dark-text-emphasis: $gray-700 !default;\n// scss-docs-end theme-text-variables\n\n// scss-docs-start theme-bg-subtle-variables\n$primary-bg-subtle: tint-color($primary, 80%) !default;\n$secondary-bg-subtle: tint-color($secondary, 80%) !default;\n$success-bg-subtle: tint-color($success, 80%) !default;\n$info-bg-subtle: tint-color($info, 80%) !default;\n$warning-bg-subtle: tint-color($warning, 80%) !default;\n$danger-bg-subtle: tint-color($danger, 80%) !default;\n$light-bg-subtle: mix($gray-100, $white) !default;\n$dark-bg-subtle: $gray-400 !default;\n// scss-docs-end theme-bg-subtle-variables\n\n// scss-docs-start theme-border-subtle-variables\n$primary-border-subtle: tint-color($primary, 60%) !default;\n$secondary-border-subtle: tint-color($secondary, 60%) !default;\n$success-border-subtle: tint-color($success, 60%) !default;\n$info-border-subtle: tint-color($info, 60%) !default;\n$warning-border-subtle: tint-color($warning, 60%) !default;\n$danger-border-subtle: tint-color($danger, 60%) !default;\n$light-border-subtle: $gray-200 !default;\n$dark-border-subtle: $gray-500 !default;\n// scss-docs-end theme-border-subtle-variables\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n$enable-dark-mode: true !default;\n$color-mode-type: data !default; // `data` or `media-query`\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-text-align: null !default;\n$body-color: $gray-900 !default;\n$body-bg: $white !default;\n\n$body-secondary-color: rgba($body-color, .75) !default;\n$body-secondary-bg: $gray-200 !default;\n\n$body-tertiary-color: rgba($body-color, .5) !default;\n$body-tertiary-bg: $gray-100 !default;\n\n$body-emphasis-color: $black !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Icon links\n// scss-docs-start icon-link-variables\n$icon-link-gap: .375rem !default;\n$icon-link-underline-offset: .25em !default;\n$icon-link-icon-size: 1em !default;\n$icon-link-icon-transition: .2s ease-in-out transform !default;\n$icon-link-icon-transform: translate3d(.25em, 0, 0) !default;\n// scss-docs-end icon-link-variables\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-xxl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n// fusv-disable\n$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0\n// fusv-enable\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start focus-ring-variables\n$focus-ring-width: .25rem !default;\n$focus-ring-opacity: .25 !default;\n$focus-ring-color: rgba($primary, $focus-ring-opacity) !default;\n$focus-ring-blur: 0 !default;\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;\n// scss-docs-end focus-ring-variables\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-medium: 500 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: inherit !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n// fusv-disable\n$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0\n// fusv-enable\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: var(--#{$prefix}border-width) !default;\n$hr-opacity: .25 !default;\n\n// scss-docs-start vr-variables\n$vr-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end vr-variables\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-color: $body-color !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}emphasis-color) !default;\n$table-bg: var(--#{$prefix}body-bg) !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;\n\n$table-border-factor: .2 !default;\n$table-border-width: var(--#{$prefix}border-width) !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: var(--#{$prefix}secondary-color) !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: $focus-ring-width !default;\n$input-btn-focus-color-opacity: $focus-ring-opacity !default;\n$input-btn-focus-color: $focus-ring-color !default;\n$input-btn-focus-blur: $focus-ring-blur !default;\n$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-color: var(--#{$prefix}body-color) !default;\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: var(--#{$prefix}border-radius) !default;\n$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: var(--#{$prefix}body-bg) !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$input-disabled-border-color: null !default;\n\n$input-color: var(--#{$prefix}body-color) !default;\n$input-border-color: var(--#{$prefix}border-color) !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$input-border-radius: var(--#{$prefix}border-radius) !default;\n$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: var(--#{$prefix}secondary-color) !default;\n$input-plaintext-color: var(--#{$prefix}body-color) !default;\n\n$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $input-disabled-bg !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: var(--#{$prefix}secondary-bg) !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default;\n$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-height: 1.5em !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-label-disabled-color: $gray-600 !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-colors\n$form-valid-color: $form-feedback-valid-color !default;\n$form-valid-border-color: $form-feedback-valid-color !default;\n$form-invalid-color: $form-feedback-invalid-color !default;\n$form-invalid-border-color: $form-feedback-invalid-color !default;\n// scss-docs-end form-validation-colors\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": var(--#{$prefix}form-valid-color),\n \"icon\": $form-feedback-icon-valid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}success),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-valid-border-color),\n ),\n \"invalid\": (\n \"color\": var(--#{$prefix}form-invalid-color),\n \"icon\": $form-feedback-icon-invalid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}danger),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-invalid-border-color),\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n// scss-docs-start zindex-levels-map\n$zindex-levels: (\n n1: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3\n) !default;\n// scss-docs-end zindex-levels-map\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default;\n$nav-link-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$nav-tabs-border-color: var(--#{$prefix}border-color) !default;\n$nav-tabs-border-width: var(--#{$prefix}border-width) !default;\n$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default;\n$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default;\n$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-underline-gap: 1rem !default;\n$nav-underline-border-width: .125rem !default;\n$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;\n$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;\n$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;\n$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;\n$navbar-light-icon-color: rgba($body-color, .75) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-icon-color: $navbar-dark-color !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: var(--#{$prefix}body-color) !default;\n$dropdown-bg: var(--#{$prefix}body-bg) !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: var(--#{$prefix}border-radius) !default;\n$dropdown-border-width: var(--#{$prefix}border-width) !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$dropdown-link-color: var(--#{$prefix}body-color) !default;\n$dropdown-link-hover-color: $dropdown-link-color !default;\n$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: var(--#{$prefix}body-bg) !default;\n$pagination-border-radius: var(--#{$prefix}border-radius) !default;\n$pagination-border-width: var(--#{$prefix}border-width) !default;\n$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list\n$pagination-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-focus-box-shadow: $focus-ring-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this?\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $component-active-bg !default;\n\n$pagination-disabled-color: var(--#{$prefix}secondary-color) !default;\n$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-disabled-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-title-color: null !default;\n$card-subtitle-color: null !default;\n$card-border-width: var(--#{$prefix}border-width) !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: var(--#{$prefix}border-radius) !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: var(--#{$prefix}body-bg) !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: var(--#{$prefix}body-color) !default;\n$accordion-bg: var(--#{$prefix}body-bg) !default;\n$accordion-border-width: var(--#{$prefix}border-width) !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: var(--#{$prefix}border-radius) !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: var(--#{$prefix}body-color) !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default;\n$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $body-color !default;\n$accordion-icon-active-color: $primary-text-emphasis !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: var(--#{$prefix}body-bg) !default;\n$tooltip-bg: var(--#{$prefix}emphasis-color) !default;\n$tooltip-border-radius: var(--#{$prefix}border-radius) !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: var(--#{$prefix}body-bg) !default;\n$popover-max-width: 276px !default;\n$popover-border-width: var(--#{$prefix}border-width) !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$popover-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: var(--#{$prefix}secondary-bg) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: var(--#{$prefix}body-color) !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-border-width: var(--#{$prefix}border-width) !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: var(--#{$prefix}border-radius) !default;\n$toast-box-shadow: var(--#{$prefix}box-shadow) !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: var(--#{$prefix}secondary-color) !default;\n$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-header-border-color: $toast-border-color !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: var(--#{$prefix}border-radius) !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: var(--#{$prefix}body-bg) !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: var(--#{$prefix}border-width) !default;\n$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default;\n$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: var(--#{$prefix}border-radius) !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: var(--#{$prefix}border-width) !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n// fusv-disable\n$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6\n// fusv-enable\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: var(--#{$prefix}secondary-bg) !default;\n$progress-border-radius: var(--#{$prefix}border-radius) !default;\n$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: var(--#{$prefix}body-color) !default;\n$list-group-bg: var(--#{$prefix}body-bg) !default;\n$list-group-border-color: var(--#{$prefix}border-color) !default;\n$list-group-border-width: var(--#{$prefix}border-width) !default;\n$list-group-border-radius: var(--#{$prefix}border-radius) !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n// fusv-disable\n$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0\n$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0\n// fusv-enable\n\n$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: var(--#{$prefix}secondary-color) !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: var(--#{$prefix}secondary-color) !default;\n$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default;\n\n$list-group-action-active-color: var(--#{$prefix}body-color) !default;\n$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: var(--#{$prefix}body-bg) !default;\n$thumbnail-border-width: var(--#{$prefix}border-width) !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: var(--#{$prefix}border-radius) !default;\n$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,\") !default;\n$btn-close-focus-shadow: $focus-ring-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: var(--#{$prefix}body-bg) !default;\n$offcanvas-color: var(--#{$prefix}body-color) !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n","// Row\n//\n// Rows contain your columns.\n\n:root {\n @each $name, $value in $grid-breakpoints {\n --#{$prefix}breakpoint-#{$name}: #{$value};\n }\n}\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file diff --git a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.rtl.min.css b/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.rtl.min.css deleted file mode 100644 index d678024b..00000000 --- a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.rtl.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap Grid v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-left:calc(var(--bs-gutter-x) * .5);padding-right:calc(var(--bs-gutter-x) * .5);margin-left:auto;margin-right:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-left:calc(-.5 * var(--bs-gutter-x));margin-right:calc(-.5 * var(--bs-gutter-x))}.row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-left:calc(var(--bs-gutter-x) * .5);padding-right:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-right:8.33333333%}.offset-2{margin-right:16.66666667%}.offset-3{margin-right:25%}.offset-4{margin-right:33.33333333%}.offset-5{margin-right:41.66666667%}.offset-6{margin-right:50%}.offset-7{margin-right:58.33333333%}.offset-8{margin-right:66.66666667%}.offset-9{margin-right:75%}.offset-10{margin-right:83.33333333%}.offset-11{margin-right:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-right:0}.offset-sm-1{margin-right:8.33333333%}.offset-sm-2{margin-right:16.66666667%}.offset-sm-3{margin-right:25%}.offset-sm-4{margin-right:33.33333333%}.offset-sm-5{margin-right:41.66666667%}.offset-sm-6{margin-right:50%}.offset-sm-7{margin-right:58.33333333%}.offset-sm-8{margin-right:66.66666667%}.offset-sm-9{margin-right:75%}.offset-sm-10{margin-right:83.33333333%}.offset-sm-11{margin-right:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-right:0}.offset-md-1{margin-right:8.33333333%}.offset-md-2{margin-right:16.66666667%}.offset-md-3{margin-right:25%}.offset-md-4{margin-right:33.33333333%}.offset-md-5{margin-right:41.66666667%}.offset-md-6{margin-right:50%}.offset-md-7{margin-right:58.33333333%}.offset-md-8{margin-right:66.66666667%}.offset-md-9{margin-right:75%}.offset-md-10{margin-right:83.33333333%}.offset-md-11{margin-right:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-right:0}.offset-lg-1{margin-right:8.33333333%}.offset-lg-2{margin-right:16.66666667%}.offset-lg-3{margin-right:25%}.offset-lg-4{margin-right:33.33333333%}.offset-lg-5{margin-right:41.66666667%}.offset-lg-6{margin-right:50%}.offset-lg-7{margin-right:58.33333333%}.offset-lg-8{margin-right:66.66666667%}.offset-lg-9{margin-right:75%}.offset-lg-10{margin-right:83.33333333%}.offset-lg-11{margin-right:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-right:0}.offset-xl-1{margin-right:8.33333333%}.offset-xl-2{margin-right:16.66666667%}.offset-xl-3{margin-right:25%}.offset-xl-4{margin-right:33.33333333%}.offset-xl-5{margin-right:41.66666667%}.offset-xl-6{margin-right:50%}.offset-xl-7{margin-right:58.33333333%}.offset-xl-8{margin-right:66.66666667%}.offset-xl-9{margin-right:75%}.offset-xl-10{margin-right:83.33333333%}.offset-xl-11{margin-right:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-right:0}.offset-xxl-1{margin-right:8.33333333%}.offset-xxl-2{margin-right:16.66666667%}.offset-xxl-3{margin-right:25%}.offset-xxl-4{margin-right:33.33333333%}.offset-xxl-5{margin-right:41.66666667%}.offset-xxl-6{margin-right:50%}.offset-xxl-7{margin-right:58.33333333%}.offset-xxl-8{margin-right:66.66666667%}.offset-xxl-9{margin-right:75%}.offset-xxl-10{margin-right:83.33333333%}.offset-xxl-11{margin-right:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:1rem!important;margin-right:1rem!important}.mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-5{margin-left:3rem!important;margin-right:3rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-left:0!important}.me-1{margin-left:.25rem!important}.me-2{margin-left:.5rem!important}.me-3{margin-left:1rem!important}.me-4{margin-left:1.5rem!important}.me-5{margin-left:3rem!important}.me-auto{margin-left:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-right:0!important}.ms-1{margin-right:.25rem!important}.ms-2{margin-right:.5rem!important}.ms-3{margin-right:1rem!important}.ms-4{margin-right:1.5rem!important}.ms-5{margin-right:3rem!important}.ms-auto{margin-right:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:1rem!important;padding-right:1rem!important}.px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-5{padding-left:3rem!important;padding-right:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-left:0!important}.pe-1{padding-left:.25rem!important}.pe-2{padding-left:.5rem!important}.pe-3{padding-left:1rem!important}.pe-4{padding-left:1.5rem!important}.pe-5{padding-left:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-right:0!important}.ps-1{padding-right:.25rem!important}.ps-2{padding-right:.5rem!important}.ps-3{padding-right:1rem!important}.ps-4{padding-right:1.5rem!important}.ps-5{padding-right:3rem!important}@media (min-width:576px){.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-left:0!important;margin-right:0!important}.mx-sm-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-sm-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-sm-3{margin-left:1rem!important;margin-right:1rem!important}.mx-sm-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-sm-5{margin-left:3rem!important;margin-right:3rem!important}.mx-sm-auto{margin-left:auto!important;margin-right:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-left:0!important}.me-sm-1{margin-left:.25rem!important}.me-sm-2{margin-left:.5rem!important}.me-sm-3{margin-left:1rem!important}.me-sm-4{margin-left:1.5rem!important}.me-sm-5{margin-left:3rem!important}.me-sm-auto{margin-left:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-right:0!important}.ms-sm-1{margin-right:.25rem!important}.ms-sm-2{margin-right:.5rem!important}.ms-sm-3{margin-right:1rem!important}.ms-sm-4{margin-right:1.5rem!important}.ms-sm-5{margin-right:3rem!important}.ms-sm-auto{margin-right:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-left:0!important;padding-right:0!important}.px-sm-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-sm-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-sm-3{padding-left:1rem!important;padding-right:1rem!important}.px-sm-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-sm-5{padding-left:3rem!important;padding-right:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-left:0!important}.pe-sm-1{padding-left:.25rem!important}.pe-sm-2{padding-left:.5rem!important}.pe-sm-3{padding-left:1rem!important}.pe-sm-4{padding-left:1.5rem!important}.pe-sm-5{padding-left:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-right:0!important}.ps-sm-1{padding-right:.25rem!important}.ps-sm-2{padding-right:.5rem!important}.ps-sm-3{padding-right:1rem!important}.ps-sm-4{padding-right:1.5rem!important}.ps-sm-5{padding-right:3rem!important}}@media (min-width:768px){.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-left:0!important;margin-right:0!important}.mx-md-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-md-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-md-3{margin-left:1rem!important;margin-right:1rem!important}.mx-md-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-md-5{margin-left:3rem!important;margin-right:3rem!important}.mx-md-auto{margin-left:auto!important;margin-right:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-left:0!important}.me-md-1{margin-left:.25rem!important}.me-md-2{margin-left:.5rem!important}.me-md-3{margin-left:1rem!important}.me-md-4{margin-left:1.5rem!important}.me-md-5{margin-left:3rem!important}.me-md-auto{margin-left:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-right:0!important}.ms-md-1{margin-right:.25rem!important}.ms-md-2{margin-right:.5rem!important}.ms-md-3{margin-right:1rem!important}.ms-md-4{margin-right:1.5rem!important}.ms-md-5{margin-right:3rem!important}.ms-md-auto{margin-right:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-left:0!important;padding-right:0!important}.px-md-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-md-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-md-3{padding-left:1rem!important;padding-right:1rem!important}.px-md-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-md-5{padding-left:3rem!important;padding-right:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-left:0!important}.pe-md-1{padding-left:.25rem!important}.pe-md-2{padding-left:.5rem!important}.pe-md-3{padding-left:1rem!important}.pe-md-4{padding-left:1.5rem!important}.pe-md-5{padding-left:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-right:0!important}.ps-md-1{padding-right:.25rem!important}.ps-md-2{padding-right:.5rem!important}.ps-md-3{padding-right:1rem!important}.ps-md-4{padding-right:1.5rem!important}.ps-md-5{padding-right:3rem!important}}@media (min-width:992px){.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-left:0!important;margin-right:0!important}.mx-lg-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-lg-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-lg-3{margin-left:1rem!important;margin-right:1rem!important}.mx-lg-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-lg-5{margin-left:3rem!important;margin-right:3rem!important}.mx-lg-auto{margin-left:auto!important;margin-right:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-left:0!important}.me-lg-1{margin-left:.25rem!important}.me-lg-2{margin-left:.5rem!important}.me-lg-3{margin-left:1rem!important}.me-lg-4{margin-left:1.5rem!important}.me-lg-5{margin-left:3rem!important}.me-lg-auto{margin-left:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-right:0!important}.ms-lg-1{margin-right:.25rem!important}.ms-lg-2{margin-right:.5rem!important}.ms-lg-3{margin-right:1rem!important}.ms-lg-4{margin-right:1.5rem!important}.ms-lg-5{margin-right:3rem!important}.ms-lg-auto{margin-right:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-left:0!important;padding-right:0!important}.px-lg-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-lg-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-lg-3{padding-left:1rem!important;padding-right:1rem!important}.px-lg-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-lg-5{padding-left:3rem!important;padding-right:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-left:0!important}.pe-lg-1{padding-left:.25rem!important}.pe-lg-2{padding-left:.5rem!important}.pe-lg-3{padding-left:1rem!important}.pe-lg-4{padding-left:1.5rem!important}.pe-lg-5{padding-left:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-right:0!important}.ps-lg-1{padding-right:.25rem!important}.ps-lg-2{padding-right:.5rem!important}.ps-lg-3{padding-right:1rem!important}.ps-lg-4{padding-right:1.5rem!important}.ps-lg-5{padding-right:3rem!important}}@media (min-width:1200px){.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-left:0!important;margin-right:0!important}.mx-xl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xl-auto{margin-left:auto!important;margin-right:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-left:0!important}.me-xl-1{margin-left:.25rem!important}.me-xl-2{margin-left:.5rem!important}.me-xl-3{margin-left:1rem!important}.me-xl-4{margin-left:1.5rem!important}.me-xl-5{margin-left:3rem!important}.me-xl-auto{margin-left:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-right:0!important}.ms-xl-1{margin-right:.25rem!important}.ms-xl-2{margin-right:.5rem!important}.ms-xl-3{margin-right:1rem!important}.ms-xl-4{margin-right:1.5rem!important}.ms-xl-5{margin-right:3rem!important}.ms-xl-auto{margin-right:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-left:0!important;padding-right:0!important}.px-xl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-left:0!important}.pe-xl-1{padding-left:.25rem!important}.pe-xl-2{padding-left:.5rem!important}.pe-xl-3{padding-left:1rem!important}.pe-xl-4{padding-left:1.5rem!important}.pe-xl-5{padding-left:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-right:0!important}.ps-xl-1{padding-right:.25rem!important}.ps-xl-2{padding-right:.5rem!important}.ps-xl-3{padding-right:1rem!important}.ps-xl-4{padding-right:1.5rem!important}.ps-xl-5{padding-right:3rem!important}}@media (min-width:1400px){.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-left:0!important;margin-right:0!important}.mx-xxl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xxl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xxl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xxl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xxl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xxl-auto{margin-left:auto!important;margin-right:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-left:0!important}.me-xxl-1{margin-left:.25rem!important}.me-xxl-2{margin-left:.5rem!important}.me-xxl-3{margin-left:1rem!important}.me-xxl-4{margin-left:1.5rem!important}.me-xxl-5{margin-left:3rem!important}.me-xxl-auto{margin-left:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-right:0!important}.ms-xxl-1{margin-right:.25rem!important}.ms-xxl-2{margin-right:.5rem!important}.ms-xxl-3{margin-right:1rem!important}.ms-xxl-4{margin-right:1.5rem!important}.ms-xxl-5{margin-right:3rem!important}.ms-xxl-auto{margin-right:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-left:0!important;padding-right:0!important}.px-xxl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xxl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xxl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xxl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xxl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-left:0!important}.pe-xxl-1{padding-left:.25rem!important}.pe-xxl-2{padding-left:.5rem!important}.pe-xxl-3{padding-left:1rem!important}.pe-xxl-4{padding-left:1.5rem!important}.pe-xxl-5{padding-left:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-right:0!important}.ps-xxl-1{padding-right:.25rem!important}.ps-xxl-2{padding-right:.5rem!important}.ps-xxl-3{padding-right:1rem!important}.ps-xxl-4{padding-right:1.5rem!important}.ps-xxl-5{padding-right:3rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} -/*# sourceMappingURL=bootstrap-grid.rtl.min.css.map */ \ No newline at end of file diff --git a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.rtl.min.css.map b/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.rtl.min.css.map deleted file mode 100644 index 1fa11dda..00000000 --- a/static/vendor/bootstrap-5.3.2/css/bootstrap-grid.rtl.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_containers.scss","dist/css/bootstrap-grid.rtl.css","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","/*!\n * Bootstrap Grid v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n margin-left: auto;\n margin-right: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-right: 8.33333333%;\n}\n\n.offset-2 {\n margin-right: 16.66666667%;\n}\n\n.offset-3 {\n margin-right: 25%;\n}\n\n.offset-4 {\n margin-right: 33.33333333%;\n}\n\n.offset-5 {\n margin-right: 41.66666667%;\n}\n\n.offset-6 {\n margin-right: 50%;\n}\n\n.offset-7 {\n margin-right: 58.33333333%;\n}\n\n.offset-8 {\n margin-right: 66.66666667%;\n}\n\n.offset-9 {\n margin-right: 75%;\n}\n\n.offset-10 {\n margin-right: 83.33333333%;\n}\n\n.offset-11 {\n margin-right: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-right: 0;\n }\n .offset-sm-1 {\n margin-right: 8.33333333%;\n }\n .offset-sm-2 {\n margin-right: 16.66666667%;\n }\n .offset-sm-3 {\n margin-right: 25%;\n }\n .offset-sm-4 {\n margin-right: 33.33333333%;\n }\n .offset-sm-5 {\n margin-right: 41.66666667%;\n }\n .offset-sm-6 {\n margin-right: 50%;\n }\n .offset-sm-7 {\n margin-right: 58.33333333%;\n }\n .offset-sm-8 {\n margin-right: 66.66666667%;\n }\n .offset-sm-9 {\n margin-right: 75%;\n }\n .offset-sm-10 {\n margin-right: 83.33333333%;\n }\n .offset-sm-11 {\n margin-right: 91.66666667%;\n }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-right: 0;\n }\n .offset-md-1 {\n margin-right: 8.33333333%;\n }\n .offset-md-2 {\n margin-right: 16.66666667%;\n }\n .offset-md-3 {\n margin-right: 25%;\n }\n .offset-md-4 {\n margin-right: 33.33333333%;\n }\n .offset-md-5 {\n margin-right: 41.66666667%;\n }\n .offset-md-6 {\n margin-right: 50%;\n }\n .offset-md-7 {\n margin-right: 58.33333333%;\n }\n .offset-md-8 {\n margin-right: 66.66666667%;\n }\n .offset-md-9 {\n margin-right: 75%;\n }\n .offset-md-10 {\n margin-right: 83.33333333%;\n }\n .offset-md-11 {\n margin-right: 91.66666667%;\n }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-right: 0;\n }\n .offset-lg-1 {\n margin-right: 8.33333333%;\n }\n .offset-lg-2 {\n margin-right: 16.66666667%;\n }\n .offset-lg-3 {\n margin-right: 25%;\n }\n .offset-lg-4 {\n margin-right: 33.33333333%;\n }\n .offset-lg-5 {\n margin-right: 41.66666667%;\n }\n .offset-lg-6 {\n margin-right: 50%;\n }\n .offset-lg-7 {\n margin-right: 58.33333333%;\n }\n .offset-lg-8 {\n margin-right: 66.66666667%;\n }\n .offset-lg-9 {\n margin-right: 75%;\n }\n .offset-lg-10 {\n margin-right: 83.33333333%;\n }\n .offset-lg-11 {\n margin-right: 91.66666667%;\n }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-right: 0;\n }\n .offset-xl-1 {\n margin-right: 8.33333333%;\n }\n .offset-xl-2 {\n margin-right: 16.66666667%;\n }\n .offset-xl-3 {\n margin-right: 25%;\n }\n .offset-xl-4 {\n margin-right: 33.33333333%;\n }\n .offset-xl-5 {\n margin-right: 41.66666667%;\n }\n .offset-xl-6 {\n margin-right: 50%;\n }\n .offset-xl-7 {\n margin-right: 58.33333333%;\n }\n .offset-xl-8 {\n margin-right: 66.66666667%;\n }\n .offset-xl-9 {\n margin-right: 75%;\n }\n .offset-xl-10 {\n margin-right: 83.33333333%;\n }\n .offset-xl-11 {\n margin-right: 91.66666667%;\n }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-right: 0;\n }\n .offset-xxl-1 {\n margin-right: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-right: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-right: 25%;\n }\n .offset-xxl-4 {\n margin-right: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-right: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-right: 50%;\n }\n .offset-xxl-7 {\n margin-right: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-right: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-right: 75%;\n }\n .offset-xxl-10 {\n margin-right: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-right: 91.66666667%;\n }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n.mx-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n}\n\n.mx-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n}\n\n.mx-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n}\n\n.mx-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n}\n\n.mx-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n}\n\n.mx-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-left: 0 !important;\n}\n\n.me-1 {\n margin-left: 0.25rem !important;\n}\n\n.me-2 {\n margin-left: 0.5rem !important;\n}\n\n.me-3 {\n margin-left: 1rem !important;\n}\n\n.me-4 {\n margin-left: 1.5rem !important;\n}\n\n.me-5 {\n margin-left: 3rem !important;\n}\n\n.me-auto {\n margin-left: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-right: 0 !important;\n}\n\n.ms-1 {\n margin-right: 0.25rem !important;\n}\n\n.ms-2 {\n margin-right: 0.5rem !important;\n}\n\n.ms-3 {\n margin-right: 1rem !important;\n}\n\n.ms-4 {\n margin-right: 1.5rem !important;\n}\n\n.ms-5 {\n margin-right: 3rem !important;\n}\n\n.ms-auto {\n margin-right: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n}\n\n.px-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n}\n\n.px-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n}\n\n.px-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n}\n\n.px-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n}\n\n.px-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-left: 0 !important;\n}\n\n.pe-1 {\n padding-left: 0.25rem !important;\n}\n\n.pe-2 {\n padding-left: 0.5rem !important;\n}\n\n.pe-3 {\n padding-left: 1rem !important;\n}\n\n.pe-4 {\n padding-left: 1.5rem !important;\n}\n\n.pe-5 {\n padding-left: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-right: 0 !important;\n}\n\n.ps-1 {\n padding-right: 0.25rem !important;\n}\n\n.ps-2 {\n padding-right: 0.5rem !important;\n}\n\n.ps-3 {\n padding-right: 1rem !important;\n}\n\n.ps-4 {\n padding-right: 1.5rem !important;\n}\n\n.ps-5 {\n padding-right: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-sm-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-left: 0 !important;\n }\n .me-sm-1 {\n margin-left: 0.25rem !important;\n }\n .me-sm-2 {\n margin-left: 0.5rem !important;\n }\n .me-sm-3 {\n margin-left: 1rem !important;\n }\n .me-sm-4 {\n margin-left: 1.5rem !important;\n }\n .me-sm-5 {\n margin-left: 3rem !important;\n }\n .me-sm-auto {\n margin-left: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-right: 0 !important;\n }\n .ms-sm-1 {\n margin-right: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-right: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-right: 1rem !important;\n }\n .ms-sm-4 {\n margin-right: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-right: 3rem !important;\n }\n .ms-sm-auto {\n margin-right: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-sm-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-sm-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-sm-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-sm-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-sm-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-left: 0 !important;\n }\n .pe-sm-1 {\n padding-left: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-left: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-left: 1rem !important;\n }\n .pe-sm-4 {\n padding-left: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-left: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-right: 0 !important;\n }\n .ps-sm-1 {\n padding-right: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-right: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-right: 1rem !important;\n }\n .ps-sm-4 {\n padding-right: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-md-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-md-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-md-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-md-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-md-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-md-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-left: 0 !important;\n }\n .me-md-1 {\n margin-left: 0.25rem !important;\n }\n .me-md-2 {\n margin-left: 0.5rem !important;\n }\n .me-md-3 {\n margin-left: 1rem !important;\n }\n .me-md-4 {\n margin-left: 1.5rem !important;\n }\n .me-md-5 {\n margin-left: 3rem !important;\n }\n .me-md-auto {\n margin-left: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-right: 0 !important;\n }\n .ms-md-1 {\n margin-right: 0.25rem !important;\n }\n .ms-md-2 {\n margin-right: 0.5rem !important;\n }\n .ms-md-3 {\n margin-right: 1rem !important;\n }\n .ms-md-4 {\n margin-right: 1.5rem !important;\n }\n .ms-md-5 {\n margin-right: 3rem !important;\n }\n .ms-md-auto {\n margin-right: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-md-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-md-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-md-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-md-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-md-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-left: 0 !important;\n }\n .pe-md-1 {\n padding-left: 0.25rem !important;\n }\n .pe-md-2 {\n padding-left: 0.5rem !important;\n }\n .pe-md-3 {\n padding-left: 1rem !important;\n }\n .pe-md-4 {\n padding-left: 1.5rem !important;\n }\n .pe-md-5 {\n padding-left: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-right: 0 !important;\n }\n .ps-md-1 {\n padding-right: 0.25rem !important;\n }\n .ps-md-2 {\n padding-right: 0.5rem !important;\n }\n .ps-md-3 {\n padding-right: 1rem !important;\n }\n .ps-md-4 {\n padding-right: 1.5rem !important;\n }\n .ps-md-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-lg-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-left: 0 !important;\n }\n .me-lg-1 {\n margin-left: 0.25rem !important;\n }\n .me-lg-2 {\n margin-left: 0.5rem !important;\n }\n .me-lg-3 {\n margin-left: 1rem !important;\n }\n .me-lg-4 {\n margin-left: 1.5rem !important;\n }\n .me-lg-5 {\n margin-left: 3rem !important;\n }\n .me-lg-auto {\n margin-left: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-right: 0 !important;\n }\n .ms-lg-1 {\n margin-right: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-right: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-right: 1rem !important;\n }\n .ms-lg-4 {\n margin-right: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-right: 3rem !important;\n }\n .ms-lg-auto {\n margin-right: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-lg-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-lg-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-lg-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-lg-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-lg-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-left: 0 !important;\n }\n .pe-lg-1 {\n padding-left: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-left: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-left: 1rem !important;\n }\n .pe-lg-4 {\n padding-left: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-left: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-right: 0 !important;\n }\n .ps-lg-1 {\n padding-right: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-right: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-right: 1rem !important;\n }\n .ps-lg-4 {\n padding-right: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-xl-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-left: 0 !important;\n }\n .me-xl-1 {\n margin-left: 0.25rem !important;\n }\n .me-xl-2 {\n margin-left: 0.5rem !important;\n }\n .me-xl-3 {\n margin-left: 1rem !important;\n }\n .me-xl-4 {\n margin-left: 1.5rem !important;\n }\n .me-xl-5 {\n margin-left: 3rem !important;\n }\n .me-xl-auto {\n margin-left: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-right: 0 !important;\n }\n .ms-xl-1 {\n margin-right: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-right: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-right: 1rem !important;\n }\n .ms-xl-4 {\n margin-right: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-right: 3rem !important;\n }\n .ms-xl-auto {\n margin-right: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-xl-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-xl-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-xl-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-xl-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-xl-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-left: 0 !important;\n }\n .pe-xl-1 {\n padding-left: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-left: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-left: 1rem !important;\n }\n .pe-xl-4 {\n padding-left: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-left: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-right: 0 !important;\n }\n .ps-xl-1 {\n padding-right: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-right: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-right: 1rem !important;\n }\n .ps-xl-4 {\n padding-right: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-xxl-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-xxl-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-xxl-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-left: 0 !important;\n }\n .me-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-left: 1rem !important;\n }\n .me-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-left: 3rem !important;\n }\n .me-xxl-auto {\n margin-left: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-right: 0 !important;\n }\n .ms-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-right: 1rem !important;\n }\n .ms-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-right: 3rem !important;\n }\n .ms-xxl-auto {\n margin-right: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-xxl-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-xxl-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-left: 0 !important;\n }\n .pe-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-left: 1rem !important;\n }\n .pe-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-left: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-right: 0 !important;\n }\n .ps-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-right: 1rem !important;\n }\n .ps-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-right: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap-grid.rtl.css.map */","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Row\n//\n// Rows contain your columns.\n\n:root {\n @each $name, $value in $grid-breakpoints {\n --#{$prefix}breakpoint-#{$name}: #{$value};\n }\n}\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file diff --git a/static/vendor/bootstrap-5.3.2/css/bootstrap-reboot.css b/static/vendor/bootstrap-5.3.2/css/bootstrap-reboot.css deleted file mode 100644 index 47a70f01..00000000 --- a/static/vendor/bootstrap-5.3.2/css/bootstrap-reboot.css +++ /dev/null @@ -1,597 +0,0 @@ -/*! - * Bootstrap Reboot v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -:root, -[data-bs-theme=light] { - --bs-blue: #0d6efd; - --bs-indigo: #6610f2; - --bs-purple: #6f42c1; - --bs-pink: #d63384; - --bs-red: #dc3545; - --bs-orange: #fd7e14; - --bs-yellow: #ffc107; - --bs-green: #198754; - --bs-teal: #20c997; - --bs-cyan: #0dcaf0; - --bs-black: #000; - --bs-white: #fff; - --bs-gray: #6c757d; - --bs-gray-dark: #343a40; - --bs-gray-100: #f8f9fa; - --bs-gray-200: #e9ecef; - --bs-gray-300: #dee2e6; - --bs-gray-400: #ced4da; - --bs-gray-500: #adb5bd; - --bs-gray-600: #6c757d; - --bs-gray-700: #495057; - --bs-gray-800: #343a40; - --bs-gray-900: #212529; - --bs-primary: #0d6efd; - --bs-secondary: #6c757d; - --bs-success: #198754; - --bs-info: #0dcaf0; - --bs-warning: #ffc107; - --bs-danger: #dc3545; - --bs-light: #f8f9fa; - --bs-dark: #212529; - --bs-primary-rgb: 13, 110, 253; - --bs-secondary-rgb: 108, 117, 125; - --bs-success-rgb: 25, 135, 84; - --bs-info-rgb: 13, 202, 240; - --bs-warning-rgb: 255, 193, 7; - --bs-danger-rgb: 220, 53, 69; - --bs-light-rgb: 248, 249, 250; - --bs-dark-rgb: 33, 37, 41; - --bs-primary-text-emphasis: #052c65; - --bs-secondary-text-emphasis: #2b2f32; - --bs-success-text-emphasis: #0a3622; - --bs-info-text-emphasis: #055160; - --bs-warning-text-emphasis: #664d03; - --bs-danger-text-emphasis: #58151c; - --bs-light-text-emphasis: #495057; - --bs-dark-text-emphasis: #495057; - --bs-primary-bg-subtle: #cfe2ff; - --bs-secondary-bg-subtle: #e2e3e5; - --bs-success-bg-subtle: #d1e7dd; - --bs-info-bg-subtle: #cff4fc; - --bs-warning-bg-subtle: #fff3cd; - --bs-danger-bg-subtle: #f8d7da; - --bs-light-bg-subtle: #fcfcfd; - --bs-dark-bg-subtle: #ced4da; - --bs-primary-border-subtle: #9ec5fe; - --bs-secondary-border-subtle: #c4c8cb; - --bs-success-border-subtle: #a3cfbb; - --bs-info-border-subtle: #9eeaf9; - --bs-warning-border-subtle: #ffe69c; - --bs-danger-border-subtle: #f1aeb5; - --bs-light-border-subtle: #e9ecef; - --bs-dark-border-subtle: #adb5bd; - --bs-white-rgb: 255, 255, 255; - --bs-black-rgb: 0, 0, 0; - --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --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: #212529; - --bs-body-color-rgb: 33, 37, 41; - --bs-body-bg: #fff; - --bs-body-bg-rgb: 255, 255, 255; - --bs-emphasis-color: #000; - --bs-emphasis-color-rgb: 0, 0, 0; - --bs-secondary-color: rgba(33, 37, 41, 0.75); - --bs-secondary-color-rgb: 33, 37, 41; - --bs-secondary-bg: #e9ecef; - --bs-secondary-bg-rgb: 233, 236, 239; - --bs-tertiary-color: rgba(33, 37, 41, 0.5); - --bs-tertiary-color-rgb: 33, 37, 41; - --bs-tertiary-bg: #f8f9fa; - --bs-tertiary-bg-rgb: 248, 249, 250; - --bs-heading-color: inherit; - --bs-link-color: #0d6efd; - --bs-link-color-rgb: 13, 110, 253; - --bs-link-decoration: underline; - --bs-link-hover-color: #0a58ca; - --bs-link-hover-color-rgb: 10, 88, 202; - --bs-code-color: #d63384; - --bs-highlight-color: #212529; - --bs-highlight-bg: #fff3cd; - --bs-border-width: 1px; - --bs-border-style: solid; - --bs-border-color: #dee2e6; - --bs-border-color-translucent: rgba(0, 0, 0, 0.175); - --bs-border-radius: 0.375rem; - --bs-border-radius-sm: 0.25rem; - --bs-border-radius-lg: 0.5rem; - --bs-border-radius-xl: 1rem; - --bs-border-radius-xxl: 2rem; - --bs-border-radius-2xl: var(--bs-border-radius-xxl); - --bs-border-radius-pill: 50rem; - --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); - --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); - --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); - --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); - --bs-focus-ring-width: 0.25rem; - --bs-focus-ring-opacity: 0.25; - --bs-focus-ring-color: rgba(13, 110, 253, 0.25); - --bs-form-valid-color: #198754; - --bs-form-valid-border-color: #198754; - --bs-form-invalid-color: #dc3545; - --bs-form-invalid-border-color: #dc3545; -} - -[data-bs-theme=dark] { - color-scheme: dark; - --bs-body-color: #dee2e6; - --bs-body-color-rgb: 222, 226, 230; - --bs-body-bg: #212529; - --bs-body-bg-rgb: 33, 37, 41; - --bs-emphasis-color: #fff; - --bs-emphasis-color-rgb: 255, 255, 255; - --bs-secondary-color: rgba(222, 226, 230, 0.75); - --bs-secondary-color-rgb: 222, 226, 230; - --bs-secondary-bg: #343a40; - --bs-secondary-bg-rgb: 52, 58, 64; - --bs-tertiary-color: rgba(222, 226, 230, 0.5); - --bs-tertiary-color-rgb: 222, 226, 230; - --bs-tertiary-bg: #2b3035; - --bs-tertiary-bg-rgb: 43, 48, 53; - --bs-primary-text-emphasis: #6ea8fe; - --bs-secondary-text-emphasis: #a7acb1; - --bs-success-text-emphasis: #75b798; - --bs-info-text-emphasis: #6edff6; - --bs-warning-text-emphasis: #ffda6a; - --bs-danger-text-emphasis: #ea868f; - --bs-light-text-emphasis: #f8f9fa; - --bs-dark-text-emphasis: #dee2e6; - --bs-primary-bg-subtle: #031633; - --bs-secondary-bg-subtle: #161719; - --bs-success-bg-subtle: #051b11; - --bs-info-bg-subtle: #032830; - --bs-warning-bg-subtle: #332701; - --bs-danger-bg-subtle: #2c0b0e; - --bs-light-bg-subtle: #343a40; - --bs-dark-bg-subtle: #1a1d20; - --bs-primary-border-subtle: #084298; - --bs-secondary-border-subtle: #41464b; - --bs-success-border-subtle: #0f5132; - --bs-info-border-subtle: #087990; - --bs-warning-border-subtle: #997404; - --bs-danger-border-subtle: #842029; - --bs-light-border-subtle: #495057; - --bs-dark-border-subtle: #343a40; - --bs-heading-color: inherit; - --bs-link-color: #6ea8fe; - --bs-link-hover-color: #8bb9fe; - --bs-link-color-rgb: 110, 168, 254; - --bs-link-hover-color-rgb: 139, 185, 254; - --bs-code-color: #e685b5; - --bs-highlight-color: #dee2e6; - --bs-highlight-bg: #664d03; - --bs-border-color: #495057; - --bs-border-color-translucent: rgba(255, 255, 255, 0.15); - --bs-form-valid-color: #75b798; - --bs-form-valid-border-color: #75b798; - --bs-form-invalid-color: #ea868f; - --bs-form-invalid-border-color: #ea868f; -} - -*, -*::before, -*::after { - box-sizing: border-box; -} - -@media (prefers-reduced-motion: no-preference) { - :root { - scroll-behavior: smooth; - } -} - -body { - margin: 0; - font-family: var(--bs-body-font-family); - font-size: var(--bs-body-font-size); - font-weight: var(--bs-body-font-weight); - line-height: var(--bs-body-line-height); - color: var(--bs-body-color); - text-align: var(--bs-body-text-align); - background-color: var(--bs-body-bg); - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -hr { - margin: 1rem 0; - color: inherit; - border: 0; - border-top: var(--bs-border-width) solid; - opacity: 0.25; -} - -h6, h5, h4, h3, h2, h1 { - margin-top: 0; - margin-bottom: 0.5rem; - font-weight: 500; - line-height: 1.2; - color: var(--bs-heading-color); -} - -h1 { - font-size: calc(1.375rem + 1.5vw); -} -@media (min-width: 1200px) { - h1 { - font-size: 2.5rem; - } -} - -h2 { - font-size: calc(1.325rem + 0.9vw); -} -@media (min-width: 1200px) { - h2 { - font-size: 2rem; - } -} - -h3 { - font-size: calc(1.3rem + 0.6vw); -} -@media (min-width: 1200px) { - h3 { - font-size: 1.75rem; - } -} - -h4 { - font-size: calc(1.275rem + 0.3vw); -} -@media (min-width: 1200px) { - h4 { - font-size: 1.5rem; - } -} - -h5 { - font-size: 1.25rem; -} - -h6 { - font-size: 1rem; -} - -p { - margin-top: 0; - margin-bottom: 1rem; -} - -abbr[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: 700; -} - -dd { - margin-bottom: 0.5rem; - margin-left: 0; -} - -blockquote { - margin: 0 0 1rem; -} - -b, -strong { - font-weight: bolder; -} - -small { - font-size: 0.875em; -} - -mark { - padding: 0.1875em; - color: var(--bs-highlight-color); - background-color: var(--bs-highlight-bg); -} - -sub, -sup { - position: relative; - font-size: 0.75em; - line-height: 0; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -a { - color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); - text-decoration: underline; -} -a:hover { - --bs-link-color-rgb: var(--bs-link-hover-color-rgb); -} - -a:not([href]):not([class]), a:not([href]):not([class]):hover { - color: inherit; - text-decoration: none; -} - -pre, -code, -kbd, -samp { - font-family: var(--bs-font-monospace); - font-size: 1em; -} - -pre { - display: block; - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; - font-size: 0.875em; -} -pre code { - font-size: inherit; - color: inherit; - word-break: normal; -} - -code { - font-size: 0.875em; - color: var(--bs-code-color); - word-wrap: break-word; -} -a > code { - color: inherit; -} - -kbd { - padding: 0.1875rem 0.375rem; - font-size: 0.875em; - color: var(--bs-body-bg); - background-color: var(--bs-body-color); - border-radius: 0.25rem; -} -kbd kbd { - padding: 0; - font-size: 1em; -} - -figure { - margin: 0 0 1rem; -} - -img, -svg { - vertical-align: middle; -} - -table { - caption-side: bottom; - border-collapse: collapse; -} - -caption { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - color: var(--bs-secondary-color); - text-align: left; -} - -th { - text-align: inherit; - text-align: -webkit-match-parent; -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - -label { - display: inline-block; -} - -button { - border-radius: 0; -} - -button:focus:not(:focus-visible) { - outline: 0; -} - -input, -button, -select, -optgroup, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -button, -select { - text-transform: none; -} - -[role=button] { - cursor: pointer; -} - -select { - word-wrap: normal; -} -select:disabled { - opacity: 1; -} - -[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator { - display: none !important; -} - -button, -[type=button], -[type=reset], -[type=submit] { - -webkit-appearance: button; -} -button:not(:disabled), -[type=button]:not(:disabled), -[type=reset]:not(:disabled), -[type=submit]:not(:disabled) { - cursor: pointer; -} - -::-moz-focus-inner { - padding: 0; - border-style: none; -} - -textarea { - resize: vertical; -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} - -legend { - float: left; - width: 100%; - padding: 0; - margin-bottom: 0.5rem; - font-size: calc(1.275rem + 0.3vw); - line-height: inherit; -} -@media (min-width: 1200px) { - legend { - font-size: 1.5rem; - } -} -legend + * { - clear: left; -} - -::-webkit-datetime-edit-fields-wrapper, -::-webkit-datetime-edit-text, -::-webkit-datetime-edit-minute, -::-webkit-datetime-edit-hour-field, -::-webkit-datetime-edit-day-field, -::-webkit-datetime-edit-month-field, -::-webkit-datetime-edit-year-field { - padding: 0; -} - -::-webkit-inner-spin-button { - height: auto; -} - -[type=search] { - -webkit-appearance: textfield; - outline-offset: -2px; -} - -/* rtl:raw: -[type="tel"], -[type="url"], -[type="email"], -[type="number"] { - direction: ltr; -} -*/ -::-webkit-search-decoration { - -webkit-appearance: none; -} - -::-webkit-color-swatch-wrapper { - padding: 0; -} - -::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button; -} - -::file-selector-button { - font: inherit; - -webkit-appearance: button; -} - -output { - display: inline-block; -} - -iframe { - border: 0; -} - -summary { - display: list-item; - cursor: pointer; -} - -progress { - vertical-align: baseline; -} - -[hidden] { - display: none !important; -} - -/*# sourceMappingURL=bootstrap-reboot.css.map */ \ No newline at end of file diff --git a/static/vendor/bootstrap-5.3.2/css/bootstrap-reboot.css.map b/static/vendor/bootstrap-5.3.2/css/bootstrap-reboot.css.map deleted file mode 100644 index 8a9aab3b..00000000 --- a/static/vendor/bootstrap-5.3.2/css/bootstrap-reboot.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_root.scss","../../scss/vendor/_rfs.scss","bootstrap-reboot.css","../../scss/mixins/_color-mode.scss","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/mixins/_border-radius.scss"],"names":[],"mappings":"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","file":"bootstrap-reboot.css","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n",":root,\n[data-bs-theme=\"light\"] {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n @each $color, $value in $theme-colors-text {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{inspect($font-family-base)};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n\n --#{$prefix}body-color: #{$body-color};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg: #{$body-bg};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\n // scss-docs-end root-body-variables\n\n --#{$prefix}heading-color: #{$headings-color};\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\n --#{$prefix}link-decoration: #{$link-decoration};\n\n --#{$prefix}link-hover-color: #{$link-hover-color};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\n\n @if $link-hover-decoration != null {\n --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\n }\n\n --#{$prefix}code-color: #{$code-color};\n --#{$prefix}highlight-color: #{$mark-color};\n --#{$prefix}highlight-bg: #{$mark-bg};\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\n --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}box-shadow: #{$box-shadow};\n --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\n --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\n --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\n\n // Focus styles\n // scss-docs-start root-focus-variables\n --#{$prefix}focus-ring-width: #{$focus-ring-width};\n --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\n --#{$prefix}focus-ring-color: #{$focus-ring-color};\n // scss-docs-end root-focus-variables\n\n // scss-docs-start root-form-validation-variables\n --#{$prefix}form-valid-color: #{$form-valid-color};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\n --#{$prefix}form-invalid-color: #{$form-invalid-color};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\n // scss-docs-end root-form-validation-variables\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark, true) {\n color-scheme: dark;\n\n // scss-docs-start root-dark-mode-vars\n --#{$prefix}body-color: #{$body-color-dark};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\n --#{$prefix}body-bg: #{$body-bg-dark};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color-dark};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\n\n @each $color, $value in $theme-colors-text-dark {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle-dark {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle-dark {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}heading-color: #{$headings-color-dark};\n\n --#{$prefix}link-color: #{$link-color-dark};\n --#{$prefix}link-hover-color: #{$link-hover-color-dark};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\n\n --#{$prefix}code-color: #{$code-color-dark};\n --#{$prefix}highlight-color: #{$mark-color-dark};\n --#{$prefix}highlight-bg: #{$mark-bg-dark};\n\n --#{$prefix}border-color: #{$border-color-dark};\n --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\n\n --#{$prefix}form-valid-color: #{$form-valid-color-dark};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\n --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\n // scss-docs-end root-dark-mode-vars\n }\n}\n","// stylelint-disable scss/dimension-no-non-numeric-values\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query () {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query () {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + \" \" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n } @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + \" \" + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n } @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + \" \" + $value;\n } @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + \" calc(\" + $min-width + if($value < 0, \" - \", \" + \") + $variable-width + \")\";\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluid-val: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluid-val {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule () {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule () {\n #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","/*!\n * Bootstrap Reboot v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root,\n[data-bs-theme=light] {\n --bs-blue: #0d6efd;\n --bs-indigo: #6610f2;\n --bs-purple: #6f42c1;\n --bs-pink: #d63384;\n --bs-red: #dc3545;\n --bs-orange: #fd7e14;\n --bs-yellow: #ffc107;\n --bs-green: #198754;\n --bs-teal: #20c997;\n --bs-cyan: #0dcaf0;\n --bs-black: #000;\n --bs-white: #fff;\n --bs-gray: #6c757d;\n --bs-gray-dark: #343a40;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #0d6efd;\n --bs-secondary: #6c757d;\n --bs-success: #198754;\n --bs-info: #0dcaf0;\n --bs-warning: #ffc107;\n --bs-danger: #dc3545;\n --bs-light: #f8f9fa;\n --bs-dark: #212529;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-primary-text-emphasis: #052c65;\n --bs-secondary-text-emphasis: #2b2f32;\n --bs-success-text-emphasis: #0a3622;\n --bs-info-text-emphasis: #055160;\n --bs-warning-text-emphasis: #664d03;\n --bs-danger-text-emphasis: #58151c;\n --bs-light-text-emphasis: #495057;\n --bs-dark-text-emphasis: #495057;\n --bs-primary-bg-subtle: #cfe2ff;\n --bs-secondary-bg-subtle: #e2e3e5;\n --bs-success-bg-subtle: #d1e7dd;\n --bs-info-bg-subtle: #cff4fc;\n --bs-warning-bg-subtle: #fff3cd;\n --bs-danger-bg-subtle: #f8d7da;\n --bs-light-bg-subtle: #fcfcfd;\n --bs-dark-bg-subtle: #ced4da;\n --bs-primary-border-subtle: #9ec5fe;\n --bs-secondary-border-subtle: #c4c8cb;\n --bs-success-border-subtle: #a3cfbb;\n --bs-info-border-subtle: #9eeaf9;\n --bs-warning-border-subtle: #ffe69c;\n --bs-danger-border-subtle: #f1aeb5;\n --bs-light-border-subtle: #e9ecef;\n --bs-dark-border-subtle: #adb5bd;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #212529;\n --bs-body-color-rgb: 33, 37, 41;\n --bs-body-bg: #fff;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-emphasis-color: #000;\n --bs-emphasis-color-rgb: 0, 0, 0;\n --bs-secondary-color: rgba(33, 37, 41, 0.75);\n --bs-secondary-color-rgb: 33, 37, 41;\n --bs-secondary-bg: #e9ecef;\n --bs-secondary-bg-rgb: 233, 236, 239;\n --bs-tertiary-color: rgba(33, 37, 41, 0.5);\n --bs-tertiary-color-rgb: 33, 37, 41;\n --bs-tertiary-bg: #f8f9fa;\n --bs-tertiary-bg-rgb: 248, 249, 250;\n --bs-heading-color: inherit;\n --bs-link-color: #0d6efd;\n --bs-link-color-rgb: 13, 110, 253;\n --bs-link-decoration: underline;\n --bs-link-hover-color: #0a58ca;\n --bs-link-hover-color-rgb: 10, 88, 202;\n --bs-code-color: #d63384;\n --bs-highlight-color: #212529;\n --bs-highlight-bg: #fff3cd;\n --bs-border-width: 1px;\n --bs-border-style: solid;\n --bs-border-color: #dee2e6;\n --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n --bs-border-radius: 0.375rem;\n --bs-border-radius-sm: 0.25rem;\n --bs-border-radius-lg: 0.5rem;\n --bs-border-radius-xl: 1rem;\n --bs-border-radius-xxl: 2rem;\n --bs-border-radius-2xl: var(--bs-border-radius-xxl);\n --bs-border-radius-pill: 50rem;\n --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);\n --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);\n --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);\n --bs-focus-ring-width: 0.25rem;\n --bs-focus-ring-opacity: 0.25;\n --bs-focus-ring-color: rgba(13, 110, 253, 0.25);\n --bs-form-valid-color: #198754;\n --bs-form-valid-border-color: #198754;\n --bs-form-invalid-color: #dc3545;\n --bs-form-invalid-border-color: #dc3545;\n}\n\n[data-bs-theme=dark] {\n color-scheme: dark;\n --bs-body-color: #dee2e6;\n --bs-body-color-rgb: 222, 226, 230;\n --bs-body-bg: #212529;\n --bs-body-bg-rgb: 33, 37, 41;\n --bs-emphasis-color: #fff;\n --bs-emphasis-color-rgb: 255, 255, 255;\n --bs-secondary-color: rgba(222, 226, 230, 0.75);\n --bs-secondary-color-rgb: 222, 226, 230;\n --bs-secondary-bg: #343a40;\n --bs-secondary-bg-rgb: 52, 58, 64;\n --bs-tertiary-color: rgba(222, 226, 230, 0.5);\n --bs-tertiary-color-rgb: 222, 226, 230;\n --bs-tertiary-bg: #2b3035;\n --bs-tertiary-bg-rgb: 43, 48, 53;\n --bs-primary-text-emphasis: #6ea8fe;\n --bs-secondary-text-emphasis: #a7acb1;\n --bs-success-text-emphasis: #75b798;\n --bs-info-text-emphasis: #6edff6;\n --bs-warning-text-emphasis: #ffda6a;\n --bs-danger-text-emphasis: #ea868f;\n --bs-light-text-emphasis: #f8f9fa;\n --bs-dark-text-emphasis: #dee2e6;\n --bs-primary-bg-subtle: #031633;\n --bs-secondary-bg-subtle: #161719;\n --bs-success-bg-subtle: #051b11;\n --bs-info-bg-subtle: #032830;\n --bs-warning-bg-subtle: #332701;\n --bs-danger-bg-subtle: #2c0b0e;\n --bs-light-bg-subtle: #343a40;\n --bs-dark-bg-subtle: #1a1d20;\n --bs-primary-border-subtle: #084298;\n --bs-secondary-border-subtle: #41464b;\n --bs-success-border-subtle: #0f5132;\n --bs-info-border-subtle: #087990;\n --bs-warning-border-subtle: #997404;\n --bs-danger-border-subtle: #842029;\n --bs-light-border-subtle: #495057;\n --bs-dark-border-subtle: #343a40;\n --bs-heading-color: inherit;\n --bs-link-color: #6ea8fe;\n --bs-link-hover-color: #8bb9fe;\n --bs-link-color-rgb: 110, 168, 254;\n --bs-link-hover-color-rgb: 139, 185, 254;\n --bs-code-color: #e685b5;\n --bs-highlight-color: #dee2e6;\n --bs-highlight-bg: #664d03;\n --bs-border-color: #495057;\n --bs-border-color-translucent: rgba(255, 255, 255, 0.15);\n --bs-form-valid-color: #75b798;\n --bs-form-valid-border-color: #75b798;\n --bs-form-invalid-color: #ea868f;\n --bs-form-invalid-border-color: #ea868f;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n :root {\n scroll-behavior: smooth;\n }\n}\n\nbody {\n margin: 0;\n font-family: var(--bs-body-font-family);\n font-size: var(--bs-body-font-size);\n font-weight: var(--bs-body-font-weight);\n line-height: var(--bs-body-line-height);\n color: var(--bs-body-color);\n text-align: var(--bs-body-text-align);\n background-color: var(--bs-body-bg);\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n margin: 1rem 0;\n color: inherit;\n border: 0;\n border-top: var(--bs-border-width) solid;\n opacity: 0.25;\n}\n\nh6, h5, h4, h3, h2, h1 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n color: var(--bs-heading-color);\n}\n\nh1 {\n font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n h1 {\n font-size: 2.5rem;\n }\n}\n\nh2 {\n font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n h2 {\n font-size: 2rem;\n }\n}\n\nh3 {\n font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n h3 {\n font-size: 1.75rem;\n }\n}\n\nh4 {\n font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n h4 {\n font-size: 1.5rem;\n }\n}\n\nh5 {\n font-size: 1.25rem;\n}\n\nh6 {\n font-size: 1rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title] {\n text-decoration: underline dotted;\n cursor: help;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: 0.5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 0.875em;\n}\n\nmark {\n padding: 0.1875em;\n color: var(--bs-highlight-color);\n background-color: var(--bs-highlight-bg);\n}\n\nsub,\nsup {\n position: relative;\n font-size: 0.75em;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\na {\n color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));\n text-decoration: underline;\n}\na:hover {\n --bs-link-color-rgb: var(--bs-link-hover-color-rgb);\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n color: inherit;\n text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: var(--bs-font-monospace);\n font-size: 1em;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n font-size: 0.875em;\n}\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\ncode {\n font-size: 0.875em;\n color: var(--bs-code-color);\n word-wrap: break-word;\n}\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.1875rem 0.375rem;\n font-size: 0.875em;\n color: var(--bs-body-bg);\n background-color: var(--bs-body-color);\n border-radius: 0.25rem;\n}\nkbd kbd {\n padding: 0;\n font-size: 1em;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n color: var(--bs-secondary-color);\n text-align: left;\n}\n\nth {\n text-align: inherit;\n text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\nlabel {\n display: inline-block;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\n[role=button] {\n cursor: pointer;\n}\n\nselect {\n word-wrap: normal;\n}\nselect:disabled {\n opacity: 1;\n}\n\n[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {\n display: none !important;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n cursor: pointer;\n}\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ntextarea {\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n float: left;\n width: 100%;\n padding: 0;\n margin-bottom: 0.5rem;\n font-size: calc(1.275rem + 0.3vw);\n line-height: inherit;\n}\n@media (min-width: 1200px) {\n legend {\n font-size: 1.5rem;\n }\n}\nlegend + * {\n clear: left;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n[type=search] {\n -webkit-appearance: textfield;\n outline-offset: -2px;\n}\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n::file-selector-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\niframe {\n border: 0;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */\n","// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n @if $color-mode-type == \"media-query\" {\n @if $root == true {\n @media (prefers-color-scheme: $mode) {\n :root {\n @content;\n }\n }\n } @else {\n @media (prefers-color-scheme: $mode) {\n @content;\n }\n }\n } @else {\n [data-bs-theme=\"#{$mode}\"] {\n @content;\n }\n }\n}\n// scss-docs-end color-mode-mixin\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: var(--#{$prefix}heading-color);\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n color: var(--#{$prefix}highlight-color);\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\n text-decoration: $link-decoration;\n\n &:hover {\n --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-` -

- - - -
-
-
-

-
- {% trans 'Students' %} -

{{ student_count }}

-
-
-
-
-
-

-
- {% trans 'Lecturers' %} -

{{ lecturer_count }}

-
-
-
-
-
-

-
- {% trans 'Administrators' %} -

{{ superuser_count }}

-
-
-
-
-
-

-
- {% trans 'Lab Assistance' %} -

500

-
-
-
-
-
-

-
- {% trans 'Librarians' %} -

300

-
-
-
-
-
-

-
- {% trans 'Supervisors' %} -

660

-
-
-
-
-
-

-
- {% trans 'Office Assistance' %} -

1,700

-
-
-
-
-
-

-
- {% trans 'Others' %} -

1,250

-
-
-
-
- -
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
-
{% trans 'Latest activities' %}
-
    - {% for log in logs %} -
  • {{ log.message }} - {{ log.created_at }}
  • - {% empty %} -
  • {% trans 'No recent activity' %}
  • - {% endfor %} -
-
-
-
-
-
-
{% trans 'School Demographics' %}
-
-
- - -
-
- - -
-
- - -
-
-
- -{% endblock content %} - -{% block js %} - - - - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/core/index.html b/templates/core/index.html deleted file mode 100644 index 045c5467..00000000 --- a/templates/core/index.html +++ /dev/null @@ -1,81 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load static %} - -{% block content %} - - - -{% if request.user.is_superuser %} - -{% endif %} - -{% include 'snippets/messages.html' %} - -
-
{% trans 'News' %} & {% trans 'Events' %}
-
- -
-
- {% trans 'News' %} -
-
- {% trans 'Events' %} -
-
- -
- {% if items %} -
- {% for item in items %} -
-
-
- - {{ item.title|title }} - - {% if request.user.is_superuser %} - - {% endif %} -
- -
{{ item.summary }}
- -
- - {{ item.updated_date|timesince }} {% trans 'ago' %} -
- -
-
- {% endfor %} -
- - {% else %} -

- {% trans 'School news and events will appear here.' %} -

- - {% endif %} - -
- -{% endblock content %} \ No newline at end of file diff --git a/templates/core/post_add.html b/templates/core/post_add.html deleted file mode 100644 index 5d1dd1ef..00000000 --- a/templates/core/post_add.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} -{% load static %} - -{% block content %} - - - -{% include 'snippets/messages.html' %} - -
-
-
-

{% trans 'Post Form' %}

-
-
{% csrf_token %} - {{ form|crispy }} - - {% trans 'Cancel' %} -
-
-
-
-
- -{% endblock content %} diff --git a/templates/core/semester_list.html b/templates/core/semester_list.html deleted file mode 100644 index cd30e709..00000000 --- a/templates/core/semester_list.html +++ /dev/null @@ -1,91 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %} {% endblock title %} - -{% block content %} - - - -{% if request.user.is_superuser %} - -{% endif %} - -
{% trans 'Semester List' %}
- -{% include 'snippets/messages.html' %} - -
- - - - - - - - - {% if request.user.is_superuser %} - - {% endif %} - - - - {% for semester in semesters %} - - - - - - - - {% if request.user.is_superuser %} - - {% endif %} - - {% empty %} - - - - - - - - - - - {% endfor %} - -
# {% trans 'Semester' %} {% trans 'Is Current semester' %} {% trans 'Session' %} {% trans 'Next Semester Begins' %} {% trans 'Actions' %}
{{ forloop.counter }}.{{ semester.semester }} - {% if semester.is_current_semester == False %} - - {% else %} - - - {% endif %} - {{ semester.session }}{{ semester.next_semester_begins }} -
- - -
-
- - {% trans 'No Semester.' %} - {% if request.user.is_superuser %} - - - {% trans 'Add Semester Now.' %} - - {% endif %} - - -
-
-{% endblock content %} \ No newline at end of file diff --git a/templates/core/semester_update.html b/templates/core/semester_update.html deleted file mode 100644 index b16e1821..00000000 --- a/templates/core/semester_update.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} -{% load static %} - -{% block content %} - - - -{% include 'snippets/messages.html' %} - -
-
-
-

{% trans 'Semester Add & update Form' %}

-

-
{% csrf_token %} - {{ form|crispy }} - -
-
-
-
-
- -{% endblock content %} diff --git a/templates/core/session_list.html b/templates/core/session_list.html deleted file mode 100644 index cd5221a5..00000000 --- a/templates/core/session_list.html +++ /dev/null @@ -1,85 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} - -{% block content %} - - - -{% if request.user.is_superuser %} - -{% endif %} - -
{% trans 'Session List' %}
- -{% include 'snippets/messages.html' %} - -
- - - - - - - - {% if request.user.is_superuser %} - - {% endif %} - - - - {% for session in sessions %} - - - - - - - {% if request.user.is_superuser %} - - {% endif %} - - {% empty %} - - - - - - - - - - - {% endfor %} - -
# {% trans 'Session' %} {% trans 'Is Current Session' %} {% trans 'Next Session Begins' %} {% trans 'Actions' %}
{{ forloop.counter }}.{{ session.session }} - {% if session.is_current_session == True %} - - {% else %} - - {% endif %} - {{ session.next_session_begins }}
- - -
-
- - {% trans 'No Session.' %} - {% if request.user.is_superuser %} - - - {% trans 'Add Session Now.' %} - - {% endif %} - - -
-
-{% endblock content %} diff --git a/templates/core/session_update.html b/templates/core/session_update.html deleted file mode 100644 index 6b7d5007..00000000 --- a/templates/core/session_update.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} -{% load static %} - -{% block content %} - - - -{% include 'snippets/messages.html' %} - -
-
-
-

{% trans 'Session Add & update Form' %}

-

-
{% csrf_token %} - {{ form|crispy }} - -
-
-
-
-
- -{% endblock content %} diff --git a/templates/course/course_add.html b/templates/course/course_add.html deleted file mode 100644 index e0ae187c..00000000 --- a/templates/course/course_add.html +++ /dev/null @@ -1,52 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} -{% load static %} - -{% block content %} - - - -
{% trans 'Course Form' %}
-
-
- -{% include 'snippets/messages.html' %} - -
{% csrf_token %} -
-
-
-

{% trans 'Course Detail' %}

-
- {{ form.title|as_crispy_field }} - {{ form.code|as_crispy_field }} - {{ form.summary|as_crispy_field }} -
-
-
-
-
-

{% trans 'Other Info' %}

-
- {{ form.program|as_crispy_field }} - {{ form.credit|as_crispy_field }} - {{ form.year|as_crispy_field }} - {{ form.semester|as_crispy_field }} - {{ form.level|as_crispy_field }} - {{ form.is_elective|as_crispy_field }} -
-
-
-
- -
- -{% endblock content %} diff --git a/templates/course/course_allocation_form.html b/templates/course/course_allocation_form.html deleted file mode 100644 index a1a6a1d5..00000000 --- a/templates/course/course_allocation_form.html +++ /dev/null @@ -1,38 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} -{% load static %} - -{% block content %} - - - -{% include 'snippets/messages.html' %} - -
-
-
-

{% trans 'Course Allocation Form' %}

-
-
{% csrf_token %} - {{ form.lecturer|as_crispy_field }} - {{ form.courses|as_crispy_field }} - - {% for course in form.courses.all %}{{ course }}{% endfor %} - - -
-
-
- -
-
- -{% endblock content %} diff --git a/templates/course/course_allocation_view.html b/templates/course/course_allocation_view.html deleted file mode 100644 index c37e2b63..00000000 --- a/templates/course/course_allocation_view.html +++ /dev/null @@ -1,82 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} - -{% block content %} - - - -{% if request.user.is_superuser %} - -{% endif %} - -
{% trans 'Course Allocations' %}
-
-
- -{% include 'snippets/messages.html' %} -{% include 'snippets/filter_form.html' %} - -
- - - - - - - {% if request.user.is_superuser %} - - {% endif %} - - - {% for course in filter.qs %} - - - - - - {% if request.user.is_superuser %} - - {% endif %} - - {% empty %} - - - - - - - - - {% endfor %} -
#{% trans 'Lecturer' %}{% trans 'Courses' %}{% trans 'Action' %}
{{ forloop.counter }}.{{ course.lecturer.get_full_name }}
{% for i in course.courses.all %} - - {% endfor %}
-
-
- {% trans 'No Course Allocated.' %} - {% if request.user.is_superuser %} - - - {% trans 'Allocate now' %} - - {% endif %} - - -
-
-{% endblock content %} diff --git a/templates/course/course_registration.html b/templates/course/course_registration.html deleted file mode 100644 index 3afbec0d..00000000 --- a/templates/course/course_registration.html +++ /dev/null @@ -1,268 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load static %} - -{% load crispy_forms_tags %} - -{% block content %} - - - -

{% trans 'Course Add' %} & {% trans 'Drop' %}

- -{% include 'snippets/messages.html' %} - -{% if current_semester %} -{% if is_calender_on == False %} - -
-

{% trans 'Calender is off' %}

-
{% trans 'Check the university calender' %}
-
- -{% else %} - -{% if not all_courses_are_registered %} - -
{% csrf_token %} -
-

{% trans 'Course Add' %}

-
-
- -
- -
-
{% trans 'First Semester:' %}
-
- - - - - - - - - - - - - - {% for course in courses %} - {% if course.semester == "First" %} - - - - - - - {% if course.is_elective %} - - {% else %} - - {% endif %} - - - {% endif %} - {% empty %} - - - - - - - - - - {% endfor %} - - - - - - - - - - -
{% trans 'Mark' %}{% trans 'Course Code' %}{% trans 'Course Title' %}{% trans 'Cr.Hr(s)' %}{% trans 'Year' %}{% trans 'Classification' %}{% trans 'Elective Group' %}
- - {{ course.code }}{{ course.title }}{{ course.credit }}{{ course.year }}{% trans 'Elective' %}{% trans 'Core' %}-
- - {% trans 'No Course.' %} - -
{% trans 'First semester Credit(s):' %} {{ total_first_semester_credit }}
-
-
- -
-
{% trans 'Second Semester:' %}
-
- - - - - - - - - - - - - - {% for course in courses %} - {% if course.semester == "Second" %} - - - - - - - {% if course.is_elective %} - - {% else %} - - {% endif %} - - - {% endif %} - {% empty %} - - - - - - - - - - {% endfor %} - - - - - - - - - - - - - - - - - - - -
{% trans 'Mark' %}{% trans 'Course Code' %}{% trans 'Course Title' %}{% trans 'Cr.Hr(s)' %}{% trans 'Year' %}{% trans 'Classification' %}{% trans 'Elective Group' %}
- - {{ course.code }}{{ course.title }}{{ course.credit }}{{ course.year }}{% trans 'Elective' %}{% trans 'Core' %}-
- - {% trans 'No Course.' %} - -
{% trans 'Second semester credit(s):' %} {{ total_sec_semester_credit }}
{% trans 'Registerd course credit(s):' %}' {{ total_registered_credit }} - {% trans 'Total credit(s):' %} {{ total_sec_semester_credit|add:total_first_semester_credit }}
-
-
-
-
-
-{% endif %} -
-
- -{% if not no_course_is_registered %} - -
-

{% trans 'Course Drop' %}

-
-

{{ student.level }}

-
- {% csrf_token %} -
- -
- -
-
- - - - - - - - - - - - - - {% for course in registered_courses %} - - - - - - - {% if course.is_elective %} - - {% else %} - - {% endif %} - - - {% empty %} - - - - - - - - - - {% endfor %} - - - - - - - - - - -
{% trans 'Mark' %}{% trans 'Course Code' %}{% trans 'Course Title' %}{% trans 'Cr.Hr(s)' %}{% trans 'Year' %}{% trans 'Classification' %}{% trans 'Elective Group' %}
- - {{ course.code }}{{ course.title }}{{ course.credit }}{{ course.year }}{% trans 'Elective' %}{% trans 'Core' %}-
- - {% trans 'No Course.' %} - -
{% trans 'Total credit(s):' %} {{ total_registered_credit }}
-
-
-
-
-
- - - {% trans 'Print Registerd Courses' %} - - -{% endif %} -{% endif %} -{% endif %} - -{% endblock content %} \ No newline at end of file diff --git a/templates/course/course_single.html b/templates/course/course_single.html deleted file mode 100644 index d2612509..00000000 --- a/templates/course/course_single.html +++ /dev/null @@ -1,243 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load static %} - -{% block content %} - - - -
-
-
- {% if request.user.is_superuser %} - - {% trans 'Edit course' %} - - {% endif %} - {% if request.user.is_superuser or request.user.is_lecturer %} - - {% trans 'Upload new file' %} - - - {% trans 'Upload new video' %} - - {% endif %} -
- -
-
- -
{{ course }}
-

{{ course.summary }}

- -{% include 'snippets/messages.html' %} - -
- -
-
-

{% trans 'Video Tutorials' %}

-
- - - - - - - - {% if request.user.is_superuser or request.user.is_lecturer %} - - {% endif %} - - - - {% for video in videos %} - - - - - - - {% if request.user.is_superuser or request.user.is_lecturer %} - - {% endif %} - - {% empty %} - - - - - - - - - {% endfor %} - -
#{% trans 'Video Title' %}{% trans 'Uploaded Date' %}{% trans 'Get Started' %}{% trans 'Actions' %}
{{ forloop.counter }} - - {{ video.title|title }} - - {{ video.timestamp|date }} - - - -
- - {% trans 'No video Uploaded.' %} - {% if request.user.is_superuser or request.user.is_lecturer %} - - - {% trans 'Upload now.' %} - - {% endif %} - - -
-
-
-
- -
-
-

{% trans 'Documentations' %}

-
- - - - - - - - - {% if request.user.is_superuser or request.user.is_lecturer %} - - {% endif %} - - - - {% for file in files %} - - - - - - - - {% if request.user.is_superuser or request.user.is_lecturer %} - - {% endif %} - - {% empty %} - - - - - - - - - {% endfor %} - -
#{% trans 'File name' %}{% trans 'Uploaded Date' %}{% trans 'Updated Date' %}{% trans 'Downloads' %}{% trans 'Actions' %}
{{ forloop.counter }} - - {{ file.title|title }} - - {{ file.upload_time|date }}{{ file.updated_date|date }} - - - -
- - {% trans 'No File Uploaded.' %} - {% if request.user.is_superuser or request.user.is_lecturer %} - - - {% trans 'Upload now.' %} - - {% endif %} - - -
-
-
-
- -
- -
-
{% trans 'Lecturer(s)' %}
-
-
-
-
- {% for lecturer in lecturers %} -
-
-
- {% if lecturer.lecturer.picture %} - - {% endif %} -
{{ lecturer|title }}
-

{{ lecturer.lecturer.email }}

-

Donec sed odio dui. Etiam porta sem malesuada magna mollis euismod.

-

- - - -

-
-
-
- {% empty %} -
{% trans 'No lecturer assigned for this course' %}
- {% endfor %} - -
-
-
- -{% endblock content %} \ No newline at end of file diff --git a/templates/course/program_add.html b/templates/course/program_add.html deleted file mode 100644 index b9880e1d..00000000 --- a/templates/course/program_add.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} -{% load static %} - -{% block content %} - - - -{% include 'snippets/messages.html' %} - -
-
-
-

{% trans 'Program Add Form' %}

-

-
{% csrf_token %} - {{ form.title|as_crispy_field }} - {{ form.summary|as_crispy_field }} - -
-
-
-
-
-{% endblock content %} diff --git a/templates/course/program_list.html b/templates/course/program_list.html deleted file mode 100644 index 480c8864..00000000 --- a/templates/course/program_list.html +++ /dev/null @@ -1,88 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} - -{% block content %} - - - -{% if request.user.is_superuser %} - -{% endif %} - -
{% trans 'Program List' %}
-

- -{% include 'snippets/messages.html' %} -{% include 'snippets/filter_form.html' %} - -
-
- - - - - - - {% if request.user.is_superuser %} - - {% endif %} - - - - {% for program in filter.qs %} - - - - - {% if request.user.is_superuser %} - - {% endif %} - - {% empty %} - - - - - - - - - {% endfor %} - -
#{% trans 'Program Name' %}{% trans 'Summary' %}{% trans 'Action' %}
{{ forloop.counter }}. - - {{ program.title}} - - {{ program.summary }} - -
- - {% trans 'No program.' %} - {% if request.user.is_superuser %} - - - {% trans 'Add program now.' %} - - {% endif %} - - -
-
-
-{% endblock content %} \ No newline at end of file diff --git a/templates/course/program_single.html b/templates/course/program_single.html deleted file mode 100644 index 53c8e825..00000000 --- a/templates/course/program_single.html +++ /dev/null @@ -1,129 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %} {{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load static %} - -{% block content %} - - - -{% if request.user.is_superuser %} - -{% endif %} - - -{% if program %} -
{{ program.title }}
-{% if program.summary %} -

{{ program.summary }}

-{% endif %} -{% endif %} - -{% include 'snippets/messages.html' %} -{% include 'snippets/filter_form.html' %} - -
-
- - - - - - - - - - - - {% if request.user.is_superuser %} - - {% endif %} - - - - {% for course in courses %} - - - - - - - - - - {% if request.user.is_superuser %} - - {% endif %} - - {% empty %} - - - - {% endfor %} - -
# {% trans 'Course Name' %} {% trans 'Course Code' %} {% trans 'Cr.Hr' %} {% trans 'Level' %} {% trans 'Year' %} {% trans 'Semester' %} {% trans 'Current Semester' %} {% trans 'Action' %}
{{ forloop.counter }}. - {{ course.title }}{{ course.code }}{{ course.credit }}{{ course.level }}{{ course.year }}{{ course.semester }} - {% if course.is_current_semester == False %} - - {% elif course.is_current_semester == True %} - - {% endif %} - - -
- - {% trans 'No course for this progrm.' %} - {% if request.user.is_superuser %} - - - {% trans 'Add one now.' %} - - {% endif %} - - -
-
-
- -{% if courses.paginator.page_range|length > 1 %} -
- -
-{% endif %} - -{% endblock content %} \ No newline at end of file diff --git a/templates/course/user_course_list.html b/templates/course/user_course_list.html deleted file mode 100644 index 38a4e9b1..00000000 --- a/templates/course/user_course_list.html +++ /dev/null @@ -1,128 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %} {% trans 'My Courses' %} | {% trans 'Learning management system' %}{% endblock title %} -{% load static %} - -{% block content %} - - - -{% if request.user.is_student %} -
{{ student.program.title }}
- {% if student.program.summary %} -

{{ student.program.summary }}

- {% endif %} -{% endif %} - -{% if request.user.is_lecturer %} -
{% trans 'My Courses' %}
-{% endif %} - -{% include 'snippets/messages.html' %} - -{% if request.user.is_student %} -
-
{% trans 'Taken Courses:' %}
-
- - - - - - - - - - - - - - - {% for course in taken_courses %} - - - - - - - - - - - {% endfor %} - -
# {% trans 'Course Name' %} {% trans 'Course Code' %} {% trans 'Cr.Hr' %} {% trans 'Year' %} {% trans 'Semester' %} {% trans 'Current Semester' %} {% trans 'Taken' %}
{{ forloop.counter }}. - {{ course.course.title }}{{ course.course.code }}{{ course.course.credit }}{{ course.course.year }}{{ course.course.semester }} - {% if course.course.is_current_semester == False %} - - {% else %} - - {% endif %} - - {% trans 'Taken' %} -
-
-
-{% endif %} - -
-
{% trans 'All Courses:' %}
-
- - - - - - - - - - - - - - {% for course in courses %} - - - - - - - - - - {% endfor %} - -
# {% trans 'Course Name' %} {% trans 'Course Code' %} {% trans 'Cr.Hr' %} {% trans 'Year' %} {% trans 'Semester' %} {% trans 'Current Semester' %}
{{ forloop.counter }}. - {{ course.title }}{{ course.code }}{{ course.credit }}{{ course.year }}{{ course.semester }} - {% if course.is_current_semester == False %} - - {% else %} - - {% endif %} -
-
-
- -{% if courses.paginator.page_range|length > 1 %} -
- -
-{% endif %} - -{% endblock content %} diff --git a/templates/error_handler_base.html b/templates/error_handler_base.html deleted file mode 100644 index 3e29c445..00000000 --- a/templates/error_handler_base.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends 'base.html' %} - -{% block sidebar %}{% endblock %} - -{% block maincontent %} -{% block content %} -{% endblock %} -{% endblock %} \ No newline at end of file diff --git a/templates/invoice_detail.html b/templates/invoice_detail.html deleted file mode 100644 index b3acecbe..00000000 --- a/templates/invoice_detail.html +++ /dev/null @@ -1,6 +0,0 @@ -{% load i18n %} -

{% trans 'Invoices' %}

- -

{{ invoice.user }}

-

{{ invoice.amount }}

-

{{ invoice.total }}

diff --git a/templates/invoices.html b/templates/invoices.html deleted file mode 100644 index 67811b3d..00000000 --- a/templates/invoices.html +++ /dev/null @@ -1,13 +0,0 @@ -

{% trans 'Invoices' %}

- -
{% csrf_token %} - - -
- -{% for invoice in invoices %} -

{{ invoice.user }}

-

{{ invoice.amount }}

-

{{ invoice.total }}

-

{{ invoice.payment_complete }}

-{% endfor %} diff --git a/templates/navbar.html b/templates/navbar.html deleted file mode 100644 index dece5ec0..00000000 --- a/templates/navbar.html +++ /dev/null @@ -1,53 +0,0 @@ -{% load i18n%} -
-
- -
-
\ No newline at end of file diff --git a/templates/payments/charge.html b/templates/payments/charge.html deleted file mode 100644 index ee07e830..00000000 --- a/templates/payments/charge.html +++ /dev/null @@ -1,49 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}PayPal{% endblock title %} -{% load static %} - -{% block header %} - -{% endblock %} - -{% block content %} - -
-
-

{% trans 'Payment Succeed, You has been make payment successfuly.' %}

-
{% trans 'Redirect to your dashboard in' %} 8
-
- -
-{% endblock content %} - -{% block js %} - - - -{% endblock %} diff --git a/templates/payments/coinbase.html b/templates/payments/coinbase.html deleted file mode 100644 index ae13b235..00000000 --- a/templates/payments/coinbase.html +++ /dev/null @@ -1,10 +0,0 @@ -{% extends 'base.html' %} -{% i18n %} -{% block title %}{% trans 'Coinbase' %}{% endblock title %} -{% load static %} - -{% block content %} -
-

{% trans 'Coinbase' %}

-
-{% endblock content %} diff --git a/templates/payments/paylike.html b/templates/payments/paylike.html deleted file mode 100644 index 3e30d0e8..00000000 --- a/templates/payments/paylike.html +++ /dev/null @@ -1,9 +0,0 @@ -{% extends 'base.html' %} -{% block title %}PayLike{% endblock title %} -{% load static %} - -{% block content %} -
-

PayLike

-
-{% endblock content %} diff --git a/templates/payments/payment_gateways.html b/templates/payments/payment_gateways.html deleted file mode 100644 index c05cebbc..00000000 --- a/templates/payments/payment_gateways.html +++ /dev/null @@ -1,204 +0,0 @@ -{% extends 'base.html' %} -{% block title %}Choose a gateway{% endblock title %} -{% load static %} - -{% block header %} - - - - -{% endblock %} - -{% block content %} - -
-

Payment GateWays

-
-
- -
- {% csrf_token %} - -
- - -
-

Paypal

-
-
-
-

Stripe

-
- {% csrf_token %} - -
-

- Make payment with stripe and get jobs done. -

-
-
-

CoinBase

- C CoinBase -

- Make payment with stripe and get jobs done. -

-
-
-

Paylike

- Paylike -

- Make payment with stripe and get jobs done. -

-
-
-
-
- -{% endblock content %} - - -{% block js %} - - - - - - - - - -{% endblock js %} diff --git a/templates/payments/payment_succeed.html b/templates/payments/payment_succeed.html deleted file mode 100644 index 8b497807..00000000 --- a/templates/payments/payment_succeed.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends 'base.html' %} -{% block title %}PayPal{% endblock title %} -{% load static %} - -{% block header %} - -{% endblock %} - -{% block content %} - -
-
-

Payment Succeed, You has been make payment successfuly.

-
Redirect to the invoice in 8
-
- -
-{% endblock content %} - -{% block js %} - - - -{% endblock %} diff --git a/templates/payments/paypal.html b/templates/payments/paypal.html deleted file mode 100644 index 6cdac4e1..00000000 --- a/templates/payments/paypal.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - PayPal Smart Payment Buttons Integration | Client Demo - - - - -
- - - - - - - - diff --git a/templates/payments/stripe.html b/templates/payments/stripe.html deleted file mode 100644 index 0cab5a57..00000000 --- a/templates/payments/stripe.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends 'base.html' %} -{% block title %}Stripe{% endblock title %} -{% load static %} - -{% block header %} - -{% endblock %} - -{% block content %} -
-
-

Stripe

- -
-
-{% endblock content %} diff --git a/templates/pdf/lecturer_list.html b/templates/pdf/lecturer_list.html deleted file mode 100644 index f4c5b8f3..00000000 --- a/templates/pdf/lecturer_list.html +++ /dev/null @@ -1,40 +0,0 @@ -{% block content %} -{% load i18n %} - -

{% trans 'Lecturers' %}

- -
- - - - - - - - - - - - - {% for lecturer in lecturers %} - - - - - - - - - {% empty %} - - - - {% endfor %} - -
#{% trans 'ID No.' %}{% trans 'Full Name' %}{% trans 'Email' %}{% trans 'Mob No.' %}{% trans 'Address/City' %}
{{ forloop.counter }}.{{ lecturer.username }}{{ lecturer.get_full_name }}{{ lecturer.email }}{{ lecturer.phone }}{{ lecturer.address }}
- - {% trans 'No Lecturer(s).' %} - -
-
-{% endblock content %} diff --git a/templates/pdf/profile_single.html b/templates/pdf/profile_single.html deleted file mode 100644 index be0bbf32..00000000 --- a/templates/pdf/profile_single.html +++ /dev/null @@ -1,76 +0,0 @@ -{% block content %} -{% load i18n %} - -{% if user.is_authenticated %} -
-
- - - - - -
- - -

{{ user.get_full_name|title }}

-

{% trans 'Last login:' %} {{ user.last_login|date }}

-

{% trans 'Role:' %} {{ user.get_user_role }}

-
-
-
- -
-
- {% if user.is_lecturer %} -

{% trans 'My Courses' %}

- {% if courses %} -
    - {% for course in courses %} -
  • {{ course }}
  • - {% endfor %} -
- {% else %} -
{% trans 'No courses assigned!' %}
- {% endif %} -
- {% endif %} - -

{% trans 'Personal Info' %}

-
-

{% trans 'First Name:' %} {{ user.first_name|title }}

-

{% trans 'Last Name:' %} {{ user.last_name|title }}

-

{% trans 'ID No.:' %} {{ user.username }}

-
- - {% if user.is_student %} -
-

{% trans 'Applicant Info' %}

-
-

{% trans 'School:' %}{% trans 'Hawas Preparatory School' %}

-

{% trans 'Level:' %} {{ level.level }}

-
- {% endif %} - -
-

{% trans 'Contact Info' %}

-
-

{% trans 'Email:' %} {{ user.email }}

-

{% trans 'Tel No.:' %} {{ user.phone }}

-

{% trans 'Address/city:' %} {{ user.address }}

-
- -
-

{% trans 'Important Dates' %}

-
-

{% trans 'Last login:' %} {{ user.last_login }}

- {% if current_semester and current_session %} -

{% trans 'Academic Year:' %} {{ current_semester }} {% trans 'Semester' %} {{ current_session }}

- {% endif %} -

{% trans 'Registered Date:' %} {{ user.date_joined|date }}

-
-
-
-
-{% endif %} - -{% endblock content %} diff --git a/templates/pdf/student_list.html b/templates/pdf/student_list.html deleted file mode 100644 index fc3a01c2..00000000 --- a/templates/pdf/student_list.html +++ /dev/null @@ -1,38 +0,0 @@ -{% block content %} -{% load i18n %} - -

{% trans 'Students' %}

- -
- - - - - - - - - - - - {% for student in students %} - - - - - - - - {% empty %} - - - - {% endfor %} - -
{% trans 'ID No.' %}{% trans 'Full Name' %}{% trans 'Email' %}{% trans 'Mob No.' %}{% trans 'Program' %}
{{ forloop.counter }}.{{ student.student.username }}{{ student.student.get_full_name }}{{ student.student.email }}{{ student.program }}
- - {% trans 'No Lecturer(s).' %} - -
-
-{% endblock content %} diff --git a/templates/privacy.html b/templates/privacy.html deleted file mode 100644 index 00045241..00000000 --- a/templates/privacy.html +++ /dev/null @@ -1,69 +0,0 @@ - - diff --git a/templates/quiz/correct_answer.html b/templates/quiz/correct_answer.html deleted file mode 100644 index dcf6fd1b..00000000 --- a/templates/quiz/correct_answer.html +++ /dev/null @@ -1,32 +0,0 @@ -{% load i18n %} -{% if previous.answers %} - - - {% for answer in previous.answers %} - {% if answer.correct %} - - - - - {% else %} - - - - - {% endif %} - {% endfor %} - -
{{ answer }}{% trans "This is the correct answer" %}
{{ answer }} - {% if previous.question_type.MCQuestion %} - {% if answer.id|add:"0" == previous.previous_answer|add:"0" %} - {% trans "This was your answer." %} - {% endif %} - {% endif %} -
- - {% if user_was_incorrect %} -
- {% trans "You answered the above question incorrectly" %} -
- {% endif %} -{% endif %} diff --git a/templates/quiz/mcquestion_form.html b/templates/quiz/mcquestion_form.html deleted file mode 100644 index 39a27ba7..00000000 --- a/templates/quiz/mcquestion_form.html +++ /dev/null @@ -1,71 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% load crispy_forms_tags %} - -{% block content %} - - - -
{% trans 'Add questions' %} [{{ quiz_obj|truncatechars:15 }}]
- -{% if formset.non_form_errors %} -
-
    - {% for e in formset.non_form_errors %} -
  • {{ e }}
  • - {% endfor %} -
-
-{% endif %} - -
-
{{ quiz_questions_count }} {% trans 'question added' %}
- -
{% csrf_token %} - {% if form.errors %}

{% trans 'Correct the error(s) below.' %}

{% endif %} -
-
- - {{ form.content|as_crispy_field }} - {{ form.figure|as_crispy_field }} - {{ form.explanation|as_crispy_field }} -
-
- {{ form.choice_order|as_crispy_field }} -
- - {{ formset.management_form }} - {% for fs in formset %} - -
-
- {{ fs.correct }} {% trans 'Correct' %} -
- {{ fs.choice_text }} -
- {{ fs.DELETE }} {% trans 'Delete' %} -
-
- {% endfor %} -
-
-
- - -
-
- -{% endblock %} diff --git a/templates/quiz/progress.html b/templates/quiz/progress.html deleted file mode 100644 index bf095083..00000000 --- a/templates/quiz/progress.html +++ /dev/null @@ -1,103 +0,0 @@ -{% extends "base.html" %} -{% load i18n %} - -{% block title %} {% trans "Progress Page" %} | {% trans 'Learning management system' %} {% endblock %} -{% block description %} {% trans "User Progress Page" %} {% endblock %} - -{% block content %} - - - -

{% trans 'Quiz Progress Rec' %}

- - {% if cat_scores %} - -
{% trans "Question Category Scores" %}
-
- - - - - - - - - - - - - - - - {% for cat, value in cat_scores.items %} - - - - - - - - {% endfor %} - - - -
{% trans "Category" %}{% trans "Correctly answererd" %}{% trans "Incorrect" %}%
{{ cat }}{{ value.0 }}{{ value.1 }}{{ value.2 }}
- - - {% endif %} - - {% if exams %} - -
{% trans "Previous exam papers" %}
-

- {% if request.user.is_superuser %} - {% trans "Student exam results" %} - {% else %} - {% trans "Below are the results of exams that you have sat" %} - {% endif %} -

-
{% trans 'Total complete exams:' %} {{ exams_counter }}
-
- - - - - - - - - - - - - - - {% for exam in exams %} - - - - - - - - - - {% endfor %} - - - -
#{% trans "Quiz Title" %}{% trans "Score" %}{% trans "Possible Score" %}{% trans 'Out of 100%' %}
{{ forloop.counter }}{{ exam.quiz.title }}{{ exam.current_score }}{{ exam.get_max_score }}{{ exam.get_percent_correct }}%
-
- {% endif %} - {% if not cat_scores and not exams %} -

- {% trans 'Progress records will appear here' %} -

- {% endif %} - -{% endblock %} diff --git a/templates/quiz/question.html b/templates/quiz/question.html deleted file mode 100644 index 3fd94849..00000000 --- a/templates/quiz/question.html +++ /dev/null @@ -1,177 +0,0 @@ -{% extends "base.html" %} -{% load i18n%} - - -{% block title %} {{ quiz.title }} | {% trans 'Learning management system' %} {% endblock %} -{% block description %} {{ quiz.title }} - {{ quiz.description }} {% endblock %} - -{% block content %} - - - -
{{ quiz.title|title|truncatechars:25 }}
-
- -
- - {% if previous.answers %} - -

{% trans "The previous question" %}:

-

{{ previous.previous_question }}

- - {% if previous.previous_outcome %} -
- {% else %} -
- {% endif %} -

- {% trans "Your answer was" %} - - {{ previous.previous_outcome|yesno:"correct,incorrect" }} - -

- -
- - {% load i18n %} - {% if previous.answers %} - - - {% for answer in previous.answers %} - {% if answer.correct %} - - - - - {% else %} - - - - {% endif %} - - {% endfor %} - -
{{ answer }}{% trans "This is the correct answer" %}
{{ answer }} - {% if previous.question_type.MCQuestion %} - {% if answer.id|add:"0" == previous.previous_answer|add:"0" %} - {% trans "This was your answer." %} - {% endif %} - {% endif %} -
- - {% if user_was_incorrect %} -
- {% trans "You answered the above question incorrectly" %} -
- {% endif %} - - {% endif %} - - -

{% trans "Explanation" %}:

-

- {% if previous.previous_question.explanation %} - {{ previous.previous_question.explanation }} - {% else %} - {% trans "No explanation set to this question." %} - {% endif %} -

- - - -
- - {% endif %} - -
- - {% if question %} - - {% if progress.0|add:1 == 1 %} - - - {% endif %} - - {% if progress %} -
- {% trans "Question" %} {{ progress.0|add:1 }} {% trans "of" %} {{ progress.1 }} -
- {% endif %} - -

- {% trans "Quiz category" %}: - {{ quiz.category }} -

- -
-
{{ question.content }}
- - {% if question.figure %} -
- {{ question.content }} -
- {% endif %} -
-
{% csrf_token %} - - -
    - - {% for answer in form.answers %} -
  • - {{ answer }} -
  • - {% endfor %} - -
-
- - -
-
- - {% endif %} -
- -
- -{% endblock %} - -{% block js %} - -{% endblock js %} diff --git a/templates/quiz/quiz_form.html b/templates/quiz/quiz_form.html deleted file mode 100644 index b0df808d..00000000 --- a/templates/quiz/quiz_form.html +++ /dev/null @@ -1,79 +0,0 @@ -{% extends 'base.html' %} -{% load crispy_forms_tags %} -{% load i18n %} - -{% block content %} - - - -
{% trans 'Quiz form for' %} {{ course|truncatechars:15 }}
-

- -
- -
{% csrf_token %} -
-
-
-
- - - {{ form.category|as_crispy_field }} - {{ form.title|as_crispy_field }} - - {{ form.pass_mark|as_crispy_field }} - {{ form.description|as_crispy_field }} - -
-
-
-
-
-
- - - {{ form.random_order|as_crispy_field }} - {{ form.answers_at_end|as_crispy_field }} - {{ form.exam_paper|as_crispy_field }} - {{ form.single_attempt|as_crispy_field }} - {{ form.draft|as_crispy_field }} -
-
-
-
- -
-
- -{% endblock %} - -{% block js %} - -{% endblock js %} diff --git a/templates/quiz/quiz_list.html b/templates/quiz/quiz_list.html deleted file mode 100644 index f3b19d5a..00000000 --- a/templates/quiz/quiz_list.html +++ /dev/null @@ -1,101 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | Learning management system{% endblock title %} -{% load i18n %} -{% load static %} - -{% block content %} - - - -{% if request.user.is_superuser or request.user.is_lecturer %} - -{% endif %} - -
{% trans 'Quizzes' %} [{{ course|truncatechars:25 }}]
-
-
- -{% include 'snippets/messages.html' %} - -
- -
- {% for quiz in quizzes %} -
-
-
- {{ quiz.category|title }} {% trans 'Quiz' %} -
- {{ quiz.get_questions.count }} {% trans 'Questions' %} -
-
- -
{{ quiz.title|title }}
- - {% if quiz.description %} -

{{ quiz.description }}

- {% else %} -

No description set.

- {% endif %} - - {% if quiz.single_attempt %} -

{% trans "You will only get one attempt at this quiz" %}.

- {% endif %} - -
- {% trans "Start quiz" %} » - - {% if request.user.is_superuser or request.user.is_lecturer %} - - {% endif %} -
-
-
- - {% empty %} -

- Course quizzes will appear here. -

- {% endfor %} -
- -
-{% endblock %} - -{% block js %} - -{% endblock js %} diff --git a/templates/quiz/quiz_marking_detail.html b/templates/quiz/quiz_marking_detail.html deleted file mode 100644 index afaea9fb..00000000 --- a/templates/quiz/quiz_marking_detail.html +++ /dev/null @@ -1,72 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %} -{% trans "Result of" %} {{ sitting.quiz.title }} {% trans "for" %} {{ sitting.user }} | {% trans 'Learning management system' %} -{% endblock %} - -{% block content %} - - - -
-
{% trans "Quiz title" %}: {{ sitting.quiz.title }}
- {% trans "Category" %}: {{ sitting.quiz.category }} -
- -

{{ sitting.quiz.description }}

-
-

{% trans "User" %}: {{ sitting.user }}

-

{% trans "Completed" %}: {{ sitting.end|date }}

-

{% trans "Score" %}: {{ sitting.get_percent_correct }}%

- - - - - - - - - - - - - - -{% for question in questions %} - - - - - - - - -{% endfor %} - - - -
{% trans "Question" %}{% trans "User answer" %}
- {{ question.content }} - {% if question.figure %} -
{{ question.figure }}
- {% endif %} -
{{ question }} - {% if question.id in sitting.get_incorrect_questions %} -

{% trans "incorrect" %}

- {% else %} -

{% trans "Correct" %}

- {% endif %} -
-
{% csrf_token %} - - -
-
-{% endblock %} diff --git a/templates/quiz/result.html b/templates/quiz/result.html deleted file mode 100644 index 64d073be..00000000 --- a/templates/quiz/result.html +++ /dev/null @@ -1,186 +0,0 @@ -{% extends "base.html" %} -{% load i18n %} - -{% load quiz_tags %} - - -{% block title %} {{ quiz.title}} | {% trans 'Learning management system' %} {% endblock %} -{% block description %} {% trans "Quiz Results for" %} {{ quiz.title }} {% endblock %} - -{% block content %} - - - -
-
-
{% trans 'Calculating your result...' %}
-
-
-
-
-
- -
- {% if previous.answers %} -
-

{% trans "The previous question" %}:

-

{{ previous.previous_question }}

-

Your answer was - - {{ previous.previous_outcome|yesno:"correct,incorrect" }} - -

- - {% load i18n %} - {% if previous.answers %} - - - {% for answer in previous.answers %} - {% if answer.correct %} - - - - - {% else %} - - - - {% endif %} - - {% endfor %} - -
{{ answer }}{% trans "This is the correct answer" %}
{{ answer }} - {% if previous.question_type.MCQuestion %} - {% if answer.id|add:"0" == previous.previous_answer|add:"0" %} - {% trans "This was your answer." %} - {% endif %} - {% endif %} -
- - {% if user_was_incorrect %} -
- {% trans "You answered the above question incorrectly" %} -
- {% endif %} - - {% endif %} - -

{% trans "Explanation" %}:

-

- {% if previous.previous_question.explanation %} - {{ previous.previous_question.explanation }} - {% else %} - {% trans "No explanation set to this question." %} - {% endif %} -

-
-
- - {% endif %} - - {% if max_score %} - -
-
{% trans "Quiz result" %}
-
-

- {% trans "Quiz title" %}: - {{ quiz.title }}

- -

- {% trans "You answered" %} {{ score }} {% trans "questions correctly out of" %} {{ max_score }}, {% trans "giving you" %} {{ percent }}{% trans "% correct" %} -

- -
-
{{ percent }}%
-
-

- - {% if quiz.pass_mark %} -
-

{{ sitting.result_message }}

- {% endif %} -
    -
  • {% trans "Review the questions below and try the quiz again in the future"%}.
  • -
  • - {% trans "The result of this quiz will be stored in your progress section" %} - Here - {% trans "so you can review and monitor your progression" %}. -
  • -
- -
- - {% endif %} - -
- - {% if possible %} - -

- {% trans "Your session score is" %} {{ session }} {% trans "out of a possible" %} {{ possible }} -

- -
- - {% endif %} - - {% if questions %} -
-

Overview

- {% for question in questions %} - -

- {{ forloop.counter }}, {{ question.content }} -

- -

{% trans "Explanation" %}:

- {% if question.explanation %} -

- {{ question.explanation|safe }} -

- {% else %} -

- {% trans "No explanation set for this question." %} -

- {% endif %} - - {% correct_answer_for_all question %} - - {% if question.user_answer %} -

{% trans "Your answer" %}: {{ question|answer_choice_to_string:question.user_answer }}

- {% endif %} - -
- - {% endfor %} -
- - {% endif %} - -
- -{% endblock %} - -{% block js %} - -{% endblock js %} diff --git a/templates/quiz/sitting_list.html b/templates/quiz/sitting_list.html deleted file mode 100644 index 558536a5..00000000 --- a/templates/quiz/sitting_list.html +++ /dev/null @@ -1,63 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{% trans "All Quizzes" %} | {% trans 'Learning management system' %}{% endblock %} - -{% block content %} - - - -
{% trans "List of complete exams" %}
- -{% for student in students %}

{{ student.student.user.get_full_name }}

{% endfor %} -{% for marking in marking_list %}

{{ marking }} {{ forloop.counter }}

{% endfor %} - -
- - - -
- -{% if sitting_list %} - -
{% trans 'Total complete exams' %}: {{ sitting_list.count }}
- - - - - - - - - - - - - - - {% for sitting in sitting_list %} - - - - - - - - - - {% endfor %} - - -
#{% trans "User" %}{% trans "Course" %}{% trans "Quiz" %}{% trans "Completed" %}{% trans "Score" %}(%)
{{ forloop.counter }}{{ sitting.user }}{{ sitting.quiz.course }}{{ sitting.quiz }}{{ sitting.end|date }}{{ sitting.get_percent_correct }}% - - {% trans "View details" %} - -
-{% else %} -

{% trans "No completed exams for you" %}.

-{% endif %} -{% endblock %} diff --git a/templates/registration/login.html b/templates/registration/login.html deleted file mode 100644 index ff4cfd09..00000000 --- a/templates/registration/login.html +++ /dev/null @@ -1,70 +0,0 @@ -{% extends 'registration/registration_base.html' %} -{% load i18n %} -{% block title %}{% trans 'Dj Learning Management System - Login' %}{% endblock title %} -{% load crispy_forms_tags %} -{% block content %} - -
-
-
- - {% trans 'Sign in' %} -
-
-
{% csrf_token %} -
- - -
-
-
- - -
- {% if form.errors %} - {% trans 'Invalid ID & Password.' %}
- {% endif %} - - -
-
- -
-
-
-{% endblock content %} - -{% block js %} - - -{% endblock %} diff --git a/templates/registration/password_reset.html b/templates/registration/password_reset.html deleted file mode 100644 index c82e9519..00000000 --- a/templates/registration/password_reset.html +++ /dev/null @@ -1,20 +0,0 @@ -{% extends 'registration/registration_base.html' %} -{% load i18n %} -{% block title %}{% trans 'Password Reset | Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} -{% block content %} -
- - -
{% csrf_token %} -
- -
- {% trans 'Email' %} {{ form.email }} - {{ form.email.errors }} -
-
- -
-
-{% endblock content %} diff --git a/templates/registration/password_reset_complete.html b/templates/registration/password_reset_complete.html deleted file mode 100644 index ab562e8f..00000000 --- a/templates/registration/password_reset_complete.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends 'registration/registration_base.html' %} -{% load i18n %} -{% block title %}{% trans 'Password Reset Complete | Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} - -{% block content %} -
- -
-
- {% trans 'Your password has been set, you are now able to Log In!' %} -
- {% trans 'Sign In Here' %} -
-
-{% endblock content %} diff --git a/templates/registration/password_reset_confirm.html b/templates/registration/password_reset_confirm.html deleted file mode 100644 index 6ae7de4a..00000000 --- a/templates/registration/password_reset_confirm.html +++ /dev/null @@ -1,23 +0,0 @@ -{% extends 'registration/registration_base.html' %} -{% load i18n %} -{% block title %}{% trans 'New Password | Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} -{% block content %} - -{% include 'snippets/messages.html' %} - -
- -
-
{% csrf_token %} - {{ form|crispy }} - - -
-
-
-{% endblock content %} diff --git a/templates/registration/password_reset_done.html b/templates/registration/password_reset_done.html deleted file mode 100644 index 1c751960..00000000 --- a/templates/registration/password_reset_done.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends 'registration/registration_base.html' %} -{% load i18n %} -{% block title %}{% trans 'Email Sent | Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} - -{% block content %} -
- -
-
- {% trans 'An Email has been sent with instructions - to reset your password, check your email.' %} -
- {% trans 'Back To Login' %} -
-
-{% endblock content %} diff --git a/templates/registration/register.html b/templates/registration/register.html deleted file mode 100644 index 7446844f..00000000 --- a/templates/registration/register.html +++ /dev/null @@ -1,116 +0,0 @@ -{% extends 'registration/registration_base.html' %} -{% load i18n %} -{% block title %}{% trans 'Register | Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} - -{% block content %} - -
- -
-

- {% trans 'Create Your Account' %} -

-
- -
- {% csrf_token %} -
-
-

{% trans 'Login Form' %}

-
- - {{ form.username }} -
-
-
- - {{ form.email }} -
-
- - {{ form.password1 }} -
-
- - {{ form.password2 }} -
-
-
-

{% trans 'Personal Info' %}

-
- - {{ form.address }} -
-
- - {{ form.phone }} -
-
- - {{ form.first_name }} -
-
- - {{ form.last_name }} -
-
- - {{ form.gender }} -
-
- - {{ form.level }} -
-
- - {{ form.program }} -
-
-
- - {% if form.errors %} -

{% trans 'Invalid ID & Password.' %}


- {% endif %} - - -
-
- {% trans 'Already Registered ?' %} {% trans 'Login' %} -
-{% endblock content %} - -{% block js %} - - -{% endblock %} diff --git a/templates/registration/registration_base.html b/templates/registration/registration_base.html deleted file mode 100644 index 17d769e6..00000000 --- a/templates/registration/registration_base.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends 'base.html' %} - -{% block sidebar %}{% endblock %} - -{% block maincontent %} - {% block content %}{% endblock content %} -{% endblock %} \ No newline at end of file diff --git a/templates/result/add_score.html b/templates/result/add_score.html deleted file mode 100644 index eeb6bffb..00000000 --- a/templates/result/add_score.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load static %} - -{% block content %} - - - -{% include 'snippets/messages.html' %} - -
{% trans 'Manage Score' %}
- -{% if current_semester %} -
-
-
-

- {{ current_semester }} {% trans 'Semester' %} - {{ current_session }} -

-
- -

{% trans 'To manage scores, please select the course using the button above.' %}

-
-
-
-
-{% endif %} - -{% endblock content %} diff --git a/templates/result/add_score_for.html b/templates/result/add_score_for.html deleted file mode 100644 index a8a96bd9..00000000 --- a/templates/result/add_score_for.html +++ /dev/null @@ -1,120 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load static %} - -{% block content %} - - - - - -
-

{% trans 'Students result form' %} | {{ course|truncatechars:15 }}

-

{{ course.summary }}

- -{% include 'snippets/messages.html' %} - -
- {% csrf_token %} -
- - - - {% trans 'Grade report' %} - - -
- -

{{ current_semester }} {% trans 'Semester' %} {{ current_session }}

-
- - - - - - - - - - - - - - - - - - {% for student in students %} - - - - - - - - - - - - - {% if student.comment == 'PASS' %} - - {% elif student.comment == 'FAIL' %} - - {% else %} - {% endif %} - - - {% empty %} - - - - - - - - - - - - - - {% endfor %} - -
#{% trans 'Student' %}{% trans 'Assignment' %}{% trans 'Mid exam' %}{% trans 'Quiz' %}{% trans 'Attendance' %}{% trans 'Final exam' %}{% trans 'Total' %}{% trans 'Point' %}{% trans 'Grade' %}{% trans 'Comment' %}
{{ forloop.counter }}{{ student.student.student.username }} - - - - - - - - - - {{ student.total }}{{ student.point }}{{ student.grade }}✓ {{ student.comment }}⨂ {{ student.comment }}
- - {% trans 'No Student.' %} - -
-
-
- -{% endblock content %} diff --git a/templates/result/assessment_results.html b/templates/result/assessment_results.html deleted file mode 100644 index 787880d6..00000000 --- a/templates/result/assessment_results.html +++ /dev/null @@ -1,104 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} - -{% block content %} - - - -{% include 'snippets/messages.html' %} - -
{% trans 'Assesment Results' %}
-

{{ student.level }} {% trans 'Result' %}

- -
-
{% trans 'First Semester:' %}
- - - - - - - - - - - - - - - - {% for course in courses %} - {% if course.course.semester == "First" %} - - - - - - - - - - - - {% if course.total >= 45 %} - - {% else %} - - {% endif %} - - - {% endif %} - {% endfor %} -
#{% trans 'Course Title' %}{% trans 'Course Code' %}{% trans 'Cr.Hr(s)' %}{% trans 'Assignment' %}{% trans 'Mid exam' %}{% trans 'Quiz' %}{% trans 'Attendance' %}{% trans 'Final exam' %}{% trans 'Total' %}
{{ forloop.counter }}{{ course.course.title }}{{ course.course.code }}{{ course.course.credit }}{{ course.assignment }}{{ course.mid_exam }}{{ course.quiz }}{{ course.attendance }}{{ course.final_exam }} {{ course.total }} {{ course.total }}
-
- -
-
{% trans 'Second Semester:' %}
- - - - - - - - - - - - - - - - {% for course in courses %} - {% if course.course.semester == "Second" %} - - - - - - - - - - - - {% if course.total >= 45 %} - - {% else %} - - {% endif %} - - - {% endif %} - {% endfor %} -
#{% trans 'Course Title' %}{% trans 'Course Code' %}{% trans 'Cr.Hr(s)' %}{% trans 'Assignment' %}{% trans 'Mid exam' %}{% trans 'Quiz' %}{% trans 'Attendance' %}{% trans 'Final exam' %}{% trans 'Total' %}
{{ forloop.counter }}{{ course.course.title }}{{ course.course.code }}{{ course.course.credit }}{{ course.assignment }}{{ course.mid_exam }}{{ course.quiz }}{{ course.attendance }}{{ course.final_exam }} {{ course.total }} {{ course.total }}
-
- -
-{% endblock %} diff --git a/templates/result/grade_results.html b/templates/result/grade_results.html deleted file mode 100644 index 08050eac..00000000 --- a/templates/result/grade_results.html +++ /dev/null @@ -1,184 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} - -{% block content %} - - - -{% include 'snippets/messages.html' %} - -
{% trans 'Grade Results' %}
-

{{ student.level }} {% trans 'Result' %}

- -
-
{% trans 'First Semester:' %}
- - - - - - - - - - - - - {% for course in courses %} - {% if course.course.semester == "First" %} - - - - - - - - - - - {% if course.comment == 'PASS' %} - - {% elif course.comment == 'FAIL' %} - - {% else %} - - {% endif %} - - - - {% endif %} - {% endfor %} - - {% for result in results %} - {% if result.semester == "First" %} - - - - - - - - - - - - - - - - - - - {% endif %} - {% endfor %} - -
#{% trans 'Course Title' %}{% trans 'Course Code' %}{% trans 'Cr.Hr' %}{% trans 'Grade' %}{% trans 'Points' %}{% trans 'Comment' %}
{{ forloop.counter }}{{ course.course.title }}{{ course.course.code }}{{ course.course.credit }}{{ course.grade }}{{ course.point }}{% trans 'PASS' %}{% trans 'FAIL' %}
{% trans 'Total first semester credit:' %} {{ total_first_semester_credit }}
{% trans 'First Semester GPA:' %} {{ result.gpa }}
-
- -
-
{% trans 'Second Semester:' %}
- - - - - - - - - - - - - {% for course in courses %} - {% if course.course.semester == "Second" %} - - - - - - - - - - - {% if course.comment == 'PASS' %} - - {% elif course.comment == 'FAIL' %} - - {% else %} - - {% endif %} - - - - {% endif %} - {% endfor %} - - {% for result in results %} - {% if result.semester == "Second" %} - - - - - - - - - - - - - - - - - - - - - - - - - - - - {% endif %} - {% endfor %} - -
#{% trans 'Course Title' %}{% trans 'Course Code' %}{% trans 'Cr.Hr' %}{% trans 'GRADE' %}{% trans 'Points' %}{% trans 'Comment' %}
{{ forloop.counter }}{{ course.course.title }}{{ course.course.code }}{{ course.course.credit }}{{ course.grade }}{{ course.point }}{% trans 'PASS' %}{% trans 'FAIL' %}
{% trans 'Total second semester credit:' %} {{ total_sec_semester_credit }}{% trans 'Total Credit:' %} {{ total_first_and_second_semester_credit }}
{% trans 'Second Semester GPA:' %} {{ result.gpa }}
{% trans 'Previous CGPA:' %} {{ previousCGPA }}
-
- -
- - {% for result in results %} - {% if result.semester == "First" %} - - - - {{ result.gpa }} - -
- {% elif result.semester == "Second" %} - - - - {{ result.gpa }} - -
- {% endif %} - {% endfor %} - - - - {{ previousCGPA }} - - -
-{% endblock %} diff --git a/templates/search/search_view.html b/templates/search/search_view.html deleted file mode 100644 index 4b61e376..00000000 --- a/templates/search/search_view.html +++ /dev/null @@ -1,98 +0,0 @@ -{% extends "base.html" %} -{% load i18n %} -{% block title %}{% trans 'Search result for' %} {{ query }} | {% trans 'Learning management system' %}{% endblock title %} - -{% load class_name %} - -{% block content %} - - - -
-
{{ count }} {% trans 'result' %}{{ count|pluralize }} {% trans 'for' %} {{ query }}
-
- {% for object in object_list %} - {% with object|class_name as klass %} - {% if klass == "Program" %} -
- {% trans 'Program' %} -
{{ object.title}}
-

{{ object.summary }}

-

- - {% elif klass == "Course" %} -
- {% trans 'Course' %} -

{% trans 'Program of' %} {{ object.program }}

-
{{ object }}
-

{{ object.summary }}

-

- - {% elif klass == "NewsAndEvents" %} -
- {% trans 'News And Events' %} -

{% trans 'Date:' %} {{ object.updated_date|timesince }} ago

-
{{ object.title }}
-

{{ object.summary }}

-

- - {% elif klass == "Quiz" %} -
- {% trans 'Quiz' %} -

{{ object.category }} {% trans 'quiz' %}, {% trans 'Course:' %} {{ object.course }}

-
{{ object.title }}
-

{{ object.description }}

-

- - {% else %} -
- {% trans 'Program' %} - {{ object }} | {{ object|class_name }} -

-
-
{{ object }} | {{ object|class_name }}
-

{{ object.description }}

-

- {% endif %} - - {% endwith %} - -{% empty %} - -
-
-
- -
- - -
- -
- -
-
-
{% trans 'Search by:' %}
-
    -
  • {% trans 'Program' %} > {% trans 'Title or Description' %}
  • -
  • {% trans 'Course' %} >{% trans 'Title, Code or Description' %}
  • -
  • {% trans 'News And Events' %} > {% trans 'Title, Description or just by typing news or event' %}li> -
  • {% trans 'Quiz' %} >{% trans 'Title, Description or Category(practice, assignment and exam)' %}
  • -
-
-
- -{% endfor %} -
- -{% endblock content %} diff --git a/templates/setting/admin_panel.html b/templates/setting/admin_panel.html deleted file mode 100644 index 4f214eba..00000000 --- a/templates/setting/admin_panel.html +++ /dev/null @@ -1,76 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} -{% load static %} - -{% block content %} - - - -
{% trans 'Admin Panel' %}
-
-
- -{% include 'snippets/messages.html' %} - -
-
-
-
- {% trans 'Manage' %} {% trans 'Lecturers' %} » -

CRUD (Create, Retrieve, Update & Delete) lecturers

-
- -
- {% trans 'Manage' %} {% trans 'Students' %} » -

CRUD (Create, Retrieve, Update & Delete) {% trans 'students' %}

-
- -
- {% trans 'Manage' %} {% trans 'Session' %} » -

CRUD (Create, Retrieve, Update & Delete) {% trans 'sessions' %}

-
- -
- {% trans 'Manage' %} {% trans 'Semester' %} » -

CRUD (Create, Retrieve, Update & Delete) {% trans 'semesters' %}

-
-
-
-
- {% trans 'Course Add' %} & {% trans 'Drop' %} - -

{% trans 'Switch' %} - ON or OFF -

-
- -
- {% trans 'Manage' %} {% trans 'Programs' %} & {% trans 'Courses' %} » -

CRUD (Create, Retrieve, Update & Delete) {% trans 'programs' %}

-
- -
- {% trans 'Manage' %} {% trans 'Course Allocations' %} » -

CRUD (Create, Retrieve, Update & Delete) {% trans 'course allocations' %}

-
- -
- {% trans 'Manage' %} {% trans 'News' %} & {% trans 'Events' %} » -

CRUD (Create, Retrieve, Update & Delete) {% trans 'News' %} & {% trans 'Events' %}

-
-
-
-
- -{% endblock %} diff --git a/templates/setting/password_change.html b/templates/setting/password_change.html deleted file mode 100644 index 30a1cc75..00000000 --- a/templates/setting/password_change.html +++ /dev/null @@ -1,32 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} -{% load static %} - -{% block content %} - - - -{% include 'snippets/messages.html' %} - -
-
-
-

{% trans 'Change Password' %}

-
-
{% csrf_token %} - {{ form|crispy }} -

-
-
-
-
-
- -{% endblock content %} diff --git a/templates/setting/profile_info_change.html b/templates/setting/profile_info_change.html deleted file mode 100644 index 923cc62b..00000000 --- a/templates/setting/profile_info_change.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} -{% load static %} - -{% block content %} - - - -

{% trans 'Account Settings' %}

- -{% include 'snippets/messages.html' %} - -
{% csrf_token %} -
-
-
-
{% trans 'Email' %} & {% trans 'Personal Info' %}
-
- {{ form.email|as_crispy_field }} - {{ form.first_name|as_crispy_field }} - {{ form.last_name|as_crispy_field }} - {{ form.gender|as_crispy_field }} - {{ form.phone|as_crispy_field }} - {{ form.address|as_crispy_field }} -
-
-
-
-
-

{% trans 'Others' %}

-
- {{ form.picture|as_crispy_field }} -
-
-
-
- -
-{% endblock content %} diff --git a/templates/sidebar.html b/templates/sidebar.html deleted file mode 100644 index 58997af5..00000000 --- a/templates/sidebar.html +++ /dev/null @@ -1,157 +0,0 @@ -{% load static %} -{% load i18n %} - -
- - -
-
- -
{% csrf_token %} - - -
- -

- {% trans 'Read our' %} {% trans 'Privacy' %} {% trans 'and' %} {% trans 'Terms of use.' %} -
SkyLearn © -
-

- - {% trans '⭐️ Star This Project' %} - -
-
-
- -{% block js %} - -{% endblock js %} \ No newline at end of file diff --git a/templates/snippets/filter_form.html b/templates/snippets/filter_form.html deleted file mode 100644 index 8098b953..00000000 --- a/templates/snippets/filter_form.html +++ /dev/null @@ -1,16 +0,0 @@ -{% load i18n %} -{% if filter.form %} - -
-
- {% for field in filter.form %} -
- {{ field }} -
- {% endfor %} - -
-
-{% endif %} \ No newline at end of file diff --git a/templates/snippets/messages.html b/templates/snippets/messages.html deleted file mode 100644 index 51fae2b1..00000000 --- a/templates/snippets/messages.html +++ /dev/null @@ -1,18 +0,0 @@ - -{% if messages %} - {% for message in messages %} - {% if message.tags == 'error' %} -
- {{ message }} -
- {% elif message.tags == 'warning' %} -
- {{ message }} -
- {% else %} -
- {{ message }} -
- {% endif %} - {% endfor %} -{% endif %} \ No newline at end of file diff --git a/templates/term.html b/templates/term.html deleted file mode 100644 index 611a51e4..00000000 --- a/templates/term.html +++ /dev/null @@ -1,69 +0,0 @@ - - diff --git a/templates/upload/upload_file_form.html b/templates/upload/upload_file_form.html deleted file mode 100644 index ff2e9ea2..00000000 --- a/templates/upload/upload_file_form.html +++ /dev/null @@ -1,41 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} - -{% block content %} - - - -

{% trans 'File upload for' %} {{ course|truncatechars:25 }}

-

- -{% include 'snippets/messages.html' %} - -
-
-
-

{% trans 'File Upload Form' %}

- -
-
{% csrf_token %} - {{ form|crispy }} - -
- - {% trans 'Cancel' %} -
-
-
-
-
- -{% endblock content %} diff --git a/templates/upload/upload_video_form.html b/templates/upload/upload_video_form.html deleted file mode 100644 index cded974b..00000000 --- a/templates/upload/upload_video_form.html +++ /dev/null @@ -1,40 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load crispy_forms_tags %} - -{% block content %} - - - -

{% trans 'Video upload for' %} {{ course|truncatechars:25 }}

-

- -{% include 'snippets/messages.html' %} - -
-
-
-

{% trans 'Video Upload Form' %}

-
-
{% csrf_token %} - {{ form|crispy }} - -
- - {% trans 'Cancel' %} -
-
-
-
-
- -{% endblock content %} diff --git a/templates/upload/video_single.html b/templates/upload/video_single.html deleted file mode 100644 index 8721d84d..00000000 --- a/templates/upload/video_single.html +++ /dev/null @@ -1,31 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{{ video.title }} | {% trans 'Learning management system' %}{% endblock title %} -{% load static %} - -{% block content %} - - - -

{{ video.title }}

-

- -
-
-

{{ video.timestamp|timesince }} {% trans 'ago' %}

- {% if video.summary %} -

{{ video.summary }}

- {% else %} - {% trans 'No video description set.' %} - {% endif %} -
- -{% endblock content %}