From 5b2241aaaf8f52c3ba425233e8d8cb815197fbb8 Mon Sep 17 00:00:00 2001 From: Antoine Keranflec'h Date: Thu, 10 Oct 2024 15:38:48 +0200 Subject: [PATCH 001/189] fix(17542) add contact to tunnels --- netbox/vpn/models/tunnels.py | 6 +++--- netbox/vpn/views.py | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/netbox/vpn/models/tunnels.py b/netbox/vpn/models/tunnels.py index 6f4fa4182..6224959eb 100644 --- a/netbox/vpn/models/tunnels.py +++ b/netbox/vpn/models/tunnels.py @@ -6,7 +6,7 @@ from django.urls import reverse from django.utils.translation import gettext_lazy as _ from netbox.models import ChangeLoggedModel, OrganizationalModel, PrimaryModel -from netbox.models.features import CustomFieldsMixin, CustomLinksMixin, TagsMixin +from netbox.models.features import CustomFieldsMixin, CustomLinksMixin, TagsMixin, ContactsMixin from vpn.choices import * __all__ = ( @@ -16,7 +16,7 @@ __all__ = ( ) -class TunnelGroup(OrganizationalModel): +class TunnelGroup(ContactsMixin, OrganizationalModel): """ An administrative grouping of Tunnels. This can be used to correlate peer-to-peer tunnels which form a mesh, for example. @@ -30,7 +30,7 @@ class TunnelGroup(OrganizationalModel): return reverse('vpn:tunnelgroup', args=[self.pk]) -class Tunnel(PrimaryModel): +class Tunnel(ContactsMixin, PrimaryModel): name = models.CharField( verbose_name=_('name'), max_length=100, diff --git a/netbox/vpn/views.py b/netbox/vpn/views.py index ac8ce3667..73b2b04c0 100644 --- a/netbox/vpn/views.py +++ b/netbox/vpn/views.py @@ -62,6 +62,9 @@ class TunnelGroupBulkDeleteView(generic.BulkDeleteView): filterset = filtersets.TunnelGroupFilterSet table = tables.TunnelGroupTable +@register_model_view(Tunnel, 'contacts') +class TunnelGroupContactsView(ObjectContactsView): + queryset = TunnelGroup.objects.all() # # Tunnels @@ -121,6 +124,9 @@ class TunnelBulkDeleteView(generic.BulkDeleteView): filterset = filtersets.TunnelFilterSet table = tables.TunnelTable +@register_model_view(Tunnel, 'contacts') +class TunnelContactsView(ObjectContactsView): + queryset = Tunnel.objects.all() # # Tunnel terminations From 2a8728544c7fd1d3399f51d7de87c14b46f8a2d5 Mon Sep 17 00:00:00 2001 From: Antoine Keranflec'h Date: Fri, 31 Jan 2025 08:48:35 +0100 Subject: [PATCH 002/189] fix(pep) fix pep8 compliancy --- netbox/vpn/views.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/netbox/vpn/views.py b/netbox/vpn/views.py index 55d47ca62..1bcb99716 100644 --- a/netbox/vpn/views.py +++ b/netbox/vpn/views.py @@ -67,6 +67,7 @@ class TunnelGroupBulkDeleteView(generic.BulkDeleteView): filterset = filtersets.TunnelGroupFilterSet table = tables.TunnelGroupTable + @register_model_view(Tunnel, 'contacts') class TunnelGroupContactsView(ObjectContactsView): queryset = TunnelGroup.objects.all() @@ -75,6 +76,7 @@ class TunnelGroupContactsView(ObjectContactsView): # Tunnels # + @register_model_view(Tunnel, 'list', path='', detail=False) class TunnelListView(generic.ObjectListView): queryset = Tunnel.objects.annotate( @@ -134,6 +136,7 @@ class TunnelBulkDeleteView(generic.BulkDeleteView): filterset = filtersets.TunnelFilterSet table = tables.TunnelTable + @register_model_view(Tunnel, 'contacts') class TunnelContactsView(ObjectContactsView): queryset = Tunnel.objects.all() @@ -142,6 +145,7 @@ class TunnelContactsView(ObjectContactsView): # Tunnel terminations # + @register_model_view(TunnelTermination, 'list', path='', detail=False) class TunnelTerminationListView(generic.ObjectListView): queryset = TunnelTermination.objects.all() From 8e91db0394634921741942959c3b6c630e4f47d9 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 5 Feb 2025 09:40:22 -0500 Subject: [PATCH 003/189] Misc cleanup of the release checklist --- docs/development/release-checklist.md | 27 ++++++++++++++++++++++++--- docs/development/translations.md | 5 ++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/docs/development/release-checklist.md b/docs/development/release-checklist.md index c74fcf8f6..5b31a6391 100644 --- a/docs/development/release-checklist.md +++ b/docs/development/release-checklist.md @@ -8,6 +8,8 @@ This documentation describes the process of packaging and publishing a new NetBo While major releases generally introduce some very substantial change to the application, they are typically treated the same as minor version increments for the purpose of release packaging. +For patch releases (e.g. upgrading from v4.2.2 to v4.2.3), begin at the [patch releases](#patch-releases) heading below. For minor or major releases, complete the entire checklist. + ## Minor Version Releases ### Address Constrained Dependencies @@ -85,7 +87,20 @@ In cases where upgrading a dependency to its most recent release is breaking, it ### Update UI Dependencies -Check whether any UI dependencies (JavaScript packages, fonts, etc.) need to be updated by running `yarn outdated` from within the `project-static/` directory. [Upgrade these dependencies](./web-ui.md#updating-dependencies) as necessary, then run `yarn bundle` to generate the necessary files for distribution. +Check whether any UI dependencies (JavaScript packages, fonts, etc.) need to be updated by running `yarn outdated` from within the `project-static/` directory. [Upgrade these dependencies](./web-ui.md#updating-dependencies) as necessary, then run `yarn bundle` to generate the necessary files for distribution: + +``` +$ yarn bundle +yarn run v1.22.19 +$ node bundle.js +✅ Bundled source file 'styles/external.scss' to 'netbox-external.css' +✅ Bundled source file 'styles/netbox.scss' to 'netbox.css' +✅ Bundled source file 'styles/svg/rack_elevation.scss' to 'rack_elevation.css' +✅ Bundled source file 'styles/svg/cable_trace.scss' to 'cable_trace.css' +✅ Bundled source file 'index.ts' to 'netbox.js' +✅ Copied graphiql files +Done in 1.00s. +``` ### Rebuild the Device Type Definition Schema @@ -116,9 +131,12 @@ Then, compile these portable (`.po`) files for use in the application: ### Update Version and Changelog -* Update the version and published date in `release.yaml` with the current version & date. Add a designation (e.g.g `beta1`) if applicable. +* Update the version number and date in `netbox/release.yaml`. Add or remove the designation (e.g. `beta1`) if applicable. * Update the example version numbers in the feature request and bug report templates under `.github/ISSUE_TEMPLATES/`. -* Replace the "FUTURE" placeholder in the release notes with the current date. +* Add a section for this release at the top of the changelog page for the minor version (e.g. `docs/release-notes/version-4.2.md`) listing all relevant changes made in this release. + +!!! tip + Put yourself in the shoes of the user when recording change notes. Focus on the effect that each change has for the end user, rather than the specific bits of code that were modified in a PR. Ensure that each message conveys meaning absent context of the initial feature request or bug report. Remember to include key words or phrases (such as exception names) that can be easily searched. ### Submit a Pull Request @@ -126,6 +144,9 @@ Commit the above changes and submit a pull request titled **"Release vX.Y.Z"** t Once CI has completed and a colleague has reviewed the PR, merge it. This effects a new release in the `main` branch. +!!! warning + To ensure a streamlined review process, the pull request for a release **must** be limited to the changes outlined in this document. A release PR must never include functional changes to the application: Any unrelated "cleanup" needs to be captured in a separate PR prior to the release being shipped. + ### Create a New Release Create a [new release](https://github.com/netbox-community/netbox/releases/new) on GitHub with the following parameters. diff --git a/docs/development/translations.md b/docs/development/translations.md index de8545b97..81b80662f 100644 --- a/docs/development/translations.md +++ b/docs/development/translations.md @@ -30,7 +30,7 @@ To download translated strings automatically, you'll need to: 1. Install the [Transifex CLI client](https://github.com/transifex/cli) 2. Generate a [Transifex API token](https://app.transifex.com/user/settings/api/) -Once you have the client set up, run the following command: +Once you have the client set up, run the following command from the project root (e.g. `/opt/netbox/`): ```no-highlight TX_TOKEN=$TOKEN tx pull @@ -46,6 +46,9 @@ Once retrieved, the updated strings need to be compiled into new `.mo` files so Once any new `.mo` files have been generated, they need to be committed and pushed back up to GitHub. (Again, this is typically done as part of publishing a new NetBox release.) +!!! tip + Run `git status` to check that both `*.mo` & `*.po` files have been updated as expected. + ## Proposing New Languages If you'd like to add support for a new language to NetBox, the first step is to [submit a GitHub issue](https://github.com/netbox-community/netbox/issues/new?assignees=&labels=type%3A+translation&projects=&template=translation.yaml) to capture the proposal. While we'd like to add as many languages as possible, we do need to limit the rate at which new languages are added. New languages will be selected according to community interest and the number of volunteers who sign up as translators. From efa939d0c22471ea2082714ee6a942c761271d80 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Date: Thu, 6 Feb 2025 18:30:25 -0300 Subject: [PATCH 004/189] Fixes: #18241 - Script results log_threshold should default to Default (#18501) * Changed LogLevelChoices order; Changed ScriptResultView to select LogLevelChoices to LOG_DEFAULT and setup the html template to put (All) in the last one * Change LogLevelChoices in ScriptResultView get_table method * Remove default option, add Default string to INFO * Fix scripts.py and reports.py to reflect removing DEFAULT level * fix linting --- netbox/extras/choices.py | 4 +--- netbox/extras/constants.py | 9 ++++----- netbox/extras/reports.py | 2 +- netbox/extras/scripts.py | 2 +- netbox/extras/views.py | 12 ++++++------ netbox/templates/extras/script_result.html | 2 +- 6 files changed, 14 insertions(+), 17 deletions(-) diff --git a/netbox/extras/choices.py b/netbox/extras/choices.py index 4525d8689..3cd7daab4 100644 --- a/netbox/extras/choices.py +++ b/netbox/extras/choices.py @@ -155,7 +155,6 @@ class JournalEntryKindChoices(ChoiceSet): class LogLevelChoices(ChoiceSet): LOG_DEBUG = 'debug' - LOG_DEFAULT = 'default' LOG_INFO = 'info' LOG_SUCCESS = 'success' LOG_WARNING = 'warning' @@ -163,16 +162,15 @@ class LogLevelChoices(ChoiceSet): CHOICES = ( (LOG_DEBUG, _('Debug'), 'teal'), - (LOG_DEFAULT, _('Default'), 'gray'), (LOG_INFO, _('Info'), 'cyan'), (LOG_SUCCESS, _('Success'), 'green'), (LOG_WARNING, _('Warning'), 'yellow'), (LOG_FAILURE, _('Failure'), 'red'), + ) SYSTEM_LEVELS = { LOG_DEBUG: logging.DEBUG, - LOG_DEFAULT: logging.INFO, LOG_INFO: logging.INFO, LOG_SUCCESS: logging.INFO, LOG_WARNING: logging.WARNING, diff --git a/netbox/extras/constants.py b/netbox/extras/constants.py index 123b771f6..fadf59c25 100644 --- a/netbox/extras/constants.py +++ b/netbox/extras/constants.py @@ -138,9 +138,8 @@ DEFAULT_DASHBOARD = [ LOG_LEVEL_RANK = { LogLevelChoices.LOG_DEBUG: 0, - LogLevelChoices.LOG_DEFAULT: 1, - LogLevelChoices.LOG_INFO: 2, - LogLevelChoices.LOG_SUCCESS: 3, - LogLevelChoices.LOG_WARNING: 4, - LogLevelChoices.LOG_FAILURE: 5, + LogLevelChoices.LOG_INFO: 1, + LogLevelChoices.LOG_SUCCESS: 2, + LogLevelChoices.LOG_WARNING: 3, + LogLevelChoices.LOG_FAILURE: 4, } diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py index a70447364..8e58b8aa0 100644 --- a/netbox/extras/reports.py +++ b/netbox/extras/reports.py @@ -15,7 +15,7 @@ class Report(BaseScript): # There is no generic log() equivalent on BaseScript def log(self, message): - self._log(message, None, level=LogLevelChoices.LOG_DEFAULT) + self._log(message, None, level=LogLevelChoices.LOG_INFO) def log_success(self, obj=None, message=None): super().log_success(message, obj) diff --git a/netbox/extras/scripts.py b/netbox/extras/scripts.py index f2bd75a1d..0d9c2181f 100644 --- a/netbox/extras/scripts.py +++ b/netbox/extras/scripts.py @@ -460,7 +460,7 @@ class BaseScript: # Logging # - def _log(self, message, obj=None, level=LogLevelChoices.LOG_DEFAULT): + def _log(self, message, obj=None, level=LogLevelChoices.LOG_INFO): """ Log a message. Do not call this method directly; use one of the log_* wrappers below. """ diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 9cb9dd54a..3672e5336 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -1315,9 +1315,9 @@ class ScriptResultView(TableMixin, generic.ObjectView): index = 0 try: - log_threshold = LOG_LEVEL_RANK[request.GET.get('log_threshold', LogLevelChoices.LOG_DEBUG)] + log_threshold = LOG_LEVEL_RANK[request.GET.get('log_threshold', LogLevelChoices.LOG_INFO)] except KeyError: - log_threshold = LOG_LEVEL_RANK[LogLevelChoices.LOG_DEBUG] + log_threshold = LOG_LEVEL_RANK[LogLevelChoices.LOG_INFO] if job.data: if 'log' in job.data: @@ -1325,7 +1325,7 @@ class ScriptResultView(TableMixin, generic.ObjectView): tests = job.data['tests'] for log in job.data['log']: - log_level = LOG_LEVEL_RANK.get(log.get('status'), LogLevelChoices.LOG_DEFAULT) + log_level = LOG_LEVEL_RANK.get(log.get('status'), LogLevelChoices.LOG_INFO) if log_level >= log_threshold: index += 1 result = { @@ -1348,7 +1348,7 @@ class ScriptResultView(TableMixin, generic.ObjectView): for method, test_data in tests.items(): if 'log' in test_data: for time, status, obj, url, message in test_data['log']: - log_level = LOG_LEVEL_RANK.get(status, LogLevelChoices.LOG_DEFAULT) + log_level = LOG_LEVEL_RANK.get(status, LogLevelChoices.LOG_INFO) if log_level >= log_threshold: index += 1 result = { @@ -1374,9 +1374,9 @@ class ScriptResultView(TableMixin, generic.ObjectView): if job.completed: table = self.get_table(job, request, bulk_actions=False) - log_threshold = request.GET.get('log_threshold', LogLevelChoices.LOG_DEBUG) + log_threshold = request.GET.get('log_threshold', LogLevelChoices.LOG_INFO) if log_threshold not in LOG_LEVEL_RANK: - log_threshold = LogLevelChoices.LOG_DEBUG + log_threshold = LogLevelChoices.LOG_INFO context = { 'script': job.object, diff --git a/netbox/templates/extras/script_result.html b/netbox/templates/extras/script_result.html index 18a28998f..4630640a7 100644 --- a/netbox/templates/extras/script_result.html +++ b/netbox/templates/extras/script_result.html @@ -53,7 +53,7 @@

{% trans "Tagged Item Types" %}

- + - - - + {% with viewname=object_type.content_type.model_class|validated_viewname:"list" %} + {% if viewname %} + + {{ object_type.content_type.name|bettertitle }} + {{ object_type.item_count }} + + {% else %} +
  • + {{ object_type.content_type.name|bettertitle }} + {{ object_type.item_count }} +
  • + {% endif %} + {% endwith %} {% endfor %} -
    {{ object_type.content_type.name|bettertitle }} - {% with viewname=object_type.content_type.model_class|validated_viewname:"list" %} - {% if viewname %} - {{ object_type.item_count }} - {% else %} - {{ object_type.item_count }} - {% endif %} - {% endwith %} -
    +
    {% plugin_right_page object %} @@ -79,7 +80,7 @@

    {% trans "Tagged Objects" %}

    -
    +
    {% render_table taggeditem_table 'inc/table.html' %} {% include 'inc/paginator.html' with paginator=taggeditem_table.paginator page=taggeditem_table.page %}
    From 4b98f74943fcde3d3dad31335cf9a8137e46a03c Mon Sep 17 00:00:00 2001 From: Alexander Haase Date: Mon, 10 Feb 2025 15:42:08 +0100 Subject: [PATCH 011/189] Fixes 18247: Fix dark mode button classes (#18617) --- netbox/dcim/tables/template_code.py | 42 +++++++++---------- .../templates/extras/inc/format_toggle.html | 4 +- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index 4b51cd06a..1c526649b 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -159,8 +159,8 @@ CONSOLEPORT_BUTTONS = """ {% endif %} {% elif perms.dcim.add_cable %} - - + +
    diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index b3334ca87..b9a5f85fb 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -196,7 +196,10 @@ class GetRelatedModelsMixin: ] related_models.extend(extra) - return sorted(related_models, key=lambda x: x[0].model._meta.verbose_name.lower()) + return sorted( + filter(lambda qs: qs[0].exists(), related_models), + key=lambda qs: qs[0].model._meta.verbose_name.lower(), + ) class ViewTab: From 3e1cc0d7f388ae6ffa7442f3b0f9d5deb3b520cf Mon Sep 17 00:00:00 2001 From: Alexander Haase Date: Mon, 10 Feb 2025 17:03:08 +0100 Subject: [PATCH 014/189] Fixes 18208: Consolidate rendering configuration templates (#18604) --- netbox/dcim/views.py | 50 +------------ netbox/extras/views.py | 56 ++++++++++++++ .../object_render_config.html} | 5 +- .../virtualmachine/render_config.html | 75 ------------------- netbox/virtualization/views.py | 50 +------------ 5 files changed, 67 insertions(+), 169 deletions(-) rename netbox/templates/{dcim/device/render_config.html => extras/object_render_config.html} (95%) delete mode 100644 netbox/templates/virtualization/virtualmachine/render_config.html diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 0978747d1..6efdb63f0 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -4,17 +4,15 @@ from django.core.paginator import EmptyPage, PageNotAnInteger from django.db import transaction from django.db.models import Prefetch from django.forms import ModelMultipleChoiceField, MultipleHiddenInput, modelformset_factory -from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ from django.views.generic import View -from jinja2.exceptions import TemplateError from circuits.models import Circuit, CircuitTermination -from extras.views import ObjectConfigContextView +from extras.views import ObjectConfigContextView, ObjectRenderConfigView from ipam.models import ASN, IPAddress, Prefix, VLANGroup from ipam.tables import InterfaceVLANTable, VLANTranslationRuleTable from netbox.constants import DEFAULT_ACTION_PERMISSIONS @@ -2253,54 +2251,14 @@ class DeviceConfigContextView(ObjectConfigContextView): @register_model_view(Device, 'render-config') -class DeviceRenderConfigView(generic.ObjectView): +class DeviceRenderConfigView(ObjectRenderConfigView): queryset = Device.objects.all() - template_name = 'dcim/device/render_config.html' + base_template = 'dcim/device/base.html' tab = ViewTab( label=_('Render Config'), - weight=2100 + weight=2100, ) - def get(self, request, **kwargs): - instance = self.get_object(**kwargs) - context = self.get_extra_context(request, instance) - - # If a direct export has been requested, return the rendered template content as a - # downloadable file. - if request.GET.get('export'): - content = context['rendered_config'] or context['error_message'] - response = HttpResponse(content, content_type='text') - filename = f"{instance.name or 'config'}.txt" - response['Content-Disposition'] = f'attachment; filename="{filename}"' - return response - - return render(request, self.get_template_name(), { - 'object': instance, - 'tab': self.tab, - **context, - }) - - def get_extra_context(self, request, instance): - # Compile context data - context_data = instance.get_config_context() - context_data.update({'device': instance}) - - # Render the config template - rendered_config = None - error_message = None - if config_template := instance.get_config_template(): - try: - rendered_config = config_template.render(context=context_data) - except TemplateError as e: - error_message = _("An error occurred while rendering the template: {error}").format(error=e) - - return { - 'config_template': config_template, - 'context_data': context_data, - 'rendered_config': rendered_config, - 'error_message': error_message, - } - @register_model_view(Device, 'virtual-machines') class DeviceVirtualMachinesView(generic.ObjectChildrenView): diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 3672e5336..86e7f214a 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -10,6 +10,7 @@ from django.utils import timezone from django.utils.module_loading import import_string from django.utils.translation import gettext as _ from django.views.generic import View +from jinja2.exceptions import TemplateError from core.choices import ManagedFileRootPathChoices from core.forms import ManagedFileForm @@ -885,6 +886,61 @@ class ConfigTemplateBulkSyncDataView(generic.BulkSyncDataView): queryset = ConfigTemplate.objects.all() +class ObjectRenderConfigView(generic.ObjectView): + base_template = None + template_name = 'extras/object_render_config.html' + + def get(self, request, **kwargs): + instance = self.get_object(**kwargs) + context = self.get_extra_context(request, instance) + + # If a direct export has been requested, return the rendered template content as a + # downloadable file. + if request.GET.get('export'): + content = context['rendered_config'] or context['error_message'] + response = HttpResponse(content, content_type='text') + filename = f"{instance.name or 'config'}.txt" + response['Content-Disposition'] = f'attachment; filename="{filename}"' + return response + + return render( + request, + self.get_template_name(), + { + 'object': instance, + 'tab': self.tab, + **context, + }, + ) + + def get_extra_context_data(self, request, instance): + return { + f'{instance._meta.model_name}': instance, + } + + def get_extra_context(self, request, instance): + # Compile context data + context_data = instance.get_config_context() + context_data.update(self.get_extra_context_data(request, instance)) + + # Render the config template + rendered_config = None + error_message = None + if config_template := instance.get_config_template(): + try: + rendered_config = config_template.render(context=context_data) + except TemplateError as e: + error_message = _("An error occurred while rendering the template: {error}").format(error=e) + + return { + 'base_template': self.base_template, + 'config_template': config_template, + 'context_data': context_data, + 'rendered_config': rendered_config, + 'error_message': error_message, + } + + # # Image attachments # diff --git a/netbox/templates/dcim/device/render_config.html b/netbox/templates/extras/object_render_config.html similarity index 95% rename from netbox/templates/dcim/device/render_config.html rename to netbox/templates/extras/object_render_config.html index ab2f1c531..b28146ff4 100644 --- a/netbox/templates/dcim/device/render_config.html +++ b/netbox/templates/extras/object_render_config.html @@ -1,4 +1,5 @@ -{% extends 'dcim/device/base.html' %} +{% extends base_template %} +{% load helpers %} {% load static %} {% load i18n %} @@ -67,7 +68,7 @@ {% endif %} {% else %}
    - {% trans "No configuration template has been assigned for this device." %} + {% trans "No configuration template has been assigned." %}
    {% endif %}
    diff --git a/netbox/templates/virtualization/virtualmachine/render_config.html b/netbox/templates/virtualization/virtualmachine/render_config.html deleted file mode 100644 index fa6f1723b..000000000 --- a/netbox/templates/virtualization/virtualmachine/render_config.html +++ /dev/null @@ -1,75 +0,0 @@ -{% extends 'virtualization/virtualmachine/base.html' %} -{% load static %} -{% load i18n %} - -{% block title %}{{ object }} - {% trans "Config" %}{% endblock %} - -{% block content %} -
    -
    -
    -

    {% trans "Config Template" %}

    - - - - - - - - - - - - - -
    {% trans "Config Template" %}{{ config_template|linkify|placeholder }}
    {% trans "Data Source" %}{{ config_template.data_file.source|linkify|placeholder }}
    {% trans "Data File" %}{{ config_template.data_file|linkify|placeholder }}
    -
    -
    -
    -
    -
    -
    -
    -

    - -

    -
    -
    -
    {{ context_data|pprint }}
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - {% if config_template %} - {% if rendered_config %} -
    -

    - {% trans "Rendered Config" %} - - {% trans "Download" %} - -

    -
    {{ rendered_config }}
    -
    - {% else %} -
    -

    {% trans "Error rendering template" %}

    - {% trans error_message %} -
    - {% endif %} - {% else %} -
    - {% trans "No configuration template has been assigned for this virtual machine." %} -
    - {% endif %} -
    -
    -{% endblock %} diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 7682d0fc8..343d346e4 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -1,17 +1,15 @@ from django.contrib import messages from django.db import transaction from django.db.models import Prefetch, Sum -from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from jinja2.exceptions import TemplateError from dcim.filtersets import DeviceFilterSet from dcim.forms import DeviceFilterForm from dcim.models import Device from dcim.tables import DeviceTable -from extras.views import ObjectConfigContextView +from extras.views import ObjectConfigContextView, ObjectRenderConfigView from ipam.models import IPAddress from ipam.tables import InterfaceVLANTable, VLANTranslationRuleTable from netbox.constants import DEFAULT_ACTION_PERMISSIONS @@ -427,54 +425,14 @@ class VirtualMachineConfigContextView(ObjectConfigContextView): @register_model_view(VirtualMachine, 'render-config') -class VirtualMachineRenderConfigView(generic.ObjectView): +class VirtualMachineRenderConfigView(ObjectRenderConfigView): queryset = VirtualMachine.objects.all() - template_name = 'virtualization/virtualmachine/render_config.html' + base_template = 'virtualization/virtualmachine/base.html' tab = ViewTab( label=_('Render Config'), - weight=2100 + weight=2100, ) - def get(self, request, **kwargs): - instance = self.get_object(**kwargs) - context = self.get_extra_context(request, instance) - - # If a direct export has been requested, return the rendered template content as a - # downloadable file. - if request.GET.get('export'): - content = context['rendered_config'] or context['error_message'] - response = HttpResponse(content, content_type='text') - filename = f"{instance.name or 'config'}.txt" - response['Content-Disposition'] = f'attachment; filename="{filename}"' - return response - - return render(request, self.get_template_name(), { - 'object': instance, - 'tab': self.tab, - **context, - }) - - def get_extra_context(self, request, instance): - # Compile context data - context_data = instance.get_config_context() - context_data.update({'virtualmachine': instance}) - - # Render the config template - rendered_config = None - error_message = None - if config_template := instance.get_config_template(): - try: - rendered_config = config_template.render(context=context_data) - except TemplateError as e: - error_message = _("An error occurred while rendering the template: {error}").format(error=e) - - return { - 'config_template': config_template, - 'context_data': context_data, - 'rendered_config': rendered_config, - 'error_message': error_message, - } - @register_model_view(VirtualMachine, 'add', detail=False) @register_model_view(VirtualMachine, 'edit') From 015ef25ca03291ab111c0e86169013f79269a57d Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 18:34:35 +0000 Subject: [PATCH 015/189] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 174 +++++++++---------- 1 file changed, 81 insertions(+), 93 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index 3a6dff6c2..52257d7f2 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-08 05:02+0000\n" +"POT-Creation-Date: 2025-02-10 18:34+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -2218,11 +2218,10 @@ msgstr "" #: netbox/extras/forms/model_forms.py:632 netbox/extras/tables/tables.py:191 #: netbox/extras/tables/tables.py:483 netbox/extras/tables/tables.py:518 #: netbox/templates/core/datasource.html:31 -#: netbox/templates/dcim/device/render_config.html:18 #: netbox/templates/extras/configcontext.html:29 #: netbox/templates/extras/configtemplate.html:21 #: netbox/templates/extras/exporttemplate.html:35 -#: netbox/templates/virtualization/virtualmachine/render_config.html:18 +#: netbox/templates/extras/object_render_config.html:19 msgid "Data Source" msgstr "" @@ -6981,7 +6980,7 @@ msgstr "" #: netbox/netbox/navigation/menu.py:75 #: netbox/virtualization/forms/model_forms.py:122 #: netbox/virtualization/tables/clusters.py:87 -#: netbox/virtualization/views.py:218 +#: netbox/virtualization/views.py:216 msgid "Devices" msgstr "" @@ -6992,14 +6991,12 @@ msgstr "" #: netbox/dcim/tables/devices.py:111 netbox/dcim/tables/devices.py:226 #: netbox/extras/forms/model_forms.py:630 netbox/templates/dcim/device.html:112 -#: netbox/templates/dcim/device/render_config.html:11 -#: netbox/templates/dcim/device/render_config.html:14 #: netbox/templates/dcim/devicerole.html:44 #: netbox/templates/dcim/platform.html:41 #: netbox/templates/extras/configtemplate.html:10 +#: netbox/templates/extras/object_render_config.html:12 +#: netbox/templates/extras/object_render_config.html:15 #: netbox/templates/virtualization/virtualmachine.html:48 -#: netbox/templates/virtualization/virtualmachine/render_config.html:11 -#: netbox/templates/virtualization/virtualmachine/render_config.html:14 #: netbox/virtualization/tables/virtualmachines.py:77 msgid "Config Template" msgstr "" @@ -7057,8 +7054,8 @@ msgid "Power outlets" msgstr "" #: netbox/dcim/tables/devices.py:256 netbox/dcim/tables/devices.py:1112 -#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1144 -#: netbox/dcim/views.py:1388 netbox/dcim/views.py:2139 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1142 +#: netbox/dcim/views.py:1386 netbox/dcim/views.py:2137 #: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:258 #: netbox/templates/dcim/device/base.html:37 #: netbox/templates/dcim/device_list.html:43 @@ -7070,7 +7067,7 @@ msgstr "" #: netbox/templates/virtualization/virtualmachine/base.html:27 #: netbox/templates/virtualization/virtualmachine_list.html:14 #: netbox/virtualization/tables/virtualmachines.py:71 -#: netbox/virtualization/views.py:383 netbox/wireless/tables/wirelesslan.py:63 +#: netbox/virtualization/views.py:381 netbox/wireless/tables/wirelesslan.py:63 msgid "Interfaces" msgstr "" @@ -7096,8 +7093,8 @@ msgid "Module Bay" msgstr "" #: netbox/dcim/tables/devices.py:327 netbox/dcim/tables/devicetypes.py:47 -#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1219 -#: netbox/dcim/views.py:2237 netbox/netbox/navigation/menu.py:103 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1217 +#: netbox/dcim/views.py:2235 netbox/netbox/navigation/menu.py:103 #: netbox/templates/dcim/device/base.html:52 #: netbox/templates/dcim/device_list.html:71 #: netbox/templates/dcim/devicetype/base.html:49 @@ -7226,8 +7223,8 @@ msgstr "" msgid "Instances" msgstr "" -#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:1084 -#: netbox/dcim/views.py:1328 netbox/dcim/views.py:2075 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:1082 +#: netbox/dcim/views.py:1326 netbox/dcim/views.py:2073 #: netbox/netbox/navigation/menu.py:97 #: netbox/templates/dcim/device/base.html:25 #: netbox/templates/dcim/device_list.html:15 @@ -7237,8 +7234,8 @@ msgstr "" msgid "Console Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:1099 -#: netbox/dcim/views.py:1343 netbox/dcim/views.py:2091 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:1097 +#: netbox/dcim/views.py:1341 netbox/dcim/views.py:2089 #: netbox/netbox/navigation/menu.py:98 #: netbox/templates/dcim/device/base.html:28 #: netbox/templates/dcim/device_list.html:22 @@ -7248,8 +7245,8 @@ msgstr "" msgid "Console Server Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1114 -#: netbox/dcim/views.py:1358 netbox/dcim/views.py:2107 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1112 +#: netbox/dcim/views.py:1356 netbox/dcim/views.py:2105 #: netbox/netbox/navigation/menu.py:99 #: netbox/templates/dcim/device/base.html:31 #: netbox/templates/dcim/device_list.html:29 @@ -7259,8 +7256,8 @@ msgstr "" msgid "Power Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1129 -#: netbox/dcim/views.py:1373 netbox/dcim/views.py:2123 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1127 +#: netbox/dcim/views.py:1371 netbox/dcim/views.py:2121 #: netbox/netbox/navigation/menu.py:100 #: netbox/templates/dcim/device/base.html:34 #: netbox/templates/dcim/device_list.html:36 @@ -7270,8 +7267,8 @@ msgstr "" msgid "Power Outlets" msgstr "" -#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1159 -#: netbox/dcim/views.py:1403 netbox/dcim/views.py:2161 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1157 +#: netbox/dcim/views.py:1401 netbox/dcim/views.py:2159 #: netbox/netbox/navigation/menu.py:95 #: netbox/templates/dcim/device/base.html:40 #: netbox/templates/dcim/devicetype/base.html:37 @@ -7280,8 +7277,8 @@ msgstr "" msgid "Front Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1174 -#: netbox/dcim/views.py:1418 netbox/dcim/views.py:2177 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1172 +#: netbox/dcim/views.py:1416 netbox/dcim/views.py:2175 #: netbox/netbox/navigation/menu.py:96 #: netbox/templates/dcim/device/base.html:43 #: netbox/templates/dcim/device_list.html:50 @@ -7291,16 +7288,16 @@ msgstr "" msgid "Rear Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1204 -#: netbox/dcim/views.py:2217 netbox/netbox/navigation/menu.py:102 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1202 +#: netbox/dcim/views.py:2215 netbox/netbox/navigation/menu.py:102 #: netbox/templates/dcim/device/base.html:49 #: netbox/templates/dcim/device_list.html:57 #: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "" -#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1189 -#: netbox/dcim/views.py:1433 netbox/dcim/views.py:2197 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1187 +#: netbox/dcim/views.py:1431 netbox/dcim/views.py:2195 #: netbox/netbox/navigation/menu.py:101 #: netbox/templates/dcim/device/base.html:46 #: netbox/templates/dcim/device_list.html:64 @@ -7365,67 +7362,62 @@ msgstr "" msgid "Test case must set peer_termination_type" msgstr "" -#: netbox/dcim/views.py:139 +#: netbox/dcim/views.py:137 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "" -#: netbox/dcim/views.py:826 netbox/netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:824 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "" -#: netbox/dcim/views.py:845 netbox/templates/dcim/location.html:90 +#: netbox/dcim/views.py:843 netbox/templates/dcim/location.html:90 #: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "" -#: netbox/dcim/views.py:2250 netbox/extras/forms/model_forms.py:577 +#: netbox/dcim/views.py:2248 netbox/extras/forms/model_forms.py:577 #: netbox/templates/extras/configcontext.html:10 #: netbox/virtualization/forms/model_forms.py:232 -#: netbox/virtualization/views.py:424 +#: netbox/virtualization/views.py:422 msgid "Config Context" msgstr "" -#: netbox/dcim/views.py:2260 netbox/virtualization/views.py:434 +#: netbox/dcim/views.py:2258 netbox/virtualization/views.py:432 msgid "Render Config" msgstr "" -#: netbox/dcim/views.py:2295 netbox/virtualization/views.py:469 -#, python-brace-format -msgid "An error occurred while rendering the template: {error}" -msgstr "" - -#: netbox/dcim/views.py:2313 netbox/extras/tables/tables.py:550 +#: netbox/dcim/views.py:2271 netbox/extras/tables/tables.py:550 #: netbox/netbox/navigation/menu.py:255 netbox/netbox/navigation/menu.py:257 -#: netbox/virtualization/views.py:192 +#: netbox/virtualization/views.py:190 msgid "Virtual Machines" msgstr "" -#: netbox/dcim/views.py:3146 +#: netbox/dcim/views.py:3104 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "" -#: netbox/dcim/views.py:3187 +#: netbox/dcim/views.py:3145 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "" -#: netbox/dcim/views.py:3303 netbox/ipam/tables/ip.py:180 +#: netbox/dcim/views.py:3261 netbox/ipam/tables/ip.py:180 msgid "Children" msgstr "" -#: netbox/dcim/views.py:3770 +#: netbox/dcim/views.py:3728 #, python-brace-format msgid "Added member {device}" msgstr "" -#: netbox/dcim/views.py:3819 +#: netbox/dcim/views.py:3777 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "" -#: netbox/dcim/views.py:3832 +#: netbox/dcim/views.py:3790 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "" @@ -9251,12 +9243,11 @@ msgstr "" #: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 #: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 -#: netbox/templates/dcim/device/render_config.html:22 #: netbox/templates/extras/configcontext.html:39 #: netbox/templates/extras/configtemplate.html:31 #: netbox/templates/extras/exporttemplate.html:45 +#: netbox/templates/extras/object_render_config.html:23 #: netbox/templates/generic/bulk_import.html:35 -#: netbox/templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "" @@ -9347,27 +9338,32 @@ msgstr "" msgid "Invalid attribute \"{name}\" for {model}" msgstr "" -#: netbox/extras/views.py:1029 +#: netbox/extras/views.py:933 +#, python-brace-format +msgid "An error occurred while rendering the template: {error}" +msgstr "" + +#: netbox/extras/views.py:1085 msgid "Your dashboard has been reset." msgstr "" -#: netbox/extras/views.py:1075 +#: netbox/extras/views.py:1131 msgid "Added widget: " msgstr "" -#: netbox/extras/views.py:1116 +#: netbox/extras/views.py:1172 msgid "Updated widget: " msgstr "" -#: netbox/extras/views.py:1152 +#: netbox/extras/views.py:1208 msgid "Deleted widget: " msgstr "" -#: netbox/extras/views.py:1154 +#: netbox/extras/views.py:1210 msgid "Error deleting widget: " msgstr "" -#: netbox/extras/views.py:1244 +#: netbox/extras/views.py:1300 msgid "Unable to run script: RQ worker process not running." msgstr "" @@ -11285,7 +11281,7 @@ msgstr "" #: netbox/templates/virtualization/virtualmachine/base.html:32 #: netbox/templates/virtualization/virtualmachine_list.html:21 #: netbox/virtualization/tables/virtualmachines.py:74 -#: netbox/virtualization/views.py:405 +#: netbox/virtualization/views.py:403 msgid "Virtual Disks" msgstr "" @@ -11957,6 +11953,7 @@ msgstr "" #: netbox/templates/extras/webhook.html:75 #: netbox/templates/inc/panel_table.html:13 #: netbox/templates/inc/panels/comments.html:10 +#: netbox/templates/inc/panels/related_objects.html:23 #: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 #: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 #: netbox/templates/users/objectpermission.html:77 @@ -12838,35 +12835,6 @@ msgstr "" msgid "Add Rear Ports" msgstr "" -#: netbox/templates/dcim/device/render_config.html:5 -#: netbox/templates/virtualization/virtualmachine/render_config.html:5 -msgid "Config" -msgstr "" - -#: netbox/templates/dcim/device/render_config.html:35 -#: netbox/templates/virtualization/virtualmachine/render_config.html:35 -msgid "Context Data" -msgstr "" - -#: netbox/templates/dcim/device/render_config.html:55 -#: netbox/templates/virtualization/virtualmachine/render_config.html:55 -msgid "Rendered Config" -msgstr "" - -#: netbox/templates/dcim/device/render_config.html:57 -#: netbox/templates/virtualization/virtualmachine/render_config.html:57 -msgid "Download" -msgstr "" - -#: netbox/templates/dcim/device/render_config.html:64 -#: netbox/templates/virtualization/virtualmachine/render_config.html:64 -msgid "Error rendering template" -msgstr "" - -#: netbox/templates/dcim/device/render_config.html:70 -msgid "No configuration template has been assigned for this device." -msgstr "" - #: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "" @@ -13666,6 +13634,30 @@ msgstr "" msgid "New Journal Entry" msgstr "" +#: netbox/templates/extras/object_render_config.html:6 +msgid "Config" +msgstr "" + +#: netbox/templates/extras/object_render_config.html:36 +msgid "Context Data" +msgstr "" + +#: netbox/templates/extras/object_render_config.html:56 +msgid "Rendered Config" +msgstr "" + +#: netbox/templates/extras/object_render_config.html:58 +msgid "Download" +msgstr "" + +#: netbox/templates/extras/object_render_config.html:65 +msgid "Error rendering template" +msgstr "" + +#: netbox/templates/extras/object_render_config.html:71 +msgid "No configuration template has been assigned." +msgstr "" + #: netbox/templates/extras/report/base.html:30 msgid "Report" msgstr "" @@ -13750,7 +13742,7 @@ msgstr "" msgid "Tagged Item Types" msgstr "" -#: netbox/templates/extras/tag.html:81 +#: netbox/templates/extras/tag.html:82 msgid "Tagged Objects" msgstr "" @@ -14514,10 +14506,6 @@ msgstr "" msgid "Add Virtual Disk" msgstr "" -#: netbox/templates/virtualization/virtualmachine/render_config.html:70 -msgid "No configuration template has been assigned for this virtual machine." -msgstr "" - #: netbox/templates/vpn/ikepolicy.html:10 #: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" @@ -15698,12 +15686,12 @@ msgstr "" msgid "virtual disks" msgstr "" -#: netbox/virtualization/views.py:291 +#: netbox/virtualization/views.py:289 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "" -#: netbox/virtualization/views.py:326 +#: netbox/virtualization/views.py:324 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "" From 154b3a7abbbcb0d700257a250af82315644206cb Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Date: Tue, 11 Feb 2025 10:31:40 -0300 Subject: [PATCH 016/189] Fixes: 18593 - "Create & Add Another" broken for new IP addresses (#18602) * update IPAddressEditView get_extra_addanother_params * Simplify get_extra_addanother_params --- netbox/ipam/views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 007a652ca..d9ee0e685 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -868,6 +868,7 @@ class IPAddressEditView(generic.ObjectEditView): return {'interface': request.GET['interface']} elif 'vminterface' in request.GET: return {'vminterface': request.GET['vminterface']} + return {} # TODO: Standardize or remove this view From 81144926730bf82bc7636279c2aac4a7c716b51f Mon Sep 17 00:00:00 2001 From: Tobias Genannt Date: Thu, 9 Jan 2025 09:38:01 +0100 Subject: [PATCH 017/189] Close #18357: Display author name for plugins --- netbox/core/plugins.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/netbox/core/plugins.py b/netbox/core/plugins.py index 1fcb37f2b..66580c936 100644 --- a/netbox/core/plugins.py +++ b/netbox/core/plugins.py @@ -80,6 +80,13 @@ def get_local_plugins(plugins=None): plugin = importlib.import_module(plugin_name) plugin_config: PluginConfig = plugin.config + if plugin_config.author: + author = PluginAuthor( + name=plugin_config.author, + ) + else: + author = None + local_plugins[plugin_config.name] = Plugin( config_name=plugin_config.name, title_short=plugin_config.verbose_name, @@ -88,6 +95,7 @@ def get_local_plugins(plugins=None): description_short=plugin_config.description, is_local=True, is_installed=True, + author=author, installed_version=plugin_config.version, ) From f8022040b245790796a82b38a67570335a320b74 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 05:02:12 +0000 Subject: [PATCH 018/189] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index 52257d7f2..a6af44ae7 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-10 18:34+0000\n" +"POT-Creation-Date: 2025-02-12 05:01+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -9932,7 +9932,7 @@ msgstr "" #: netbox/ipam/forms/filtersets.py:419 netbox/ipam/models/vlans.py:273 #: netbox/ipam/tables/ip.py:122 netbox/ipam/tables/vlans.py:51 -#: netbox/ipam/views.py:1035 netbox/netbox/navigation/menu.py:199 +#: netbox/ipam/views.py:1036 netbox/netbox/navigation/menu.py:199 #: netbox/netbox/navigation/menu.py:201 msgid "VLANs" msgstr "" @@ -10644,15 +10644,15 @@ msgstr "" msgid "Child Ranges" msgstr "" -#: netbox/ipam/views.py:957 +#: netbox/ipam/views.py:958 msgid "Related IPs" msgstr "" -#: netbox/ipam/views.py:1314 +#: netbox/ipam/views.py:1315 msgid "Device Interfaces" msgstr "" -#: netbox/ipam/views.py:1332 +#: netbox/ipam/views.py:1333 msgid "VM Interfaces" msgstr "" From b1ac20ac19fdd44bf01c2d693ec87d4fc8364382 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Fri, 14 Feb 2025 00:01:11 +0000 Subject: [PATCH 019/189] Update ModuleBay instance name before saving it --- netbox/dcim/models/devices.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 2acd98801..12b0dae18 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -1298,6 +1298,7 @@ class Module(PrimaryModel, ConfigContextModel): else: # ModuleBays must be saved individually for MPTT for instance in create_instances: + instance.name = instance.name.replace(MODULE_TOKEN, str(self.module_bay.position)) instance.save() update_fields = ['module'] From f9431f1c293931046753c145fc7d2b2869667adf Mon Sep 17 00:00:00 2001 From: Alexander Haase Date: Thu, 13 Feb 2025 22:39:11 +0100 Subject: [PATCH 020/189] Replace DurationChoices by JobIntervalChoices --- netbox/core/choices.py | 2 ++ netbox/extras/choices.py | 11 ----------- netbox/extras/forms/reports.py | 4 ++-- netbox/extras/forms/scripts.py | 4 ++-- 4 files changed, 6 insertions(+), 15 deletions(-) diff --git a/netbox/core/choices.py b/netbox/core/choices.py index 442acc26b..6603a7d4f 100644 --- a/netbox/core/choices.py +++ b/netbox/core/choices.py @@ -81,8 +81,10 @@ class JobIntervalChoices(ChoiceSet): CHOICES = ( (INTERVAL_MINUTELY, _('Minutely')), (INTERVAL_HOURLY, _('Hourly')), + (INTERVAL_HOURLY * 12, _('12 hours')), (INTERVAL_DAILY, _('Daily')), (INTERVAL_WEEKLY, _('Weekly')), + (INTERVAL_DAILY * 30, _('30 days')), ) diff --git a/netbox/extras/choices.py b/netbox/extras/choices.py index 3cd7daab4..8258f4aaf 100644 --- a/netbox/extras/choices.py +++ b/netbox/extras/choices.py @@ -178,17 +178,6 @@ class LogLevelChoices(ChoiceSet): } -class DurationChoices(ChoiceSet): - - CHOICES = ( - (60, _('Hourly')), - (720, _('12 hours')), - (1440, _('Daily')), - (10080, _('Weekly')), - (43200, _('30 days')), - ) - - # # Webhooks # diff --git a/netbox/extras/forms/reports.py b/netbox/extras/forms/reports.py index 95692b3f6..72d0417f2 100644 --- a/netbox/extras/forms/reports.py +++ b/netbox/extras/forms/reports.py @@ -1,7 +1,7 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from extras.choices import DurationChoices +from core.choices import JobIntervalChoices from utilities.forms.widgets import DateTimePicker, NumberWithOptions from utilities.datetime import local_now @@ -22,7 +22,7 @@ class ReportForm(forms.Form): min_value=1, label=_("Recurs every"), widget=NumberWithOptions( - options=DurationChoices + options=JobIntervalChoices ), help_text=_("Interval at which this report is re-run (in minutes)") ) diff --git a/netbox/extras/forms/scripts.py b/netbox/extras/forms/scripts.py index 331f7f01f..8ac476544 100644 --- a/netbox/extras/forms/scripts.py +++ b/netbox/extras/forms/scripts.py @@ -1,7 +1,7 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from extras.choices import DurationChoices +from core.choices import JobIntervalChoices from utilities.forms.widgets import DateTimePicker, NumberWithOptions from utilities.datetime import local_now @@ -28,7 +28,7 @@ class ScriptForm(forms.Form): min_value=1, label=_("Recurs every"), widget=NumberWithOptions( - options=DurationChoices + options=JobIntervalChoices ), help_text=_("Interval at which this script is re-run (in minutes)") ) From c324d23634b1a2d192969996ef99f269d5baa66c Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 15 Feb 2025 05:02:03 +0000 Subject: [PATCH 021/189] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 106 +++++++++---------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index a6af44ae7..cab5ed729 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-12 05:01+0000\n" +"POT-Creation-Date: 2025-02-15 05:01+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -28,7 +28,7 @@ msgstr "" msgid "Write Enabled" msgstr "" -#: netbox/account/tables.py:35 netbox/core/choices.py:100 +#: netbox/account/tables.py:35 netbox/core/choices.py:102 #: netbox/core/tables/jobs.py:29 netbox/core/tables/tasks.py:79 #: netbox/extras/tables/tables.py:335 netbox/extras/tables/tables.py:566 #: netbox/templates/account/token.html:43 @@ -1430,7 +1430,7 @@ msgstr "" #: netbox/core/models/jobs.py:85 netbox/dcim/models/cables.py:49 #: netbox/dcim/models/device_components.py:1281 #: netbox/dcim/models/devices.py:645 netbox/dcim/models/devices.py:1177 -#: netbox/dcim/models/devices.py:1404 netbox/dcim/models/power.py:94 +#: netbox/dcim/models/devices.py:1405 netbox/dcim/models/power.py:94 #: netbox/dcim/models/racks.py:288 netbox/dcim/models/sites.py:154 #: netbox/dcim/models/sites.py:270 netbox/ipam/models/ip.py:237 #: netbox/ipam/models/ip.py:508 netbox/ipam/models/ip.py:729 @@ -1561,7 +1561,7 @@ msgstr "" #: netbox/core/models/jobs.py:46 #: netbox/dcim/models/device_component_templates.py:43 #: netbox/dcim/models/device_components.py:52 netbox/dcim/models/devices.py:589 -#: netbox/dcim/models/devices.py:1336 netbox/dcim/models/devices.py:1399 +#: netbox/dcim/models/devices.py:1337 netbox/dcim/models/devices.py:1400 #: netbox/dcim/models/power.py:38 netbox/dcim/models/power.py:89 #: netbox/dcim/models/racks.py:257 netbox/dcim/models/sites.py:142 #: netbox/extras/models/configs.py:36 netbox/extras/models/configs.py:215 @@ -2046,24 +2046,32 @@ msgstr "" msgid "Minutely" msgstr "" -#: netbox/core/choices.py:83 netbox/extras/choices.py:184 +#: netbox/core/choices.py:83 msgid "Hourly" msgstr "" -#: netbox/core/choices.py:84 netbox/extras/choices.py:186 +#: netbox/core/choices.py:84 +msgid "12 hours" +msgstr "" + +#: netbox/core/choices.py:85 msgid "Daily" msgstr "" -#: netbox/core/choices.py:85 netbox/extras/choices.py:187 +#: netbox/core/choices.py:86 msgid "Weekly" msgstr "" -#: netbox/core/choices.py:101 netbox/core/tables/plugins.py:63 +#: netbox/core/choices.py:87 +msgid "30 days" +msgstr "" + +#: netbox/core/choices.py:103 netbox/core/tables/plugins.py:63 #: netbox/templates/generic/object.html:61 msgid "Updated" msgstr "" -#: netbox/core/choices.py:102 +#: netbox/core/choices.py:104 msgid "Deleted" msgstr "" @@ -3531,7 +3539,7 @@ msgstr "" #: netbox/dcim/filtersets.py:1104 netbox/dcim/forms/filtersets.py:819 #: netbox/dcim/forms/filtersets.py:1390 netbox/dcim/forms/filtersets.py:1586 #: netbox/dcim/forms/filtersets.py:1591 netbox/dcim/forms/model_forms.py:1762 -#: netbox/dcim/models/devices.py:1500 netbox/dcim/models/devices.py:1521 +#: netbox/dcim/models/devices.py:1501 netbox/dcim/models/devices.py:1522 #: netbox/virtualization/filtersets.py:196 #: netbox/virtualization/filtersets.py:268 #: netbox/virtualization/forms/filtersets.py:177 @@ -6370,12 +6378,12 @@ msgstr "" msgid "rack face" msgstr "" -#: netbox/dcim/models/devices.py:663 netbox/dcim/models/devices.py:1420 +#: netbox/dcim/models/devices.py:663 netbox/dcim/models/devices.py:1421 #: netbox/virtualization/models/virtualmachines.py:95 msgid "primary IPv4" msgstr "" -#: netbox/dcim/models/devices.py:671 netbox/dcim/models/devices.py:1428 +#: netbox/dcim/models/devices.py:671 netbox/dcim/models/devices.py:1429 #: netbox/virtualization/models/virtualmachines.py:103 msgid "primary IPv6" msgstr "" @@ -6538,68 +6546,68 @@ msgid "" "device ({device})." msgstr "" -#: netbox/dcim/models/devices.py:1341 +#: netbox/dcim/models/devices.py:1342 msgid "domain" msgstr "" -#: netbox/dcim/models/devices.py:1354 netbox/dcim/models/devices.py:1355 +#: netbox/dcim/models/devices.py:1355 netbox/dcim/models/devices.py:1356 msgid "virtual chassis" msgstr "" -#: netbox/dcim/models/devices.py:1367 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "The selected master ({master}) is not assigned to this virtual chassis." msgstr "" -#: netbox/dcim/models/devices.py:1383 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " "form a cross-chassis LAG interfaces." msgstr "" -#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1410 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "" -#: netbox/dcim/models/devices.py:1410 +#: netbox/dcim/models/devices.py:1411 msgid "Numeric identifier unique to the parent device" msgstr "" -#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/dcim/models/devices.py:1439 netbox/extras/models/customfields.py:225 #: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 #: netbox/netbox/models/__init__.py:119 msgid "comments" msgstr "" -#: netbox/dcim/models/devices.py:1454 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device context" msgstr "" -#: netbox/dcim/models/devices.py:1455 +#: netbox/dcim/models/devices.py:1456 msgid "virtual device contexts" msgstr "" -#: netbox/dcim/models/devices.py:1484 +#: netbox/dcim/models/devices.py:1485 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "" -#: netbox/dcim/models/devices.py:1490 +#: netbox/dcim/models/devices.py:1491 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "" -#: netbox/dcim/models/devices.py:1522 +#: netbox/dcim/models/devices.py:1523 msgid "MAC addresses" msgstr "" -#: netbox/dcim/models/devices.py:1551 +#: netbox/dcim/models/devices.py:1552 msgid "" "Cannot unassign MAC Address while it is designated as the primary MAC for an " "object" msgstr "" -#: netbox/dcim/models/devices.py:1555 +#: netbox/dcim/models/devices.py:1556 msgid "" "Cannot reassign MAC Address while it is designated as the primary MAC for an " "object" @@ -7560,15 +7568,7 @@ msgstr "" msgid "Failure" msgstr "" -#: netbox/extras/choices.py:185 -msgid "12 hours" -msgstr "" - -#: netbox/extras/choices.py:188 -msgid "30 days" -msgstr "" - -#: netbox/extras/choices.py:224 +#: netbox/extras/choices.py:213 #: netbox/templates/dcim/virtualchassis_edit.html:107 #: netbox/templates/generic/bulk_add_component.html:68 #: netbox/templates/generic/object_edit.html:47 @@ -7578,11 +7578,11 @@ msgstr "" msgid "Create" msgstr "" -#: netbox/extras/choices.py:225 +#: netbox/extras/choices.py:214 msgid "Update" msgstr "" -#: netbox/extras/choices.py:226 +#: netbox/extras/choices.py:215 #: netbox/templates/circuits/inc/circuit_termination.html:23 #: netbox/templates/dcim/inc/panels/inventory_items.html:37 #: netbox/templates/dcim/powerpanel.html:66 @@ -7597,82 +7597,82 @@ msgstr "" msgid "Delete" msgstr "" -#: netbox/extras/choices.py:250 netbox/netbox/choices.py:59 +#: netbox/extras/choices.py:239 netbox/netbox/choices.py:59 #: netbox/netbox/choices.py:104 msgid "Blue" msgstr "" -#: netbox/extras/choices.py:251 netbox/netbox/choices.py:58 +#: netbox/extras/choices.py:240 netbox/netbox/choices.py:58 #: netbox/netbox/choices.py:105 msgid "Indigo" msgstr "" -#: netbox/extras/choices.py:252 netbox/netbox/choices.py:56 +#: netbox/extras/choices.py:241 netbox/netbox/choices.py:56 #: netbox/netbox/choices.py:106 msgid "Purple" msgstr "" -#: netbox/extras/choices.py:253 netbox/netbox/choices.py:53 +#: netbox/extras/choices.py:242 netbox/netbox/choices.py:53 #: netbox/netbox/choices.py:107 msgid "Pink" msgstr "" -#: netbox/extras/choices.py:254 netbox/netbox/choices.py:52 +#: netbox/extras/choices.py:243 netbox/netbox/choices.py:52 #: netbox/netbox/choices.py:108 msgid "Red" msgstr "" -#: netbox/extras/choices.py:255 netbox/netbox/choices.py:70 +#: netbox/extras/choices.py:244 netbox/netbox/choices.py:70 #: netbox/netbox/choices.py:109 msgid "Orange" msgstr "" -#: netbox/extras/choices.py:256 netbox/netbox/choices.py:68 +#: netbox/extras/choices.py:245 netbox/netbox/choices.py:68 #: netbox/netbox/choices.py:110 msgid "Yellow" msgstr "" -#: netbox/extras/choices.py:257 netbox/netbox/choices.py:65 +#: netbox/extras/choices.py:246 netbox/netbox/choices.py:65 #: netbox/netbox/choices.py:111 msgid "Green" msgstr "" -#: netbox/extras/choices.py:258 netbox/netbox/choices.py:62 +#: netbox/extras/choices.py:247 netbox/netbox/choices.py:62 #: netbox/netbox/choices.py:112 msgid "Teal" msgstr "" -#: netbox/extras/choices.py:259 netbox/netbox/choices.py:61 +#: netbox/extras/choices.py:248 netbox/netbox/choices.py:61 #: netbox/netbox/choices.py:113 msgid "Cyan" msgstr "" -#: netbox/extras/choices.py:260 netbox/netbox/choices.py:114 +#: netbox/extras/choices.py:249 netbox/netbox/choices.py:114 msgid "Gray" msgstr "" -#: netbox/extras/choices.py:261 netbox/netbox/choices.py:76 +#: netbox/extras/choices.py:250 netbox/netbox/choices.py:76 #: netbox/netbox/choices.py:115 msgid "Black" msgstr "" -#: netbox/extras/choices.py:262 netbox/netbox/choices.py:77 +#: netbox/extras/choices.py:251 netbox/netbox/choices.py:77 #: netbox/netbox/choices.py:116 msgid "White" msgstr "" -#: netbox/extras/choices.py:277 netbox/extras/forms/model_forms.py:353 +#: netbox/extras/choices.py:266 netbox/extras/forms/model_forms.py:353 #: netbox/extras/forms/model_forms.py:430 #: netbox/templates/extras/webhook.html:10 msgid "Webhook" msgstr "" -#: netbox/extras/choices.py:278 netbox/extras/forms/model_forms.py:418 +#: netbox/extras/choices.py:267 netbox/extras/forms/model_forms.py:418 #: netbox/templates/extras/script/base.html:29 msgid "Script" msgstr "" -#: netbox/extras/choices.py:279 +#: netbox/extras/choices.py:268 msgid "Notification" msgstr "" From 11514bfb219501dadd9ae1448a76247f65f2a63b Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Date: Tue, 18 Feb 2025 10:41:12 -0300 Subject: [PATCH 022/189] Fixes: #18584 Add rack types column to manufacturers table (#18636) * Add racktype_count annotation to list view queryset, create the LinkedCountColumn in ManufacturerTable * Add Manufacturer field to RackTypeFilterForm --- netbox/dcim/forms/filtersets.py | 2 +- netbox/dcim/tables/devicetypes.py | 13 +++++++++---- netbox/dcim/views.py | 1 + 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 37b8afd17..4dbceb4f5 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -303,7 +303,7 @@ class RackTypeFilterForm(RackBaseFilterForm): model = RackType fieldsets = ( FieldSet('q', 'filter_id', 'tag'), - FieldSet('form_factor', 'width', 'u_height', name=_('Rack Type')), + FieldSet('manufacturer_id', 'form_factor', 'width', 'u_height', name=_('Rack Type')), FieldSet('starting_unit', 'desc_units', name=_('Numbering')), FieldSet('weight', 'max_weight', 'weight_unit', name=_('Weight')), ) diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index a7f8f08e8..91f9f3b47 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -31,6 +31,11 @@ class ManufacturerTable(ContactsColumnMixin, NetBoxTable): verbose_name=_('Name'), linkify=True ) + racktype_count = columns.LinkedCountColumn( + viewname='dcim:racktype_list', + url_params={'manufacturer_id': 'pk'}, + verbose_name=_('Rack Types') + ) devicetype_count = columns.LinkedCountColumn( viewname='dcim:devicetype_list', url_params={'manufacturer_id': 'pk'}, @@ -58,12 +63,12 @@ class ManufacturerTable(ContactsColumnMixin, NetBoxTable): class Meta(NetBoxTable.Meta): model = models.Manufacturer fields = ( - 'pk', 'id', 'name', 'devicetype_count', 'moduletype_count', 'inventoryitem_count', 'platform_count', - 'description', 'slug', 'tags', 'contacts', 'actions', 'created', 'last_updated', + 'pk', 'id', 'name', 'racktype_count', 'devicetype_count', 'moduletype_count', 'inventoryitem_count', + 'platform_count', 'description', 'slug', 'tags', 'contacts', 'actions', 'created', 'last_updated', ) default_columns = ( - 'pk', 'name', 'devicetype_count', 'moduletype_count', 'inventoryitem_count', 'platform_count', - 'description', 'slug', + 'pk', 'name', 'racktype_count', 'devicetype_count', 'moduletype_count', 'inventoryitem_count', + 'platform_count', 'description', 'slug', ) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 6efdb63f0..583b89f1a 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -964,6 +964,7 @@ class RackReservationBulkDeleteView(generic.BulkDeleteView): @register_model_view(Manufacturer, 'list', path='', detail=False) class ManufacturerListView(generic.ObjectListView): queryset = Manufacturer.objects.annotate( + racktype_count=count_related(RackType, 'manufacturer'), devicetype_count=count_related(DeviceType, 'manufacturer'), moduletype_count=count_related(ModuleType, 'manufacturer'), inventoryitem_count=count_related(InventoryItem, 'manufacturer'), From 6c6cb321bf60a03ff23ec2db2f6fcdc4e354098d Mon Sep 17 00:00:00 2001 From: Alexander Haase Date: Tue, 18 Feb 2025 15:11:32 +0100 Subject: [PATCH 023/189] Fixes 18555: Fix model URL generator for plugins (#18607) * Fix model URL generator for plugins * Fix reverse accessor warning * Revert "Fix reverse accessor warning" This reverts commit f07642bb997910205d0acc09fc8df3dde30c7981. * Add URL test case for regular models * Split dummy models Instead of using a single model for testing, one is used for testing the plugin API and a dedicated one is used for testing the NetBox plugin model features. * Fix filterset test case error * Rename test module --------- Co-authored-by: Jeremy Stretch --- netbox/extras/tests/test_filtersets.py | 1 + netbox/netbox/models/__init__.py | 3 +- .../migrations/0002_dummynetboxmodel.py | 30 +++++++++++++++++++ netbox/netbox/tests/dummy_plugin/models.py | 6 ++++ netbox/netbox/tests/dummy_plugin/urls.py | 2 ++ netbox/netbox/tests/dummy_plugin/views.py | 19 +++++++++++- netbox/netbox/tests/test_models.py | 23 ++++++++++++++ 7 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 netbox/netbox/tests/dummy_plugin/migrations/0002_dummynetboxmodel.py create mode 100644 netbox/netbox/tests/test_models.py diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index cf914e665..03d8508af 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -1118,6 +1118,7 @@ class TagTestCase(TestCase, ChangeLoggedFilterSetTests): 'devicerole', 'devicetype', 'dummymodel', # From dummy_plugin + 'dummynetboxmodel', # From dummy_plugin 'eventrule', 'fhrpgroup', 'frontport', diff --git a/netbox/netbox/models/__init__.py b/netbox/netbox/models/__init__.py index b1f7cfd48..ca79d5e7e 100644 --- a/netbox/netbox/models/__init__.py +++ b/netbox/netbox/models/__init__.py @@ -10,6 +10,7 @@ from mptt.models import MPTTModel, TreeForeignKey from netbox.models.features import * from utilities.mptt import TreeManager from utilities.querysets import RestrictedQuerySet +from utilities.views import get_viewname __all__ = ( @@ -42,7 +43,7 @@ class NetBoxFeatureSet( return f'{settings.STATIC_URL}docs/models/{self._meta.app_label}/{self._meta.model_name}/' def get_absolute_url(self): - return reverse(f'{self._meta.app_label}:{self._meta.model_name}', args=[self.pk]) + return reverse(get_viewname(self), args=[self.pk]) # diff --git a/netbox/netbox/tests/dummy_plugin/migrations/0002_dummynetboxmodel.py b/netbox/netbox/tests/dummy_plugin/migrations/0002_dummynetboxmodel.py new file mode 100644 index 000000000..517178bd9 --- /dev/null +++ b/netbox/netbox/tests/dummy_plugin/migrations/0002_dummynetboxmodel.py @@ -0,0 +1,30 @@ +import taggit.managers +import utilities.json +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dummy_plugin', '0001_initial'), + ('extras', '0122_charfield_null_choices'), + ] + + operations = [ + migrations.CreateModel( + name='DummyNetBoxModel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ( + 'custom_field_data', + models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder), + ), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/netbox/netbox/tests/dummy_plugin/models.py b/netbox/netbox/tests/dummy_plugin/models.py index 9bd39a46b..ed4522c65 100644 --- a/netbox/netbox/tests/dummy_plugin/models.py +++ b/netbox/netbox/tests/dummy_plugin/models.py @@ -1,5 +1,7 @@ from django.db import models +from netbox.models import NetBoxModel + class DummyModel(models.Model): name = models.CharField( @@ -11,3 +13,7 @@ class DummyModel(models.Model): class Meta: ordering = ['name'] + + +class DummyNetBoxModel(NetBoxModel): + pass diff --git a/netbox/netbox/tests/dummy_plugin/urls.py b/netbox/netbox/tests/dummy_plugin/urls.py index 9e383ffe2..6cdd48f7e 100644 --- a/netbox/netbox/tests/dummy_plugin/urls.py +++ b/netbox/netbox/tests/dummy_plugin/urls.py @@ -6,4 +6,6 @@ from . import views urlpatterns = ( path('models/', views.DummyModelsView.as_view(), name='dummy_model_list'), path('models/add/', views.DummyModelAddView.as_view(), name='dummy_model_add'), + + path('netboxmodel//', views.DummyNetBoxModelView.as_view(), name='dummynetboxmodel'), ) diff --git a/netbox/netbox/tests/dummy_plugin/views.py b/netbox/netbox/tests/dummy_plugin/views.py index 82f250fc1..3aac26cf3 100644 --- a/netbox/netbox/tests/dummy_plugin/views.py +++ b/netbox/netbox/tests/dummy_plugin/views.py @@ -5,12 +5,17 @@ from django.http import HttpResponse from django.views.generic import View from dcim.models import Site +from netbox.views import generic from utilities.views import register_model_view -from .models import DummyModel +from .models import DummyModel, DummyNetBoxModel # Trigger registration of custom column from .tables import mycol # noqa: F401 +# +# DummyModel +# + class DummyModelsView(View): def get(self, request): @@ -32,6 +37,18 @@ class DummyModelAddView(View): return HttpResponse("Instance created") +# +# DummyNetBoxModel +# + +class DummyNetBoxModelView(generic.ObjectView): + queryset = DummyNetBoxModel.objects.all() + + +# +# API +# + @register_model_view(Site, 'extra', path='other-stuff') class ExtraCoreModelView(View): diff --git a/netbox/netbox/tests/test_models.py b/netbox/netbox/tests/test_models.py new file mode 100644 index 000000000..3da4144c2 --- /dev/null +++ b/netbox/netbox/tests/test_models.py @@ -0,0 +1,23 @@ +from unittest import skipIf + +from django.conf import settings +from django.test import TestCase + +from core.models import ObjectChange +from netbox.tests.dummy_plugin.models import DummyNetBoxModel + + +class ModelTest(TestCase): + + def test_get_absolute_url(self): + m = ObjectChange() + m.pk = 123 + + self.assertEqual(m.get_absolute_url(), f'/core/changelog/{m.pk}/') + + @skipIf('netbox.tests.dummy_plugin' not in settings.PLUGINS, "dummy_plugin not in settings.PLUGINS") + def test_get_absolute_url_plugin(self): + m = DummyNetBoxModel() + m.pk = 123 + + self.assertEqual(m.get_absolute_url(), f'/plugins/dummy-plugin/netboxmodel/{m.pk}/') From 70dddb673b82c476ec5ce09570b41baa10597aae Mon Sep 17 00:00:00 2001 From: Jason Novinger Date: Tue, 18 Feb 2025 12:33:05 -0600 Subject: [PATCH 024/189] Fixes #18585: filtering circuits by location (#18641) * Fixes #18585: filtering circuits by location This also fixes a related issue where selected filter is not shown in the filter form. Changes: - Adds `CircuitFilterSet.location_id` field to enable filtering with incoming GET params - Adds `CirciotFilterForm.location_id` field to enable filtering from list form - Adds `location_id` to the Location fieldset on `CircuitFilterForm` * Adds test for new CircuitFilterset.location_id filter --- netbox/circuits/filtersets.py | 5 +++++ netbox/circuits/forms/filtersets.py | 7 ++++++- netbox/circuits/tests/test_filtersets.py | 24 ++++++++++++++++++++++-- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index 964f69f83..188b5343e 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -234,6 +234,11 @@ class CircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilte to_field_name='slug', label=_('Site (slug)'), ) + location_id = django_filters.ModelMultipleChoiceFilter( + field_name='terminations___location', + label=_('Location (ID)'), + queryset=Location.objects.all(), + ) termination_a_id = django_filters.ModelMultipleChoiceFilter( queryset=CircuitTermination.objects.all(), label=_('Termination A (ID)'), diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index aefc62655..297af5e71 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -126,7 +126,7 @@ class CircuitFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFi 'type_id', 'status', 'install_date', 'termination_date', 'commit_rate', 'distance', 'distance_unit', name=_('Attributes') ), - FieldSet('region_id', 'site_group_id', 'site_id', name=_('Location')), + FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', name=_('Location')), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), ) @@ -181,6 +181,11 @@ class CircuitFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFi }, label=_('Site') ) + location_id = DynamicModelMultipleChoiceField( + queryset=Location.objects.all(), + required=False, + label=_('Location') + ) install_date = forms.DateField( label=_('Install date'), required=False, diff --git a/netbox/circuits/tests/test_filtersets.py b/netbox/circuits/tests/test_filtersets.py index b32abd34e..91077ee64 100644 --- a/netbox/circuits/tests/test_filtersets.py +++ b/netbox/circuits/tests/test_filtersets.py @@ -3,8 +3,10 @@ from django.test import TestCase from circuits.choices import * from circuits.filtersets import * from circuits.models import * -from dcim.choices import InterfaceTypeChoices -from dcim.models import Cable, Device, DeviceRole, DeviceType, Interface, Manufacturer, Region, Site, SiteGroup +from dcim.choices import InterfaceTypeChoices, LocationStatusChoices +from dcim.models import ( + Cable, Device, DeviceRole, DeviceType, Interface, Location, Manufacturer, Region, Site, SiteGroup +) from ipam.models import ASN, RIR from netbox.choices import DistanceUnitChoices from tenancy.models import Tenant, TenantGroup @@ -225,6 +227,17 @@ class CircuitTestCase(TestCase, ChangeLoggedFilterSetTests): ) ProviderNetwork.objects.bulk_create(provider_networks) + locations = ( + Location.objects.create( + site=sites[0], name='Test Location 1', slug='test-location-1', + status=LocationStatusChoices.STATUS_ACTIVE, + ), + Location.objects.create( + site=sites[1], name='Test Location 2', slug='test-location-2', + status=LocationStatusChoices.STATUS_ACTIVE, + ), + ) + circuits = ( Circuit( provider=providers[0], @@ -305,7 +318,9 @@ class CircuitTestCase(TestCase, ChangeLoggedFilterSetTests): circuit_terminations = (( CircuitTermination(circuit=circuits[0], termination=sites[0], term_side='A'), + CircuitTermination(circuit=circuits[0], termination=locations[0], term_side='Z'), CircuitTermination(circuit=circuits[1], termination=sites[1], term_side='A'), + CircuitTermination(circuit=circuits[1], termination=locations[1], term_side='Z'), CircuitTermination(circuit=circuits[2], termination=sites[2], term_side='A'), CircuitTermination(circuit=circuits[3], termination=provider_networks[0], term_side='A'), CircuitTermination(circuit=circuits[4], termination=provider_networks[1], term_side='A'), @@ -395,6 +410,11 @@ class CircuitTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'site': [sites[0].slug, sites[1].slug]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_location(self): + location_ids = Location.objects.values_list('id', flat=True)[:2] + params = {'location_id': location_ids} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_tenant(self): tenants = Tenant.objects.all()[:2] params = {'tenant_id': [tenants[0].pk, tenants[1].pk]} From 57ef44706a7cfb1abb3aac1f49206ae216f2bba8 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 19 Feb 2025 05:02:03 +0000 Subject: [PATCH 025/189] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 287 ++++++++++--------- 1 file changed, 145 insertions(+), 142 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index cab5ed729..55d263183 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-15 05:01+0000\n" +"POT-Creation-Date: 2025-02-19 05:01+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -158,7 +158,7 @@ msgid "Spoke" msgstr "" #: netbox/circuits/filtersets.py:37 netbox/circuits/filtersets.py:204 -#: netbox/circuits/filtersets.py:279 netbox/dcim/base_filtersets.py:22 +#: netbox/circuits/filtersets.py:284 netbox/dcim/base_filtersets.py:22 #: netbox/dcim/filtersets.py:99 netbox/dcim/filtersets.py:153 #: netbox/dcim/filtersets.py:213 netbox/dcim/filtersets.py:334 #: netbox/dcim/filtersets.py:465 netbox/dcim/filtersets.py:1022 @@ -170,7 +170,7 @@ msgid "Region (ID)" msgstr "" #: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211 -#: netbox/circuits/filtersets.py:286 netbox/dcim/base_filtersets.py:29 +#: netbox/circuits/filtersets.py:291 netbox/dcim/base_filtersets.py:29 #: netbox/dcim/filtersets.py:106 netbox/dcim/filtersets.py:159 #: netbox/dcim/filtersets.py:220 netbox/dcim/filtersets.py:341 #: netbox/dcim/filtersets.py:472 netbox/dcim/filtersets.py:1029 @@ -182,7 +182,7 @@ msgid "Region (slug)" msgstr "" #: netbox/circuits/filtersets.py:50 netbox/circuits/filtersets.py:217 -#: netbox/circuits/filtersets.py:292 netbox/dcim/base_filtersets.py:35 +#: netbox/circuits/filtersets.py:297 netbox/dcim/base_filtersets.py:35 #: netbox/dcim/filtersets.py:129 netbox/dcim/filtersets.py:226 #: netbox/dcim/filtersets.py:347 netbox/dcim/filtersets.py:478 #: netbox/dcim/filtersets.py:1035 netbox/dcim/filtersets.py:1382 @@ -193,7 +193,7 @@ msgid "Site group (ID)" msgstr "" #: netbox/circuits/filtersets.py:57 netbox/circuits/filtersets.py:224 -#: netbox/circuits/filtersets.py:299 netbox/dcim/base_filtersets.py:42 +#: netbox/circuits/filtersets.py:304 netbox/dcim/base_filtersets.py:42 #: netbox/dcim/filtersets.py:136 netbox/dcim/filtersets.py:233 #: netbox/dcim/filtersets.py:354 netbox/dcim/filtersets.py:485 #: netbox/dcim/filtersets.py:1042 netbox/dcim/filtersets.py:1389 @@ -205,7 +205,7 @@ msgstr "" #: netbox/circuits/filtersets.py:62 netbox/circuits/forms/filtersets.py:59 #: netbox/circuits/forms/filtersets.py:182 -#: netbox/circuits/forms/filtersets.py:235 +#: netbox/circuits/forms/filtersets.py:240 #: netbox/circuits/tables/circuits.py:129 netbox/dcim/forms/bulk_edit.py:172 #: netbox/dcim/forms/bulk_edit.py:333 netbox/dcim/forms/bulk_edit.py:686 #: netbox/dcim/forms/bulk_edit.py:891 netbox/dcim/forms/bulk_import.py:133 @@ -252,7 +252,7 @@ msgid "Site" msgstr "" #: netbox/circuits/filtersets.py:68 netbox/circuits/filtersets.py:235 -#: netbox/circuits/filtersets.py:310 netbox/dcim/base_filtersets.py:53 +#: netbox/circuits/filtersets.py:315 netbox/dcim/base_filtersets.py:53 #: netbox/dcim/filtersets.py:243 netbox/dcim/filtersets.py:364 #: netbox/dcim/filtersets.py:459 netbox/extras/filtersets.py:531 #: netbox/ipam/filtersets.py:243 netbox/ipam/filtersets.py:958 @@ -272,31 +272,31 @@ msgid "ASN" msgstr "" #: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 -#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:333 -#: netbox/circuits/filtersets.py:401 netbox/circuits/filtersets.py:477 -#: netbox/circuits/filtersets.py:545 netbox/ipam/filtersets.py:248 +#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:338 +#: netbox/circuits/filtersets.py:406 netbox/circuits/filtersets.py:482 +#: netbox/circuits/filtersets.py:550 netbox/ipam/filtersets.py:248 msgid "Provider (ID)" msgstr "" #: netbox/circuits/filtersets.py:107 netbox/circuits/filtersets.py:134 -#: netbox/circuits/filtersets.py:168 netbox/circuits/filtersets.py:339 -#: netbox/circuits/filtersets.py:483 netbox/circuits/filtersets.py:551 +#: netbox/circuits/filtersets.py:168 netbox/circuits/filtersets.py:344 +#: netbox/circuits/filtersets.py:488 netbox/circuits/filtersets.py:556 #: netbox/ipam/filtersets.py:254 msgid "Provider (slug)" msgstr "" -#: netbox/circuits/filtersets.py:173 netbox/circuits/filtersets.py:488 -#: netbox/circuits/filtersets.py:556 +#: netbox/circuits/filtersets.py:173 netbox/circuits/filtersets.py:493 +#: netbox/circuits/filtersets.py:561 msgid "Provider account (ID)" msgstr "" -#: netbox/circuits/filtersets.py:179 netbox/circuits/filtersets.py:494 -#: netbox/circuits/filtersets.py:562 +#: netbox/circuits/filtersets.py:179 netbox/circuits/filtersets.py:499 +#: netbox/circuits/filtersets.py:567 msgid "Provider account (account)" msgstr "" -#: netbox/circuits/filtersets.py:184 netbox/circuits/filtersets.py:498 -#: netbox/circuits/filtersets.py:567 +#: netbox/circuits/filtersets.py:184 netbox/circuits/filtersets.py:503 +#: netbox/circuits/filtersets.py:572 msgid "Provider network (ID)" msgstr "" @@ -308,7 +308,7 @@ msgstr "" msgid "Circuit type (slug)" msgstr "" -#: netbox/circuits/filtersets.py:229 netbox/circuits/filtersets.py:304 +#: netbox/circuits/filtersets.py:229 netbox/circuits/filtersets.py:309 #: netbox/dcim/base_filtersets.py:47 netbox/dcim/filtersets.py:237 #: netbox/dcim/filtersets.py:358 netbox/dcim/filtersets.py:453 #: netbox/dcim/filtersets.py:1046 netbox/dcim/filtersets.py:1394 @@ -319,12 +319,20 @@ msgstr "" msgid "Site (ID)" msgstr "" -#: netbox/circuits/filtersets.py:239 netbox/circuits/filtersets.py:243 +#: netbox/circuits/filtersets.py:239 netbox/circuits/filtersets.py:321 +#: netbox/dcim/base_filtersets.py:59 netbox/dcim/filtersets.py:259 +#: netbox/dcim/filtersets.py:370 netbox/dcim/filtersets.py:491 +#: netbox/dcim/filtersets.py:1058 netbox/dcim/filtersets.py:1405 +#: netbox/dcim/filtersets.py:2305 +msgid "Location (ID)" +msgstr "" + +#: netbox/circuits/filtersets.py:244 netbox/circuits/filtersets.py:248 msgid "Termination A (ID)" msgstr "" -#: netbox/circuits/filtersets.py:268 netbox/circuits/filtersets.py:370 -#: netbox/circuits/filtersets.py:532 netbox/core/filtersets.py:77 +#: netbox/circuits/filtersets.py:273 netbox/circuits/filtersets.py:375 +#: netbox/circuits/filtersets.py:537 netbox/core/filtersets.py:77 #: netbox/core/filtersets.py:136 netbox/core/filtersets.py:173 #: netbox/dcim/filtersets.py:752 netbox/dcim/filtersets.py:1363 #: netbox/dcim/filtersets.py:2400 netbox/extras/filtersets.py:41 @@ -348,12 +356,12 @@ msgstr "" msgid "Search" msgstr "" -#: netbox/circuits/filtersets.py:272 netbox/circuits/forms/bulk_edit.py:195 +#: netbox/circuits/filtersets.py:277 netbox/circuits/forms/bulk_edit.py:195 #: netbox/circuits/forms/bulk_edit.py:284 #: netbox/circuits/forms/bulk_import.py:128 -#: netbox/circuits/forms/filtersets.py:218 -#: netbox/circuits/forms/filtersets.py:245 -#: netbox/circuits/forms/filtersets.py:291 +#: netbox/circuits/forms/filtersets.py:223 +#: netbox/circuits/forms/filtersets.py:250 +#: netbox/circuits/forms/filtersets.py:296 #: netbox/circuits/forms/model_forms.py:139 #: netbox/circuits/forms/model_forms.py:162 #: netbox/circuits/forms/model_forms.py:262 @@ -367,64 +375,57 @@ msgstr "" msgid "Circuit" msgstr "" -#: netbox/circuits/filtersets.py:316 netbox/dcim/base_filtersets.py:59 -#: netbox/dcim/filtersets.py:259 netbox/dcim/filtersets.py:370 -#: netbox/dcim/filtersets.py:491 netbox/dcim/filtersets.py:1058 -#: netbox/dcim/filtersets.py:1405 netbox/dcim/filtersets.py:2305 -msgid "Location (ID)" -msgstr "" - -#: netbox/circuits/filtersets.py:323 netbox/dcim/base_filtersets.py:66 +#: netbox/circuits/filtersets.py:328 netbox/dcim/base_filtersets.py:66 #: netbox/dcim/filtersets.py:266 netbox/dcim/filtersets.py:377 #: netbox/dcim/filtersets.py:498 netbox/dcim/filtersets.py:1411 #: netbox/extras/filtersets.py:542 msgid "Location (slug)" msgstr "" -#: netbox/circuits/filtersets.py:328 +#: netbox/circuits/filtersets.py:333 msgid "ProviderNetwork (ID)" msgstr "" -#: netbox/circuits/filtersets.py:376 +#: netbox/circuits/filtersets.py:381 msgid "Circuit (CID)" msgstr "" -#: netbox/circuits/filtersets.py:381 +#: netbox/circuits/filtersets.py:386 msgid "Circuit (ID)" msgstr "" -#: netbox/circuits/filtersets.py:386 +#: netbox/circuits/filtersets.py:391 msgid "Virtual circuit (CID)" msgstr "" -#: netbox/circuits/filtersets.py:391 netbox/dcim/filtersets.py:1848 +#: netbox/circuits/filtersets.py:396 netbox/dcim/filtersets.py:1848 msgid "Virtual circuit (ID)" msgstr "" -#: netbox/circuits/filtersets.py:396 +#: netbox/circuits/filtersets.py:401 msgid "Provider (name)" msgstr "" -#: netbox/circuits/filtersets.py:405 +#: netbox/circuits/filtersets.py:410 msgid "Circuit group (ID)" msgstr "" -#: netbox/circuits/filtersets.py:411 +#: netbox/circuits/filtersets.py:416 msgid "Circuit group (slug)" msgstr "" -#: netbox/circuits/filtersets.py:502 +#: netbox/circuits/filtersets.py:507 msgid "Virtual circuit type (ID)" msgstr "" -#: netbox/circuits/filtersets.py:508 +#: netbox/circuits/filtersets.py:513 msgid "Virtual circuit type (slug)" msgstr "" -#: netbox/circuits/filtersets.py:536 netbox/circuits/forms/bulk_edit.py:355 +#: netbox/circuits/filtersets.py:541 netbox/circuits/forms/bulk_edit.py:355 #: netbox/circuits/forms/bulk_import.py:249 -#: netbox/circuits/forms/filtersets.py:367 -#: netbox/circuits/forms/filtersets.py:373 +#: netbox/circuits/forms/filtersets.py:372 +#: netbox/circuits/forms/filtersets.py:378 #: netbox/circuits/forms/model_forms.py:343 #: netbox/circuits/forms/model_forms.py:358 #: netbox/circuits/tables/virtual_circuits.py:88 @@ -433,7 +434,7 @@ msgstr "" msgid "Virtual circuit" msgstr "" -#: netbox/circuits/filtersets.py:572 netbox/dcim/filtersets.py:1268 +#: netbox/circuits/filtersets.py:577 netbox/dcim/filtersets.py:1268 #: netbox/dcim/filtersets.py:1633 netbox/ipam/filtersets.py:601 #: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" @@ -600,13 +601,13 @@ msgstr "" #: netbox/circuits/forms/filtersets.py:96 #: netbox/circuits/forms/filtersets.py:124 #: netbox/circuits/forms/filtersets.py:142 -#: netbox/circuits/forms/filtersets.py:219 -#: netbox/circuits/forms/filtersets.py:263 -#: netbox/circuits/forms/filtersets.py:286 -#: netbox/circuits/forms/filtersets.py:324 -#: netbox/circuits/forms/filtersets.py:332 -#: netbox/circuits/forms/filtersets.py:368 -#: netbox/circuits/forms/filtersets.py:391 +#: netbox/circuits/forms/filtersets.py:224 +#: netbox/circuits/forms/filtersets.py:268 +#: netbox/circuits/forms/filtersets.py:291 +#: netbox/circuits/forms/filtersets.py:329 +#: netbox/circuits/forms/filtersets.py:337 +#: netbox/circuits/forms/filtersets.py:373 +#: netbox/circuits/forms/filtersets.py:396 #: netbox/circuits/forms/model_forms.py:60 #: netbox/circuits/forms/model_forms.py:76 #: netbox/circuits/forms/model_forms.py:110 @@ -637,14 +638,14 @@ msgstr "" #: netbox/circuits/forms/bulk_edit.py:112 #: netbox/circuits/forms/bulk_edit.py:303 #: netbox/circuits/forms/filtersets.py:115 -#: netbox/circuits/forms/filtersets.py:315 netbox/dcim/forms/bulk_edit.py:210 +#: netbox/circuits/forms/filtersets.py:320 netbox/dcim/forms/bulk_edit.py:210 #: netbox/dcim/forms/bulk_edit.py:613 netbox/dcim/forms/bulk_edit.py:822 #: netbox/dcim/forms/bulk_edit.py:1191 netbox/dcim/forms/bulk_edit.py:1218 #: netbox/dcim/forms/bulk_edit.py:1740 netbox/dcim/forms/filtersets.py:1065 #: netbox/dcim/forms/filtersets.py:1323 netbox/dcim/forms/filtersets.py:1460 #: netbox/dcim/forms/filtersets.py:1484 netbox/dcim/tables/devices.py:737 #: netbox/dcim/tables/devices.py:793 netbox/dcim/tables/devices.py:1034 -#: netbox/dcim/tables/devicetypes.py:251 netbox/dcim/tables/devicetypes.py:266 +#: netbox/dcim/tables/devicetypes.py:256 netbox/dcim/tables/devicetypes.py:271 #: netbox/dcim/tables/racks.py:33 netbox/extras/forms/bulk_edit.py:270 #: netbox/extras/tables/tables.py:443 #: netbox/templates/circuits/circuittype.html:30 @@ -663,7 +664,7 @@ msgstr "" #: netbox/circuits/forms/bulk_import.py:94 #: netbox/circuits/forms/bulk_import.py:221 #: netbox/circuits/forms/filtersets.py:137 -#: netbox/circuits/forms/filtersets.py:353 +#: netbox/circuits/forms/filtersets.py:358 #: netbox/circuits/tables/circuits.py:65 netbox/circuits/tables/circuits.py:200 #: netbox/circuits/tables/virtual_circuits.py:58 #: netbox/core/forms/bulk_edit.py:18 netbox/core/forms/filtersets.py:33 @@ -725,7 +726,7 @@ msgstr "" #: netbox/circuits/forms/bulk_import.py:87 #: netbox/circuits/forms/bulk_import.py:214 #: netbox/circuits/forms/filtersets.py:150 -#: netbox/circuits/forms/filtersets.py:340 +#: netbox/circuits/forms/filtersets.py:345 #: netbox/circuits/forms/model_forms.py:116 #: netbox/circuits/forms/model_forms.py:330 #: netbox/templates/circuits/virtualcircuit.html:31 @@ -738,7 +739,7 @@ msgstr "" #: netbox/circuits/forms/bulk_import.py:100 #: netbox/circuits/forms/bulk_import.py:227 #: netbox/circuits/forms/filtersets.py:161 -#: netbox/circuits/forms/filtersets.py:356 netbox/core/forms/filtersets.py:38 +#: netbox/circuits/forms/filtersets.py:361 netbox/core/forms/filtersets.py:38 #: netbox/core/forms/filtersets.py:80 netbox/core/tables/data.py:23 #: netbox/core/tables/jobs.py:26 netbox/core/tables/tasks.py:88 #: netbox/dcim/forms/bulk_edit.py:110 netbox/dcim/forms/bulk_edit.py:185 @@ -815,8 +816,8 @@ msgstr "" #: netbox/circuits/forms/bulk_import.py:170 #: netbox/circuits/forms/bulk_import.py:232 #: netbox/circuits/forms/filtersets.py:130 -#: netbox/circuits/forms/filtersets.py:272 -#: netbox/circuits/forms/filtersets.py:326 netbox/dcim/forms/bulk_edit.py:126 +#: netbox/circuits/forms/filtersets.py:277 +#: netbox/circuits/forms/filtersets.py:331 netbox/dcim/forms/bulk_edit.py:126 #: netbox/dcim/forms/bulk_edit.py:191 netbox/dcim/forms/bulk_edit.py:350 #: netbox/dcim/forms/bulk_edit.py:470 netbox/dcim/forms/bulk_edit.py:699 #: netbox/dcim/forms/bulk_edit.py:812 netbox/dcim/forms/bulk_edit.py:1768 @@ -885,22 +886,22 @@ msgid "Tenant" msgstr "" #: netbox/circuits/forms/bulk_edit.py:159 -#: netbox/circuits/forms/filtersets.py:185 +#: netbox/circuits/forms/filtersets.py:190 msgid "Install date" msgstr "" #: netbox/circuits/forms/bulk_edit.py:164 -#: netbox/circuits/forms/filtersets.py:190 +#: netbox/circuits/forms/filtersets.py:195 msgid "Termination date" msgstr "" #: netbox/circuits/forms/bulk_edit.py:170 -#: netbox/circuits/forms/filtersets.py:197 +#: netbox/circuits/forms/filtersets.py:202 msgid "Commit rate (Kbps)" msgstr "" #: netbox/circuits/forms/bulk_edit.py:176 -#: netbox/circuits/forms/filtersets.py:203 +#: netbox/circuits/forms/filtersets.py:208 #: netbox/circuits/forms/model_forms.py:136 #: netbox/templates/circuits/circuit.html:38 #: netbox/templates/wireless/wirelesslink.html:38 @@ -913,7 +914,7 @@ msgstr "" #: netbox/circuits/forms/bulk_edit.py:181 #: netbox/circuits/forms/bulk_import.py:105 #: netbox/circuits/forms/bulk_import.py:108 -#: netbox/circuits/forms/filtersets.py:207 +#: netbox/circuits/forms/filtersets.py:212 #: netbox/wireless/forms/bulk_edit.py:137 #: netbox/wireless/forms/bulk_import.py:121 #: netbox/wireless/forms/bulk_import.py:124 @@ -931,8 +932,8 @@ msgstr "" #: netbox/circuits/forms/filtersets.py:91 #: netbox/circuits/forms/filtersets.py:110 #: netbox/circuits/forms/filtersets.py:127 -#: netbox/circuits/forms/filtersets.py:310 -#: netbox/circuits/forms/filtersets.py:325 netbox/core/forms/filtersets.py:68 +#: netbox/circuits/forms/filtersets.py:315 +#: netbox/circuits/forms/filtersets.py:330 netbox/core/forms/filtersets.py:68 #: netbox/core/forms/filtersets.py:136 netbox/dcim/forms/bulk_edit.py:846 #: netbox/dcim/forms/filtersets.py:173 netbox/dcim/forms/filtersets.py:205 #: netbox/dcim/forms/filtersets.py:916 netbox/dcim/forms/filtersets.py:1008 @@ -995,7 +996,7 @@ msgstr "" #: netbox/circuits/forms/bulk_edit.py:218 #: netbox/circuits/forms/bulk_import.py:133 -#: netbox/circuits/forms/filtersets.py:220 +#: netbox/circuits/forms/filtersets.py:225 #: netbox/circuits/forms/model_forms.py:173 #: netbox/templates/circuits/inc/circuit_termination.html:6 #: netbox/templates/dcim/cable.html:68 netbox/templates/dcim/cable.html:72 @@ -1035,7 +1036,7 @@ msgstr "" #: netbox/circuits/forms/bulk_edit.py:289 #: netbox/circuits/forms/bulk_import.py:188 -#: netbox/circuits/forms/filtersets.py:299 +#: netbox/circuits/forms/filtersets.py:304 #: netbox/circuits/tables/circuits.py:207 netbox/dcim/forms/model_forms.py:562 #: netbox/templates/circuits/circuitgroupassignment.html:34 #: netbox/templates/dcim/device.html:133 @@ -1049,9 +1050,9 @@ msgstr "" #: netbox/circuits/forms/bulk_edit.py:321 #: netbox/circuits/forms/bulk_import.py:208 #: netbox/circuits/forms/filtersets.py:158 -#: netbox/circuits/forms/filtersets.py:258 -#: netbox/circuits/forms/filtersets.py:348 -#: netbox/circuits/forms/filtersets.py:386 +#: netbox/circuits/forms/filtersets.py:263 +#: netbox/circuits/forms/filtersets.py:353 +#: netbox/circuits/forms/filtersets.py:391 #: netbox/circuits/forms/model_forms.py:325 #: netbox/circuits/tables/virtual_circuits.py:51 #: netbox/circuits/tables/virtual_circuits.py:99 @@ -1060,7 +1061,7 @@ msgstr "" #: netbox/circuits/forms/bulk_edit.py:365 #: netbox/circuits/forms/bulk_import.py:254 -#: netbox/circuits/forms/filtersets.py:376 +#: netbox/circuits/forms/filtersets.py:381 #: netbox/circuits/forms/model_forms.py:365 netbox/dcim/forms/bulk_edit.py:361 #: netbox/dcim/forms/bulk_edit.py:1280 netbox/dcim/forms/bulk_edit.py:1711 #: netbox/dcim/forms/bulk_import.py:255 netbox/dcim/forms/bulk_import.py:1106 @@ -1069,7 +1070,7 @@ msgstr "" #: netbox/dcim/forms/model_forms.py:1090 netbox/dcim/forms/model_forms.py:1559 #: netbox/dcim/forms/object_import.py:182 netbox/dcim/tables/devices.py:179 #: netbox/dcim/tables/devices.py:840 netbox/dcim/tables/devices.py:966 -#: netbox/dcim/tables/devicetypes.py:306 netbox/dcim/tables/racks.py:128 +#: netbox/dcim/tables/devicetypes.py:311 netbox/dcim/tables/racks.py:128 #: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:245 #: netbox/ipam/forms/bulk_edit.py:295 netbox/ipam/forms/bulk_edit.py:343 #: netbox/ipam/forms/bulk_edit.py:495 netbox/ipam/forms/bulk_import.py:193 @@ -1214,7 +1215,8 @@ msgstr "" #: netbox/circuits/forms/filtersets.py:38 #: netbox/circuits/forms/filtersets.py:129 -#: netbox/circuits/forms/filtersets.py:240 +#: netbox/circuits/forms/filtersets.py:187 +#: netbox/circuits/forms/filtersets.py:245 #: netbox/circuits/tables/circuits.py:144 netbox/dcim/forms/bulk_edit.py:342 #: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:691 #: netbox/dcim/forms/bulk_edit.py:746 netbox/dcim/forms/bulk_edit.py:900 @@ -1270,7 +1272,7 @@ msgstr "" #: netbox/circuits/forms/filtersets.py:45 #: netbox/circuits/forms/filtersets.py:168 -#: netbox/circuits/forms/filtersets.py:225 +#: netbox/circuits/forms/filtersets.py:230 #: netbox/circuits/tables/circuits.py:139 netbox/dcim/forms/bulk_edit.py:116 #: netbox/dcim/forms/bulk_edit.py:317 netbox/dcim/forms/bulk_edit.py:875 #: netbox/dcim/forms/bulk_import.py:95 netbox/dcim/forms/filtersets.py:74 @@ -1298,7 +1300,7 @@ msgstr "" #: netbox/circuits/forms/filtersets.py:50 #: netbox/circuits/forms/filtersets.py:173 -#: netbox/circuits/forms/filtersets.py:230 netbox/dcim/forms/bulk_edit.py:325 +#: netbox/circuits/forms/filtersets.py:235 netbox/dcim/forms/bulk_edit.py:325 #: netbox/dcim/forms/bulk_edit.py:883 netbox/dcim/forms/filtersets.py:79 #: netbox/dcim/forms/filtersets.py:191 netbox/dcim/forms/filtersets.py:217 #: netbox/dcim/forms/filtersets.py:348 netbox/dcim/forms/filtersets.py:431 @@ -1323,11 +1325,11 @@ msgstr "" msgid "Account" msgstr "" -#: netbox/circuits/forms/filtersets.py:248 +#: netbox/circuits/forms/filtersets.py:253 msgid "Term Side" msgstr "" -#: netbox/circuits/forms/filtersets.py:281 netbox/dcim/forms/bulk_edit.py:1570 +#: netbox/circuits/forms/filtersets.py:286 netbox/dcim/forms/bulk_edit.py:1570 #: netbox/extras/forms/model_forms.py:582 netbox/ipam/forms/filtersets.py:144 #: netbox/ipam/forms/filtersets.py:598 netbox/ipam/forms/model_forms.py:329 #: netbox/templates/dcim/macaddress.html:25 @@ -1338,7 +1340,7 @@ msgstr "" msgid "Assignment" msgstr "" -#: netbox/circuits/forms/filtersets.py:296 +#: netbox/circuits/forms/filtersets.py:301 #: netbox/circuits/forms/model_forms.py:252 #: netbox/circuits/tables/circuits.py:191 netbox/dcim/forms/bulk_edit.py:121 #: netbox/dcim/forms/bulk_import.py:102 netbox/dcim/forms/model_forms.py:120 @@ -1535,8 +1537,8 @@ msgstr "" #: netbox/extras/models/models.py:158 netbox/extras/models/models.py:396 #: netbox/extras/models/models.py:511 netbox/extras/models/notifications.py:131 #: netbox/extras/models/staging.py:32 netbox/extras/models/tags.py:32 -#: netbox/ipam/models/vlans.py:358 netbox/netbox/models/__init__.py:114 -#: netbox/netbox/models/__init__.py:149 netbox/netbox/models/__init__.py:195 +#: netbox/ipam/models/vlans.py:358 netbox/netbox/models/__init__.py:115 +#: netbox/netbox/models/__init__.py:150 netbox/netbox/models/__init__.py:196 #: netbox/users/models/permissions.py:24 netbox/users/models/tokens.py:57 #: netbox/users/models/users.py:33 #: netbox/virtualization/models/virtualmachines.py:276 @@ -1574,8 +1576,8 @@ msgstr "" #: netbox/ipam/models/services.py:51 netbox/ipam/models/services.py:84 #: netbox/ipam/models/vlans.py:37 netbox/ipam/models/vlans.py:199 #: netbox/ipam/models/vlans.py:337 netbox/ipam/models/vrfs.py:20 -#: netbox/ipam/models/vrfs.py:75 netbox/netbox/models/__init__.py:141 -#: netbox/netbox/models/__init__.py:185 netbox/tenancy/models/contacts.py:58 +#: netbox/ipam/models/vrfs.py:75 netbox/netbox/models/__init__.py:142 +#: netbox/netbox/models/__init__.py:186 netbox/tenancy/models/contacts.py:58 #: netbox/tenancy/models/tenants.py:19 netbox/tenancy/models/tenants.py:42 #: netbox/users/models/permissions.py:20 netbox/users/models/users.py:28 #: netbox/virtualization/models/clusters.py:52 @@ -1596,8 +1598,8 @@ msgstr "" #: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:88 #: netbox/dcim/models/racks.py:137 netbox/dcim/models/sites.py:149 #: netbox/extras/models/models.py:506 netbox/ipam/models/asns.py:23 -#: netbox/ipam/models/vlans.py:42 netbox/netbox/models/__init__.py:145 -#: netbox/netbox/models/__init__.py:190 netbox/tenancy/models/tenants.py:25 +#: netbox/ipam/models/vlans.py:42 netbox/netbox/models/__init__.py:146 +#: netbox/netbox/models/__init__.py:191 netbox/tenancy/models/tenants.py:25 #: netbox/tenancy/models/tenants.py:47 netbox/vpn/models/l2vpn.py:27 #: netbox/wireless/models.py:59 msgid "slug" @@ -1681,7 +1683,7 @@ msgstr "" #: netbox/dcim/tables/devices.py:872 netbox/dcim/tables/devices.py:941 #: netbox/dcim/tables/devices.py:1006 netbox/dcim/tables/devices.py:1025 #: netbox/dcim/tables/devices.py:1054 netbox/dcim/tables/devices.py:1084 -#: netbox/dcim/tables/devicetypes.py:31 netbox/dcim/tables/devicetypes.py:222 +#: netbox/dcim/tables/devicetypes.py:31 netbox/dcim/tables/devicetypes.py:227 #: netbox/dcim/tables/power.py:22 netbox/dcim/tables/power.py:62 #: netbox/dcim/tables/racks.py:24 netbox/dcim/tables/racks.py:113 #: netbox/dcim/tables/sites.py:24 netbox/dcim/tables/sites.py:51 @@ -1824,7 +1826,7 @@ msgstr "" #: netbox/circuits/tables/providers.py:82 #: netbox/circuits/tables/providers.py:107 #: netbox/circuits/tables/virtual_circuits.py:68 -#: netbox/dcim/tables/devices.py:1067 netbox/dcim/tables/devicetypes.py:92 +#: netbox/dcim/tables/devices.py:1067 netbox/dcim/tables/devicetypes.py:97 #: netbox/dcim/tables/modules.py:29 netbox/dcim/tables/modules.py:73 #: netbox/dcim/tables/power.py:39 netbox/dcim/tables/power.py:96 #: netbox/dcim/tables/racks.py:84 netbox/dcim/tables/racks.py:144 @@ -2187,7 +2189,7 @@ msgstr "" #: netbox/core/forms/bulk_edit.py:25 netbox/core/forms/filtersets.py:43 #: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1140 #: netbox/dcim/forms/bulk_edit.py:1418 netbox/dcim/forms/filtersets.py:1375 -#: netbox/dcim/tables/devices.py:566 netbox/dcim/tables/devicetypes.py:226 +#: netbox/dcim/tables/devices.py:566 netbox/dcim/tables/devicetypes.py:231 #: netbox/extras/forms/bulk_edit.py:123 netbox/extras/forms/bulk_edit.py:187 #: netbox/extras/forms/bulk_edit.py:246 netbox/extras/forms/filtersets.py:145 #: netbox/extras/forms/filtersets.py:235 netbox/extras/forms/filtersets.py:300 @@ -2735,7 +2737,7 @@ msgid "Last updated" msgstr "" #: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 -#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 +#: netbox/dcim/tables/devicetypes.py:169 netbox/extras/tables/tables.py:216 #: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:192 #: netbox/templates/dcim/virtualchassis_edit.html:52 #: netbox/utilities/forms/forms.py:73 netbox/wireless/tables/wirelesslink.py:16 @@ -3867,7 +3869,7 @@ msgstr "" #: netbox/dcim/forms/model_forms.py:498 netbox/dcim/forms/model_forms.py:557 #: netbox/dcim/forms/object_create.py:197 #: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:175 -#: netbox/dcim/tables/devices.py:740 netbox/dcim/tables/devicetypes.py:248 +#: netbox/dcim/tables/devices.py:740 netbox/dcim/tables/devicetypes.py:253 #: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 #: netbox/templates/dcim/modulebay.html:38 #: netbox/templates/dcim/virtualchassis.html:66 @@ -3914,8 +3916,8 @@ msgstr "" #: netbox/dcim/forms/model_forms.py:445 netbox/dcim/forms/model_forms.py:1095 #: netbox/dcim/forms/model_forms.py:1564 netbox/dcim/forms/object_import.py:188 #: netbox/dcim/tables/devices.py:107 netbox/dcim/tables/devices.py:182 -#: netbox/dcim/tables/devices.py:969 netbox/dcim/tables/devicetypes.py:80 -#: netbox/dcim/tables/devicetypes.py:310 netbox/dcim/tables/modules.py:20 +#: netbox/dcim/tables/devices.py:969 netbox/dcim/tables/devicetypes.py:85 +#: netbox/dcim/tables/devicetypes.py:315 netbox/dcim/tables/modules.py:20 #: netbox/dcim/tables/modules.py:61 netbox/dcim/tables/racks.py:58 #: netbox/dcim/tables/racks.py:131 netbox/templates/dcim/devicetype.html:14 #: netbox/templates/dcim/inventoryitem.html:48 @@ -3979,7 +3981,7 @@ msgstr "" #: netbox/dcim/forms/filtersets.py:489 netbox/dcim/forms/filtersets.py:595 #: netbox/dcim/forms/filtersets.py:614 netbox/dcim/forms/filtersets.py:675 #: netbox/dcim/forms/model_forms.py:226 netbox/dcim/forms/model_forms.py:306 -#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 +#: netbox/dcim/tables/devicetypes.py:111 netbox/dcim/tables/modules.py:35 #: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:171 #: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 #: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 @@ -4109,12 +4111,12 @@ msgstr "" msgid "U height" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:530 netbox/dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:530 netbox/dcim/tables/devicetypes.py:107 msgid "Exclude from utilization" msgstr "" #: netbox/dcim/forms/bulk_edit.py:559 netbox/dcim/forms/model_forms.py:377 -#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 +#: netbox/dcim/tables/devicetypes.py:82 netbox/templates/dcim/device.html:88 #: netbox/templates/dcim/devicebay.html:52 netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "" @@ -6576,7 +6578,7 @@ msgstr "" #: netbox/dcim/models/devices.py:1439 netbox/extras/models/customfields.py:225 #: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 -#: netbox/netbox/models/__init__.py:119 +#: netbox/netbox/models/__init__.py:120 msgid "comments" msgstr "" @@ -7062,8 +7064,8 @@ msgid "Power outlets" msgstr "" #: netbox/dcim/tables/devices.py:256 netbox/dcim/tables/devices.py:1112 -#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1142 -#: netbox/dcim/views.py:1386 netbox/dcim/views.py:2137 +#: netbox/dcim/tables/devicetypes.py:133 netbox/dcim/views.py:1143 +#: netbox/dcim/views.py:1387 netbox/dcim/views.py:2138 #: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:258 #: netbox/templates/dcim/device/base.html:37 #: netbox/templates/dcim/device_list.html:43 @@ -7100,9 +7102,9 @@ msgstr "" msgid "Module Bay" msgstr "" -#: netbox/dcim/tables/devices.py:327 netbox/dcim/tables/devicetypes.py:47 -#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1217 -#: netbox/dcim/views.py:2235 netbox/netbox/navigation/menu.py:103 +#: netbox/dcim/tables/devices.py:327 netbox/dcim/tables/devicetypes.py:52 +#: netbox/dcim/tables/devicetypes.py:148 netbox/dcim/views.py:1218 +#: netbox/dcim/views.py:2236 netbox/netbox/navigation/menu.py:103 #: netbox/templates/dcim/device/base.html:52 #: netbox/templates/dcim/device_list.html:71 #: netbox/templates/dcim/devicetype/base.html:49 @@ -7159,7 +7161,7 @@ msgstr "" msgid "Tunnel" msgstr "" -#: netbox/dcim/tables/devices.py:625 netbox/dcim/tables/devicetypes.py:229 +#: netbox/dcim/tables/devices.py:625 netbox/dcim/tables/devicetypes.py:234 #: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "" @@ -7188,7 +7190,7 @@ msgstr "" msgid "Module Status" msgstr "" -#: netbox/dcim/tables/devices.py:973 netbox/dcim/tables/devicetypes.py:314 +#: netbox/dcim/tables/devices.py:973 netbox/dcim/tables/devicetypes.py:319 #: netbox/templates/dcim/inventoryitem.html:44 msgid "Component" msgstr "" @@ -7197,42 +7199,47 @@ msgstr "" msgid "Items" msgstr "" -#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 +#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:60 +#: netbox/netbox/navigation/menu.py:62 +msgid "Rack Types" +msgstr "" + +#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:84 #: netbox/netbox/navigation/menu.py:86 msgid "Device Types" msgstr "" -#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 +#: netbox/dcim/tables/devicetypes.py:47 netbox/netbox/navigation/menu.py:87 msgid "Module Types" msgstr "" -#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:378 +#: netbox/dcim/tables/devicetypes.py:57 netbox/extras/forms/filtersets.py:378 #: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 #: netbox/netbox/navigation/menu.py:78 msgid "Platforms" msgstr "" -#: netbox/dcim/tables/devicetypes.py:84 +#: netbox/dcim/tables/devicetypes.py:89 #: netbox/templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "" -#: netbox/dcim/tables/devicetypes.py:88 +#: netbox/dcim/tables/devicetypes.py:93 #: netbox/templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "" -#: netbox/dcim/tables/devicetypes.py:98 +#: netbox/dcim/tables/devicetypes.py:103 msgid "U Height" msgstr "" -#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 +#: netbox/dcim/tables/devicetypes.py:118 netbox/dcim/tables/modules.py:26 #: netbox/dcim/tables/racks.py:89 msgid "Instances" msgstr "" -#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:1082 -#: netbox/dcim/views.py:1326 netbox/dcim/views.py:2073 +#: netbox/dcim/tables/devicetypes.py:121 netbox/dcim/views.py:1083 +#: netbox/dcim/views.py:1327 netbox/dcim/views.py:2074 #: netbox/netbox/navigation/menu.py:97 #: netbox/templates/dcim/device/base.html:25 #: netbox/templates/dcim/device_list.html:15 @@ -7242,8 +7249,8 @@ msgstr "" msgid "Console Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:1097 -#: netbox/dcim/views.py:1341 netbox/dcim/views.py:2089 +#: netbox/dcim/tables/devicetypes.py:124 netbox/dcim/views.py:1098 +#: netbox/dcim/views.py:1342 netbox/dcim/views.py:2090 #: netbox/netbox/navigation/menu.py:98 #: netbox/templates/dcim/device/base.html:28 #: netbox/templates/dcim/device_list.html:22 @@ -7253,8 +7260,8 @@ msgstr "" msgid "Console Server Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1112 -#: netbox/dcim/views.py:1356 netbox/dcim/views.py:2105 +#: netbox/dcim/tables/devicetypes.py:127 netbox/dcim/views.py:1113 +#: netbox/dcim/views.py:1357 netbox/dcim/views.py:2106 #: netbox/netbox/navigation/menu.py:99 #: netbox/templates/dcim/device/base.html:31 #: netbox/templates/dcim/device_list.html:29 @@ -7264,8 +7271,8 @@ msgstr "" msgid "Power Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1127 -#: netbox/dcim/views.py:1371 netbox/dcim/views.py:2121 +#: netbox/dcim/tables/devicetypes.py:130 netbox/dcim/views.py:1128 +#: netbox/dcim/views.py:1372 netbox/dcim/views.py:2122 #: netbox/netbox/navigation/menu.py:100 #: netbox/templates/dcim/device/base.html:34 #: netbox/templates/dcim/device_list.html:36 @@ -7275,8 +7282,8 @@ msgstr "" msgid "Power Outlets" msgstr "" -#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1157 -#: netbox/dcim/views.py:1401 netbox/dcim/views.py:2159 +#: netbox/dcim/tables/devicetypes.py:136 netbox/dcim/views.py:1158 +#: netbox/dcim/views.py:1402 netbox/dcim/views.py:2160 #: netbox/netbox/navigation/menu.py:95 #: netbox/templates/dcim/device/base.html:40 #: netbox/templates/dcim/devicetype/base.html:37 @@ -7285,8 +7292,8 @@ msgstr "" msgid "Front Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1172 -#: netbox/dcim/views.py:1416 netbox/dcim/views.py:2175 +#: netbox/dcim/tables/devicetypes.py:139 netbox/dcim/views.py:1173 +#: netbox/dcim/views.py:1417 netbox/dcim/views.py:2176 #: netbox/netbox/navigation/menu.py:96 #: netbox/templates/dcim/device/base.html:43 #: netbox/templates/dcim/device_list.html:50 @@ -7296,16 +7303,16 @@ msgstr "" msgid "Rear Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1202 -#: netbox/dcim/views.py:2215 netbox/netbox/navigation/menu.py:102 +#: netbox/dcim/tables/devicetypes.py:142 netbox/dcim/views.py:1203 +#: netbox/dcim/views.py:2216 netbox/netbox/navigation/menu.py:102 #: netbox/templates/dcim/device/base.html:49 #: netbox/templates/dcim/device_list.html:57 #: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "" -#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1187 -#: netbox/dcim/views.py:1431 netbox/dcim/views.py:2195 +#: netbox/dcim/tables/devicetypes.py:145 netbox/dcim/views.py:1188 +#: netbox/dcim/views.py:1432 netbox/dcim/views.py:2196 #: netbox/netbox/navigation/menu.py:101 #: netbox/templates/dcim/device/base.html:46 #: netbox/templates/dcim/device_list.html:64 @@ -7384,48 +7391,48 @@ msgstr "" msgid "Non-Racked Devices" msgstr "" -#: netbox/dcim/views.py:2248 netbox/extras/forms/model_forms.py:577 +#: netbox/dcim/views.py:2249 netbox/extras/forms/model_forms.py:577 #: netbox/templates/extras/configcontext.html:10 #: netbox/virtualization/forms/model_forms.py:232 #: netbox/virtualization/views.py:422 msgid "Config Context" msgstr "" -#: netbox/dcim/views.py:2258 netbox/virtualization/views.py:432 +#: netbox/dcim/views.py:2259 netbox/virtualization/views.py:432 msgid "Render Config" msgstr "" -#: netbox/dcim/views.py:2271 netbox/extras/tables/tables.py:550 +#: netbox/dcim/views.py:2272 netbox/extras/tables/tables.py:550 #: netbox/netbox/navigation/menu.py:255 netbox/netbox/navigation/menu.py:257 #: netbox/virtualization/views.py:190 msgid "Virtual Machines" msgstr "" -#: netbox/dcim/views.py:3104 +#: netbox/dcim/views.py:3105 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "" -#: netbox/dcim/views.py:3145 +#: netbox/dcim/views.py:3146 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "" -#: netbox/dcim/views.py:3261 netbox/ipam/tables/ip.py:180 +#: netbox/dcim/views.py:3262 netbox/ipam/tables/ip.py:180 msgid "Children" msgstr "" -#: netbox/dcim/views.py:3728 +#: netbox/dcim/views.py:3729 #, python-brace-format msgid "Added member {device}" msgstr "" -#: netbox/dcim/views.py:3777 +#: netbox/dcim/views.py:3778 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "" -#: netbox/dcim/views.py:3790 +#: netbox/dcim/views.py:3791 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "" @@ -11139,10 +11146,6 @@ msgstr "" msgid "Elevations" msgstr "" -#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 -msgid "Rack Types" -msgstr "" - #: netbox/netbox/navigation/menu.py:76 msgid "Modules" msgstr "" From d9066d6cffdeb37bf46fb831abcd02b1a188313b Mon Sep 17 00:00:00 2001 From: Jamie Murphy Date: Wed, 19 Feb 2025 22:02:59 +0000 Subject: [PATCH 026/189] add device rack title --- netbox/templates/dcim/device.html | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index fb11e9a5c..8f27a5cc1 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -335,6 +335,15 @@
    {% if object.rack and object.position %}
    +
    + {{ object.rack.name }} + {% if object.rack.role %} +
    {{ object.rack.role }} + {% endif %} + {% if object.rack.facility_id %} +
    {{ object.rack.facility_id }} + {% endif %} +

    {% trans "Front" %}

    From 2a44affd03ae13daeaf3d22ffcadea87b653d95d Mon Sep 17 00:00:00 2001 From: Jason Novinger Date: Thu, 20 Feb 2025 09:01:04 -0600 Subject: [PATCH 027/189] Fixes #18594: asn_count sort in Sites list (#18634) * Fixes #18594: asn_count sort in Sites list * Fixes similar issue in `circuits.views.ProviderListView` Thanks @bctiemann for point this out! --- netbox/circuits/tables/providers.py | 1 - netbox/circuits/views.py | 4 +++- netbox/dcim/tables/sites.py | 1 - netbox/dcim/views.py | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/netbox/circuits/tables/providers.py b/netbox/circuits/tables/providers.py index d70c77e9c..c7eba9012 100644 --- a/netbox/circuits/tables/providers.py +++ b/netbox/circuits/tables/providers.py @@ -33,7 +33,6 @@ class ProviderTable(ContactsColumnMixin, NetBoxTable): verbose_name=_('ASNs') ) asn_count = columns.LinkedCountColumn( - accessor=tables.A('asns__count'), viewname='ipam:asn_list', url_params={'provider_id': 'pk'}, verbose_name=_('ASN Count') diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 3bd81c33a..07c1113bd 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -4,6 +4,7 @@ from django.shortcuts import get_object_or_404, redirect, render from django.utils.translation import gettext_lazy as _ from dcim.views import PathTraceView +from ipam.models import ASN from netbox.views import generic from tenancy.views import ObjectContactsView from utilities.forms import ConfirmationForm @@ -20,7 +21,8 @@ from .models import * @register_model_view(Provider, 'list', path='', detail=False) class ProviderListView(generic.ObjectListView): queryset = Provider.objects.annotate( - count_circuits=count_related(Circuit, 'provider') + count_circuits=count_related(Circuit, 'provider'), + asn_count=count_related(ASN, 'providers'), ) filterset = filtersets.ProviderFilterSet filterset_form = forms.ProviderFilterForm diff --git a/netbox/dcim/tables/sites.py b/netbox/dcim/tables/sites.py index 77844f086..e8cb9140e 100644 --- a/netbox/dcim/tables/sites.py +++ b/netbox/dcim/tables/sites.py @@ -94,7 +94,6 @@ class SiteTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): verbose_name=_('ASNs') ) asn_count = columns.LinkedCountColumn( - accessor=tables.A('asns__count'), viewname='ipam:asn_list', url_params={'site_id': 'pk'}, verbose_name=_('ASN Count') diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 583b89f1a..60de8c355 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -422,7 +422,8 @@ class SiteGroupContactsView(ObjectContactsView): @register_model_view(Site, 'list', path='', detail=False) class SiteListView(generic.ObjectListView): queryset = Site.objects.annotate( - device_count=count_related(Device, 'site') + device_count=count_related(Device, 'site'), + asn_count=count_related(ASN, 'sites') ) filterset = filtersets.SiteFilterSet filterset_form = forms.SiteFilterForm From b5bc0bad3858d51912bd466cc4d4e897811cf952 Mon Sep 17 00:00:00 2001 From: Alexander Haase Date: Tue, 18 Feb 2025 21:48:12 +0100 Subject: [PATCH 028/189] Cover multitable inheritance in serialization During serialization, custom fields may be available to a model due to multi-table inheritance, but might not be available in serialized data because only direct fields of the model are covered. Now this attribute is only used if available in serialized data. Models using multi-table inheritance must modify their serialize_object() method to cover parent serialization. --- netbox/utilities/serialization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/utilities/serialization.py b/netbox/utilities/serialization.py index af1169e97..f402a30eb 100644 --- a/netbox/utilities/serialization.py +++ b/netbox/utilities/serialization.py @@ -29,7 +29,7 @@ def serialize_object(obj, resolve_tags=True, extra=None, exclude=None): exclude = exclude or [] # Include custom_field_data as "custom_fields" - if hasattr(obj, 'custom_field_data'): + if 'custom_field_data' in data: data['custom_fields'] = data.pop('custom_field_data') # Resolve any assigned tags to their names. Check for tags cached on the instance; From ed79e3bbf4617ec0764c6e7bd1f289d7abb22106 Mon Sep 17 00:00:00 2001 From: Jason Novinger Date: Tue, 18 Feb 2025 10:03:49 -0600 Subject: [PATCH 029/189] Fixes #18619: shift-select selects hidden items This also fixes the inverse, when a range is unselected via shift-click, previously checked checkboxes that are hidden are not changed. --- netbox/project-static/dist/netbox.js | 2 +- netbox/project-static/dist/netbox.js.map | 4 ++-- netbox/project-static/src/buttons/selectMultiple.ts | 8 ++++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 7e516f7f4..bb402ec33 100644 --- a/netbox/project-static/dist/netbox.js +++ b/netbox/project-static/dist/netbox.js @@ -1,6 +1,6 @@ "use strict";(()=>{var Xh=Object.create;var Aa=Object.defineProperty,Jh=Object.defineProperties,Zh=Object.getOwnPropertyDescriptor,ep=Object.getOwnPropertyDescriptors,tp=Object.getOwnPropertyNames,ou=Object.getOwnPropertySymbols,ip=Object.getPrototypeOf,su=Object.prototype.hasOwnProperty,np=Object.prototype.propertyIsEnumerable;var Fl=(ii,ei,ti)=>ei in ii?Aa(ii,ei,{enumerable:!0,configurable:!0,writable:!0,value:ti}):ii[ei]=ti,Di=(ii,ei)=>{for(var ti in ei||(ei={}))su.call(ei,ti)&&Fl(ii,ti,ei[ti]);if(ou)for(var ti of ou(ei))np.call(ei,ti)&&Fl(ii,ti,ei[ti]);return ii},sn=(ii,ei)=>Jh(ii,ep(ei));var au=(ii,ei)=>()=>(ei||ii((ei={exports:{}}).exports,ei),ei.exports),lu=(ii,ei)=>{for(var ti in ei)Aa(ii,ti,{get:ei[ti],enumerable:!0})},rp=(ii,ei,ti,ni)=>{if(ei&&typeof ei=="object"||typeof ei=="function")for(let ri of tp(ei))!su.call(ii,ri)&&ri!==ti&&Aa(ii,ri,{get:()=>ei[ri],enumerable:!(ni=Zh(ei,ri))||ni.enumerable});return ii};var cu=(ii,ei,ti)=>(ti=ii!=null?Xh(ip(ii)):{},rp(ei||!ii||!ii.__esModule?Aa(ti,"default",{value:ii,enumerable:!0}):ti,ii));var en=(ii,ei,ti)=>Fl(ii,typeof ei!="symbol"?ei+"":ei,ti);var co=(ii,ei,ti)=>new Promise((ni,ri)=>{var oi=li=>{try{ai(ti.next(li))}catch(ui){ri(ui)}},si=li=>{try{ai(ti.throw(li))}catch(ui){ri(ui)}},ai=li=>li.done?ni(li.value):Promise.resolve(li.value).then(oi,si);ai((ti=ti.apply(ii,ei)).next())});var Ld=au((exports,module)=>{(function(ii,ei){typeof define=="function"&&define.amd?define([],ei):typeof module=="object"&&module.exports?module.exports=ei():ii.htmx=ii.htmx||ei()})(typeof self!="undefined"?self:exports,function(){return function(){"use strict";var Q={onLoad:F,process:zt,on:de,off:ge,trigger:ce,ajax:Nr,find:C,findAll:f,closest:v,values:function(ii,ei){var ti=dr(ii,ei||"post");return ti.values},remove:_,addClass:z,removeClass:n,toggleClass:$,takeClass:W,defineExtension:Ur,removeExtension:Br,logAll:V,logNone:j,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:!1,scrollBehavior:"smooth",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get"],selfRequestsOnly:!1,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null},parseInterval:d,_:t,createEventSource:function(ii){return new EventSource(ii,{withCredentials:!0})},createWebSocket:function(ii){var ei=new WebSocket(ii,[]);return ei.binaryType=Q.config.wsBinaryType,ei},version:"1.9.12"},r={addTriggerHandler:Lt,bodyContains:se,canAccessLocalStorage:U,findThisElement:xe,filterValues:yr,hasAttribute:o,getAttributeValue:te,getClosestAttributeValue:ne,getClosestMatch:c,getExpressionVars:Hr,getHeaders:xr,getInputValues:dr,getInternalData:ae,getSwapSpecification:wr,getTriggerSpecs:it,getTarget:ye,makeFragment:l,mergeObjects:le,makeSettleInfo:T,oobSwap:Ee,querySelectorExt:ue,selectAndSwap:je,settleImmediately:nr,shouldCancel:ut,triggerEvent:ce,triggerErrorEvent:fe,withExtensions:R},w=["get","post","put","delete","patch"],i=w.map(function(ii){return"[hx-"+ii+"], [data-hx-"+ii+"]"}).join(", "),S=e("head"),q=e("title"),H=e("svg",!0);function e(ii,ei){return new RegExp("<"+ii+"(\\s[^>]*>|>)([\\s\\S]*?)<\\/"+ii+">",ei?"gim":"im")}function d(ii){if(ii==null)return;let ei=NaN;return ii.slice(-2)=="ms"?ei=parseFloat(ii.slice(0,-2)):ii.slice(-1)=="s"?ei=parseFloat(ii.slice(0,-1))*1e3:ii.slice(-1)=="m"?ei=parseFloat(ii.slice(0,-1))*1e3*60:ei=parseFloat(ii),isNaN(ei)?void 0:ei}function ee(ii,ei){return ii.getAttribute&&ii.getAttribute(ei)}function o(ii,ei){return ii.hasAttribute&&(ii.hasAttribute(ei)||ii.hasAttribute("data-"+ei))}function te(ii,ei){return ee(ii,ei)||ee(ii,"data-"+ei)}function u(ii){return ii.parentElement}function re(){return document}function c(ii,ei){for(;ii&&!ei(ii);)ii=u(ii);return ii||null}function L(ii,ei,ti){var ni=te(ei,ti),ri=te(ei,"hx-disinherit");return ii!==ei&&ri&&(ri==="*"||ri.split(" ").indexOf(ti)>=0)?"unset":ni}function ne(ii,ei){var ti=null;if(c(ii,function(ni){return ti=L(ii,ni,ei)}),ti!=="unset")return ti}function h(ii,ei){var ti=ii.matches||ii.matchesSelector||ii.msMatchesSelector||ii.mozMatchesSelector||ii.webkitMatchesSelector||ii.oMatchesSelector;return ti&&ti.call(ii,ei)}function A(ii){var ei=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,ti=ei.exec(ii);return ti?ti[1].toLowerCase():""}function s(ii,ei){for(var ti=new DOMParser,ni=ti.parseFromString(ii,"text/html"),ri=ni.body;ei>0;)ei--,ri=ri.firstChild;return ri==null&&(ri=re().createDocumentFragment()),ri}function N(ii){return/",0),oi=ri.querySelector("template").content;return Q.config.allowScriptTags?oe(oi.querySelectorAll("script"),function(si){Q.config.inlineScriptNonce&&(si.nonce=Q.config.inlineScriptNonce),si.htmxExecuted=navigator.userAgent.indexOf("Firefox")===-1}):oe(oi.querySelectorAll("script"),function(si){_(si)}),oi}switch(ti){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return s(""+ni+"
    ",1);case"col":return s(""+ni+"
    ",2);case"tr":return s(""+ni+"
    ",2);case"td":case"th":return s(""+ni+"
    ",3);case"script":case"style":return s("
    "+ni+"
    ",1);default:return s(ni,0)}}function ie(ii){ii&&ii()}function I(ii,ei){return Object.prototype.toString.call(ii)==="[object "+ei+"]"}function k(ii){return I(ii,"Function")}function P(ii){return I(ii,"Object")}function ae(ii){var ei="htmx-internal-data",ti=ii[ei];return ti||(ti=ii[ei]={}),ti}function M(ii){var ei=[];if(ii)for(var ti=0;ti=0}function se(ii){return ii.getRootNode&&ii.getRootNode()instanceof window.ShadowRoot?re().body.contains(ii.getRootNode().host):re().body.contains(ii)}function D(ii){return ii.trim().split(/\s+/)}function le(ii,ei){for(var ti in ei)ei.hasOwnProperty(ti)&&(ii[ti]=ei[ti]);return ii}function E(ii){try{return JSON.parse(ii)}catch(ei){return b(ei),null}}function U(){var ii="htmx:localStorageTest";try{return localStorage.setItem(ii,ii),localStorage.removeItem(ii),!0}catch(ei){return!1}}function B(ii){try{var ei=new URL(ii);return ei&&(ii=ei.pathname+ei.search),/^\/$/.test(ii)||(ii=ii.replace(/\/+$/,"")),ii}catch(ti){return ii}}function t(e){return Tr(re().body,function(){return eval(e)})}function F(ii){var ei=Q.on("htmx:load",function(ti){ii(ti.detail.elt)});return ei}function V(){Q.logger=function(ii,ei,ti){console&&console.log(ei,ii,ti)}}function j(){Q.logger=null}function C(ii,ei){return ei?ii.querySelector(ei):C(re(),ii)}function f(ii,ei){return ei?ii.querySelectorAll(ei):f(re(),ii)}function _(ii,ei){ii=p(ii),ei?setTimeout(function(){_(ii),ii=null},ei):ii.parentElement.removeChild(ii)}function z(ii,ei,ti){ii=p(ii),ti?setTimeout(function(){z(ii,ei),ii=null},ti):ii.classList&&ii.classList.add(ei)}function n(ii,ei,ti){ii=p(ii),ti?setTimeout(function(){n(ii,ei),ii=null},ti):ii.classList&&(ii.classList.remove(ei),ii.classList.length===0&&ii.removeAttribute("class"))}function $(ii,ei){ii=p(ii),ii.classList.toggle(ei)}function W(ii,ei){ii=p(ii),oe(ii.parentElement.children,function(ti){n(ti,ei)}),z(ii,ei)}function v(ii,ei){if(ii=p(ii),ii.closest)return ii.closest(ei);do if(ii==null||h(ii,ei))return ii;while(ii=ii&&u(ii));return null}function g(ii,ei){return ii.substring(0,ei.length)===ei}function G(ii,ei){return ii.substring(ii.length-ei.length)===ei}function J(ii){var ei=ii.trim();return g(ei,"<")&&G(ei,"/>")?ei.substring(1,ei.length-2):ei}function Z(ii,ei){return ei.indexOf("closest ")===0?[v(ii,J(ei.substr(8)))]:ei.indexOf("find ")===0?[C(ii,J(ei.substr(5)))]:ei==="next"?[ii.nextElementSibling]:ei.indexOf("next ")===0?[K(ii,J(ei.substr(5)))]:ei==="previous"?[ii.previousElementSibling]:ei.indexOf("previous ")===0?[Y(ii,J(ei.substr(9)))]:ei==="document"?[document]:ei==="window"?[window]:ei==="body"?[document.body]:re().querySelectorAll(J(ei))}var K=function(ii,ei){for(var ti=re().querySelectorAll(ei),ni=0;ni=0;ni--){var ri=ti[ni];if(ri.compareDocumentPosition(ii)===Node.DOCUMENT_POSITION_FOLLOWING)return ri}};function ue(ii,ei){return ei?Z(ii,ei)[0]:Z(re().body,ii)[0]}function p(ii){return I(ii,"String")?C(ii):ii}function ve(ii,ei,ti){return k(ei)?{target:re().body,event:ii,listener:ei}:{target:p(ii),event:ei,listener:ti}}function de(ii,ei,ti){jr(function(){var ri=ve(ii,ei,ti);ri.target.addEventListener(ri.event,ri.listener)});var ni=k(ei);return ni?ei:ti}function ge(ii,ei,ti){return jr(function(){var ni=ve(ii,ei,ti);ni.target.removeEventListener(ni.event,ni.listener)}),k(ei)?ei:ti}var pe=re().createElement("output");function me(ii,ei){var ti=ne(ii,ei);if(ti){if(ti==="this")return[xe(ii,ei)];var ni=Z(ii,ti);return ni.length===0?(b('The selector "'+ti+'" on '+ei+" returned no matches!"),[pe]):ni}}function xe(ii,ei){return c(ii,function(ti){return te(ti,ei)!=null})}function ye(ii){var ei=ne(ii,"hx-target");if(ei)return ei==="this"?xe(ii,"hx-target"):ue(ii,ei);var ti=ae(ii);return ti.boosted?re().body:ii}function be(ii){for(var ei=Q.config.attributesToSettle,ti=0;ti0?(ri=ii.substr(0,ii.indexOf(":")),ni=ii.substr(ii.indexOf(":")+1,ii.length)):ri=ii);var oi=re().querySelectorAll(ni);return oi?(oe(oi,function(si){var ai,li=ei.cloneNode(!0);ai=re().createDocumentFragment(),ai.appendChild(li),Se(ri,si)||(ai=li);var ui={shouldSwap:!0,target:si,fragment:ai};ce(si,"htmx:oobBeforeSwap",ui)&&(si=ui.target,ui.shouldSwap&&Fe(ri,si,si,ai,ti),oe(ti.elts,function(ci){ce(ci,"htmx:oobAfterSwap",ui)}))}),ei.parentNode.removeChild(ei)):(ei.parentNode.removeChild(ei),fe(re().body,"htmx:oobErrorNoTarget",{content:ei})),ii}function Ce(ii,ei,ti){var ni=ne(ii,"hx-select-oob");if(ni)for(var ri=ni.split(","),oi=0;oi0){var oi=ri.replace("'","\\'"),si=ni.tagName.replace(":","\\:"),ai=ii.querySelector(si+"[id='"+oi+"']");if(ai&&ai!==ii){var li=ni.cloneNode();we(ni,ai),ti.tasks.push(function(){we(ni,li)})}}})}function Oe(ii){return function(){n(ii,Q.config.addedClass),zt(ii),Nt(ii),qe(ii),ce(ii,"htmx:load")}}function qe(ii){var ei="[autofocus]",ti=h(ii,ei)?ii:ii.querySelector(ei);ti!=null&&ti.focus()}function a(ii,ei,ti,ni){for(Te(ii,ti,ni);ti.childNodes.length>0;){var ri=ti.firstChild;z(ri,Q.config.addedClass),ii.insertBefore(ri,ei),ri.nodeType!==Node.TEXT_NODE&&ri.nodeType!==Node.COMMENT_NODE&&ni.tasks.push(Oe(ri))}}function He(ii,ei){for(var ti=0;ti-1){var ei=ii.replace(H,""),ti=ei.match(q);if(ti)return ti[2]}}function je(ii,ei,ti,ni,ri,oi){ri.title=Ve(ni);var si=l(ni);if(si)return Ce(ti,si,ri),si=Be(ti,si,oi),Re(si),Fe(ii,ti,ei,si,ri)}function _e(ii,ei,ti){var ni=ii.getResponseHeader(ei);if(ni.indexOf("{")===0){var ri=E(ni);for(var oi in ri)if(ri.hasOwnProperty(oi)){var si=ri[oi];P(si)||(si={value:si}),ce(ti,oi,si)}}else for(var ai=ni.split(","),li=0;li0;){var si=ei[0];if(si==="]"){if(ni--,ni===0){oi===null&&(ri=ri+"true"),ei.shift(),ri+=")})";try{var ai=Tr(ii,function(){return Function(ri)()},function(){return!0});return ai.source=ri,ai}catch(li){return fe(re().body,"htmx:syntax:error",{error:li,source:ri}),null}}}else si==="["&&ni++;Qe(si,oi,ti)?ri+="(("+ti+"."+si+") ? ("+ti+"."+si+") : (window."+si+"))":ri=ri+si,oi=ei.shift()}}}function y(ii,ei){for(var ti="";ii.length>0&&!ei.test(ii[0]);)ti+=ii.shift();return ti}function tt(ii){var ei;return ii.length>0&&Ze.test(ii[0])?(ii.shift(),ei=y(ii,Ke).trim(),ii.shift()):ei=y(ii,x),ei}var rt="input, textarea, select";function nt(ii,ei,ti){var ni=[],ri=Ye(ei);do{y(ri,Je);var oi=ri.length,si=y(ri,/[,\[\s]/);if(si!=="")if(si==="every"){var ai={trigger:"every"};y(ri,Je),ai.pollInterval=d(y(ri,/[,\[\s]/)),y(ri,Je);var li=et(ii,ri,"event");li&&(ai.eventFilter=li),ni.push(ai)}else if(si.indexOf("sse:")===0)ni.push({trigger:"sse",sseEvent:si.substr(4)});else{var ui={trigger:si},li=et(ii,ri,"event");for(li&&(ui.eventFilter=li);ri.length>0&&ri[0]!==",";){y(ri,Je);var ci=ri.shift();if(ci==="changed")ui.changed=!0;else if(ci==="once")ui.once=!0;else if(ci==="consume")ui.consume=!0;else if(ci==="delay"&&ri[0]===":")ri.shift(),ui.delay=d(y(ri,x));else if(ci==="from"&&ri[0]===":"){if(ri.shift(),Ze.test(ri[0]))var di=tt(ri);else{var di=y(ri,x);if(di==="closest"||di==="find"||di==="next"||di==="previous"){ri.shift();var pi=tt(ri);pi.length>0&&(di+=" "+pi)}}ui.from=di}else ci==="target"&&ri[0]===":"?(ri.shift(),ui.target=tt(ri)):ci==="throttle"&&ri[0]===":"?(ri.shift(),ui.throttle=d(y(ri,x))):ci==="queue"&&ri[0]===":"?(ri.shift(),ui.queue=y(ri,x)):ci==="root"&&ri[0]===":"?(ri.shift(),ui[ci]=tt(ri)):ci==="threshold"&&ri[0]===":"?(ri.shift(),ui[ci]=y(ri,x)):fe(ii,"htmx:syntax:error",{token:ri.shift()})}ni.push(ui)}ri.length===oi&&fe(ii,"htmx:syntax:error",{token:ri.shift()}),y(ri,Je)}while(ri[0]===","&&ri.shift());return ti&&(ti[ei]=ni),ni}function it(ii){var ei=te(ii,"hx-trigger"),ti=[];if(ei){var ni=Q.config.triggerSpecsCache;ti=ni&&ni[ei]||nt(ii,ei,ni)}return ti.length>0?ti:h(ii,"form")?[{trigger:"submit"}]:h(ii,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:h(ii,rt)?[{trigger:"change"}]:[{trigger:"click"}]}function at(ii){ae(ii).cancelled=!0}function ot(ii,ei,ti){var ni=ae(ii);ni.timeout=setTimeout(function(){se(ii)&&ni.cancelled!==!0&&(ct(ti,ii,Wt("hx:poll:trigger",{triggerSpec:ti,target:ii}))||ei(ii),ot(ii,ei,ti))},ti.pollInterval)}function st(ii){return location.hostname===ii.hostname&&ee(ii,"href")&&ee(ii,"href").indexOf("#")!==0}function lt(ii,ei,ti){if(ii.tagName==="A"&&st(ii)&&(ii.target===""||ii.target==="_self")||ii.tagName==="FORM"){ei.boosted=!0;var ni,ri;if(ii.tagName==="A")ni="get",ri=ee(ii,"href");else{var oi=ee(ii,"method");ni=oi?oi.toLowerCase():"get",ri=ee(ii,"action")}ti.forEach(function(si){ht(ii,function(ai,li){if(v(ai,Q.config.disableSelector)){m(ai);return}he(ni,ri,ai,li)},ei,si,!0)})}}function ut(ii,ei){return!!((ii.type==="submit"||ii.type==="click")&&(ei.tagName==="FORM"||h(ei,'input[type="submit"], button')&&v(ei,"form")!==null||ei.tagName==="A"&&ei.href&&(ei.getAttribute("href")==="#"||ei.getAttribute("href").indexOf("#")!==0)))}function ft(ii,ei){return ae(ii).boosted&&ii.tagName==="A"&&ei.type==="click"&&(ei.ctrlKey||ei.metaKey)}function ct(ii,ei,ti){var ni=ii.eventFilter;if(ni)try{return ni.call(ei,ti)!==!0}catch(ri){return fe(re().body,"htmx:eventFilter:error",{error:ri,source:ni.source}),!0}return!1}function ht(ii,ei,ti,ni,ri){var oi=ae(ii),si;ni.from?si=Z(ii,ni.from):si=[ii],ni.changed&&si.forEach(function(ai){var li=ae(ai);li.lastValue=ai.value}),oe(si,function(ai){var li=function(ui){if(!se(ii)){ai.removeEventListener(ni.trigger,li);return}if(!ft(ii,ui)&&((ri||ut(ui,ii))&&ui.preventDefault(),!ct(ni,ii,ui))){var ci=ae(ui);if(ci.triggerSpec=ni,ci.handledFor==null&&(ci.handledFor=[]),ci.handledFor.indexOf(ii)<0){if(ci.handledFor.push(ii),ni.consume&&ui.stopPropagation(),ni.target&&ui.target&&!h(ui.target,ni.target))return;if(ni.once){if(oi.triggeredOnce)return;oi.triggeredOnce=!0}if(ni.changed){var di=ae(ai);if(di.lastValue===ai.value)return;di.lastValue=ai.value}if(oi.delayed&&clearTimeout(oi.delayed),oi.throttle)return;ni.throttle>0?oi.throttle||(ei(ii,ui),oi.throttle=setTimeout(function(){oi.throttle=null},ni.throttle)):ni.delay>0?oi.delayed=setTimeout(function(){ei(ii,ui)},ni.delay):(ce(ii,"htmx:trigger"),ei(ii,ui))}}};ti.listenerInfos==null&&(ti.listenerInfos=[]),ti.listenerInfos.push({trigger:ni.trigger,listener:li,on:ai}),ai.addEventListener(ni.trigger,li)})}var vt=!1,dt=null;function gt(){dt||(dt=function(){vt=!0},window.addEventListener("scroll",dt),setInterval(function(){vt&&(vt=!1,oe(re().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(ii){pt(ii)}))},200))}function pt(ii){if(!o(ii,"data-hx-revealed")&&X(ii)){ii.setAttribute("data-hx-revealed","true");var ei=ae(ii);ei.initHash?ce(ii,"revealed"):ii.addEventListener("htmx:afterProcessNode",function(ti){ce(ii,"revealed")},{once:!0})}}function mt(ii,ei,ti){for(var ni=D(ti),ri=0;ri=0){var si=wt(ti);setTimeout(function(){xt(ii,ei,ti+1)},si)}},ri.onopen=function(oi){ti=0},ae(ii).webSocket=ri,ri.addEventListener("message",function(oi){if(!yt(ii)){var si=oi.data;R(ii,function(pi){si=pi.transformResponse(si,null,ii)});for(var ai=T(ii),li=l(si),ui=M(li.children),ci=0;ci0){ce(ii,"htmx:validation:halted",si);return}ni.send(JSON.stringify(ci)),ut(ti,ii)&&ti.preventDefault()}):fe(ii,"htmx:noWebSocketSourceError")}function wt(ii){var ei=Q.config.wsReconnectDelay;if(typeof ei=="function")return ei(ii);if(ei==="full-jitter"){var ti=Math.min(ii,6),ni=1e3*Math.pow(2,ti);return ni*Math.random()}b('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function St(ii,ei,ti){for(var ni=D(ti),ri=0;ri0?setTimeout(ri,ni):ri()}function Ht(ii,ei,ti){var ni=!1;return oe(w,function(ri){if(o(ii,"hx-"+ri)){var oi=te(ii,"hx-"+ri);ni=!0,ei.path=oi,ei.verb=ri,ti.forEach(function(si){Lt(ii,si,ei,function(ai,li){if(v(ai,Q.config.disableSelector)){m(ai);return}he(ri,oi,ai,li)})})}}),ni}function Lt(ii,ei,ti,ni){if(ei.sseEvent)Rt(ii,ni,ei.sseEvent);else if(ei.trigger==="revealed")gt(),ht(ii,ni,ti,ei),pt(ii);else if(ei.trigger==="intersect"){var ri={};ei.root&&(ri.root=ue(ii,ei.root)),ei.threshold&&(ri.threshold=parseFloat(ei.threshold));var oi=new IntersectionObserver(function(si){for(var ai=0;ai0?(ti.polling=!0,ot(ii,ni,ei)):ht(ii,ni,ti,ei)}function At(ii){if(!ii.htmxExecuted&&Q.config.allowScriptTags&&(ii.type==="text/javascript"||ii.type==="module"||ii.type==="")){var ei=re().createElement("script");oe(ii.attributes,function(ni){ei.setAttribute(ni.name,ni.value)}),ei.textContent=ii.textContent,ei.async=!1,Q.config.inlineScriptNonce&&(ei.nonce=Q.config.inlineScriptNonce);var ti=ii.parentElement;try{ti.insertBefore(ei,ii)}catch(ni){b(ni)}finally{ii.parentElement&&ii.parentElement.removeChild(ii)}}}function Nt(ii){h(ii,"script")&&At(ii),oe(f(ii,"script"),function(ei){At(ei)})}function It(ii){var ei=ii.attributes;if(!ei)return!1;for(var ti=0;ti0;){var si=ni.shift(),ai=si.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/);oi===0&&ai?(si.split(":"),ri=ai[1].slice(0,-1),ti[ri]=ai[2]):ti[ri]+=si,oi+=Bt(si)}for(var li in ti)Ft(ii,li,ti[li])}}function jt(ii){Ae(ii);for(var ei=0;eiQ.config.historyCacheSize;)ri.shift();for(;ri.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(ri));break}catch(ai){fe(re().body,"htmx:historyCacheError",{cause:ai,cache:ri}),ri.shift()}}}function Yt(ii){if(!U())return null;ii=B(ii);for(var ei=E(localStorage.getItem("htmx-history-cache"))||[],ti=0;ti=200&&this.status<400){ce(re().body,"htmx:historyCacheMissLoad",ti);var ni=l(this.response);ni=ni.querySelector("[hx-history-elt],[data-hx-history-elt]")||ni;var ri=Zt(),oi=T(ri),si=Ve(this.response);if(si){var ai=C("title");ai?ai.innerHTML=si:window.document.title=si}Ue(ri,ni,oi),nr(oi.tasks),Jt=ii,ce(re().body,"htmx:historyRestore",{path:ii,cacheMiss:!0,serverResponse:this.response})}else fe(re().body,"htmx:historyCacheMissLoadError",ti)},ei.send()}function ar(ii){er(),ii=ii||location.pathname+location.search;var ei=Yt(ii);if(ei){var ti=l(ei.content),ni=Zt(),ri=T(ni);Ue(ni,ti,ri),nr(ri.tasks),document.title=ei.title,setTimeout(function(){window.scrollTo(0,ei.scroll)},0),Jt=ii,ce(re().body,"htmx:historyRestore",{path:ii,item:ei})}else Q.config.refreshOnHistoryMiss?window.location.reload(!0):ir(ii)}function or(ii){var ei=me(ii,"hx-indicator");return ei==null&&(ei=[ii]),oe(ei,function(ti){var ni=ae(ti);ni.requestCount=(ni.requestCount||0)+1,ti.classList.add.call(ti.classList,Q.config.requestClass)}),ei}function sr(ii){var ei=me(ii,"hx-disabled-elt");return ei==null&&(ei=[]),oe(ei,function(ti){var ni=ae(ti);ni.requestCount=(ni.requestCount||0)+1,ti.setAttribute("disabled","")}),ei}function lr(ii,ei){oe(ii,function(ti){var ni=ae(ti);ni.requestCount=(ni.requestCount||0)-1,ni.requestCount===0&&ti.classList.remove.call(ti.classList,Q.config.requestClass)}),oe(ei,function(ti){var ni=ae(ti);ni.requestCount=(ni.requestCount||0)-1,ni.requestCount===0&&ti.removeAttribute("disabled")})}function ur(ii,ei){for(var ti=0;ti=0}function wr(ii,ei){var ti=ei||ne(ii,"hx-swap"),ni={swapStyle:ae(ii).boosted?"innerHTML":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ae(ii).boosted&&!br(ii)&&(ni.show="top"),ti){var ri=D(ti);if(ri.length>0)for(var oi=0;oi0?li.join(":"):null;ni.scroll=ui,ni.scrollTarget=ci}else if(si.indexOf("show:")===0){var di=si.substr(5),li=di.split(":"),pi=li.pop(),ci=li.length>0?li.join(":"):null;ni.show=pi,ni.showTarget=ci}else if(si.indexOf("focus-scroll:")===0){var yi=si.substr(13);ni.focusScroll=yi=="true"}else oi==0?ni.swapStyle=si:b("Unknown modifier in hx-swap: "+si)}}return ni}function Sr(ii){return ne(ii,"hx-encoding")==="multipart/form-data"||h(ii,"form")&&ee(ii,"enctype")==="multipart/form-data"}function Er(ii,ei,ti){var ni=null;return R(ei,function(ri){ni==null&&(ni=ri.encodeParameters(ii,ti,ei))}),ni!=null?ni:Sr(ei)?mr(ti):pr(ti)}function T(ii){return{tasks:[],elts:[ii]}}function Cr(ii,ei){var ti=ii[0],ni=ii[ii.length-1];if(ei.scroll){var ri=null;ei.scrollTarget&&(ri=ue(ti,ei.scrollTarget)),ei.scroll==="top"&&(ti||ri)&&(ri=ri||ti,ri.scrollTop=0),ei.scroll==="bottom"&&(ni||ri)&&(ri=ri||ni,ri.scrollTop=ri.scrollHeight)}if(ei.show){var ri=null;if(ei.showTarget){var oi=ei.showTarget;ei.showTarget==="window"&&(oi="body"),ri=ue(ti,oi)}ei.show==="top"&&(ti||ri)&&(ri=ri||ti,ri.scrollIntoView({block:"start",behavior:Q.config.scrollBehavior})),ei.show==="bottom"&&(ni||ri)&&(ri=ri||ni,ri.scrollIntoView({block:"end",behavior:Q.config.scrollBehavior}))}}function Rr(ii,ei,ti,ni){if(ni==null&&(ni={}),ii==null)return ni;var ri=te(ii,ei);if(ri){var oi=ri.trim(),si=ti;if(oi==="unset")return null;oi.indexOf("javascript:")===0?(oi=oi.substr(11),si=!0):oi.indexOf("js:")===0&&(oi=oi.substr(3),si=!0),oi.indexOf("{")!==0&&(oi="{"+oi+"}");var ai;si?ai=Tr(ii,function(){return Function("return ("+oi+")")()},{}):ai=E(oi);for(var li in ai)ai.hasOwnProperty(li)&&ni[li]==null&&(ni[li]=ai[li])}return Rr(u(ii),ei,ti,ni)}function Tr(ii,ei,ti){return Q.config.allowEval?ei():(fe(ii,"htmx:evalDisallowedError"),ti)}function Or(ii,ei){return Rr(ii,"hx-vars",!0,ei)}function qr(ii,ei){return Rr(ii,"hx-vals",!1,ei)}function Hr(ii){return le(Or(ii),qr(ii))}function Lr(ii,ei,ti){if(ti!==null)try{ii.setRequestHeader(ei,ti)}catch(ni){ii.setRequestHeader(ei,encodeURIComponent(ti)),ii.setRequestHeader(ei+"-URI-AutoEncoded","true")}}function Ar(ii){if(ii.responseURL&&typeof URL!="undefined")try{var ei=new URL(ii.responseURL);return ei.pathname+ei.search}catch(ti){fe(re().body,"htmx:badResponseUrl",{url:ii.responseURL})}}function O(ii,ei){return ei.test(ii.getAllResponseHeaders())}function Nr(ii,ei,ti){return ii=ii.toLowerCase(),ti?ti instanceof Element||I(ti,"String")?he(ii,ei,null,null,{targetOverride:p(ti),returnPromise:!0}):he(ii,ei,p(ti.source),ti.event,{handler:ti.handler,headers:ti.headers,values:ti.values,targetOverride:p(ti.target),swapOverride:ti.swap,select:ti.select,returnPromise:!0}):he(ii,ei,null,null,{returnPromise:!0})}function Ir(ii){for(var ei=[];ii;)ei.push(ii),ii=ii.parentElement;return ei}function kr(ii,ei,ti){var ni,ri;if(typeof URL=="function"){ri=new URL(ei,document.location.href);var oi=document.location.origin;ni=oi===ri.origin}else ri=ei,ni=g(ei,document.location.origin);return Q.config.selfRequestsOnly&&!ni?!1:ce(ii,"htmx:validateUrl",le({url:ri,sameHost:ni},ti))}function he(ii,ei,ti,ni,ri,oi){var si=null,ai=null;if(ri=ri!=null?ri:{},ri.returnPromise&&typeof Promise!="undefined")var li=new Promise(function(On,zn){si=On,ai=zn});ti==null&&(ti=re().body);var ui=ri.handler||Mr,ci=ri.select||null;if(!se(ti))return ie(si),li;var di=ri.targetOverride||ye(ti);if(di==null||di==pe)return fe(ti,"htmx:targetError",{target:te(ti,"hx-target")}),ie(ai),li;var pi=ae(ti),yi=pi.lastButtonClicked;if(yi){var gi=ee(yi,"formaction");gi!=null&&(ei=gi);var vi=ee(yi,"formmethod");vi!=null&&vi.toLowerCase()!=="dialog"&&(ii=vi)}var Ei=ne(ti,"hx-confirm");if(oi===void 0){var Si=function(On){return he(ii,ei,ti,ni,ri,!!On)},xi={target:di,elt:ti,path:ei,verb:ii,triggeringEvent:ni,etc:ri,issueRequest:Si,question:Ei};if(ce(ti,"htmx:confirm",xi)===!1)return ie(si),li}var Li=ti,Oi=ne(ti,"hx-sync"),zi=null,Vi=!1;if(Oi){var ki=Oi.split(":"),Mi=ki[0].trim();if(Mi==="this"?Li=xe(ti,"hx-sync"):Li=ue(ti,Mi),Oi=(ki[1]||"drop").trim(),pi=ae(Li),Oi==="drop"&&pi.xhr&&pi.abortable!==!0)return ie(si),li;if(Oi==="abort"){if(pi.xhr)return ie(si),li;Vi=!0}else if(Oi==="replace")ce(Li,"htmx:abort");else if(Oi.indexOf("queue")===0){var Ai=Oi.split(" ");zi=(Ai[1]||"last").trim()}}if(pi.xhr)if(pi.abortable)ce(Li,"htmx:abort");else{if(zi==null){if(ni){var qi=ae(ni);qi&&qi.triggerSpec&&qi.triggerSpec.queue&&(zi=qi.triggerSpec.queue)}zi==null&&(zi="last")}return pi.queuedRequests==null&&(pi.queuedRequests=[]),zi==="first"&&pi.queuedRequests.length===0?pi.queuedRequests.push(function(){he(ii,ei,ti,ni,ri)}):zi==="all"?pi.queuedRequests.push(function(){he(ii,ei,ti,ni,ri)}):zi==="last"&&(pi.queuedRequests=[],pi.queuedRequests.push(function(){he(ii,ei,ti,ni,ri)})),ie(si),li}var Ci=new XMLHttpRequest;pi.xhr=Ci,pi.abortable=Vi;var Qi=function(){if(pi.xhr=null,pi.abortable=!1,pi.queuedRequests!=null&&pi.queuedRequests.length>0){var On=pi.queuedRequests.shift();On()}},Ji=ne(ti,"hx-prompt");if(Ji){var gn=prompt(Ji);if(gn===null||!ce(ti,"htmx:prompt",{prompt:gn,target:di}))return ie(si),Qi(),li}if(Ei&&!oi&&!confirm(Ei))return ie(si),Qi(),li;var rn=xr(ti,di,gn);ii!=="get"&&!Sr(ti)&&(rn["Content-Type"]="application/x-www-form-urlencoded"),ri.headers&&(rn=le(rn,ri.headers));var Zi=dr(ti,ii),on=Zi.errors,Mn=Zi.values;ri.values&&(Mn=le(Mn,ri.values));var vn=Hr(ti),Yi=le(Mn,vn),Ri=yr(Yi,ti);Q.config.getCacheBusterParam&&ii==="get"&&(Ri["org.htmx.cache-buster"]=ee(di,"id")||"true"),(ei==null||ei==="")&&(ei=re().location.href);var Ii=Rr(ti,"hx-request"),Ui=ae(ti).boosted,ji=Q.config.methodsThatUseUrlParams.indexOf(ii)>=0,Pi={boosted:Ui,useUrlParams:ji,parameters:Ri,unfilteredParameters:Yi,headers:rn,target:di,verb:ii,errors:on,withCredentials:ri.credentials||Ii.credentials||Q.config.withCredentials,timeout:ri.timeout||Ii.timeout||Q.config.timeout,path:ei,triggeringEvent:ni};if(!ce(ti,"htmx:configRequest",Pi))return ie(si),Qi(),li;if(ei=Pi.path,ii=Pi.verb,rn=Pi.headers,Ri=Pi.parameters,on=Pi.errors,ji=Pi.useUrlParams,on&&on.length>0)return ce(ti,"htmx:validation:halted",Pi),ie(si),Qi(),li;var ln=ei.split("#"),kn=ln[0],yn=ln[1],Sn=ei;if(ji){Sn=kn;var $s=Object.keys(Ri).length!==0;$s&&(Sn.indexOf("?")<0?Sn+="?":Sn+="&",Sn+=pr(Ri),yn&&(Sn+="#"+yn))}if(!kr(ti,Sn,Pi))return fe(ti,"htmx:invalidPath",Pi),ie(ai),li;if(Ci.open(ii.toUpperCase(),Sn,!0),Ci.overrideMimeType("text/html"),Ci.withCredentials=Pi.withCredentials,Ci.timeout=Pi.timeout,!Ii.noHeaders){for(var ro in rn)if(rn.hasOwnProperty(ro)){var wo=rn[ro];Lr(Ci,ro,wo)}}var bn={xhr:Ci,target:di,requestConfig:Pi,etc:ri,boosted:Ui,select:ci,pathInfo:{requestPath:ei,finalRequestPath:Sn,anchor:yn}};if(Ci.onload=function(){try{var On=Ir(ti);if(bn.pathInfo.responsePath=Ar(Ci),ui(ti,bn),lr(xo,ao),ce(ti,"htmx:afterRequest",bn),ce(ti,"htmx:afterOnLoad",bn),!se(ti)){for(var zn=null;On.length>0&&zn==null;){var Gn=On.shift();se(Gn)&&(zn=Gn)}zn&&(ce(zn,"htmx:afterRequest",bn),ce(zn,"htmx:afterOnLoad",bn))}ie(si),Qi()}catch(Jn){throw fe(ti,"htmx:onLoadError",le({error:Jn},bn)),Jn}},Ci.onerror=function(){lr(xo,ao),fe(ti,"htmx:afterRequest",bn),fe(ti,"htmx:sendError",bn),ie(ai),Qi()},Ci.onabort=function(){lr(xo,ao),fe(ti,"htmx:afterRequest",bn),fe(ti,"htmx:sendAbort",bn),ie(ai),Qi()},Ci.ontimeout=function(){lr(xo,ao),fe(ti,"htmx:afterRequest",bn),fe(ti,"htmx:timeout",bn),ie(ai),Qi()},!ce(ti,"htmx:beforeRequest",bn))return ie(si),Qi(),li;var xo=or(ti),ao=sr(ti);oe(["loadstart","loadend","progress","abort"],function(On){oe([Ci,Ci.upload],function(zn){zn.addEventListener(On,function(Gn){ce(ti,"htmx:xhr:"+On,{lengthComputable:Gn.lengthComputable,loaded:Gn.loaded,total:Gn.total})})})}),ce(ti,"htmx:beforeSend",bn);var ls=ji?null:Er(Ci,ti,Ri);return Ci.send(ls),li}function Pr(ii,ei){var ti=ei.xhr,ni=null,ri=null;if(O(ti,/HX-Push:/i)?(ni=ti.getResponseHeader("HX-Push"),ri="push"):O(ti,/HX-Push-Url:/i)?(ni=ti.getResponseHeader("HX-Push-Url"),ri="push"):O(ti,/HX-Replace-Url:/i)&&(ni=ti.getResponseHeader("HX-Replace-Url"),ri="replace"),ni)return ni==="false"?{}:{type:ri,path:ni};var oi=ei.pathInfo.finalRequestPath,si=ei.pathInfo.responsePath,ai=ne(ii,"hx-push-url"),li=ne(ii,"hx-replace-url"),ui=ae(ii).boosted,ci=null,di=null;return ai?(ci="push",di=ai):li?(ci="replace",di=li):ui&&(ci="push",di=si||oi),di?di==="false"?{}:(di==="true"&&(di=si||oi),ei.pathInfo.anchor&&di.indexOf("#")===-1&&(di=di+"#"+ei.pathInfo.anchor),{type:ci,path:di}):{}}function Mr(ii,ei){var ti=ei.xhr,ni=ei.target,ri=ei.etc,oi=ei.requestConfig,si=ei.select;if(ce(ii,"htmx:beforeOnLoad",ei)){if(O(ti,/HX-Trigger:/i)&&_e(ti,"HX-Trigger",ii),O(ti,/HX-Location:/i)){er();var ai=ti.getResponseHeader("HX-Location"),li;ai.indexOf("{")===0&&(li=E(ai),ai=li.path,delete li.path),Nr("GET",ai,li).then(function(){tr(ai)});return}var ui=O(ti,/HX-Refresh:/i)&&ti.getResponseHeader("HX-Refresh")==="true";if(O(ti,/HX-Redirect:/i)){location.href=ti.getResponseHeader("HX-Redirect"),ui&&location.reload();return}if(ui){location.reload();return}O(ti,/HX-Retarget:/i)&&(ti.getResponseHeader("HX-Retarget")==="this"?ei.target=ii:ei.target=ue(ii,ti.getResponseHeader("HX-Retarget")));var ci=Pr(ii,ei),di=ti.status>=200&&ti.status<400&&ti.status!==204,pi=ti.response,yi=ti.status>=400,gi=Q.config.ignoreTitle,vi=le({shouldSwap:di,serverResponse:pi,isError:yi,ignoreTitle:gi},ei);if(ce(ni,"htmx:beforeSwap",vi)){if(ni=vi.target,pi=vi.serverResponse,yi=vi.isError,gi=vi.ignoreTitle,ei.target=ni,ei.failed=yi,ei.successful=!yi,vi.shouldSwap){ti.status===286&&at(ii),R(ii,function(Mi){pi=Mi.transformResponse(pi,ti,ii)}),ci.type&&er();var Ei=ri.swapOverride;O(ti,/HX-Reswap:/i)&&(Ei=ti.getResponseHeader("HX-Reswap"));var li=wr(ii,Ei);li.hasOwnProperty("ignoreTitle")&&(gi=li.ignoreTitle),ni.classList.add(Q.config.swappingClass);var Si=null,xi=null,Li=function(){try{var Mi=document.activeElement,Ai={};try{Ai={elt:Mi,start:Mi?Mi.selectionStart:null,end:Mi?Mi.selectionEnd:null}}catch(Zi){}var qi;si&&(qi=si),O(ti,/HX-Reselect:/i)&&(qi=ti.getResponseHeader("HX-Reselect")),ci.type&&(ce(re().body,"htmx:beforeHistoryUpdate",le({history:ci},ei)),ci.type==="push"?(tr(ci.path),ce(re().body,"htmx:pushedIntoHistory",{path:ci.path})):(rr(ci.path),ce(re().body,"htmx:replacedInHistory",{path:ci.path})));var Ci=T(ni);if(je(li.swapStyle,ni,ii,pi,Ci,qi),Ai.elt&&!se(Ai.elt)&&ee(Ai.elt,"id")){var Qi=document.getElementById(ee(Ai.elt,"id")),Ji={preventScroll:li.focusScroll!==void 0?!li.focusScroll:!Q.config.defaultFocusScroll};if(Qi){if(Ai.start&&Qi.setSelectionRange)try{Qi.setSelectionRange(Ai.start,Ai.end)}catch(Zi){}Qi.focus(Ji)}}if(ni.classList.remove(Q.config.swappingClass),oe(Ci.elts,function(Zi){Zi.classList&&Zi.classList.add(Q.config.settlingClass),ce(Zi,"htmx:afterSwap",ei)}),O(ti,/HX-Trigger-After-Swap:/i)){var gn=ii;se(ii)||(gn=re().body),_e(ti,"HX-Trigger-After-Swap",gn)}var rn=function(){if(oe(Ci.tasks,function(vn){vn.call()}),oe(Ci.elts,function(vn){vn.classList&&vn.classList.remove(Q.config.settlingClass),ce(vn,"htmx:afterSettle",ei)}),ei.pathInfo.anchor){var Zi=re().getElementById(ei.pathInfo.anchor);Zi&&Zi.scrollIntoView({block:"start",behavior:"auto"})}if(Ci.title&&!gi){var on=C("title");on?on.innerHTML=Ci.title:window.document.title=Ci.title}if(Cr(Ci.elts,li),O(ti,/HX-Trigger-After-Settle:/i)){var Mn=ii;se(ii)||(Mn=re().body),_e(ti,"HX-Trigger-After-Settle",Mn)}ie(Si)};li.settleDelay>0?setTimeout(rn,li.settleDelay):rn()}catch(Zi){throw fe(ii,"htmx:swapError",ei),ie(xi),Zi}},Oi=Q.config.globalViewTransitions;if(li.hasOwnProperty("transition")&&(Oi=li.transition),Oi&&ce(ii,"htmx:beforeTransition",ei)&&typeof Promise!="undefined"&&document.startViewTransition){var zi=new Promise(function(Mi,Ai){Si=Mi,xi=Ai}),Vi=Li;Li=function(){document.startViewTransition(function(){return Vi(),zi})}}li.swapDelay>0?setTimeout(Li,li.swapDelay):Li()}yi&&fe(ii,"htmx:responseError",le({error:"Response Status Error Code "+ti.status+" from "+ei.pathInfo.requestPath},ei))}}}var Xr={};function Dr(){return{init:function(ii){return null},onEvent:function(ii,ei){return!0},transformResponse:function(ii,ei,ti){return ii},isInlineSwap:function(ii){return!1},handleSwap:function(ii,ei,ti,ni){return!1},encodeParameters:function(ii,ei,ti){return null}}}function Ur(ii,ei){ei.init&&ei.init(r),Xr[ii]=le(Dr(),ei)}function Br(ii){delete Xr[ii]}function Fr(ii,ei,ti){if(ii==null)return ei;ei==null&&(ei=[]),ti==null&&(ti=[]);var ni=te(ii,"hx-ext");return ni&&oe(ni.split(","),function(ri){if(ri=ri.replace(/ /g,""),ri.slice(0,7)=="ignore:"){ti.push(ri.slice(7));return}if(ti.indexOf(ri)<0){var oi=Xr[ri];oi&&ei.indexOf(oi)<0&&ei.push(oi)}}),Fr(u(ii),ei,ti)}var Vr=!1;re().addEventListener("DOMContentLoaded",function(){Vr=!0});function jr(ii){Vr||re().readyState==="complete"?ii():re().addEventListener("DOMContentLoaded",ii)}function _r(){Q.config.includeIndicatorStyles!==!1&&re().head.insertAdjacentHTML("beforeend","")}function zr(){var ii=re().querySelector('meta[name="htmx-config"]');return ii?E(ii.content):null}function $r(){var ii=zr();ii&&(Q.config=le(Q.config,ii))}return jr(function(){$r(),_r();var ii=re().body;zt(ii);var ei=re().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");ii.addEventListener("htmx:abort",function(ni){var ri=ni.target,oi=ae(ri);oi&&oi.xhr&&oi.xhr.abort()});let ti=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(ni){ni.state&&ni.state.htmx?(ar(),oe(ei,function(ri){ce(ri,"htmx:restored",{document:re(),triggerEvent:ce})})):ti&&ti(ni)},setTimeout(function(){ce(ii,"htmx:load",{}),ii=null},0)}),Q}()})});var fh=au((va,Uc)=>{(function(ei,ti){typeof va=="object"&&typeof Uc=="object"?Uc.exports=ti():typeof define=="function"&&define.amd?define([],ti):typeof va=="object"?va.ClipboardJS=ti():ei.ClipboardJS=ti()})(va,function(){return function(){var ii={686:function(ni,ri,oi){"use strict";oi.d(ri,{default:function(){return vn}});var si=oi(279),ai=oi.n(si),li=oi(370),ui=oi.n(li),ci=oi(817),di=oi.n(ci);function pi(Yi){try{return document.execCommand(Yi)}catch(Ri){return!1}}var yi=function(Ri){var Ii=di()(Ri);return pi("cut"),Ii},gi=yi;function vi(Yi){var Ri=document.documentElement.getAttribute("dir")==="rtl",Ii=document.createElement("textarea");Ii.style.fontSize="12pt",Ii.style.border="0",Ii.style.padding="0",Ii.style.margin="0",Ii.style.position="absolute",Ii.style[Ri?"right":"left"]="-9999px";var Ui=window.pageYOffset||document.documentElement.scrollTop;return Ii.style.top="".concat(Ui,"px"),Ii.setAttribute("readonly",""),Ii.value=Yi,Ii}var Ei=function(Ri,Ii){var Ui=vi(Ri);Ii.container.appendChild(Ui);var ji=di()(Ui);return pi("copy"),Ui.remove(),ji},Si=function(Ri){var Ii=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},Ui="";return typeof Ri=="string"?Ui=Ei(Ri,Ii):Ri instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(Ri==null?void 0:Ri.type)?Ui=Ei(Ri.value,Ii):(Ui=di()(Ri),pi("copy")),Ui},xi=Si;function Li(Yi){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Li=function(Ii){return typeof Ii}:Li=function(Ii){return Ii&&typeof Symbol=="function"&&Ii.constructor===Symbol&&Ii!==Symbol.prototype?"symbol":typeof Ii},Li(Yi)}var Oi=function(){var Ri=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},Ii=Ri.action,Ui=Ii===void 0?"copy":Ii,ji=Ri.container,Pi=Ri.target,ln=Ri.text;if(Ui!=="copy"&&Ui!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Pi!==void 0)if(Pi&&Li(Pi)==="object"&&Pi.nodeType===1){if(Ui==="copy"&&Pi.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(Ui==="cut"&&(Pi.hasAttribute("readonly")||Pi.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(ln)return xi(ln,{container:ji});if(Pi)return Ui==="cut"?gi(Pi):xi(Pi,{container:ji})},zi=Oi;function Vi(Yi){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Vi=function(Ii){return typeof Ii}:Vi=function(Ii){return Ii&&typeof Symbol=="function"&&Ii.constructor===Symbol&&Ii!==Symbol.prototype?"symbol":typeof Ii},Vi(Yi)}function ki(Yi,Ri){if(!(Yi instanceof Ri))throw new TypeError("Cannot call a class as a function")}function Mi(Yi,Ri){for(var Ii=0;Ii0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof ji.action=="function"?ji.action:this.defaultAction,this.target=typeof ji.target=="function"?ji.target:this.defaultTarget,this.text=typeof ji.text=="function"?ji.text:this.defaultText,this.container=Vi(ji.container)==="object"?ji.container:document.body}},{key:"listenClick",value:function(ji){var Pi=this;this.listener=ui()(ji,"click",function(ln){return Pi.onClick(ln)})}},{key:"onClick",value:function(ji){var Pi=ji.delegateTarget||ji.currentTarget,ln=this.action(Pi)||"copy",kn=zi({action:ln,container:this.container,target:this.target(Pi),text:this.text(Pi)});this.emit(kn?"success":"error",{action:ln,text:kn,trigger:Pi,clearSelection:function(){Pi&&Pi.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(ji){return on("action",ji)}},{key:"defaultTarget",value:function(ji){var Pi=on("target",ji);if(Pi)return document.querySelector(Pi)}},{key:"defaultText",value:function(ji){return on("text",ji)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(ji){var Pi=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return xi(ji,Pi)}},{key:"cut",value:function(ji){return gi(ji)}},{key:"isSupported",value:function(){var ji=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Pi=typeof ji=="string"?[ji]:ji,ln=!!document.queryCommandSupported;return Pi.forEach(function(kn){ln=ln&&!!document.queryCommandSupported(kn)}),ln}}]),Ii}(ai()),vn=Mn},828:function(ni){var ri=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var oi=Element.prototype;oi.matches=oi.matchesSelector||oi.mozMatchesSelector||oi.msMatchesSelector||oi.oMatchesSelector||oi.webkitMatchesSelector}function si(ai,li){for(;ai&&ai.nodeType!==ri;){if(typeof ai.matches=="function"&&ai.matches(li))return ai;ai=ai.parentNode}}ni.exports=si},438:function(ni,ri,oi){var si=oi(828);function ai(ci,di,pi,yi,gi){var vi=ui.apply(this,arguments);return ci.addEventListener(pi,vi,gi),{destroy:function(){ci.removeEventListener(pi,vi,gi)}}}function li(ci,di,pi,yi,gi){return typeof ci.addEventListener=="function"?ai.apply(null,arguments):typeof pi=="function"?ai.bind(null,document).apply(null,arguments):(typeof ci=="string"&&(ci=document.querySelectorAll(ci)),Array.prototype.map.call(ci,function(vi){return ai(vi,di,pi,yi,gi)}))}function ui(ci,di,pi,yi){return function(gi){gi.delegateTarget=si(gi.target,di),gi.delegateTarget&&yi.call(ci,gi)}}ni.exports=li},879:function(ni,ri){ri.node=function(oi){return oi!==void 0&&oi instanceof HTMLElement&&oi.nodeType===1},ri.nodeList=function(oi){var si=Object.prototype.toString.call(oi);return oi!==void 0&&(si==="[object NodeList]"||si==="[object HTMLCollection]")&&"length"in oi&&(oi.length===0||ri.node(oi[0]))},ri.string=function(oi){return typeof oi=="string"||oi instanceof String},ri.fn=function(oi){var si=Object.prototype.toString.call(oi);return si==="[object Function]"}},370:function(ni,ri,oi){var si=oi(879),ai=oi(438);function li(pi,yi,gi){if(!pi&&!yi&&!gi)throw new Error("Missing required arguments");if(!si.string(yi))throw new TypeError("Second argument must be a String");if(!si.fn(gi))throw new TypeError("Third argument must be a Function");if(si.node(pi))return ui(pi,yi,gi);if(si.nodeList(pi))return ci(pi,yi,gi);if(si.string(pi))return di(pi,yi,gi);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function ui(pi,yi,gi){return pi.addEventListener(yi,gi),{destroy:function(){pi.removeEventListener(yi,gi)}}}function ci(pi,yi,gi){return Array.prototype.forEach.call(pi,function(vi){vi.addEventListener(yi,gi)}),{destroy:function(){Array.prototype.forEach.call(pi,function(vi){vi.removeEventListener(yi,gi)})}}}function di(pi,yi,gi){return ai(document.body,pi,yi,gi)}ni.exports=li},817:function(ni){function ri(oi){var si;if(oi.nodeName==="SELECT")oi.focus(),si=oi.value;else if(oi.nodeName==="INPUT"||oi.nodeName==="TEXTAREA"){var ai=oi.hasAttribute("readonly");ai||oi.setAttribute("readonly",""),oi.select(),oi.setSelectionRange(0,oi.value.length),ai||oi.removeAttribute("readonly"),si=oi.value}else{oi.hasAttribute("contenteditable")&&oi.focus();var li=window.getSelection(),ui=document.createRange();ui.selectNodeContents(oi),li.removeAllRanges(),li.addRange(ui),si=li.toString()}return si}ni.exports=ri},279:function(ni){function ri(){}ri.prototype={on:function(oi,si,ai){var li=this.e||(this.e={});return(li[oi]||(li[oi]=[])).push({fn:si,ctx:ai}),this},once:function(oi,si,ai){var li=this;function ui(){li.off(oi,ui),si.apply(ai,arguments)}return ui._=si,this.on(oi,ui,ai)},emit:function(oi){var si=[].slice.call(arguments,1),ai=((this.e||(this.e={}))[oi]||[]).slice(),li=0,ui=ai.length;for(li;limu,afterRead:()=>fu,afterWrite:()=>yu,applyStyles:()=>ps,arrow:()=>Oa,auto:()=>js,basePlacements:()=>uo,beforeMain:()=>hu,beforeRead:()=>uu,beforeWrite:()=>gu,bottom:()=>_n,clippingParents:()=>$l,computeStyles:()=>gs,createPopper:()=>Js,createPopperBase:()=>Au,createPopperLite:()=>Du,detectOverflow:()=>Fn,end:()=>To,eventListeners:()=>vs,flip:()=>Na,hide:()=>Ra,left:()=>hn,main:()=>pu,modifierPhases:()=>zl,offset:()=>Ia,placements:()=>Ws,popper:()=>jo,popperGenerator:()=>Xo,popperOffsets:()=>_s,preventOverflow:()=>Ha,read:()=>du,reference:()=>Bl,right:()=>mn,start:()=>so,top:()=>dn,variationPlacements:()=>Da,viewport:()=>qs,write:()=>vu});var dn="top",_n="bottom",mn="right",hn="left",js="auto",uo=[dn,_n,mn,hn],so="start",To="end",$l="clippingParents",qs="viewport",jo="popper",Bl="reference",Da=uo.reduce(function(ii,ei){return ii.concat([ei+"-"+so,ei+"-"+To])},[]),Ws=[].concat(uo,[js]).reduce(function(ii,ei){return ii.concat([ei,ei+"-"+so,ei+"-"+To])},[]),uu="beforeRead",du="read",fu="afterRead",hu="beforeMain",pu="main",mu="afterMain",gu="beforeWrite",vu="write",yu="afterWrite",zl=[uu,du,fu,hu,pu,mu,gu,vu,yu];function An(ii){return ii?(ii.nodeName||"").toLowerCase():null}function cn(ii){if(ii==null)return window;if(ii.toString()!=="[object Window]"){var ei=ii.ownerDocument;return ei&&ei.defaultView||window}return ii}function Zn(ii){var ei=cn(ii).Element;return ii instanceof ei||ii instanceof Element}function Tn(ii){var ei=cn(ii).HTMLElement;return ii instanceof ei||ii instanceof HTMLElement}function hs(ii){if(typeof ShadowRoot=="undefined")return!1;var ei=cn(ii).ShadowRoot;return ii instanceof ei||ii instanceof ShadowRoot}function op(ii){var ei=ii.state;Object.keys(ei.elements).forEach(function(ti){var ni=ei.styles[ti]||{},ri=ei.attributes[ti]||{},oi=ei.elements[ti];!Tn(oi)||!An(oi)||(Object.assign(oi.style,ni),Object.keys(ri).forEach(function(si){var ai=ri[si];ai===!1?oi.removeAttribute(si):oi.setAttribute(si,ai===!0?"":ai)}))})}function sp(ii){var ei=ii.state,ti={popper:{position:ei.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(ei.elements.popper.style,ti.popper),ei.styles=ti,ei.elements.arrow&&Object.assign(ei.elements.arrow.style,ti.arrow),function(){Object.keys(ei.elements).forEach(function(ni){var ri=ei.elements[ni],oi=ei.attributes[ni]||{},si=Object.keys(ei.styles.hasOwnProperty(ni)?ei.styles[ni]:ti[ni]),ai=si.reduce(function(li,ui){return li[ui]="",li},{});!Tn(ri)||!An(ri)||(Object.assign(ri.style,ai),Object.keys(oi).forEach(function(li){ri.removeAttribute(li)}))})}}var ps={name:"applyStyles",enabled:!0,phase:"write",fn:op,effect:sp,requires:["computeStyles"]};function Dn(ii){return ii.split("-")[0]}var eo=Math.max,qo=Math.min,fo=Math.round;function ms(){var ii=navigator.userAgentData;return ii!=null&&ii.brands&&Array.isArray(ii.brands)?ii.brands.map(function(ei){return ei.brand+"/"+ei.version}).join(" "):navigator.userAgent}function Us(){return!/^((?!chrome|android).)*safari/i.test(ms())}function Wr(ii,ei,ti){ei===void 0&&(ei=!1),ti===void 0&&(ti=!1);var ni=ii.getBoundingClientRect(),ri=1,oi=1;ei&&Tn(ii)&&(ri=ii.offsetWidth>0&&fo(ni.width)/ii.offsetWidth||1,oi=ii.offsetHeight>0&&fo(ni.height)/ii.offsetHeight||1);var si=Zn(ii)?cn(ii):window,ai=si.visualViewport,li=!Us()&&ti,ui=(ni.left+(li&&ai?ai.offsetLeft:0))/ri,ci=(ni.top+(li&&ai?ai.offsetTop:0))/oi,di=ni.width/ri,pi=ni.height/oi;return{width:di,height:pi,top:ci,right:ui+di,bottom:ci+pi,left:ui,x:ui,y:ci}}function Wo(ii){var ei=Wr(ii),ti=ii.offsetWidth,ni=ii.offsetHeight;return Math.abs(ei.width-ti)<=1&&(ti=ei.width),Math.abs(ei.height-ni)<=1&&(ni=ei.height),{x:ii.offsetLeft,y:ii.offsetTop,width:ti,height:ni}}function Ys(ii,ei){var ti=ei.getRootNode&&ei.getRootNode();if(ii.contains(ei))return!0;if(ti&&hs(ti)){var ni=ei;do{if(ni&&ii.isSameNode(ni))return!0;ni=ni.parentNode||ni.host}while(ni)}return!1}function Pn(ii){return cn(ii).getComputedStyle(ii)}function Vl(ii){return["table","td","th"].indexOf(An(ii))>=0}function Ln(ii){return((Zn(ii)?ii.ownerDocument:ii.document)||window.document).documentElement}function ho(ii){return An(ii)==="html"?ii:ii.assignedSlot||ii.parentNode||(hs(ii)?ii.host:null)||Ln(ii)}function bu(ii){return!Tn(ii)||Pn(ii).position==="fixed"?null:ii.offsetParent}function ap(ii){var ei=/firefox/i.test(ms()),ti=/Trident/i.test(ms());if(ti&&Tn(ii)){var ni=Pn(ii);if(ni.position==="fixed")return null}var ri=ho(ii);for(hs(ri)&&(ri=ri.host);Tn(ri)&&["html","body"].indexOf(An(ri))<0;){var oi=Pn(ri);if(oi.transform!=="none"||oi.perspective!=="none"||oi.contain==="paint"||["transform","perspective"].indexOf(oi.willChange)!==-1||ei&&oi.willChange==="filter"||ei&&oi.filter&&oi.filter!=="none")return ri;ri=ri.parentNode}return null}function to(ii){for(var ei=cn(ii),ti=bu(ii);ti&&Vl(ti)&&Pn(ti).position==="static";)ti=bu(ti);return ti&&(An(ti)==="html"||An(ti)==="body"&&Pn(ti).position==="static")?ei:ti||ap(ii)||ei}function Uo(ii){return["top","bottom"].indexOf(ii)>=0?"x":"y"}function Yo(ii,ei,ti){return eo(ii,qo(ei,ti))}function _u(ii,ei,ti){var ni=Yo(ii,ei,ti);return ni>ti?ti:ni}function Gs(){return{top:0,right:0,bottom:0,left:0}}function Ks(ii){return Object.assign({},Gs(),ii)}function Qs(ii,ei){return ei.reduce(function(ti,ni){return ti[ni]=ii,ti},{})}var lp=function(ei,ti){return ei=typeof ei=="function"?ei(Object.assign({},ti.rects,{placement:ti.placement})):ei,Ks(typeof ei!="number"?ei:Qs(ei,uo))};function cp(ii){var ei,ti=ii.state,ni=ii.name,ri=ii.options,oi=ti.elements.arrow,si=ti.modifiersData.popperOffsets,ai=Dn(ti.placement),li=Uo(ai),ui=[hn,mn].indexOf(ai)>=0,ci=ui?"height":"width";if(!(!oi||!si)){var di=lp(ri.padding,ti),pi=Wo(oi),yi=li==="y"?dn:hn,gi=li==="y"?_n:mn,vi=ti.rects.reference[ci]+ti.rects.reference[li]-si[li]-ti.rects.popper[ci],Ei=si[li]-ti.rects.reference[li],Si=to(oi),xi=Si?li==="y"?Si.clientHeight||0:Si.clientWidth||0:0,Li=vi/2-Ei/2,Oi=di[yi],zi=xi-pi[ci]-di[gi],Vi=xi/2-pi[ci]/2+Li,ki=Yo(Oi,Vi,zi),Mi=li;ti.modifiersData[ni]=(ei={},ei[Mi]=ki,ei.centerOffset=ki-Vi,ei)}}function up(ii){var ei=ii.state,ti=ii.options,ni=ti.element,ri=ni===void 0?"[data-popper-arrow]":ni;ri!=null&&(typeof ri=="string"&&(ri=ei.elements.popper.querySelector(ri),!ri)||Ys(ei.elements.popper,ri)&&(ei.elements.arrow=ri))}var Oa={name:"arrow",enabled:!0,phase:"main",fn:cp,effect:up,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Yr(ii){return ii.split("-")[1]}var dp={top:"auto",right:"auto",bottom:"auto",left:"auto"};function fp(ii,ei){var ti=ii.x,ni=ii.y,ri=ei.devicePixelRatio||1;return{x:fo(ti*ri)/ri||0,y:fo(ni*ri)/ri||0}}function Eu(ii){var ei,ti=ii.popper,ni=ii.popperRect,ri=ii.placement,oi=ii.variation,si=ii.offsets,ai=ii.position,li=ii.gpuAcceleration,ui=ii.adaptive,ci=ii.roundOffsets,di=ii.isFixed,pi=si.x,yi=pi===void 0?0:pi,gi=si.y,vi=gi===void 0?0:gi,Ei=typeof ci=="function"?ci({x:yi,y:vi}):{x:yi,y:vi};yi=Ei.x,vi=Ei.y;var Si=si.hasOwnProperty("x"),xi=si.hasOwnProperty("y"),Li=hn,Oi=dn,zi=window;if(ui){var Vi=to(ti),ki="clientHeight",Mi="clientWidth";if(Vi===cn(ti)&&(Vi=Ln(ti),Pn(Vi).position!=="static"&&ai==="absolute"&&(ki="scrollHeight",Mi="scrollWidth")),Vi=Vi,ri===dn||(ri===hn||ri===mn)&&oi===To){Oi=_n;var Ai=di&&Vi===zi&&zi.visualViewport?zi.visualViewport.height:Vi[ki];vi-=Ai-ni.height,vi*=li?1:-1}if(ri===hn||(ri===dn||ri===_n)&&oi===To){Li=mn;var qi=di&&Vi===zi&&zi.visualViewport?zi.visualViewport.width:Vi[Mi];yi-=qi-ni.width,yi*=li?1:-1}}var Ci=Object.assign({position:ai},ui&&dp),Qi=ci===!0?fp({x:yi,y:vi},cn(ti)):{x:yi,y:vi};if(yi=Qi.x,vi=Qi.y,li){var Ji;return Object.assign({},Ci,(Ji={},Ji[Oi]=xi?"0":"",Ji[Li]=Si?"0":"",Ji.transform=(zi.devicePixelRatio||1)<=1?"translate("+yi+"px, "+vi+"px)":"translate3d("+yi+"px, "+vi+"px, 0)",Ji))}return Object.assign({},Ci,(ei={},ei[Oi]=xi?vi+"px":"",ei[Li]=Si?yi+"px":"",ei.transform="",ei))}function hp(ii){var ei=ii.state,ti=ii.options,ni=ti.gpuAcceleration,ri=ni===void 0?!0:ni,oi=ti.adaptive,si=oi===void 0?!0:oi,ai=ti.roundOffsets,li=ai===void 0?!0:ai,ui={placement:Dn(ei.placement),variation:Yr(ei.placement),popper:ei.elements.popper,popperRect:ei.rects.popper,gpuAcceleration:ri,isFixed:ei.options.strategy==="fixed"};ei.modifiersData.popperOffsets!=null&&(ei.styles.popper=Object.assign({},ei.styles.popper,Eu(Object.assign({},ui,{offsets:ei.modifiersData.popperOffsets,position:ei.options.strategy,adaptive:si,roundOffsets:li})))),ei.modifiersData.arrow!=null&&(ei.styles.arrow=Object.assign({},ei.styles.arrow,Eu(Object.assign({},ui,{offsets:ei.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:li})))),ei.attributes.popper=Object.assign({},ei.attributes.popper,{"data-popper-placement":ei.placement})}var gs={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:hp,data:{}};var La={passive:!0};function pp(ii){var ei=ii.state,ti=ii.instance,ni=ii.options,ri=ni.scroll,oi=ri===void 0?!0:ri,si=ni.resize,ai=si===void 0?!0:si,li=cn(ei.elements.popper),ui=[].concat(ei.scrollParents.reference,ei.scrollParents.popper);return oi&&ui.forEach(function(ci){ci.addEventListener("scroll",ti.update,La)}),ai&&li.addEventListener("resize",ti.update,La),function(){oi&&ui.forEach(function(ci){ci.removeEventListener("scroll",ti.update,La)}),ai&&li.removeEventListener("resize",ti.update,La)}}var vs={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:pp,data:{}};var mp={left:"right",right:"left",bottom:"top",top:"bottom"};function ys(ii){return ii.replace(/left|right|bottom|top/g,function(ei){return mp[ei]})}var gp={start:"end",end:"start"};function Ma(ii){return ii.replace(/start|end/g,function(ei){return gp[ei]})}function Go(ii){var ei=cn(ii),ti=ei.pageXOffset,ni=ei.pageYOffset;return{scrollLeft:ti,scrollTop:ni}}function Ko(ii){return Wr(Ln(ii)).left+Go(ii).scrollLeft}function jl(ii,ei){var ti=cn(ii),ni=Ln(ii),ri=ti.visualViewport,oi=ni.clientWidth,si=ni.clientHeight,ai=0,li=0;if(ri){oi=ri.width,si=ri.height;var ui=Us();(ui||!ui&&ei==="fixed")&&(ai=ri.offsetLeft,li=ri.offsetTop)}return{width:oi,height:si,x:ai+Ko(ii),y:li}}function ql(ii){var ei,ti=Ln(ii),ni=Go(ii),ri=(ei=ii.ownerDocument)==null?void 0:ei.body,oi=eo(ti.scrollWidth,ti.clientWidth,ri?ri.scrollWidth:0,ri?ri.clientWidth:0),si=eo(ti.scrollHeight,ti.clientHeight,ri?ri.scrollHeight:0,ri?ri.clientHeight:0),ai=-ni.scrollLeft+Ko(ii),li=-ni.scrollTop;return Pn(ri||ti).direction==="rtl"&&(ai+=eo(ti.clientWidth,ri?ri.clientWidth:0)-oi),{width:oi,height:si,x:ai,y:li}}function Qo(ii){var ei=Pn(ii),ti=ei.overflow,ni=ei.overflowX,ri=ei.overflowY;return/auto|scroll|overlay|hidden/.test(ti+ri+ni)}function ka(ii){return["html","body","#document"].indexOf(An(ii))>=0?ii.ownerDocument.body:Tn(ii)&&Qo(ii)?ii:ka(ho(ii))}function Co(ii,ei){var ti;ei===void 0&&(ei=[]);var ni=ka(ii),ri=ni===((ti=ii.ownerDocument)==null?void 0:ti.body),oi=cn(ni),si=ri?[oi].concat(oi.visualViewport||[],Qo(ni)?ni:[]):ni,ai=ei.concat(si);return ri?ai:ai.concat(Co(ho(si)))}function bs(ii){return Object.assign({},ii,{left:ii.x,top:ii.y,right:ii.x+ii.width,bottom:ii.y+ii.height})}function vp(ii,ei){var ti=Wr(ii,!1,ei==="fixed");return ti.top=ti.top+ii.clientTop,ti.left=ti.left+ii.clientLeft,ti.bottom=ti.top+ii.clientHeight,ti.right=ti.left+ii.clientWidth,ti.width=ii.clientWidth,ti.height=ii.clientHeight,ti.x=ti.left,ti.y=ti.top,ti}function wu(ii,ei,ti){return ei===qs?bs(jl(ii,ti)):Zn(ei)?vp(ei,ti):bs(ql(Ln(ii)))}function yp(ii){var ei=Co(ho(ii)),ti=["absolute","fixed"].indexOf(Pn(ii).position)>=0,ni=ti&&Tn(ii)?to(ii):ii;return Zn(ni)?ei.filter(function(ri){return Zn(ri)&&Ys(ri,ni)&&An(ri)!=="body"}):[]}function Wl(ii,ei,ti,ni){var ri=ei==="clippingParents"?yp(ii):[].concat(ei),oi=[].concat(ri,[ti]),si=oi[0],ai=oi.reduce(function(li,ui){var ci=wu(ii,ui,ni);return li.top=eo(ci.top,li.top),li.right=qo(ci.right,li.right),li.bottom=qo(ci.bottom,li.bottom),li.left=eo(ci.left,li.left),li},wu(ii,si,ni));return ai.width=ai.right-ai.left,ai.height=ai.bottom-ai.top,ai.x=ai.left,ai.y=ai.top,ai}function Xs(ii){var ei=ii.reference,ti=ii.element,ni=ii.placement,ri=ni?Dn(ni):null,oi=ni?Yr(ni):null,si=ei.x+ei.width/2-ti.width/2,ai=ei.y+ei.height/2-ti.height/2,li;switch(ri){case dn:li={x:si,y:ei.y-ti.height};break;case _n:li={x:si,y:ei.y+ei.height};break;case mn:li={x:ei.x+ei.width,y:ai};break;case hn:li={x:ei.x-ti.width,y:ai};break;default:li={x:ei.x,y:ei.y}}var ui=ri?Uo(ri):null;if(ui!=null){var ci=ui==="y"?"height":"width";switch(oi){case so:li[ui]=li[ui]-(ei[ci]/2-ti[ci]/2);break;case To:li[ui]=li[ui]+(ei[ci]/2-ti[ci]/2);break;default:}}return li}function Fn(ii,ei){ei===void 0&&(ei={});var ti=ei,ni=ti.placement,ri=ni===void 0?ii.placement:ni,oi=ti.strategy,si=oi===void 0?ii.strategy:oi,ai=ti.boundary,li=ai===void 0?$l:ai,ui=ti.rootBoundary,ci=ui===void 0?qs:ui,di=ti.elementContext,pi=di===void 0?jo:di,yi=ti.altBoundary,gi=yi===void 0?!1:yi,vi=ti.padding,Ei=vi===void 0?0:vi,Si=Ks(typeof Ei!="number"?Ei:Qs(Ei,uo)),xi=pi===jo?Bl:jo,Li=ii.rects.popper,Oi=ii.elements[gi?xi:pi],zi=Wl(Zn(Oi)?Oi:Oi.contextElement||Ln(ii.elements.popper),li,ci,si),Vi=Wr(ii.elements.reference),ki=Xs({reference:Vi,element:Li,strategy:"absolute",placement:ri}),Mi=bs(Object.assign({},Li,ki)),Ai=pi===jo?Mi:Vi,qi={top:zi.top-Ai.top+Si.top,bottom:Ai.bottom-zi.bottom+Si.bottom,left:zi.left-Ai.left+Si.left,right:Ai.right-zi.right+Si.right},Ci=ii.modifiersData.offset;if(pi===jo&&Ci){var Qi=Ci[ri];Object.keys(qi).forEach(function(Ji){var gn=[mn,_n].indexOf(Ji)>=0?1:-1,rn=[dn,_n].indexOf(Ji)>=0?"y":"x";qi[Ji]+=Qi[rn]*gn})}return qi}function Ul(ii,ei){ei===void 0&&(ei={});var ti=ei,ni=ti.placement,ri=ti.boundary,oi=ti.rootBoundary,si=ti.padding,ai=ti.flipVariations,li=ti.allowedAutoPlacements,ui=li===void 0?Ws:li,ci=Yr(ni),di=ci?ai?Da:Da.filter(function(gi){return Yr(gi)===ci}):uo,pi=di.filter(function(gi){return ui.indexOf(gi)>=0});pi.length===0&&(pi=di);var yi=pi.reduce(function(gi,vi){return gi[vi]=Fn(ii,{placement:vi,boundary:ri,rootBoundary:oi,padding:si})[Dn(vi)],gi},{});return Object.keys(yi).sort(function(gi,vi){return yi[gi]-yi[vi]})}function bp(ii){if(Dn(ii)===js)return[];var ei=ys(ii);return[Ma(ii),ei,Ma(ei)]}function _p(ii){var ei=ii.state,ti=ii.options,ni=ii.name;if(!ei.modifiersData[ni]._skip){for(var ri=ti.mainAxis,oi=ri===void 0?!0:ri,si=ti.altAxis,ai=si===void 0?!0:si,li=ti.fallbackPlacements,ui=ti.padding,ci=ti.boundary,di=ti.rootBoundary,pi=ti.altBoundary,yi=ti.flipVariations,gi=yi===void 0?!0:yi,vi=ti.allowedAutoPlacements,Ei=ei.options.placement,Si=Dn(Ei),xi=Si===Ei,Li=li||(xi||!gi?[ys(Ei)]:bp(Ei)),Oi=[Ei].concat(Li).reduce(function(ji,Pi){return ji.concat(Dn(Pi)===js?Ul(ei,{placement:Pi,boundary:ci,rootBoundary:di,padding:ui,flipVariations:gi,allowedAutoPlacements:vi}):Pi)},[]),zi=ei.rects.reference,Vi=ei.rects.popper,ki=new Map,Mi=!0,Ai=Oi[0],qi=0;qi=0,rn=gn?"width":"height",Zi=Fn(ei,{placement:Ci,boundary:ci,rootBoundary:di,altBoundary:pi,padding:ui}),on=gn?Ji?mn:hn:Ji?_n:dn;zi[rn]>Vi[rn]&&(on=ys(on));var Mn=ys(on),vn=[];if(oi&&vn.push(Zi[Qi]<=0),ai&&vn.push(Zi[on]<=0,Zi[Mn]<=0),vn.every(function(ji){return ji})){Ai=Ci,Mi=!1;break}ki.set(Ci,vn)}if(Mi)for(var Yi=gi?3:1,Ri=function(Pi){var ln=Oi.find(function(kn){var yn=ki.get(kn);if(yn)return yn.slice(0,Pi).every(function(Sn){return Sn})});if(ln)return Ai=ln,"break"},Ii=Yi;Ii>0;Ii--){var Ui=Ri(Ii);if(Ui==="break")break}ei.placement!==Ai&&(ei.modifiersData[ni]._skip=!0,ei.placement=Ai,ei.reset=!0)}}var Na={name:"flip",enabled:!0,phase:"main",fn:_p,requiresIfExists:["offset"],data:{_skip:!1}};function xu(ii,ei,ti){return ti===void 0&&(ti={x:0,y:0}),{top:ii.top-ei.height-ti.y,right:ii.right-ei.width+ti.x,bottom:ii.bottom-ei.height+ti.y,left:ii.left-ei.width-ti.x}}function Tu(ii){return[dn,mn,_n,hn].some(function(ei){return ii[ei]>=0})}function Ep(ii){var ei=ii.state,ti=ii.name,ni=ei.rects.reference,ri=ei.rects.popper,oi=ei.modifiersData.preventOverflow,si=Fn(ei,{elementContext:"reference"}),ai=Fn(ei,{altBoundary:!0}),li=xu(si,ni),ui=xu(ai,ri,oi),ci=Tu(li),di=Tu(ui);ei.modifiersData[ti]={referenceClippingOffsets:li,popperEscapeOffsets:ui,isReferenceHidden:ci,hasPopperEscaped:di},ei.attributes.popper=Object.assign({},ei.attributes.popper,{"data-popper-reference-hidden":ci,"data-popper-escaped":di})}var Ra={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:Ep};function wp(ii,ei,ti){var ni=Dn(ii),ri=[hn,dn].indexOf(ni)>=0?-1:1,oi=typeof ti=="function"?ti(Object.assign({},ei,{placement:ii})):ti,si=oi[0],ai=oi[1];return si=si||0,ai=(ai||0)*ri,[hn,mn].indexOf(ni)>=0?{x:ai,y:si}:{x:si,y:ai}}function xp(ii){var ei=ii.state,ti=ii.options,ni=ii.name,ri=ti.offset,oi=ri===void 0?[0,0]:ri,si=Ws.reduce(function(ci,di){return ci[di]=wp(di,ei.rects,oi),ci},{}),ai=si[ei.placement],li=ai.x,ui=ai.y;ei.modifiersData.popperOffsets!=null&&(ei.modifiersData.popperOffsets.x+=li,ei.modifiersData.popperOffsets.y+=ui),ei.modifiersData[ni]=si}var Ia={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:xp};function Tp(ii){var ei=ii.state,ti=ii.name;ei.modifiersData[ti]=Xs({reference:ei.rects.reference,element:ei.rects.popper,strategy:"absolute",placement:ei.placement})}var _s={name:"popperOffsets",enabled:!0,phase:"read",fn:Tp,data:{}};function Yl(ii){return ii==="x"?"y":"x"}function Cp(ii){var ei=ii.state,ti=ii.options,ni=ii.name,ri=ti.mainAxis,oi=ri===void 0?!0:ri,si=ti.altAxis,ai=si===void 0?!1:si,li=ti.boundary,ui=ti.rootBoundary,ci=ti.altBoundary,di=ti.padding,pi=ti.tether,yi=pi===void 0?!0:pi,gi=ti.tetherOffset,vi=gi===void 0?0:gi,Ei=Fn(ei,{boundary:li,rootBoundary:ui,padding:di,altBoundary:ci}),Si=Dn(ei.placement),xi=Yr(ei.placement),Li=!xi,Oi=Uo(Si),zi=Yl(Oi),Vi=ei.modifiersData.popperOffsets,ki=ei.rects.reference,Mi=ei.rects.popper,Ai=typeof vi=="function"?vi(Object.assign({},ei.rects,{placement:ei.placement})):vi,qi=typeof Ai=="number"?{mainAxis:Ai,altAxis:Ai}:Object.assign({mainAxis:0,altAxis:0},Ai),Ci=ei.modifiersData.offset?ei.modifiersData.offset[ei.placement]:null,Qi={x:0,y:0};if(Vi){if(oi){var Ji,gn=Oi==="y"?dn:hn,rn=Oi==="y"?_n:mn,Zi=Oi==="y"?"height":"width",on=Vi[Oi],Mn=on+Ei[gn],vn=on-Ei[rn],Yi=yi?-Mi[Zi]/2:0,Ri=xi===so?ki[Zi]:Mi[Zi],Ii=xi===so?-Mi[Zi]:-ki[Zi],Ui=ei.elements.arrow,ji=yi&&Ui?Wo(Ui):{width:0,height:0},Pi=ei.modifiersData["arrow#persistent"]?ei.modifiersData["arrow#persistent"].padding:Gs(),ln=Pi[gn],kn=Pi[rn],yn=Yo(0,ki[Zi],ji[Zi]),Sn=Li?ki[Zi]/2-Yi-yn-ln-qi.mainAxis:Ri-yn-ln-qi.mainAxis,$s=Li?-ki[Zi]/2+Yi+yn+kn+qi.mainAxis:Ii+yn+kn+qi.mainAxis,ro=ei.elements.arrow&&to(ei.elements.arrow),wo=ro?Oi==="y"?ro.clientTop||0:ro.clientLeft||0:0,bn=(Ji=Ci==null?void 0:Ci[Oi])!=null?Ji:0,xo=on+Sn-bn-wo,ao=on+$s-bn,ls=Yo(yi?qo(Mn,xo):Mn,on,yi?eo(vn,ao):vn);Vi[Oi]=ls,Qi[Oi]=ls-on}if(ai){var On,zn=Oi==="x"?dn:hn,Gn=Oi==="x"?_n:mn,Jn=Vi[zi],cs=zi==="y"?"height":"width",Bs=Jn+Ei[zn],us=Jn-Ei[Gn],ds=[dn,hn].indexOf(Si)!==-1,Vo=(On=Ci==null?void 0:Ci[zi])!=null?On:0,Ta=ds?Bs:Jn-ki[cs]-Mi[cs]-Vo+qi.altAxis,zs=ds?Jn+ki[cs]+Mi[cs]-Vo-qi.altAxis:us,Ca=yi&&ds?_u(Ta,Jn,zs):Yo(yi?Ta:Bs,Jn,yi?zs:us);Vi[zi]=Ca,Qi[zi]=Ca-Jn}ei.modifiersData[ni]=Qi}}var Ha={name:"preventOverflow",enabled:!0,phase:"main",fn:Cp,requiresIfExists:["offset"]};function Gl(ii){return{scrollLeft:ii.scrollLeft,scrollTop:ii.scrollTop}}function Kl(ii){return ii===cn(ii)||!Tn(ii)?Go(ii):Gl(ii)}function Sp(ii){var ei=ii.getBoundingClientRect(),ti=fo(ei.width)/ii.offsetWidth||1,ni=fo(ei.height)/ii.offsetHeight||1;return ti!==1||ni!==1}function Ql(ii,ei,ti){ti===void 0&&(ti=!1);var ni=Tn(ei),ri=Tn(ei)&&Sp(ei),oi=Ln(ei),si=Wr(ii,ri,ti),ai={scrollLeft:0,scrollTop:0},li={x:0,y:0};return(ni||!ni&&!ti)&&((An(ei)!=="body"||Qo(oi))&&(ai=Kl(ei)),Tn(ei)?(li=Wr(ei,!0),li.x+=ei.clientLeft,li.y+=ei.clientTop):oi&&(li.x=Ko(oi))),{x:si.left+ai.scrollLeft-li.x,y:si.top+ai.scrollTop-li.y,width:si.width,height:si.height}}function Ap(ii){var ei=new Map,ti=new Set,ni=[];ii.forEach(function(oi){ei.set(oi.name,oi)});function ri(oi){ti.add(oi.name);var si=[].concat(oi.requires||[],oi.requiresIfExists||[]);si.forEach(function(ai){if(!ti.has(ai)){var li=ei.get(ai);li&&ri(li)}}),ni.push(oi)}return ii.forEach(function(oi){ti.has(oi.name)||ri(oi)}),ni}function Xl(ii){var ei=Ap(ii);return zl.reduce(function(ti,ni){return ti.concat(ei.filter(function(ri){return ri.phase===ni}))},[])}function Jl(ii){var ei;return function(){return ei||(ei=new Promise(function(ti){Promise.resolve().then(function(){ei=void 0,ti(ii())})})),ei}}function Zl(ii){var ei=ii.reduce(function(ti,ni){var ri=ti[ni.name];return ti[ni.name]=ri?Object.assign({},ri,ni,{options:Object.assign({},ri.options,ni.options),data:Object.assign({},ri.data,ni.data)}):ni,ti},{});return Object.keys(ei).map(function(ti){return ei[ti]})}var Cu={placement:"bottom",modifiers:[],strategy:"absolute"};function Su(){for(var ii=arguments.length,ei=new Array(ii),ti=0;ti(ii&&window.CSS&&window.CSS.escape&&(ii=ii.replace(/#([^\s"#']+)/g,(ei,ti)=>`#${CSS.escape(ti)}`)),ii),kp=ii=>ii==null?`${ii}`:Object.prototype.toString.call(ii).match(/\s([a-z]+)/i)[1].toLowerCase(),Np=ii=>{do ii+=Math.floor(Math.random()*Lp);while(document.getElementById(ii));return ii},Rp=ii=>{if(!ii)return 0;let{transitionDuration:ei,transitionDelay:ti}=window.getComputedStyle(ii),ni=Number.parseFloat(ei),ri=Number.parseFloat(ti);return!ni&&!ri?0:(ei=ei.split(",")[0],ti=ti.split(",")[0],(Number.parseFloat(ei)+Number.parseFloat(ti))*Mp)},rd=ii=>{ii.dispatchEvent(new Event(mc))},po=ii=>!ii||typeof ii!="object"?!1:(typeof ii.jquery!="undefined"&&(ii=ii[0]),typeof ii.nodeType!="undefined"),Ao=ii=>po(ii)?ii.jquery?ii[0]:ii:typeof ii=="string"&&ii.length>0?document.querySelector(nd(ii)):null,As=ii=>{if(!po(ii)||ii.getClientRects().length===0)return!1;let ei=getComputedStyle(ii).getPropertyValue("visibility")==="visible",ti=ii.closest("details:not([open])");if(!ti)return ei;if(ti!==ii){let ni=ii.closest("summary");if(ni&&ni.parentNode!==ti||ni===null)return!1}return ei},Do=ii=>!ii||ii.nodeType!==Node.ELEMENT_NODE||ii.classList.contains("disabled")?!0:typeof ii.disabled!="undefined"?ii.disabled:ii.hasAttribute("disabled")&&ii.getAttribute("disabled")!=="false",od=ii=>{if(!document.documentElement.attachShadow)return null;if(typeof ii.getRootNode=="function"){let ei=ii.getRootNode();return ei instanceof ShadowRoot?ei:null}return ii instanceof ShadowRoot?ii:ii.parentNode?od(ii.parentNode):null},Ua=()=>{},na=ii=>{ii.offsetHeight},sd=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,tc=[],Ip=ii=>{document.readyState==="loading"?(tc.length||document.addEventListener("DOMContentLoaded",()=>{for(let ei of tc)ei()}),tc.push(ii)):ii()},Gr=()=>document.documentElement.dir==="rtl",Qr=ii=>{Ip(()=>{let ei=sd();if(ei){let ti=ii.NAME,ni=ei.fn[ti];ei.fn[ti]=ii.jQueryInterface,ei.fn[ti].Constructor=ii,ei.fn[ti].noConflict=()=>(ei.fn[ti]=ni,ii.jQueryInterface)}})},Vn=(ii,ei=[],ti=ii)=>typeof ii=="function"?ii(...ei):ti,ad=(ii,ei,ti=!0)=>{if(!ti){Vn(ii);return}let ri=Rp(ei)+5,oi=!1,si=({target:ai})=>{ai===ei&&(oi=!0,ei.removeEventListener(mc,si),Vn(ii))};ei.addEventListener(mc,si),setTimeout(()=>{oi||rd(ei)},ri)},bc=(ii,ei,ti,ni)=>{let ri=ii.length,oi=ii.indexOf(ei);return oi===-1?!ti&&ni?ii[ri-1]:ii[0]:(oi+=ti?1:-1,ni&&(oi=(oi+ri)%ri),ii[Math.max(0,Math.min(oi,ri-1))])},Hp=/[^.]*(?=\..*)\.|.*/,Pp=/\..*/,Fp=/::\d+$/,ic={},Ou=1,ld={mouseenter:"mouseover",mouseleave:"mouseout"},$p=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function cd(ii,ei){return ei&&`${ei}::${Ou++}`||ii.uidEvent||Ou++}function ud(ii){let ei=cd(ii);return ii.uidEvent=ei,ic[ei]=ic[ei]||{},ic[ei]}function Bp(ii,ei){return function ti(ni){return _c(ni,{delegateTarget:ii}),ti.oneOff&&wi.off(ii,ni.type,ei),ei.apply(ii,[ni])}}function zp(ii,ei,ti){return function ni(ri){let oi=ii.querySelectorAll(ei);for(let{target:si}=ri;si&&si!==this;si=si.parentNode)for(let ai of oi)if(ai===si)return _c(ri,{delegateTarget:si}),ni.oneOff&&wi.off(ii,ri.type,ei,ti),ti.apply(si,[ri])}}function dd(ii,ei,ti=null){return Object.values(ii).find(ni=>ni.callable===ei&&ni.delegationSelector===ti)}function fd(ii,ei,ti){let ni=typeof ei=="string",ri=ni?ti:ei||ti,oi=hd(ii);return $p.has(oi)||(oi=ii),[ni,ri,oi]}function Lu(ii,ei,ti,ni,ri){if(typeof ei!="string"||!ii)return;let[oi,si,ai]=fd(ei,ti,ni);ei in ld&&(si=(gi=>function(vi){if(!vi.relatedTarget||vi.relatedTarget!==vi.delegateTarget&&!vi.delegateTarget.contains(vi.relatedTarget))return gi.call(this,vi)})(si));let li=ud(ii),ui=li[ai]||(li[ai]={}),ci=dd(ui,si,oi?ti:null);if(ci){ci.oneOff=ci.oneOff&&ri;return}let di=cd(si,ei.replace(Hp,"")),pi=oi?zp(ii,ti,si):Bp(ii,si);pi.delegationSelector=oi?ti:null,pi.callable=si,pi.oneOff=ri,pi.uidEvent=di,ui[di]=pi,ii.addEventListener(ai,pi,oi)}function gc(ii,ei,ti,ni,ri){let oi=dd(ei[ti],ni,ri);oi&&(ii.removeEventListener(ti,oi,!!ri),delete ei[ti][oi.uidEvent])}function Vp(ii,ei,ti,ni){let ri=ei[ti]||{};for(let[oi,si]of Object.entries(ri))oi.includes(ni)&&gc(ii,ei,ti,si.callable,si.delegationSelector)}function hd(ii){return ii=ii.replace(Pp,""),ld[ii]||ii}var wi={on(ii,ei,ti,ni){Lu(ii,ei,ti,ni,!1)},one(ii,ei,ti,ni){Lu(ii,ei,ti,ni,!0)},off(ii,ei,ti,ni){if(typeof ei!="string"||!ii)return;let[ri,oi,si]=fd(ei,ti,ni),ai=si!==ei,li=ud(ii),ui=li[si]||{},ci=ei.startsWith(".");if(typeof oi!="undefined"){if(!Object.keys(ui).length)return;gc(ii,li,si,oi,ri?ti:null);return}if(ci)for(let di of Object.keys(li))Vp(ii,li,di,ei.slice(1));for(let[di,pi]of Object.entries(ui)){let yi=di.replace(Fp,"");(!ai||ei.includes(yi))&&gc(ii,li,si,pi.callable,pi.delegationSelector)}},trigger(ii,ei,ti){if(typeof ei!="string"||!ii)return null;let ni=sd(),ri=hd(ei),oi=ei!==ri,si=null,ai=!0,li=!0,ui=!1;oi&&ni&&(si=ni.Event(ei,ti),ni(ii).trigger(si),ai=!si.isPropagationStopped(),li=!si.isImmediatePropagationStopped(),ui=si.isDefaultPrevented());let ci=_c(new Event(ei,{bubbles:ai,cancelable:!0}),ti);return ui&&ci.preventDefault(),li&&ii.dispatchEvent(ci),ci.defaultPrevented&&si&&si.preventDefault(),ci}};function _c(ii,ei={}){for(let[ti,ni]of Object.entries(ei))try{ii[ti]=ni}catch(ri){Object.defineProperty(ii,ti,{configurable:!0,get(){return ni}})}return ii}function Mu(ii){if(ii==="true")return!0;if(ii==="false")return!1;if(ii===Number(ii).toString())return Number(ii);if(ii===""||ii==="null")return null;if(typeof ii!="string")return ii;try{return JSON.parse(decodeURIComponent(ii))}catch(ei){return ii}}function nc(ii){return ii.replace(/[A-Z]/g,ei=>`-${ei.toLowerCase()}`)}var mo={setDataAttribute(ii,ei,ti){ii.setAttribute(`data-bs-${nc(ei)}`,ti)},removeDataAttribute(ii,ei){ii.removeAttribute(`data-bs-${nc(ei)}`)},getDataAttributes(ii){if(!ii)return{};let ei={},ti=Object.keys(ii.dataset).filter(ni=>ni.startsWith("bs")&&!ni.startsWith("bsConfig"));for(let ni of ti){let ri=ni.replace(/^bs/,"");ri=ri.charAt(0).toLowerCase()+ri.slice(1,ri.length),ei[ri]=Mu(ii.dataset[ni])}return ei},getDataAttribute(ii,ei){return Mu(ii.getAttribute(`data-bs-${nc(ei)}`))}},es=class{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(ei){return ei=this._mergeConfigObj(ei),ei=this._configAfterMerge(ei),this._typeCheckConfig(ei),ei}_configAfterMerge(ei){return ei}_mergeConfigObj(ei,ti){let ni=po(ti)?mo.getDataAttribute(ti,"config"):{};return Di(Di(Di(Di({},this.constructor.Default),typeof ni=="object"?ni:{}),po(ti)?mo.getDataAttributes(ti):{}),typeof ei=="object"?ei:{})}_typeCheckConfig(ei,ti=this.constructor.DefaultType){for(let[ni,ri]of Object.entries(ti)){let oi=ei[ni],si=po(oi)?"element":kp(oi);if(!new RegExp(ri).test(si))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${ni}" provided type "${si}" but expected type "${ri}".`)}}},jp="5.3.3",Qn=class extends es{constructor(ei,ti){super(),ei=Ao(ei),ei&&(this._element=ei,this._config=this._getConfig(ti),ec.set(this._element,this.constructor.DATA_KEY,this))}dispose(){ec.remove(this._element,this.constructor.DATA_KEY),wi.off(this._element,this.constructor.EVENT_KEY);for(let ei of Object.getOwnPropertyNames(this))this[ei]=null}_queueCallback(ei,ti,ni=!0){ad(ei,ti,ni)}_getConfig(ei){return ei=this._mergeConfigObj(ei,this._element),ei=this._configAfterMerge(ei),this._typeCheckConfig(ei),ei}static getInstance(ei){return ec.get(Ao(ei),this.DATA_KEY)}static getOrCreateInstance(ei,ti={}){return this.getInstance(ei)||new this(ei,typeof ti=="object"?ti:null)}static get VERSION(){return jp}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(ei){return`${ei}${this.EVENT_KEY}`}},rc=ii=>{let ei=ii.getAttribute("data-bs-target");if(!ei||ei==="#"){let ti=ii.getAttribute("href");if(!ti||!ti.includes("#")&&!ti.startsWith("."))return null;ti.includes("#")&&!ti.startsWith("#")&&(ti=`#${ti.split("#")[1]}`),ei=ti&&ti!=="#"?ti.trim():null}return ei?ei.split(",").map(ti=>nd(ti)).join(","):null},Wi={find(ii,ei=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(ei,ii))},findOne(ii,ei=document.documentElement){return Element.prototype.querySelector.call(ei,ii)},children(ii,ei){return[].concat(...ii.children).filter(ti=>ti.matches(ei))},parents(ii,ei){let ti=[],ni=ii.parentNode.closest(ei);for(;ni;)ti.push(ni),ni=ni.parentNode.closest(ei);return ti},prev(ii,ei){let ti=ii.previousElementSibling;for(;ti;){if(ti.matches(ei))return[ti];ti=ti.previousElementSibling}return[]},next(ii,ei){let ti=ii.nextElementSibling;for(;ti;){if(ti.matches(ei))return[ti];ti=ti.nextElementSibling}return[]},focusableChildren(ii){let ei=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(ti=>`${ti}:not([tabindex^="-"])`).join(",");return this.find(ei,ii).filter(ti=>!Do(ti)&&As(ti))},getSelectorFromElement(ii){let ei=rc(ii);return ei&&Wi.findOne(ei)?ei:null},getElementFromSelector(ii){let ei=rc(ii);return ei?Wi.findOne(ei):null},getMultipleElementsFromSelector(ii){let ei=rc(ii);return ei?Wi.find(ei):[]}},el=(ii,ei="hide")=>{let ti=`click.dismiss${ii.EVENT_KEY}`,ni=ii.NAME;wi.on(document,ti,`[data-bs-dismiss="${ni}"]`,function(ri){if(["A","AREA"].includes(this.tagName)&&ri.preventDefault(),Do(this))return;let oi=Wi.getElementFromSelector(this)||this.closest(`.${ni}`);ii.getOrCreateInstance(oi)[ei]()})},qp="alert",Wp="bs.alert",pd=`.${Wp}`,Up=`close${pd}`,Yp=`closed${pd}`,Gp="fade",Kp="show",Ya=class ii extends Qn{static get NAME(){return qp}close(){if(wi.trigger(this._element,Up).defaultPrevented)return;this._element.classList.remove(Kp);let ti=this._element.classList.contains(Gp);this._queueCallback(()=>this._destroyElement(),this._element,ti)}_destroyElement(){this._element.remove(),wi.trigger(this._element,Yp),this.dispose()}static jQueryInterface(ei){return this.each(function(){let ti=ii.getOrCreateInstance(this);if(typeof ei=="string"){if(ti[ei]===void 0||ei.startsWith("_")||ei==="constructor")throw new TypeError(`No method named "${ei}"`);ti[ei](this)}})}};el(Ya,"close");Qr(Ya);var Qp="button",Xp="bs.button",Jp=`.${Xp}`,Zp=".data-api",em="active",ku='[data-bs-toggle="button"]',tm=`click${Jp}${Zp}`,Ga=class ii extends Qn{static get NAME(){return Qp}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(em))}static jQueryInterface(ei){return this.each(function(){let ti=ii.getOrCreateInstance(this);ei==="toggle"&&ti[ei]()})}};wi.on(document,tm,ku,ii=>{ii.preventDefault();let ei=ii.target.closest(ku);Ga.getOrCreateInstance(ei).toggle()});Qr(Ga);var im="swipe",Ds=".bs.swipe",nm=`touchstart${Ds}`,rm=`touchmove${Ds}`,om=`touchend${Ds}`,sm=`pointerdown${Ds}`,am=`pointerup${Ds}`,lm="touch",cm="pen",um="pointer-event",dm=40,fm={endCallback:null,leftCallback:null,rightCallback:null},hm={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"},Ka=class ii extends es{constructor(ei,ti){super(),this._element=ei,!(!ei||!ii.isSupported())&&(this._config=this._getConfig(ti),this._deltaX=0,this._supportPointerEvents=!!window.PointerEvent,this._initEvents())}static get Default(){return fm}static get DefaultType(){return hm}static get NAME(){return im}dispose(){wi.off(this._element,Ds)}_start(ei){if(!this._supportPointerEvents){this._deltaX=ei.touches[0].clientX;return}this._eventIsPointerPenTouch(ei)&&(this._deltaX=ei.clientX)}_end(ei){this._eventIsPointerPenTouch(ei)&&(this._deltaX=ei.clientX-this._deltaX),this._handleSwipe(),Vn(this._config.endCallback)}_move(ei){this._deltaX=ei.touches&&ei.touches.length>1?0:ei.touches[0].clientX-this._deltaX}_handleSwipe(){let ei=Math.abs(this._deltaX);if(ei<=dm)return;let ti=ei/this._deltaX;this._deltaX=0,ti&&Vn(ti>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(wi.on(this._element,sm,ei=>this._start(ei)),wi.on(this._element,am,ei=>this._end(ei)),this._element.classList.add(um)):(wi.on(this._element,nm,ei=>this._start(ei)),wi.on(this._element,rm,ei=>this._move(ei)),wi.on(this._element,om,ei=>this._end(ei)))}_eventIsPointerPenTouch(ei){return this._supportPointerEvents&&(ei.pointerType===cm||ei.pointerType===lm)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}},pm="carousel",mm="bs.carousel",ko=`.${mm}`,md=".data-api",gm="ArrowLeft",vm="ArrowRight",ym=500,Zs="next",Es="prev",xs="left",qa="right",bm=`slide${ko}`,oc=`slid${ko}`,_m=`keydown${ko}`,Em=`mouseenter${ko}`,wm=`mouseleave${ko}`,xm=`dragstart${ko}`,Tm=`load${ko}${md}`,Cm=`click${ko}${md}`,gd="carousel",Fa="active",Sm="slide",Am="carousel-item-end",Dm="carousel-item-start",Om="carousel-item-next",Lm="carousel-item-prev",vd=".active",yd=".carousel-item",Mm=vd+yd,km=".carousel-item img",Nm=".carousel-indicators",Rm="[data-bs-slide], [data-bs-slide-to]",Im='[data-bs-ride="carousel"]',Hm={[gm]:qa,[vm]:xs},Pm={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Fm={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"},ta=class ii extends Qn{constructor(ei,ti){super(ei,ti),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=Wi.findOne(Nm,this._element),this._addEventListeners(),this._config.ride===gd&&this.cycle()}static get Default(){return Pm}static get DefaultType(){return Fm}static get NAME(){return pm}next(){this._slide(Zs)}nextWhenVisible(){!document.hidden&&As(this._element)&&this.next()}prev(){this._slide(Es)}pause(){this._isSliding&&rd(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){if(this._config.ride){if(this._isSliding){wi.one(this._element,oc,()=>this.cycle());return}this.cycle()}}to(ei){let ti=this._getItems();if(ei>ti.length-1||ei<0)return;if(this._isSliding){wi.one(this._element,oc,()=>this.to(ei));return}let ni=this._getItemIndex(this._getActive());if(ni===ei)return;let ri=ei>ni?Zs:Es;this._slide(ri,ti[ei])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(ei){return ei.defaultInterval=ei.interval,ei}_addEventListeners(){this._config.keyboard&&wi.on(this._element,_m,ei=>this._keydown(ei)),this._config.pause==="hover"&&(wi.on(this._element,Em,()=>this.pause()),wi.on(this._element,wm,()=>this._maybeEnableCycle())),this._config.touch&&Ka.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(let ni of Wi.find(km,this._element))wi.on(ni,xm,ri=>ri.preventDefault());let ti={leftCallback:()=>this._slide(this._directionToOrder(xs)),rightCallback:()=>this._slide(this._directionToOrder(qa)),endCallback:()=>{this._config.pause==="hover"&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),ym+this._config.interval))}};this._swipeHelper=new Ka(this._element,ti)}_keydown(ei){if(/input|textarea/i.test(ei.target.tagName))return;let ti=Hm[ei.key];ti&&(ei.preventDefault(),this._slide(this._directionToOrder(ti)))}_getItemIndex(ei){return this._getItems().indexOf(ei)}_setActiveIndicatorElement(ei){if(!this._indicatorsElement)return;let ti=Wi.findOne(vd,this._indicatorsElement);ti.classList.remove(Fa),ti.removeAttribute("aria-current");let ni=Wi.findOne(`[data-bs-slide-to="${ei}"]`,this._indicatorsElement);ni&&(ni.classList.add(Fa),ni.setAttribute("aria-current","true"))}_updateInterval(){let ei=this._activeElement||this._getActive();if(!ei)return;let ti=Number.parseInt(ei.getAttribute("data-bs-interval"),10);this._config.interval=ti||this._config.defaultInterval}_slide(ei,ti=null){if(this._isSliding)return;let ni=this._getActive(),ri=ei===Zs,oi=ti||bc(this._getItems(),ni,ri,this._config.wrap);if(oi===ni)return;let si=this._getItemIndex(oi),ai=yi=>wi.trigger(this._element,yi,{relatedTarget:oi,direction:this._orderToDirection(ei),from:this._getItemIndex(ni),to:si});if(ai(bm).defaultPrevented||!ni||!oi)return;let ui=!!this._interval;this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(si),this._activeElement=oi;let ci=ri?Dm:Am,di=ri?Om:Lm;oi.classList.add(di),na(oi),ni.classList.add(ci),oi.classList.add(ci);let pi=()=>{oi.classList.remove(ci,di),oi.classList.add(Fa),ni.classList.remove(Fa,di,ci),this._isSliding=!1,ai(oc)};this._queueCallback(pi,ni,this._isAnimated()),ui&&this.cycle()}_isAnimated(){return this._element.classList.contains(Sm)}_getActive(){return Wi.findOne(Mm,this._element)}_getItems(){return Wi.find(yd,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(ei){return Gr()?ei===xs?Es:Zs:ei===xs?Zs:Es}_orderToDirection(ei){return Gr()?ei===Es?xs:qa:ei===Es?qa:xs}static jQueryInterface(ei){return this.each(function(){let ti=ii.getOrCreateInstance(this,ei);if(typeof ei=="number"){ti.to(ei);return}if(typeof ei=="string"){if(ti[ei]===void 0||ei.startsWith("_")||ei==="constructor")throw new TypeError(`No method named "${ei}"`);ti[ei]()}})}};wi.on(document,Cm,Rm,function(ii){let ei=Wi.getElementFromSelector(this);if(!ei||!ei.classList.contains(gd))return;ii.preventDefault();let ti=ta.getOrCreateInstance(ei),ni=this.getAttribute("data-bs-slide-to");if(ni){ti.to(ni),ti._maybeEnableCycle();return}if(mo.getDataAttribute(this,"slide")==="next"){ti.next(),ti._maybeEnableCycle();return}ti.prev(),ti._maybeEnableCycle()});wi.on(window,Tm,()=>{let ii=Wi.find(Im);for(let ei of ii)ta.getOrCreateInstance(ei)});Qr(ta);var $m="collapse",Bm="bs.collapse",ra=`.${Bm}`,zm=".data-api",Vm=`show${ra}`,jm=`shown${ra}`,qm=`hide${ra}`,Wm=`hidden${ra}`,Um=`click${ra}${zm}`,sc="show",Cs="collapse",$a="collapsing",Ym="collapsed",Gm=`:scope .${Cs} .${Cs}`,Km="collapse-horizontal",Qm="width",Xm="height",Jm=".collapse.show, .collapse.collapsing",vc='[data-bs-toggle="collapse"]',Zm={parent:null,toggle:!0},eg={parent:"(null|element)",toggle:"boolean"},Oo=class ii extends Qn{constructor(ei,ti){super(ei,ti),this._isTransitioning=!1,this._triggerArray=[];let ni=Wi.find(vc);for(let ri of ni){let oi=Wi.getSelectorFromElement(ri),si=Wi.find(oi).filter(ai=>ai===this._element);oi!==null&&si.length&&this._triggerArray.push(ri)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Zm}static get DefaultType(){return eg}static get NAME(){return $m}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let ei=[];if(this._config.parent&&(ei=this._getFirstLevelChildren(Jm).filter(ai=>ai!==this._element).map(ai=>ii.getOrCreateInstance(ai,{toggle:!1}))),ei.length&&ei[0]._isTransitioning||wi.trigger(this._element,Vm).defaultPrevented)return;for(let ai of ei)ai.hide();let ni=this._getDimension();this._element.classList.remove(Cs),this._element.classList.add($a),this._element.style[ni]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;let ri=()=>{this._isTransitioning=!1,this._element.classList.remove($a),this._element.classList.add(Cs,sc),this._element.style[ni]="",wi.trigger(this._element,jm)},si=`scroll${ni[0].toUpperCase()+ni.slice(1)}`;this._queueCallback(ri,this._element,!0),this._element.style[ni]=`${this._element[si]}px`}hide(){if(this._isTransitioning||!this._isShown()||wi.trigger(this._element,qm).defaultPrevented)return;let ti=this._getDimension();this._element.style[ti]=`${this._element.getBoundingClientRect()[ti]}px`,na(this._element),this._element.classList.add($a),this._element.classList.remove(Cs,sc);for(let ri of this._triggerArray){let oi=Wi.getElementFromSelector(ri);oi&&!this._isShown(oi)&&this._addAriaAndCollapsedClass([ri],!1)}this._isTransitioning=!0;let ni=()=>{this._isTransitioning=!1,this._element.classList.remove($a),this._element.classList.add(Cs),wi.trigger(this._element,Wm)};this._element.style[ti]="",this._queueCallback(ni,this._element,!0)}_isShown(ei=this._element){return ei.classList.contains(sc)}_configAfterMerge(ei){return ei.toggle=!!ei.toggle,ei.parent=Ao(ei.parent),ei}_getDimension(){return this._element.classList.contains(Km)?Qm:Xm}_initializeChildren(){if(!this._config.parent)return;let ei=this._getFirstLevelChildren(vc);for(let ti of ei){let ni=Wi.getElementFromSelector(ti);ni&&this._addAriaAndCollapsedClass([ti],this._isShown(ni))}}_getFirstLevelChildren(ei){let ti=Wi.find(Gm,this._config.parent);return Wi.find(ei,this._config.parent).filter(ni=>!ti.includes(ni))}_addAriaAndCollapsedClass(ei,ti){if(ei.length)for(let ni of ei)ni.classList.toggle(Ym,!ti),ni.setAttribute("aria-expanded",ti)}static jQueryInterface(ei){let ti={};return typeof ei=="string"&&/show|hide/.test(ei)&&(ti.toggle=!1),this.each(function(){let ni=ii.getOrCreateInstance(this,ti);if(typeof ei=="string"){if(typeof ni[ei]=="undefined")throw new TypeError(`No method named "${ei}"`);ni[ei]()}})}};wi.on(document,Um,vc,function(ii){(ii.target.tagName==="A"||ii.delegateTarget&&ii.delegateTarget.tagName==="A")&&ii.preventDefault();for(let ei of Wi.getMultipleElementsFromSelector(this))Oo.getOrCreateInstance(ei,{toggle:!1}).toggle()});Qr(Oo);var Nu="dropdown",tg="bs.dropdown",is=`.${tg}`,Ec=".data-api",ig="Escape",Ru="Tab",ng="ArrowUp",Iu="ArrowDown",rg=2,og=`hide${is}`,sg=`hidden${is}`,ag=`show${is}`,lg=`shown${is}`,bd=`click${is}${Ec}`,_d=`keydown${is}${Ec}`,cg=`keyup${is}${Ec}`,Ts="show",ug="dropup",dg="dropend",fg="dropstart",hg="dropup-center",pg="dropdown-center",Jo='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',mg=`${Jo}.${Ts}`,Wa=".dropdown-menu",gg=".navbar",vg=".navbar-nav",yg=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",bg=Gr()?"top-end":"top-start",_g=Gr()?"top-start":"top-end",Eg=Gr()?"bottom-end":"bottom-start",wg=Gr()?"bottom-start":"bottom-end",xg=Gr()?"left-start":"right-start",Tg=Gr()?"right-start":"left-start",Cg="top",Sg="bottom",Ag={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Dg={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"},Lo=class ii extends Qn{constructor(ei,ti){super(ei,ti),this._popper=null,this._parent=this._element.parentNode,this._menu=Wi.next(this._element,Wa)[0]||Wi.prev(this._element,Wa)[0]||Wi.findOne(Wa,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Ag}static get DefaultType(){return Dg}static get NAME(){return Nu}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Do(this._element)||this._isShown())return;let ei={relatedTarget:this._element};if(!wi.trigger(this._element,ag,ei).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(vg))for(let ni of[].concat(...document.body.children))wi.on(ni,"mouseover",Ua);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Ts),this._element.classList.add(Ts),wi.trigger(this._element,lg,ei)}}hide(){if(Do(this._element)||!this._isShown())return;let ei={relatedTarget:this._element};this._completeHide(ei)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(ei){if(!wi.trigger(this._element,og,ei).defaultPrevented){if("ontouchstart"in document.documentElement)for(let ni of[].concat(...document.body.children))wi.off(ni,"mouseover",Ua);this._popper&&this._popper.destroy(),this._menu.classList.remove(Ts),this._element.classList.remove(Ts),this._element.setAttribute("aria-expanded","false"),mo.removeDataAttribute(this._menu,"popper"),wi.trigger(this._element,sg,ei)}}_getConfig(ei){if(ei=super._getConfig(ei),typeof ei.reference=="object"&&!po(ei.reference)&&typeof ei.reference.getBoundingClientRect!="function")throw new TypeError(`${Nu.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return ei}_createPopper(){if(typeof Pa=="undefined")throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let ei=this._element;this._config.reference==="parent"?ei=this._parent:po(this._config.reference)?ei=Ao(this._config.reference):typeof this._config.reference=="object"&&(ei=this._config.reference);let ti=this._getPopperConfig();this._popper=Js(ei,this._menu,ti)}_isShown(){return this._menu.classList.contains(Ts)}_getPlacement(){let ei=this._parent;if(ei.classList.contains(dg))return xg;if(ei.classList.contains(fg))return Tg;if(ei.classList.contains(hg))return Cg;if(ei.classList.contains(pg))return Sg;let ti=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";return ei.classList.contains(ug)?ti?_g:bg:ti?wg:Eg}_detectNavbar(){return this._element.closest(gg)!==null}_getOffset(){let{offset:ei}=this._config;return typeof ei=="string"?ei.split(",").map(ti=>Number.parseInt(ti,10)):typeof ei=="function"?ti=>ei(ti,this._element):ei}_getPopperConfig(){let ei={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display==="static")&&(mo.setDataAttribute(this._menu,"popper","static"),ei.modifiers=[{name:"applyStyles",enabled:!1}]),Di(Di({},ei),Vn(this._config.popperConfig,[ei]))}_selectMenuItem({key:ei,target:ti}){let ni=Wi.find(yg,this._menu).filter(ri=>As(ri));ni.length&&bc(ni,ti,ei===Iu,!ni.includes(ti)).focus()}static jQueryInterface(ei){return this.each(function(){let ti=ii.getOrCreateInstance(this,ei);if(typeof ei=="string"){if(typeof ti[ei]=="undefined")throw new TypeError(`No method named "${ei}"`);ti[ei]()}})}static clearMenus(ei){if(ei.button===rg||ei.type==="keyup"&&ei.key!==Ru)return;let ti=Wi.find(mg);for(let ni of ti){let ri=ii.getInstance(ni);if(!ri||ri._config.autoClose===!1)continue;let oi=ei.composedPath(),si=oi.includes(ri._menu);if(oi.includes(ri._element)||ri._config.autoClose==="inside"&&!si||ri._config.autoClose==="outside"&&si||ri._menu.contains(ei.target)&&(ei.type==="keyup"&&ei.key===Ru||/input|select|option|textarea|form/i.test(ei.target.tagName)))continue;let ai={relatedTarget:ri._element};ei.type==="click"&&(ai.clickEvent=ei),ri._completeHide(ai)}}static dataApiKeydownHandler(ei){let ti=/input|textarea/i.test(ei.target.tagName),ni=ei.key===ig,ri=[ng,Iu].includes(ei.key);if(!ri&&!ni||ti&&!ni)return;ei.preventDefault();let oi=this.matches(Jo)?this:Wi.prev(this,Jo)[0]||Wi.next(this,Jo)[0]||Wi.findOne(Jo,ei.delegateTarget.parentNode),si=ii.getOrCreateInstance(oi);if(ri){ei.stopPropagation(),si.show(),si._selectMenuItem(ei);return}si._isShown()&&(ei.stopPropagation(),si.hide(),oi.focus())}};wi.on(document,_d,Jo,Lo.dataApiKeydownHandler);wi.on(document,_d,Wa,Lo.dataApiKeydownHandler);wi.on(document,bd,Lo.clearMenus);wi.on(document,cg,Lo.clearMenus);wi.on(document,bd,Jo,function(ii){ii.preventDefault(),Lo.getOrCreateInstance(this).toggle()});Qr(Lo);var Ed="backdrop",Og="fade",Hu="show",Pu=`mousedown.bs.${Ed}`,Lg={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Mg={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"},Qa=class extends es{constructor(ei){super(),this._config=this._getConfig(ei),this._isAppended=!1,this._element=null}static get Default(){return Lg}static get DefaultType(){return Mg}static get NAME(){return Ed}show(ei){if(!this._config.isVisible){Vn(ei);return}this._append();let ti=this._getElement();this._config.isAnimated&&na(ti),ti.classList.add(Hu),this._emulateAnimation(()=>{Vn(ei)})}hide(ei){if(!this._config.isVisible){Vn(ei);return}this._getElement().classList.remove(Hu),this._emulateAnimation(()=>{this.dispose(),Vn(ei)})}dispose(){this._isAppended&&(wi.off(this._element,Pu),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){let ei=document.createElement("div");ei.className=this._config.className,this._config.isAnimated&&ei.classList.add(Og),this._element=ei}return this._element}_configAfterMerge(ei){return ei.rootElement=Ao(ei.rootElement),ei}_append(){if(this._isAppended)return;let ei=this._getElement();this._config.rootElement.append(ei),wi.on(ei,Pu,()=>{Vn(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(ei){ad(ei,this._getElement(),this._config.isAnimated)}},kg="focustrap",Ng="bs.focustrap",Xa=`.${Ng}`,Rg=`focusin${Xa}`,Ig=`keydown.tab${Xa}`,Hg="Tab",Pg="forward",Fu="backward",Fg={autofocus:!0,trapElement:null},$g={autofocus:"boolean",trapElement:"element"},Ja=class extends es{constructor(ei){super(),this._config=this._getConfig(ei),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Fg}static get DefaultType(){return $g}static get NAME(){return kg}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),wi.off(document,Xa),wi.on(document,Rg,ei=>this._handleFocusin(ei)),wi.on(document,Ig,ei=>this._handleKeydown(ei)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,wi.off(document,Xa))}_handleFocusin(ei){let{trapElement:ti}=this._config;if(ei.target===document||ei.target===ti||ti.contains(ei.target))return;let ni=Wi.focusableChildren(ti);ni.length===0?ti.focus():this._lastTabNavDirection===Fu?ni[ni.length-1].focus():ni[0].focus()}_handleKeydown(ei){ei.key===Hg&&(this._lastTabNavDirection=ei.shiftKey?Fu:Pg)}},$u=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Bu=".sticky-top",Ba="padding-right",zu="margin-right",ia=class{constructor(){this._element=document.body}getWidth(){let ei=document.documentElement.clientWidth;return Math.abs(window.innerWidth-ei)}hide(){let ei=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Ba,ti=>ti+ei),this._setElementAttributes($u,Ba,ti=>ti+ei),this._setElementAttributes(Bu,zu,ti=>ti-ei)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,Ba),this._resetElementAttributes($u,Ba),this._resetElementAttributes(Bu,zu)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(ei,ti,ni){let ri=this.getWidth(),oi=si=>{if(si!==this._element&&window.innerWidth>si.clientWidth+ri)return;this._saveInitialAttribute(si,ti);let ai=window.getComputedStyle(si).getPropertyValue(ti);si.style.setProperty(ti,`${ni(Number.parseFloat(ai))}px`)};this._applyManipulationCallback(ei,oi)}_saveInitialAttribute(ei,ti){let ni=ei.style.getPropertyValue(ti);ni&&mo.setDataAttribute(ei,ti,ni)}_resetElementAttributes(ei,ti){let ni=ri=>{let oi=mo.getDataAttribute(ri,ti);if(oi===null){ri.style.removeProperty(ti);return}mo.removeDataAttribute(ri,ti),ri.style.setProperty(ti,oi)};this._applyManipulationCallback(ei,ni)}_applyManipulationCallback(ei,ti){if(po(ei)){ti(ei);return}for(let ni of Wi.find(ei,this._element))ti(ni)}},Bg="modal",zg="bs.modal",Kr=`.${zg}`,Vg=".data-api",jg="Escape",qg=`hide${Kr}`,Wg=`hidePrevented${Kr}`,wd=`hidden${Kr}`,xd=`show${Kr}`,Ug=`shown${Kr}`,Yg=`resize${Kr}`,Gg=`click.dismiss${Kr}`,Kg=`mousedown.dismiss${Kr}`,Qg=`keydown.dismiss${Kr}`,Xg=`click${Kr}${Vg}`,Vu="modal-open",Jg="fade",ju="show",ac="modal-static",Zg=".modal.show",ev=".modal-dialog",tv=".modal-body",iv='[data-bs-toggle="modal"]',nv={backdrop:!0,focus:!0,keyboard:!0},rv={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"},io=class ii extends Qn{constructor(ei,ti){super(ei,ti),this._dialog=Wi.findOne(ev,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new ia,this._addEventListeners()}static get Default(){return nv}static get DefaultType(){return rv}static get NAME(){return Bg}toggle(ei){return this._isShown?this.hide():this.show(ei)}show(ei){this._isShown||this._isTransitioning||wi.trigger(this._element,xd,{relatedTarget:ei}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Vu),this._adjustDialog(),this._backdrop.show(()=>this._showElement(ei)))}hide(){!this._isShown||this._isTransitioning||wi.trigger(this._element,qg).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(ju),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated()))}dispose(){wi.off(window,Kr),wi.off(this._dialog,Kr),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Qa({isVisible:!!this._config.backdrop,isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Ja({trapElement:this._element})}_showElement(ei){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;let ti=Wi.findOne(tv,this._dialog);ti&&(ti.scrollTop=0),na(this._element),this._element.classList.add(ju);let ni=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,wi.trigger(this._element,Ug,{relatedTarget:ei})};this._queueCallback(ni,this._dialog,this._isAnimated())}_addEventListeners(){wi.on(this._element,Qg,ei=>{if(ei.key===jg){if(this._config.keyboard){this.hide();return}this._triggerBackdropTransition()}}),wi.on(window,Yg,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),wi.on(this._element,Kg,ei=>{wi.one(this._element,Gg,ti=>{if(!(this._element!==ei.target||this._element!==ti.target)){if(this._config.backdrop==="static"){this._triggerBackdropTransition();return}this._config.backdrop&&this.hide()}})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(Vu),this._resetAdjustments(),this._scrollBar.reset(),wi.trigger(this._element,wd)})}_isAnimated(){return this._element.classList.contains(Jg)}_triggerBackdropTransition(){if(wi.trigger(this._element,Wg).defaultPrevented)return;let ti=this._element.scrollHeight>document.documentElement.clientHeight,ni=this._element.style.overflowY;ni==="hidden"||this._element.classList.contains(ac)||(ti||(this._element.style.overflowY="hidden"),this._element.classList.add(ac),this._queueCallback(()=>{this._element.classList.remove(ac),this._queueCallback(()=>{this._element.style.overflowY=ni},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){let ei=this._element.scrollHeight>document.documentElement.clientHeight,ti=this._scrollBar.getWidth(),ni=ti>0;if(ni&&!ei){let ri=Gr()?"paddingLeft":"paddingRight";this._element.style[ri]=`${ti}px`}if(!ni&&ei){let ri=Gr()?"paddingRight":"paddingLeft";this._element.style[ri]=`${ti}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(ei,ti){return this.each(function(){let ni=ii.getOrCreateInstance(this,ei);if(typeof ei=="string"){if(typeof ni[ei]=="undefined")throw new TypeError(`No method named "${ei}"`);ni[ei](ti)}})}};wi.on(document,Xg,iv,function(ii){let ei=Wi.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&ii.preventDefault(),wi.one(ei,xd,ri=>{ri.defaultPrevented||wi.one(ei,wd,()=>{As(this)&&this.focus()})});let ti=Wi.findOne(Zg);ti&&io.getInstance(ti).hide(),io.getOrCreateInstance(ei).toggle(this)});el(io);Qr(io);var ov="offcanvas",sv="bs.offcanvas",yo=`.${sv}`,Td=".data-api",av=`load${yo}${Td}`,lv="Escape",qu="show",Wu="showing",Uu="hiding",cv="offcanvas-backdrop",Cd=".offcanvas.show",uv=`show${yo}`,dv=`shown${yo}`,fv=`hide${yo}`,Yu=`hidePrevented${yo}`,Sd=`hidden${yo}`,hv=`resize${yo}`,pv=`click${yo}${Td}`,mv=`keydown.dismiss${yo}`,gv='[data-bs-toggle="offcanvas"]',vv={backdrop:!0,keyboard:!0,scroll:!1},yv={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"},Mo=class ii extends Qn{constructor(ei,ti){super(ei,ti),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return vv}static get DefaultType(){return yv}static get NAME(){return ov}toggle(ei){return this._isShown?this.hide():this.show(ei)}show(ei){if(this._isShown||wi.trigger(this._element,uv,{relatedTarget:ei}).defaultPrevented)return;this._isShown=!0,this._backdrop.show(),this._config.scroll||new ia().hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Wu);let ni=()=>{(!this._config.scroll||this._config.backdrop)&&this._focustrap.activate(),this._element.classList.add(qu),this._element.classList.remove(Wu),wi.trigger(this._element,dv,{relatedTarget:ei})};this._queueCallback(ni,this._element,!0)}hide(){if(!this._isShown||wi.trigger(this._element,fv).defaultPrevented)return;this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Uu),this._backdrop.hide();let ti=()=>{this._element.classList.remove(qu,Uu),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||new ia().reset(),wi.trigger(this._element,Sd)};this._queueCallback(ti,this._element,!0)}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){let ei=()=>{if(this._config.backdrop==="static"){wi.trigger(this._element,Yu);return}this.hide()},ti=!!this._config.backdrop;return new Qa({className:cv,isVisible:ti,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:ti?ei:null})}_initializeFocusTrap(){return new Ja({trapElement:this._element})}_addEventListeners(){wi.on(this._element,mv,ei=>{if(ei.key===lv){if(this._config.keyboard){this.hide();return}wi.trigger(this._element,Yu)}})}static jQueryInterface(ei){return this.each(function(){let ti=ii.getOrCreateInstance(this,ei);if(typeof ei=="string"){if(ti[ei]===void 0||ei.startsWith("_")||ei==="constructor")throw new TypeError(`No method named "${ei}"`);ti[ei](this)}})}};wi.on(document,pv,gv,function(ii){let ei=Wi.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&ii.preventDefault(),Do(this))return;wi.one(ei,Sd,()=>{As(this)&&this.focus()});let ti=Wi.findOne(Cd);ti&&ti!==ei&&Mo.getInstance(ti).hide(),Mo.getOrCreateInstance(ei).toggle(this)});wi.on(window,av,()=>{for(let ii of Wi.find(Cd))Mo.getOrCreateInstance(ii).show()});wi.on(window,hv,()=>{for(let ii of Wi.find("[aria-modal][class*=show][class*=offcanvas-]"))getComputedStyle(ii).position!=="fixed"&&Mo.getOrCreateInstance(ii).hide()});el(Mo);Qr(Mo);var bv=/^aria-[\w-]*$/i,Ad={"*":["class","dir","id","lang","role",bv],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},_v=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Ev=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,wv=(ii,ei)=>{let ti=ii.nodeName.toLowerCase();return ei.includes(ti)?_v.has(ti)?!!Ev.test(ii.nodeValue):!0:ei.filter(ni=>ni instanceof RegExp).some(ni=>ni.test(ti))};function xv(ii,ei,ti){if(!ii.length)return ii;if(ti&&typeof ti=="function")return ti(ii);let ri=new window.DOMParser().parseFromString(ii,"text/html"),oi=[].concat(...ri.body.querySelectorAll("*"));for(let si of oi){let ai=si.nodeName.toLowerCase();if(!Object.keys(ei).includes(ai)){si.remove();continue}let li=[].concat(...si.attributes),ui=[].concat(ei["*"]||[],ei[ai]||[]);for(let ci of li)wv(ci,ui)||si.removeAttribute(ci.nodeName)}return ri.body.innerHTML}var Tv="TemplateFactory",Cv={allowList:Ad,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
    "},Sv={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Av={entry:"(string|element|function|null)",selector:"(string|element)"},yc=class extends es{constructor(ei){super(),this._config=this._getConfig(ei)}static get Default(){return Cv}static get DefaultType(){return Sv}static get NAME(){return Tv}getContent(){return Object.values(this._config.content).map(ei=>this._resolvePossibleFunction(ei)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(ei){return this._checkContent(ei),this._config.content=Di(Di({},this._config.content),ei),this}toHtml(){let ei=document.createElement("div");ei.innerHTML=this._maybeSanitize(this._config.template);for(let[ri,oi]of Object.entries(this._config.content))this._setContent(ei,oi,ri);let ti=ei.children[0],ni=this._resolvePossibleFunction(this._config.extraClass);return ni&&ti.classList.add(...ni.split(" ")),ti}_typeCheckConfig(ei){super._typeCheckConfig(ei),this._checkContent(ei.content)}_checkContent(ei){for(let[ti,ni]of Object.entries(ei))super._typeCheckConfig({selector:ti,entry:ni},Av)}_setContent(ei,ti,ni){let ri=Wi.findOne(ni,ei);if(ri){if(ti=this._resolvePossibleFunction(ti),!ti){ri.remove();return}if(po(ti)){this._putElementInTemplate(Ao(ti),ri);return}if(this._config.html){ri.innerHTML=this._maybeSanitize(ti);return}ri.textContent=ti}}_maybeSanitize(ei){return this._config.sanitize?xv(ei,this._config.allowList,this._config.sanitizeFn):ei}_resolvePossibleFunction(ei){return Vn(ei,[this])}_putElementInTemplate(ei,ti){if(this._config.html){ti.innerHTML="",ti.append(ei);return}ti.textContent=ei.textContent}},Dv="tooltip",Ov=new Set(["sanitize","allowList","sanitizeFn"]),lc="fade",Lv="modal",za="show",Mv=".tooltip-inner",Gu=`.${Lv}`,Ku="hide.bs.modal",ea="hover",cc="focus",kv="click",Nv="manual",Rv="hide",Iv="hidden",Hv="show",Pv="shown",Fv="inserted",$v="click",Bv="focusin",zv="focusout",Vv="mouseenter",jv="mouseleave",qv={AUTO:"auto",TOP:"top",RIGHT:Gr()?"left":"right",BOTTOM:"bottom",LEFT:Gr()?"right":"left"},Wv={allowList:Ad,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},Uv={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"},go=class ii extends Qn{constructor(ei,ti){if(typeof Pa=="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(ei,ti),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Wv}static get DefaultType(){return Uv}static get NAME(){return Dv}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(this._isEnabled){if(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()){this._leave();return}this._enter()}}dispose(){clearTimeout(this._timeout),wi.off(this._element.closest(Gu),Ku,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!(this._isWithContent()&&this._isEnabled))return;let ei=wi.trigger(this._element,this.constructor.eventName(Hv)),ni=(od(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(ei.defaultPrevented||!ni)return;this._disposePopper();let ri=this._getTipElement();this._element.setAttribute("aria-describedby",ri.getAttribute("id"));let{container:oi}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(oi.append(ri),wi.trigger(this._element,this.constructor.eventName(Fv))),this._popper=this._createPopper(ri),ri.classList.add(za),"ontouchstart"in document.documentElement)for(let ai of[].concat(...document.body.children))wi.on(ai,"mouseover",Ua);let si=()=>{wi.trigger(this._element,this.constructor.eventName(Pv)),this._isHovered===!1&&this._leave(),this._isHovered=!1};this._queueCallback(si,this.tip,this._isAnimated())}hide(){if(!this._isShown()||wi.trigger(this._element,this.constructor.eventName(Rv)).defaultPrevented)return;if(this._getTipElement().classList.remove(za),"ontouchstart"in document.documentElement)for(let ri of[].concat(...document.body.children))wi.off(ri,"mouseover",Ua);this._activeTrigger[kv]=!1,this._activeTrigger[cc]=!1,this._activeTrigger[ea]=!1,this._isHovered=null;let ni=()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),wi.trigger(this._element,this.constructor.eventName(Iv)))};this._queueCallback(ni,this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return!!this._getTitle()}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(ei){let ti=this._getTemplateFactory(ei).toHtml();if(!ti)return null;ti.classList.remove(lc,za),ti.classList.add(`bs-${this.constructor.NAME}-auto`);let ni=Np(this.constructor.NAME).toString();return ti.setAttribute("id",ni),this._isAnimated()&&ti.classList.add(lc),ti}setContent(ei){this._newContent=ei,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(ei){return this._templateFactory?this._templateFactory.changeContent(ei):this._templateFactory=new yc(sn(Di({},this._config),{content:ei,extraClass:this._resolvePossibleFunction(this._config.customClass)})),this._templateFactory}_getContentForTemplate(){return{[Mv]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(ei){return this.constructor.getOrCreateInstance(ei.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(lc)}_isShown(){return this.tip&&this.tip.classList.contains(za)}_createPopper(ei){let ti=Vn(this._config.placement,[this,ei,this._element]),ni=qv[ti.toUpperCase()];return Js(this._element,ei,this._getPopperConfig(ni))}_getOffset(){let{offset:ei}=this._config;return typeof ei=="string"?ei.split(",").map(ti=>Number.parseInt(ti,10)):typeof ei=="function"?ti=>ei(ti,this._element):ei}_resolvePossibleFunction(ei){return Vn(ei,[this._element])}_getPopperConfig(ei){let ti={placement:ei,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:ni=>{this._getTipElement().setAttribute("data-popper-placement",ni.state.placement)}}]};return Di(Di({},ti),Vn(this._config.popperConfig,[ti]))}_setListeners(){let ei=this._config.trigger.split(" ");for(let ti of ei)if(ti==="click")wi.on(this._element,this.constructor.eventName($v),this._config.selector,ni=>{this._initializeOnDelegatedTarget(ni).toggle()});else if(ti!==Nv){let ni=ti===ea?this.constructor.eventName(Vv):this.constructor.eventName(Bv),ri=ti===ea?this.constructor.eventName(jv):this.constructor.eventName(zv);wi.on(this._element,ni,this._config.selector,oi=>{let si=this._initializeOnDelegatedTarget(oi);si._activeTrigger[oi.type==="focusin"?cc:ea]=!0,si._enter()}),wi.on(this._element,ri,this._config.selector,oi=>{let si=this._initializeOnDelegatedTarget(oi);si._activeTrigger[oi.type==="focusout"?cc:ea]=si._element.contains(oi.relatedTarget),si._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},wi.on(this._element.closest(Gu),Ku,this._hideModalHandler)}_fixTitle(){let ei=this._element.getAttribute("title");ei&&(!this._element.getAttribute("aria-label")&&!this._element.textContent.trim()&&this._element.setAttribute("aria-label",ei),this._element.setAttribute("data-bs-original-title",ei),this._element.removeAttribute("title"))}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide))}_setTimeout(ei,ti){clearTimeout(this._timeout),this._timeout=setTimeout(ei,ti)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(ei){let ti=mo.getDataAttributes(this._element);for(let ni of Object.keys(ti))Ov.has(ni)&&delete ti[ni];return ei=Di(Di({},ti),typeof ei=="object"&&ei?ei:{}),ei=this._mergeConfigObj(ei),ei=this._configAfterMerge(ei),this._typeCheckConfig(ei),ei}_configAfterMerge(ei){return ei.container=ei.container===!1?document.body:Ao(ei.container),typeof ei.delay=="number"&&(ei.delay={show:ei.delay,hide:ei.delay}),typeof ei.title=="number"&&(ei.title=ei.title.toString()),typeof ei.content=="number"&&(ei.content=ei.content.toString()),ei}_getDelegateConfig(){let ei={};for(let[ti,ni]of Object.entries(this._config))this.constructor.Default[ti]!==ni&&(ei[ti]=ni);return ei.selector=!1,ei.trigger="manual",ei}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(ei){return this.each(function(){let ti=ii.getOrCreateInstance(this,ei);if(typeof ei=="string"){if(typeof ti[ei]=="undefined")throw new TypeError(`No method named "${ei}"`);ti[ei]()}})}};Qr(go);var Yv="popover",Gv=".popover-header",Kv=".popover-body",Qv=sn(Di({},go.Default),{content:"",offset:[0,8],placement:"right",template:'',trigger:"click"}),Xv=sn(Di({},go.DefaultType),{content:"(null|string|element|function)"}),Ss=class ii extends go{static get Default(){return Qv}static get DefaultType(){return Xv}static get NAME(){return Yv}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[Gv]:this._getTitle(),[Kv]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(ei){return this.each(function(){let ti=ii.getOrCreateInstance(this,ei);if(typeof ei=="string"){if(typeof ti[ei]=="undefined")throw new TypeError(`No method named "${ei}"`);ti[ei]()}})}};Qr(Ss);var Jv="scrollspy",Zv="bs.scrollspy",wc=`.${Zv}`,ey=".data-api",ty=`activate${wc}`,Qu=`click${wc}`,iy=`load${wc}${ey}`,ny="dropdown-item",ws="active",ry='[data-bs-spy="scroll"]',uc="[href]",oy=".nav, .list-group",Xu=".nav-link",sy=".nav-item",ay=".list-group-item",ly=`${Xu}, ${sy} > ${Xu}, ${ay}`,cy=".dropdown",uy=".dropdown-toggle",dy={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},fy={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"},Za=class ii extends Qn{constructor(ei,ti){super(ei,ti),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return dy}static get DefaultType(){return fy}static get NAME(){return Jv}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(let ei of this._observableSections.values())this._observer.observe(ei)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(ei){return ei.target=Ao(ei.target)||document.body,ei.rootMargin=ei.offset?`${ei.offset}px 0px -30%`:ei.rootMargin,typeof ei.threshold=="string"&&(ei.threshold=ei.threshold.split(",").map(ti=>Number.parseFloat(ti))),ei}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(wi.off(this._config.target,Qu),wi.on(this._config.target,Qu,uc,ei=>{let ti=this._observableSections.get(ei.target.hash);if(ti){ei.preventDefault();let ni=this._rootElement||window,ri=ti.offsetTop-this._element.offsetTop;if(ni.scrollTo){ni.scrollTo({top:ri,behavior:"smooth"});return}ni.scrollTop=ri}}))}_getNewObserver(){let ei={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(ti=>this._observerCallback(ti),ei)}_observerCallback(ei){let ti=si=>this._targetLinks.get(`#${si.target.id}`),ni=si=>{this._previousScrollData.visibleEntryTop=si.target.offsetTop,this._process(ti(si))},ri=(this._rootElement||document.documentElement).scrollTop,oi=ri>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=ri;for(let si of ei){if(!si.isIntersecting){this._activeTarget=null,this._clearActiveClass(ti(si));continue}let ai=si.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(oi&&ai){if(ni(si),!ri)return;continue}!oi&&!ai&&ni(si)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;let ei=Wi.find(uc,this._config.target);for(let ti of ei){if(!ti.hash||Do(ti))continue;let ni=Wi.findOne(decodeURI(ti.hash),this._element);As(ni)&&(this._targetLinks.set(decodeURI(ti.hash),ti),this._observableSections.set(ti.hash,ni))}}_process(ei){this._activeTarget!==ei&&(this._clearActiveClass(this._config.target),this._activeTarget=ei,ei.classList.add(ws),this._activateParents(ei),wi.trigger(this._element,ty,{relatedTarget:ei}))}_activateParents(ei){if(ei.classList.contains(ny)){Wi.findOne(uy,ei.closest(cy)).classList.add(ws);return}for(let ti of Wi.parents(ei,oy))for(let ni of Wi.prev(ti,ly))ni.classList.add(ws)}_clearActiveClass(ei){ei.classList.remove(ws);let ti=Wi.find(`${uc}.${ws}`,ei);for(let ni of ti)ni.classList.remove(ws)}static jQueryInterface(ei){return this.each(function(){let ti=ii.getOrCreateInstance(this,ei);if(typeof ei=="string"){if(ti[ei]===void 0||ei.startsWith("_")||ei==="constructor")throw new TypeError(`No method named "${ei}"`);ti[ei]()}})}};wi.on(window,iy,()=>{for(let ii of Wi.find(ry))Za.getOrCreateInstance(ii)});Qr(Za);var hy="tab",py="bs.tab",ns=`.${py}`,my=`hide${ns}`,gy=`hidden${ns}`,vy=`show${ns}`,yy=`shown${ns}`,by=`click${ns}`,_y=`keydown${ns}`,Ey=`load${ns}`,wy="ArrowLeft",Ju="ArrowRight",xy="ArrowUp",Zu="ArrowDown",dc="Home",ed="End",Zo="active",td="fade",fc="show",Ty="dropdown",Dd=".dropdown-toggle",Cy=".dropdown-menu",hc=`:not(${Dd})`,Sy='.list-group, .nav, [role="tablist"]',Ay=".nav-item, .list-group-item",Dy=`.nav-link${hc}, .list-group-item${hc}, [role="tab"]${hc}`,Od='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',pc=`${Dy}, ${Od}`,Oy=`.${Zo}[data-bs-toggle="tab"], .${Zo}[data-bs-toggle="pill"], .${Zo}[data-bs-toggle="list"]`,ts=class ii extends Qn{constructor(ei){super(ei),this._parent=this._element.closest(Sy),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),wi.on(this._element,_y,ti=>this._keydown(ti)))}static get NAME(){return hy}show(){let ei=this._element;if(this._elemIsActive(ei))return;let ti=this._getActiveElem(),ni=ti?wi.trigger(ti,my,{relatedTarget:ei}):null;wi.trigger(ei,vy,{relatedTarget:ti}).defaultPrevented||ni&&ni.defaultPrevented||(this._deactivate(ti,ei),this._activate(ei,ti))}_activate(ei,ti){if(!ei)return;ei.classList.add(Zo),this._activate(Wi.getElementFromSelector(ei));let ni=()=>{if(ei.getAttribute("role")!=="tab"){ei.classList.add(fc);return}ei.removeAttribute("tabindex"),ei.setAttribute("aria-selected",!0),this._toggleDropDown(ei,!0),wi.trigger(ei,yy,{relatedTarget:ti})};this._queueCallback(ni,ei,ei.classList.contains(td))}_deactivate(ei,ti){if(!ei)return;ei.classList.remove(Zo),ei.blur(),this._deactivate(Wi.getElementFromSelector(ei));let ni=()=>{if(ei.getAttribute("role")!=="tab"){ei.classList.remove(fc);return}ei.setAttribute("aria-selected",!1),ei.setAttribute("tabindex","-1"),this._toggleDropDown(ei,!1),wi.trigger(ei,gy,{relatedTarget:ti})};this._queueCallback(ni,ei,ei.classList.contains(td))}_keydown(ei){if(![wy,Ju,xy,Zu,dc,ed].includes(ei.key))return;ei.stopPropagation(),ei.preventDefault();let ti=this._getChildren().filter(ri=>!Do(ri)),ni;if([dc,ed].includes(ei.key))ni=ti[ei.key===dc?0:ti.length-1];else{let ri=[Ju,Zu].includes(ei.key);ni=bc(ti,ei.target,ri,!0)}ni&&(ni.focus({preventScroll:!0}),ii.getOrCreateInstance(ni).show())}_getChildren(){return Wi.find(pc,this._parent)}_getActiveElem(){return this._getChildren().find(ei=>this._elemIsActive(ei))||null}_setInitialAttributes(ei,ti){this._setAttributeIfNotExists(ei,"role","tablist");for(let ni of ti)this._setInitialAttributesOnChild(ni)}_setInitialAttributesOnChild(ei){ei=this._getInnerElement(ei);let ti=this._elemIsActive(ei),ni=this._getOuterElement(ei);ei.setAttribute("aria-selected",ti),ni!==ei&&this._setAttributeIfNotExists(ni,"role","presentation"),ti||ei.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(ei,"role","tab"),this._setInitialAttributesOnTargetPanel(ei)}_setInitialAttributesOnTargetPanel(ei){let ti=Wi.getElementFromSelector(ei);ti&&(this._setAttributeIfNotExists(ti,"role","tabpanel"),ei.id&&this._setAttributeIfNotExists(ti,"aria-labelledby",`${ei.id}`))}_toggleDropDown(ei,ti){let ni=this._getOuterElement(ei);if(!ni.classList.contains(Ty))return;let ri=(oi,si)=>{let ai=Wi.findOne(oi,ni);ai&&ai.classList.toggle(si,ti)};ri(Dd,Zo),ri(Cy,fc),ni.setAttribute("aria-expanded",ti)}_setAttributeIfNotExists(ei,ti,ni){ei.hasAttribute(ti)||ei.setAttribute(ti,ni)}_elemIsActive(ei){return ei.classList.contains(Zo)}_getInnerElement(ei){return ei.matches(pc)?ei:Wi.findOne(pc,ei)}_getOuterElement(ei){return ei.closest(Ay)||ei}static jQueryInterface(ei){return this.each(function(){let ti=ii.getOrCreateInstance(this);if(typeof ei=="string"){if(ti[ei]===void 0||ei.startsWith("_")||ei==="constructor")throw new TypeError(`No method named "${ei}"`);ti[ei]()}})}};wi.on(document,by,Od,function(ii){["A","AREA"].includes(this.tagName)&&ii.preventDefault(),!Do(this)&&ts.getOrCreateInstance(this).show()});wi.on(window,Ey,()=>{for(let ii of Wi.find(Oy))ts.getOrCreateInstance(ii)});Qr(ts);var Ly="toast",My="bs.toast",No=`.${My}`,ky=`mouseover${No}`,Ny=`mouseout${No}`,Ry=`focusin${No}`,Iy=`focusout${No}`,Hy=`hide${No}`,Py=`hidden${No}`,Fy=`show${No}`,$y=`shown${No}`,By="fade",id="hide",Va="show",ja="showing",zy={animation:"boolean",autohide:"boolean",delay:"number"},Vy={animation:!0,autohide:!0,delay:5e3},vo=class ii extends Qn{constructor(ei,ti){super(ei,ti),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Vy}static get DefaultType(){return zy}static get NAME(){return Ly}show(){if(wi.trigger(this._element,Fy).defaultPrevented)return;this._clearTimeout(),this._config.animation&&this._element.classList.add(By);let ti=()=>{this._element.classList.remove(ja),wi.trigger(this._element,$y),this._maybeScheduleHide()};this._element.classList.remove(id),na(this._element),this._element.classList.add(Va,ja),this._queueCallback(ti,this._element,this._config.animation)}hide(){if(!this.isShown()||wi.trigger(this._element,Hy).defaultPrevented)return;let ti=()=>{this._element.classList.add(id),this._element.classList.remove(ja,Va),wi.trigger(this._element,Py)};this._element.classList.add(ja),this._queueCallback(ti,this._element,this._config.animation)}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(Va),super.dispose()}isShown(){return this._element.classList.contains(Va)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(ei,ti){switch(ei.type){case"mouseover":case"mouseout":{this._hasMouseInteraction=ti;break}case"focusin":case"focusout":{this._hasKeyboardInteraction=ti;break}}if(ti){this._clearTimeout();return}let ni=ei.relatedTarget;this._element===ni||this._element.contains(ni)||this._maybeScheduleHide()}_setListeners(){wi.on(this._element,ky,ei=>this._onInteraction(ei,!0)),wi.on(this._element,Ny,ei=>this._onInteraction(ei,!1)),wi.on(this._element,Ry,ei=>this._onInteraction(ei,!0)),wi.on(this._element,Iy,ei=>this._onInteraction(ei,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(ei){return this.each(function(){let ti=ii.getOrCreateInstance(this,ei);if(typeof ei=="string"){if(typeof ti[ei]=="undefined")throw new TypeError(`No method named "${ei}"`);ti[ei](this)}})}};el(vo);Qr(vo);var FL=cu(Ld());function xc(ii,ei){ii.split(/\s+/).forEach(ti=>{ei(ti)})}var oa=class{constructor(){this._events={}}on(ei,ti){xc(ei,ni=>{let ri=this._events[ni]||[];ri.push(ti),this._events[ni]=ri})}off(ei,ti){var ni=arguments.length;if(ni===0){this._events={};return}xc(ei,ri=>{if(ni===1){delete this._events[ri];return}let oi=this._events[ri];oi!==void 0&&(oi.splice(oi.indexOf(ti),1),this._events[ri]=oi)})}trigger(ei,...ti){var ni=this;xc(ei,ri=>{let oi=ni._events[ri];oi!==void 0&&oi.forEach(si=>{si.apply(ni,ti)})})}};function Tc(ii){return ii.plugins={},class extends ii{constructor(){super(...arguments),this.plugins={names:[],settings:{},requested:{},loaded:{}}}static define(ei,ti){ii.plugins[ei]={name:ei,fn:ti}}initializePlugins(ei){var ti,ni;let ri=this,oi=[];if(Array.isArray(ei))ei.forEach(si=>{typeof si=="string"?oi.push(si):(ri.plugins.settings[si.name]=si.options,oi.push(si.name))});else if(ei)for(ti in ei)ei.hasOwnProperty(ti)&&(ri.plugins.settings[ti]=ei[ti],oi.push(ti));for(;ni=oi.shift();)ri.require(ni)}loadPlugin(ei){var ti=this,ni=ti.plugins,ri=ii.plugins[ei];if(!ii.plugins.hasOwnProperty(ei))throw new Error('Unable to find "'+ei+'" plugin');ni.requested[ei]=!0,ni.loaded[ei]=ri.fn.apply(ti,[ti.plugins.settings[ei]||{}]),ni.names.push(ei)}require(ei){var ti=this,ni=ti.plugins;if(!ti.plugins.loaded.hasOwnProperty(ei)){if(ni.requested[ei])throw new Error('Plugin has circular dependency ("'+ei+'")');ti.loadPlugin(ei)}return ni.loaded[ei]}}}var sa=ii=>(ii=ii.filter(Boolean),ii.length<2?ii[0]||"":qy(ii)==1?"["+ii.join("")+"]":"(?:"+ii.join("|")+")"),Cc=ii=>{if(!jy(ii))return ii.join("");let ei="",ti=0,ni=()=>{ti>1&&(ei+="{"+ti+"}")};return ii.forEach((ri,oi)=>{if(ri===ii[oi-1]){ti++;return}ni(),ei+=ri,ti=1}),ni(),ei},Sc=ii=>{let ei=Array.from(ii);return sa(ei)},jy=ii=>new Set(ii).size!==ii.length,Ro=ii=>(ii+"").replace(/([\$\(\)\*\+\.\?\[\]\^\{\|\}\\])/gu,"\\$1"),qy=ii=>ii.reduce((ei,ti)=>Math.max(ei,Wy(ti)),0),Wy=ii=>Array.from(ii).length;var Ac=ii=>{if(ii.length===1)return[[ii]];let ei=[],ti=ii.substring(1);return Ac(ti).forEach(function(ri){let oi=ri.slice(0);oi[0]=ii.charAt(0)+oi[0],ei.push(oi),oi=ri.slice(0),oi.unshift(ii.charAt(0)),ei.push(oi)}),ei};var Uy=[[0,65535]],Yy="[\u0300-\u036F\xB7\u02BE\u02BC]",tl,Rd,Gy=3,Dc={},Md={"/":"\u2044\u2215",0:"\u07C0",a:"\u2C65\u0250\u0251",aa:"\uA733",ae:"\xE6\u01FD\u01E3",ao:"\uA735",au:"\uA737",av:"\uA739\uA73B",ay:"\uA73D",b:"\u0180\u0253\u0183",c:"\uA73F\u0188\u023C\u2184",d:"\u0111\u0257\u0256\u1D05\u018C\uABB7\u0501\u0266",e:"\u025B\u01DD\u1D07\u0247",f:"\uA77C\u0192",g:"\u01E5\u0260\uA7A1\u1D79\uA77F\u0262",h:"\u0127\u2C68\u2C76\u0265",i:"\u0268\u0131",j:"\u0249\u0237",k:"\u0199\u2C6A\uA741\uA743\uA745\uA7A3",l:"\u0142\u019A\u026B\u2C61\uA749\uA747\uA781\u026D",m:"\u0271\u026F\u03FB",n:"\uA7A5\u019E\u0272\uA791\u1D0E\u043B\u0509",o:"\xF8\u01FF\u0254\u0275\uA74B\uA74D\u1D11",oe:"\u0153",oi:"\u01A3",oo:"\uA74F",ou:"\u0223",p:"\u01A5\u1D7D\uA751\uA753\uA755\u03C1",q:"\uA757\uA759\u024B",r:"\u024D\u027D\uA75B\uA7A7\uA783",s:"\xDF\u023F\uA7A9\uA785\u0282",t:"\u0167\u01AD\u0288\u2C66\uA787",th:"\xFE",tz:"\uA729",u:"\u0289",v:"\u028B\uA75F\u028C",vy:"\uA761",w:"\u2C73",y:"\u01B4\u024F\u1EFF",z:"\u01B6\u0225\u0240\u2C6C\uA763",hv:"\u0195"};for(let ii in Md){let ei=Md[ii]||"";for(let ti=0;ti{tl===void 0&&(tl=eb(ii||Uy))},kd=(ii,ei="NFKD")=>ii.normalize(ei),aa=ii=>Array.from(ii).reduce((ei,ti)=>ei+Xy(ti),""),Xy=ii=>(ii=kd(ii).toLowerCase().replace(Ky,ei=>Dc[ei]||""),kd(ii,"NFC"));function*Jy(ii){for(let[ei,ti]of ii)for(let ni=ei;ni<=ti;ni++){let ri=String.fromCharCode(ni),oi=aa(ri);oi!=ri.toLowerCase()&&(oi.length>Gy||oi.length!=0&&(yield{folded:oi,composed:ri,code_point:ni}))}}var Zy=ii=>{let ei={},ti=(ni,ri)=>{let oi=ei[ni]||new Set,si=new RegExp("^"+Sc(oi)+"$","iu");ri.match(si)||(oi.add(Ro(ri)),ei[ni]=oi)};for(let ni of Jy(ii))ti(ni.folded,ni.folded),ti(ni.folded,ni.composed);return ei},eb=ii=>{let ei=Zy(ii),ti={},ni=[];for(let oi in ei){let si=ei[oi];si&&(ti[oi]=Sc(si)),oi.length>1&&ni.push(Ro(oi))}ni.sort((oi,si)=>si.length-oi.length);let ri=sa(ni);return Rd=new RegExp("^"+ri,"u"),ti},tb=(ii,ei=1)=>{let ti=0;return ii=ii.map(ni=>(tl[ni]&&(ti+=ni.length),tl[ni]||ni)),ti>=ei?Cc(ii):""},ib=(ii,ei=1)=>(ei=Math.max(ei,ii.length-1),sa(Ac(ii).map(ti=>tb(ti,ei)))),Nd=(ii,ei=!0)=>{let ti=ii.length>1?1:0;return sa(ii.map(ni=>{let ri=[],oi=ei?ni.length():ni.length()-1;for(let si=0;si{for(let ti of ei){if(ti.start!=ii.start||ti.end!=ii.end||ti.substrs.join("")!==ii.substrs.join(""))continue;let ni=ii.parts,ri=si=>{for(let ai of ni){if(ai.start===si.start&&ai.substr===si.substr)return!1;if(!(si.length==1||ai.length==1)&&(si.startai.start||ai.startsi.start))return!0}return!1};if(!(ti.parts.filter(ri).length>0))return!0}return!1},il=class ii{constructor(){en(this,"parts");en(this,"substrs");en(this,"start");en(this,"end");this.parts=[],this.substrs=[],this.start=0,this.end=0}add(ei){ei&&(this.parts.push(ei),this.substrs.push(ei.substr),this.start=Math.min(ei.start,this.start),this.end=Math.max(ei.end,this.end))}last(){return this.parts[this.parts.length-1]}length(){return this.parts.length}clone(ei,ti){let ni=new ii,ri=JSON.parse(JSON.stringify(this.parts)),oi=ri.pop();for(let li of ri)ni.add(li);let si=ti.substr.substring(0,ei-oi.start),ai=si.length;return ni.add({start:oi.start,end:oi.start+ai,length:ai,substr:si}),ni}},Id=ii=>{Qy(),ii=aa(ii);let ei="",ti=[new il];for(let ni=0;ni0){li=li.sort((ci,di)=>ci.length()-di.length());for(let ci of li)nb(ci,ti)||ti.push(ci);continue}if(ni>0&&ui.size==1&&!ui.has("3")){ei+=Nd(ti,!1);let ci=new il,di=ti[0];di&&ci.add(di.last()),ti=[ci]}}return ei+=Nd(ti,!0),ei};var Hd=(ii,ei)=>{if(ii)return ii[ei]},Pd=(ii,ei)=>{if(ii){for(var ti,ni=ei.split(".");(ti=ni.shift())&&(ii=ii[ti]););return ii}},nl=(ii,ei,ti)=>{var ni,ri;return!ii||(ii=ii+"",ei.regex==null)||(ri=ii.search(ei.regex),ri===-1)?0:(ni=ei.string.length/ii.length,ri===0&&(ni+=.5),ni*ti)},rl=(ii,ei)=>{var ti=ii[ei];if(typeof ti=="function")return ti;ti&&!Array.isArray(ti)&&(ii[ei]=[ti])},la=(ii,ei)=>{if(Array.isArray(ii))ii.forEach(ei);else for(var ti in ii)ii.hasOwnProperty(ti)&&ei(ii[ti],ti)},Fd=(ii,ei)=>typeof ii=="number"&&typeof ei=="number"?ii>ei?1:iiei?1:ei>ii?-1:0);var ol=class{constructor(ei,ti){en(this,"items");en(this,"settings");this.items=ei,this.settings=ti||{diacritics:!0}}tokenize(ei,ti,ni){if(!ei||!ei.length)return[];let ri=[],oi=ei.split(/\s+/);var si;return ni&&(si=new RegExp("^("+Object.keys(ni).map(Ro).join("|")+"):(.*)$")),oi.forEach(ai=>{let li,ui=null,ci=null;si&&(li=ai.match(si))&&(ui=li[1],ai=li[2]),ai.length>0&&(this.settings.diacritics?ci=Id(ai)||null:ci=Ro(ai),ci&&ti&&(ci="\\b"+ci)),ri.push({string:ai,regex:ci?new RegExp(ci,"iu"):null,field:ui})}),ri}getScoreFunction(ei,ti){var ni=this.prepareSearch(ei,ti);return this._getScoreFunction(ni)}_getScoreFunction(ei){let ti=ei.tokens,ni=ti.length;if(!ni)return function(){return 0};let ri=ei.options.fields,oi=ei.weights,si=ri.length,ai=ei.getAttrFn;if(!si)return function(){return 1};let li=function(){return si===1?function(ui,ci){let di=ri[0].field;return nl(ai(ci,di),ui,oi[di]||1)}:function(ui,ci){var di=0;if(ui.field){let pi=ai(ci,ui.field);!ui.regex&&pi?di+=1/si:di+=nl(pi,ui,1)}else la(oi,(pi,yi)=>{di+=nl(ai(ci,yi),ui,pi)});return di/si}}();return ni===1?function(ui){return li(ti[0],ui)}:ei.options.conjunction==="and"?function(ui){var ci,di=0;for(let pi of ti){if(ci=li(pi,ui),ci<=0)return 0;di+=ci}return di/ni}:function(ui){var ci=0;return la(ti,di=>{ci+=li(di,ui)}),ci/ni}}getSortFunction(ei,ti){var ni=this.prepareSearch(ei,ti);return this._getSortFunction(ni)}_getSortFunction(ei){var ti,ni=[];let ri=this,oi=ei.options,si=!ei.query&&oi.sort_empty?oi.sort_empty:oi.sort;if(typeof si=="function")return si.bind(this);let ai=function(ui,ci){return ui==="$score"?ci.score:ei.getAttrFn(ri.items[ci.id],ui)};if(si)for(let ui of si)(ei.query||ui.field!=="$score")&&ni.push(ui);if(ei.query){ti=!0;for(let ui of ni)if(ui.field==="$score"){ti=!1;break}ti&&ni.unshift({field:"$score",direction:"desc"})}else ni=ni.filter(ui=>ui.field!=="$score");return ni.length?function(ui,ci){var di,pi;for(let yi of ni)if(pi=yi.field,di=(yi.direction==="desc"?-1:1)*Fd(ai(pi,ui),ai(pi,ci)),di)return di;return 0}:null}prepareSearch(ei,ti){let ni={};var ri=Object.assign({},ti);if(rl(ri,"sort"),rl(ri,"sort_empty"),ri.fields){rl(ri,"fields");let oi=[];ri.fields.forEach(si=>{typeof si=="string"&&(si={field:si,weight:1}),oi.push(si),ni[si.field]="weight"in si?si.weight:1}),ri.fields=oi}return{options:ri,query:ei.toLowerCase().trim(),tokens:this.tokenize(ei,ri.respect_word_boundaries,ni),total:0,items:[],weights:ni,getAttrFn:ri.nesting?Pd:Hd}}search(ei,ti){var ni=this,ri,oi;oi=this.prepareSearch(ei,ti),ti=oi.options,ei=oi.query;let si=ti.score||ni._getScoreFunction(oi);ei.length?la(ni.items,(li,ui)=>{ri=si(li),(ti.filter===!1||ri>0)&&oi.items.push({score:ri,id:ui})}):la(ni.items,(li,ui)=>{oi.items.push({score:1,id:ui})});let ai=ni._getSortFunction(oi);return ai&&oi.items.sort(ai),oi.total=oi.items.length,typeof ti.limit=="number"&&(oi.items=oi.items.slice(0,ti.limit)),oi}};var Xn=ii=>typeof ii=="undefined"||ii===null?null:ca(ii),ca=ii=>typeof ii=="boolean"?ii?"1":"0":ii+"",sl=ii=>(ii+"").replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),$d=(ii,ei)=>ei>0?window.setTimeout(ii,ei):(ii.call(null),null),Bd=(ii,ei)=>{var ti;return function(ni,ri){var oi=this;ti&&(oi.loading=Math.max(oi.loading-1,0),clearTimeout(ti)),ti=setTimeout(function(){ti=null,oi.loadedSearches[ni]=!0,ii.call(oi,ni,ri)},ei)}},Oc=(ii,ei,ti)=>{var ni,ri=ii.trigger,oi={};ii.trigger=function(){var si=arguments[0];if(ei.indexOf(si)!==-1)oi[si]=arguments;else return ri.apply(ii,arguments)},ti.apply(ii,[]),ii.trigger=ri;for(ni of ei)ni in oi&&ri.apply(ii,oi[ni])},zd=ii=>({start:ii.selectionStart||0,length:(ii.selectionEnd||0)-(ii.selectionStart||0)}),fn=(ii,ei=!1)=>{ii&&(ii.preventDefault(),ei&&ii.stopPropagation())},Nn=(ii,ei,ti,ni)=>{ii.addEventListener(ei,ti,ni)},Io=(ii,ei)=>{if(!ei||!ei[ii])return!1;var ti=(ei.altKey?1:0)+(ei.ctrlKey?1:0)+(ei.shiftKey?1:0)+(ei.metaKey?1:0);return ti===1},al=(ii,ei)=>{let ti=ii.getAttribute("id");return ti||(ii.setAttribute("id",ei),ei)},Lc=ii=>ii.replace(/[\\"']/g,"\\$&"),Ho=(ii,ei)=>{ei&&ii.append(ei)},En=(ii,ei)=>{if(Array.isArray(ii))ii.forEach(ei);else for(var ti in ii)ii.hasOwnProperty(ti)&&ei(ii[ti],ti)};var no=ii=>{if(ii.jquery)return ii[0];if(ii instanceof HTMLElement)return ii;if(Mc(ii)){var ei=document.createElement("template");return ei.innerHTML=ii.trim(),ei.content.firstChild}return document.querySelector(ii)},Mc=ii=>typeof ii=="string"&&ii.indexOf("<")>-1,Vd=ii=>ii.replace(/['"\\]/g,"\\$&"),ll=(ii,ei)=>{var ti=document.createEvent("HTMLEvents");ti.initEvent(ei,!0,!1),ii.dispatchEvent(ti)},ua=(ii,ei)=>{Object.assign(ii.style,ei)},jn=(ii,...ei)=>{var ti=jd(ei);ii=qd(ii),ii.map(ni=>{ti.map(ri=>{ni.classList.add(ri)})})},bo=(ii,...ei)=>{var ti=jd(ei);ii=qd(ii),ii.map(ni=>{ti.map(ri=>{ni.classList.remove(ri)})})},jd=ii=>{var ei=[];return En(ii,ti=>{typeof ti=="string"&&(ti=ti.trim().split(/[\t\n\f\r\s]/)),Array.isArray(ti)&&(ei=ei.concat(ti))}),ei.filter(Boolean)},qd=ii=>(Array.isArray(ii)||(ii=[ii]),ii),cl=(ii,ei,ti)=>{if(!(ti&&!ti.contains(ii)))for(;ii&&ii.matches;){if(ii.matches(ei))return ii;ii=ii.parentNode}},kc=(ii,ei=0)=>ei>0?ii[ii.length-1]:ii[0],Wd=ii=>Object.keys(ii).length===0,Nc=(ii,ei)=>{if(!ii)return-1;ei=ei||ii.nodeName;for(var ti=0;ii=ii.previousElementSibling;)ii.matches(ei)&&ti++;return ti},an=(ii,ei)=>{En(ei,(ti,ni)=>{ti==null?ii.removeAttribute(ni):ii.setAttribute(ni,""+ti)})},da=(ii,ei)=>{ii.parentNode&&ii.parentNode.replaceChild(ei,ii)};var Ud=(ii,ei)=>{if(ei===null)return;if(typeof ei=="string"){if(!ei.length)return;ei=new RegExp(ei,"i")}let ti=oi=>{var si=oi.data.match(ei);if(si&&oi.data.length>0){var ai=document.createElement("span");ai.className="highlight";var li=oi.splitText(si.index);li.splitText(si[0].length);var ui=li.cloneNode(!0);return ai.appendChild(ui),da(li,ai),1}return 0},ni=oi=>{oi.nodeType===1&&oi.childNodes&&!/(script|style)/i.test(oi.tagName)&&(oi.className!=="highlight"||oi.tagName!=="SPAN")&&Array.from(oi.childNodes).forEach(si=>{ri(si)})},ri=oi=>oi.nodeType===3?ti(oi):(ni(oi),0);ri(ii)},Yd=ii=>{var ei=ii.querySelectorAll("span.highlight");Array.prototype.forEach.call(ei,function(ti){var ni=ti.parentNode;ni.replaceChild(ti.firstChild,ti),ni.normalize()})};var rb=typeof navigator=="undefined"?!1:/Mac/.test(navigator.userAgent),fa=rb?"metaKey":"ctrlKey";var Rc={options:[],optgroups:[],plugins:[],delimiter:",",splitOn:null,persist:!0,diacritics:!0,create:null,createOnBlur:!1,createFilter:null,highlight:!0,openOnFocus:!0,shouldOpen:null,maxOptions:50,maxItems:null,hideSelected:null,duplicates:!1,addPrecedence:!1,selectOnTab:!1,preload:null,allowEmptyOption:!1,refreshThrottle:300,loadThrottle:300,loadingClass:"loading",dataAttr:null,optgroupField:"optgroup",valueField:"value",labelField:"text",disabledField:"disabled",optgroupLabelField:"label",optgroupValueField:"value",lockOptgroupOrder:!1,sortField:"$order",searchField:["text"],searchConjunction:"and",mode:null,wrapperClass:"ts-wrapper",controlClass:"ts-control",dropdownClass:"ts-dropdown",dropdownContentClass:"ts-dropdown-content",itemClass:"item",optionClass:"option",dropdownParent:null,controlInput:'',copyClassesToDropdown:!1,placeholder:null,hidePlaceholder:null,shouldLoad:function(ii){return ii.length>0},render:{}};function ul(ii,ei){var ti=Object.assign({},Rc,ei),ni=ti.dataAttr,ri=ti.labelField,oi=ti.valueField,si=ti.disabledField,ai=ti.optgroupField,li=ti.optgroupLabelField,ui=ti.optgroupValueField,ci=ii.tagName.toLowerCase(),di=ii.getAttribute("placeholder")||ii.getAttribute("data-placeholder");if(!di&&!ti.allowEmptyOption){let vi=ii.querySelector('option[value=""]');vi&&(di=vi.textContent)}var pi={placeholder:di,options:[],optgroups:[],items:[],maxItems:null},yi=()=>{var vi,Ei=pi.options,Si={},xi=1;let Li=0;var Oi=ki=>{var Mi=Object.assign({},ki.dataset),Ai=ni&&Mi[ni];return typeof Ai=="string"&&Ai.length&&(Mi=Object.assign(Mi,JSON.parse(Ai))),Mi},zi=(ki,Mi)=>{var Ai=Xn(ki.value);if(Ai!=null&&!(!Ai&&!ti.allowEmptyOption)){if(Si.hasOwnProperty(Ai)){if(Mi){var qi=Si[Ai][ai];qi?Array.isArray(qi)?qi.push(Mi):Si[Ai][ai]=[qi,Mi]:Si[Ai][ai]=Mi}}else{var Ci=Oi(ki);Ci[ri]=Ci[ri]||ki.textContent,Ci[oi]=Ci[oi]||Ai,Ci[si]=Ci[si]||ki.disabled,Ci[ai]=Ci[ai]||Mi,Ci.$option=ki,Ci.$order=Ci.$order||++Li,Si[Ai]=Ci,Ei.push(Ci)}ki.selected&&pi.items.push(Ai)}},Vi=ki=>{var Mi,Ai;Ai=Oi(ki),Ai[li]=Ai[li]||ki.getAttribute("label")||"",Ai[ui]=Ai[ui]||xi++,Ai[si]=Ai[si]||ki.disabled,Ai.$order=Ai.$order||++Li,pi.optgroups.push(Ai),Mi=Ai[ui],En(ki.children,qi=>{zi(qi,Mi)})};pi.maxItems=ii.hasAttribute("multiple")?null:1,En(ii.children,ki=>{vi=ki.tagName.toLowerCase(),vi==="optgroup"?Vi(ki):vi==="option"&&zi(ki)})},gi=()=>{let vi=ii.getAttribute(ni);if(vi)pi.options=JSON.parse(vi),En(pi.options,Si=>{pi.items.push(Si[oi])});else{var Ei=ii.value.trim()||"";if(!ti.allowEmptyOption&&!Ei.length)return;let Si=Ei.split(ti.delimiter);En(Si,xi=>{let Li={};Li[ri]=xi,Li[oi]=xi,pi.options.push(Li)}),pi.items=Si}};return ci==="select"?yi():gi(),Object.assign({},Rc,pi,ei)}var Qd=0,Cn=class extends Tc(oa){constructor(ei,ti){super(),this.order=0,this.isOpen=!1,this.isDisabled=!1,this.isReadOnly=!1,this.isInvalid=!1,this.isValid=!0,this.isLocked=!1,this.isFocused=!1,this.isInputHidden=!1,this.isSetup=!1,this.ignoreFocus=!1,this.ignoreHover=!1,this.hasOptions=!1,this.lastValue="",this.caretPos=0,this.loading=0,this.loadedSearches={},this.activeOption=null,this.activeItems=[],this.optgroups={},this.options={},this.userOptions={},this.items=[],this.refreshTimeout=null,Qd++;var ni,ri=no(ei);if(ri.tomselect)throw new Error("Tom Select already initialized on this element");ri.tomselect=this;var oi=window.getComputedStyle&&window.getComputedStyle(ri,null);ni=oi.getPropertyValue("direction");let si=ul(ri,ti);this.settings=si,this.input=ri,this.tabIndex=ri.tabIndex||0,this.is_select_tag=ri.tagName.toLowerCase()==="select",this.rtl=/rtl/i.test(ni),this.inputId=al(ri,"tomselect-"+Qd),this.isRequired=ri.required,this.sifter=new ol(this.options,{diacritics:si.diacritics}),si.mode=si.mode||(si.maxItems===1?"single":"multi"),typeof si.hideSelected!="boolean"&&(si.hideSelected=si.mode==="multi"),typeof si.hidePlaceholder!="boolean"&&(si.hidePlaceholder=si.mode!=="multi");var ai=si.createFilter;typeof ai!="function"&&(typeof ai=="string"&&(ai=new RegExp(ai)),ai instanceof RegExp?si.createFilter=Ei=>ai.test(Ei):si.createFilter=Ei=>this.settings.duplicates||!this.options[Ei]),this.initializePlugins(si.plugins),this.setupCallbacks(),this.setupTemplates();let li=no("
    "),ui=no("
    "),ci=this._render("dropdown"),di=no('
    '),pi=this.input.getAttribute("class")||"",yi=si.mode;var gi;if(jn(li,si.wrapperClass,pi,yi),jn(ui,si.controlClass),Ho(li,ui),jn(ci,si.dropdownClass,yi),si.copyClassesToDropdown&&jn(ci,pi),jn(di,si.dropdownContentClass),Ho(ci,di),no(si.dropdownParent||li).appendChild(ci),Mc(si.controlInput)){gi=no(si.controlInput);var vi=["autocorrect","autocapitalize","autocomplete","spellcheck"];En(vi,Ei=>{ri.getAttribute(Ei)&&an(gi,{[Ei]:ri.getAttribute(Ei)})}),gi.tabIndex=-1,ui.appendChild(gi),this.focus_node=gi}else si.controlInput?(gi=no(si.controlInput),this.focus_node=gi):(gi=no(""),this.focus_node=ui);this.wrapper=li,this.dropdown=ci,this.dropdown_content=di,this.control=ui,this.control_input=gi,this.setup()}setup(){let ei=this,ti=ei.settings,ni=ei.control_input,ri=ei.dropdown,oi=ei.dropdown_content,si=ei.wrapper,ai=ei.control,li=ei.input,ui=ei.focus_node,ci={passive:!0},di=ei.inputId+"-ts-dropdown";an(oi,{id:di}),an(ui,{role:"combobox","aria-haspopup":"listbox","aria-expanded":"false","aria-controls":di});let pi=al(ui,ei.inputId+"-ts-control"),yi="label[for='"+Vd(ei.inputId)+"']",gi=document.querySelector(yi),vi=ei.focus.bind(ei);if(gi){Nn(gi,"click",vi),an(gi,{for:pi});let xi=al(gi,ei.inputId+"-ts-label");an(ui,{"aria-labelledby":xi}),an(oi,{"aria-labelledby":xi})}if(si.style.width=li.style.width,ei.plugins.names.length){let xi="plugin-"+ei.plugins.names.join(" plugin-");jn([si,ri],xi)}(ti.maxItems===null||ti.maxItems>1)&&ei.is_select_tag&&an(li,{multiple:"multiple"}),ti.placeholder&&an(ni,{placeholder:ti.placeholder}),!ti.splitOn&&ti.delimiter&&(ti.splitOn=new RegExp("\\s*"+Ro(ti.delimiter)+"+\\s*")),ti.load&&ti.loadThrottle&&(ti.load=Bd(ti.load,ti.loadThrottle)),Nn(ri,"mousemove",()=>{ei.ignoreHover=!1}),Nn(ri,"mouseenter",xi=>{var Li=cl(xi.target,"[data-selectable]",ri);Li&&ei.onOptionHover(xi,Li)},{capture:!0}),Nn(ri,"click",xi=>{let Li=cl(xi.target,"[data-selectable]");Li&&(ei.onOptionSelect(xi,Li),fn(xi,!0))}),Nn(ai,"click",xi=>{var Li=cl(xi.target,"[data-ts-item]",ai);if(Li&&ei.onItemSelect(xi,Li)){fn(xi,!0);return}ni.value==""&&(ei.onClick(),fn(xi,!0))}),Nn(ui,"keydown",xi=>ei.onKeyDown(xi)),Nn(ni,"keypress",xi=>ei.onKeyPress(xi)),Nn(ni,"input",xi=>ei.onInput(xi)),Nn(ui,"blur",xi=>ei.onBlur(xi)),Nn(ui,"focus",xi=>ei.onFocus(xi)),Nn(ni,"paste",xi=>ei.onPaste(xi));let Ei=xi=>{let Li=xi.composedPath()[0];if(!si.contains(Li)&&!ri.contains(Li)){ei.isFocused&&ei.blur(),ei.inputState();return}Li==ni&&ei.isOpen?xi.stopPropagation():fn(xi,!0)},Si=()=>{ei.isOpen&&ei.positionDropdown()};Nn(document,"mousedown",Ei),Nn(window,"scroll",Si,ci),Nn(window,"resize",Si,ci),this._destroy=()=>{document.removeEventListener("mousedown",Ei),window.removeEventListener("scroll",Si),window.removeEventListener("resize",Si),gi&&gi.removeEventListener("click",vi)},this.revertSettings={innerHTML:li.innerHTML,tabIndex:li.tabIndex},li.tabIndex=-1,li.insertAdjacentElement("afterend",ei.wrapper),ei.sync(!1),ti.items=[],delete ti.optgroups,delete ti.options,Nn(li,"invalid",()=>{ei.isValid&&(ei.isValid=!1,ei.isInvalid=!0,ei.refreshState())}),ei.updateOriginalInput(),ei.refreshItems(),ei.close(!1),ei.inputState(),ei.isSetup=!0,li.disabled?ei.disable():li.readOnly?ei.setReadOnly(!0):ei.enable(),ei.on("change",this.onChange),jn(li,"tomselected","ts-hidden-accessible"),ei.trigger("initialize"),ti.preload===!0&&ei.preload()}setupOptions(ei=[],ti=[]){this.addOptions(ei),En(ti,ni=>{this.registerOptionGroup(ni)})}setupTemplates(){var ei=this,ti=ei.settings.labelField,ni=ei.settings.optgroupLabelField,ri={optgroup:oi=>{let si=document.createElement("div");return si.className="optgroup",si.appendChild(oi.options),si},optgroup_header:(oi,si)=>'
    '+si(oi[ni])+"
    ",option:(oi,si)=>"
    "+si(oi[ti])+"
    ",item:(oi,si)=>"
    "+si(oi[ti])+"
    ",option_create:(oi,si)=>'
    Add '+si(oi.input)+"
    ",no_results:()=>'
    No results found
    ',loading:()=>'
    ',not_loading:()=>{},dropdown:()=>"
    "};ei.settings.render=Object.assign({},ri,ei.settings.render)}setupCallbacks(){var ei,ti,ni={initialize:"onInitialize",change:"onChange",item_add:"onItemAdd",item_remove:"onItemRemove",item_select:"onItemSelect",clear:"onClear",option_add:"onOptionAdd",option_remove:"onOptionRemove",option_clear:"onOptionClear",optgroup_add:"onOptionGroupAdd",optgroup_remove:"onOptionGroupRemove",optgroup_clear:"onOptionGroupClear",dropdown_open:"onDropdownOpen",dropdown_close:"onDropdownClose",type:"onType",load:"onLoad",focus:"onFocus",blur:"onBlur"};for(ei in ni)ti=this.settings[ni[ei]],ti&&this.on(ei,ti)}sync(ei=!0){let ti=this,ni=ei?ul(ti.input,{delimiter:ti.settings.delimiter}):ti.settings;ti.setupOptions(ni.options,ni.optgroups),ti.setValue(ni.items||[],!0),ti.lastQuery=null}onClick(){var ei=this;if(ei.activeItems.length>0){ei.clearActiveItems(),ei.focus();return}ei.isFocused&&ei.isOpen?ei.blur():ei.focus()}onMouseDown(){}onChange(){ll(this.input,"input"),ll(this.input,"change")}onPaste(ei){var ti=this;if(ti.isInputHidden||ti.isLocked){fn(ei);return}ti.settings.splitOn&&setTimeout(()=>{var ni=ti.inputValue();if(ni.match(ti.settings.splitOn)){var ri=ni.trim().split(ti.settings.splitOn);En(ri,oi=>{Xn(oi)&&(this.options[oi]?ti.addItem(oi):ti.createItem(oi))})}},0)}onKeyPress(ei){var ti=this;if(ti.isLocked){fn(ei);return}var ni=String.fromCharCode(ei.keyCode||ei.which);if(ti.settings.create&&ti.settings.mode==="multi"&&ni===ti.settings.delimiter){ti.createItem(),fn(ei);return}}onKeyDown(ei){var ti=this;if(ti.ignoreHover=!0,ti.isLocked){ei.keyCode!==9&&fn(ei);return}switch(ei.keyCode){case 65:if(Io(fa,ei)&&ti.control_input.value==""){fn(ei),ti.selectAll();return}break;case 27:ti.isOpen&&(fn(ei,!0),ti.close()),ti.clearActiveItems();return;case 40:if(!ti.isOpen&&ti.hasOptions)ti.open();else if(ti.activeOption){let ni=ti.getAdjacent(ti.activeOption,1);ni&&ti.setActiveOption(ni)}fn(ei);return;case 38:if(ti.activeOption){let ni=ti.getAdjacent(ti.activeOption,-1);ni&&ti.setActiveOption(ni)}fn(ei);return;case 13:ti.canSelect(ti.activeOption)?(ti.onOptionSelect(ei,ti.activeOption),fn(ei)):ti.settings.create&&ti.createItem()?fn(ei):document.activeElement==ti.control_input&&ti.isOpen&&fn(ei);return;case 37:ti.advanceSelection(-1,ei);return;case 39:ti.advanceSelection(1,ei);return;case 9:ti.settings.selectOnTab&&(ti.canSelect(ti.activeOption)&&(ti.onOptionSelect(ei,ti.activeOption),fn(ei)),ti.settings.create&&ti.createItem()&&fn(ei));return;case 8:case 46:ti.deleteSelection(ei);return}ti.isInputHidden&&!Io(fa,ei)&&fn(ei)}onInput(ei){if(this.isLocked)return;let ti=this.inputValue();if(this.lastValue!==ti){if(this.lastValue=ti,ti==""){this._onInput();return}this.refreshTimeout&&window.clearTimeout(this.refreshTimeout),this.refreshTimeout=$d(()=>{this.refreshTimeout=null,this._onInput()},this.settings.refreshThrottle)}}_onInput(){let ei=this.lastValue;this.settings.shouldLoad.call(this,ei)&&this.load(ei),this.refreshOptions(),this.trigger("type",ei)}onOptionHover(ei,ti){this.ignoreHover||this.setActiveOption(ti,!1)}onFocus(ei){var ti=this,ni=ti.isFocused;if(ti.isDisabled||ti.isReadOnly){ti.blur(),fn(ei);return}ti.ignoreFocus||(ti.isFocused=!0,ti.settings.preload==="focus"&&ti.preload(),ni||ti.trigger("focus"),ti.activeItems.length||(ti.inputState(),ti.refreshOptions(!!ti.settings.openOnFocus)),ti.refreshState())}onBlur(ei){if(document.hasFocus()!==!1){var ti=this;if(ti.isFocused){ti.isFocused=!1,ti.ignoreFocus=!1;var ni=()=>{ti.close(),ti.setActiveItem(),ti.setCaret(ti.items.length),ti.trigger("blur")};ti.settings.create&&ti.settings.createOnBlur?ti.createItem(null,ni):ni()}}}onOptionSelect(ei,ti){var ni,ri=this;ti.parentElement&&ti.parentElement.matches("[data-disabled]")||(ti.classList.contains("create")?ri.createItem(null,()=>{ri.settings.closeAfterSelect&&ri.close()}):(ni=ti.dataset.value,typeof ni!="undefined"&&(ri.lastQuery=null,ri.addItem(ni),ri.settings.closeAfterSelect&&ri.close(),!ri.settings.hideSelected&&ei.type&&/click/.test(ei.type)&&ri.setActiveOption(ti))))}canSelect(ei){return!!(this.isOpen&&ei&&this.dropdown_content.contains(ei))}onItemSelect(ei,ti){var ni=this;return!ni.isLocked&&ni.settings.mode==="multi"?(fn(ei),ni.setActiveItem(ti,ei),!0):!1}canLoad(ei){return!(!this.settings.load||this.loadedSearches.hasOwnProperty(ei))}load(ei){let ti=this;if(!ti.canLoad(ei))return;jn(ti.wrapper,ti.settings.loadingClass),ti.loading++;let ni=ti.loadCallback.bind(ti);ti.settings.load.call(ti,ei,ni)}loadCallback(ei,ti){let ni=this;ni.loading=Math.max(ni.loading-1,0),ni.lastQuery=null,ni.clearActiveOption(),ni.setupOptions(ei,ti),ni.refreshOptions(ni.isFocused&&!ni.isInputHidden),ni.loading||bo(ni.wrapper,ni.settings.loadingClass),ni.trigger("load",ei,ti)}preload(){var ei=this.wrapper.classList;ei.contains("preloaded")||(ei.add("preloaded"),this.load(""))}setTextboxValue(ei=""){var ti=this.control_input,ni=ti.value!==ei;ni&&(ti.value=ei,ll(ti,"update"),this.lastValue=ei)}getValue(){return this.is_select_tag&&this.input.hasAttribute("multiple")?this.items:this.items.join(this.settings.delimiter)}setValue(ei,ti){var ni=ti?[]:["change"];Oc(this,ni,()=>{this.clear(ti),this.addItems(ei,ti)})}setMaxItems(ei){ei===0&&(ei=null),this.settings.maxItems=ei,this.refreshState()}setActiveItem(ei,ti){var ni=this,ri,oi,si,ai,li,ui;if(ni.settings.mode!=="single"){if(!ei){ni.clearActiveItems(),ni.isFocused&&ni.inputState();return}if(ri=ti&&ti.type.toLowerCase(),ri==="click"&&Io("shiftKey",ti)&&ni.activeItems.length){for(ui=ni.getLastActive(),si=Array.prototype.indexOf.call(ni.control.children,ui),ai=Array.prototype.indexOf.call(ni.control.children,ei),si>ai&&(li=si,si=ai,ai=li),oi=si;oi<=ai;oi++)ei=ni.control.children[oi],ni.activeItems.indexOf(ei)===-1&&ni.setActiveItemClass(ei);fn(ti)}else ri==="click"&&Io(fa,ti)||ri==="keydown"&&Io("shiftKey",ti)?ei.classList.contains("active")?ni.removeActiveItem(ei):ni.setActiveItemClass(ei):(ni.clearActiveItems(),ni.setActiveItemClass(ei));ni.inputState(),ni.isFocused||ni.focus()}}setActiveItemClass(ei){let ti=this,ni=ti.control.querySelector(".last-active");ni&&bo(ni,"last-active"),jn(ei,"active last-active"),ti.trigger("item_select",ei),ti.activeItems.indexOf(ei)==-1&&ti.activeItems.push(ei)}removeActiveItem(ei){var ti=this.activeItems.indexOf(ei);this.activeItems.splice(ti,1),bo(ei,"active")}clearActiveItems(){bo(this.activeItems,"active"),this.activeItems=[]}setActiveOption(ei,ti=!0){ei!==this.activeOption&&(this.clearActiveOption(),ei&&(this.activeOption=ei,an(this.focus_node,{"aria-activedescendant":ei.getAttribute("id")}),an(ei,{"aria-selected":"true"}),jn(ei,"active"),ti&&this.scrollToOption(ei)))}scrollToOption(ei,ti){if(!ei)return;let ni=this.dropdown_content,ri=ni.clientHeight,oi=ni.scrollTop||0,si=ei.offsetHeight,ai=ei.getBoundingClientRect().top-ni.getBoundingClientRect().top+oi;ai+si>ri+oi?this.scroll(ai-ri+si,ti):ai{ei.setActiveItemClass(ni)}))}inputState(){var ei=this;ei.control.contains(ei.control_input)&&(an(ei.control_input,{placeholder:ei.settings.placeholder}),ei.activeItems.length>0||!ei.isFocused&&ei.settings.hidePlaceholder&&ei.items.length>0?(ei.setTextboxValue(),ei.isInputHidden=!0):(ei.settings.hidePlaceholder&&ei.items.length>0&&an(ei.control_input,{placeholder:""}),ei.isInputHidden=!1),ei.wrapper.classList.toggle("input-hidden",ei.isInputHidden))}inputValue(){return this.control_input.value.trim()}focus(){var ei=this;ei.isDisabled||ei.isReadOnly||(ei.ignoreFocus=!0,ei.control_input.offsetWidth?ei.control_input.focus():ei.focus_node.focus(),setTimeout(()=>{ei.ignoreFocus=!1,ei.onFocus()},0))}blur(){this.focus_node.blur(),this.onBlur()}getScoreFunction(ei){return this.sifter.getScoreFunction(ei,this.getSearchOptions())}getSearchOptions(){var ei=this.settings,ti=ei.sortField;return typeof ei.sortField=="string"&&(ti=[{field:ei.sortField}]),{fields:ei.searchField,conjunction:ei.searchConjunction,sort:ti,nesting:ei.nesting}}search(ei){var ti,ni,ri=this,oi=this.getSearchOptions();if(ri.settings.score&&(ni=ri.settings.score.call(ri,ei),typeof ni!="function"))throw new Error('Tom Select "score" setting must be a function that returns a function');return ei!==ri.lastQuery?(ri.lastQuery=ei,ti=ri.sifter.search(ei,Object.assign(oi,{score:ni})),ri.currentResults=ti):ti=Object.assign({},ri.currentResults),ri.settings.hideSelected&&(ti.items=ti.items.filter(si=>{let ai=Xn(si.id);return!(ai&&ri.items.indexOf(ai)!==-1)})),ti}refreshOptions(ei=!0){var ti,ni,ri,oi,si,ai,li,ui,ci,di;let pi={},yi=[];var gi=this,vi=gi.inputValue();let Ei=vi===gi.lastQuery||vi==""&&gi.lastQuery==null;var Si=gi.search(vi),xi=null,Li=gi.settings.shouldOpen||!1,Oi=gi.dropdown_content;Ei&&(xi=gi.activeOption,xi&&(ci=xi.closest("[data-group]"))),oi=Si.items.length,typeof gi.settings.maxOptions=="number"&&(oi=Math.min(oi,gi.settings.maxOptions)),oi>0&&(Li=!0);let zi=(ki,Mi)=>{let Ai=pi[ki];if(Ai!==void 0){let Ci=yi[Ai];if(Ci!==void 0)return[Ai,Ci.fragment]}let qi=document.createDocumentFragment();return Ai=yi.length,yi.push({fragment:qi,order:Mi,optgroup:ki}),[Ai,qi]};for(ti=0;ti0&&(Ci=Ci.cloneNode(!0),an(Ci,{id:Ai.$id+"-clone-"+ni,"aria-selected":null}),Ci.classList.add("ts-cloned"),bo(Ci,"active"),gi.activeOption&&gi.activeOption.dataset.value==Mi&&ci&&ci.dataset.group===si.toString()&&(xi=Ci)),rn.appendChild(Ci),si!=""&&(pi[si]=gn)}}gi.settings.lockOptgroupOrder&&yi.sort((ki,Mi)=>ki.order-Mi.order),li=document.createDocumentFragment(),En(yi,ki=>{let Mi=ki.fragment,Ai=ki.optgroup;if(!Mi||!Mi.children.length)return;let qi=gi.optgroups[Ai];if(qi!==void 0){let Ci=document.createDocumentFragment(),Qi=gi.render("optgroup_header",qi);Ho(Ci,Qi),Ho(Ci,Mi);let Ji=gi.render("optgroup",{group:qi,options:Ci});Ho(li,Ji)}else Ho(li,Mi)}),Oi.innerHTML="",Ho(Oi,li),gi.settings.highlight&&(Yd(Oi),Si.query.length&&Si.tokens.length&&En(Si.tokens,ki=>{Ud(Oi,ki.regex)}));var Vi=ki=>{let Mi=gi.render(ki,{input:vi});return Mi&&(Li=!0,Oi.insertBefore(Mi,Oi.firstChild)),Mi};if(gi.loading?Vi("loading"):gi.settings.shouldLoad.call(gi,vi)?Si.items.length===0&&Vi("no_results"):Vi("not_loading"),ui=gi.canCreate(vi),ui&&(di=Vi("option_create")),gi.hasOptions=Si.items.length>0||ui,Li){if(Si.items.length>0){if(!xi&&gi.settings.mode==="single"&&gi.items[0]!=null&&(xi=gi.getOption(gi.items[0])),!Oi.contains(xi)){let ki=0;di&&!gi.settings.addPrecedence&&(ki=1),xi=gi.selectable()[ki]}}else di&&(xi=di);ei&&!gi.isOpen&&(gi.open(),gi.scrollToOption(xi,"auto")),gi.setActiveOption(xi)}else gi.clearActiveOption(),ei&&gi.isOpen&&gi.close(!1)}selectable(){return this.dropdown_content.querySelectorAll("[data-selectable]")}addOption(ei,ti=!1){let ni=this;if(Array.isArray(ei))return ni.addOptions(ei,ti),!1;let ri=Xn(ei[ni.settings.valueField]);return ri===null||ni.options.hasOwnProperty(ri)?!1:(ei.$order=ei.$order||++ni.order,ei.$id=ni.inputId+"-opt-"+ei.$order,ni.options[ri]=ei,ni.lastQuery=null,ti&&(ni.userOptions[ri]=ti,ni.trigger("option_add",ri,ei)),ri)}addOptions(ei,ti=!1){En(ei,ni=>{this.addOption(ni,ti)})}registerOption(ei){return this.addOption(ei)}registerOptionGroup(ei){var ti=Xn(ei[this.settings.optgroupValueField]);return ti===null?!1:(ei.$order=ei.$order||++this.order,this.optgroups[ti]=ei,ti)}addOptionGroup(ei,ti){var ni;ti[this.settings.optgroupValueField]=ei,(ni=this.registerOptionGroup(ti))&&this.trigger("optgroup_add",ni,ti)}removeOptionGroup(ei){this.optgroups.hasOwnProperty(ei)&&(delete this.optgroups[ei],this.clearCache(),this.trigger("optgroup_remove",ei))}clearOptionGroups(){this.optgroups={},this.clearCache(),this.trigger("optgroup_clear")}updateOption(ei,ti){let ni=this;var ri,oi;let si=Xn(ei),ai=Xn(ti[ni.settings.valueField]);if(si===null)return;let li=ni.options[si];if(li==null)return;if(typeof ai!="string")throw new Error("Value must be set in option data");let ui=ni.getOption(si),ci=ni.getItem(si);if(ti.$order=ti.$order||li.$order,delete ni.options[si],ni.uncacheValue(ai),ni.options[ai]=ti,ui){if(ni.dropdown_content.contains(ui)){let di=ni._render("option",ti);da(ui,di),ni.activeOption===ui&&ni.setActiveOption(di)}ui.remove()}ci&&(oi=ni.items.indexOf(si),oi!==-1&&ni.items.splice(oi,1,ai),ri=ni._render("item",ti),ci.classList.contains("active")&&jn(ri,"active"),da(ci,ri)),ni.lastQuery=null}removeOption(ei,ti){let ni=this;ei=ca(ei),ni.uncacheValue(ei),delete ni.userOptions[ei],delete ni.options[ei],ni.lastQuery=null,ni.trigger("option_remove",ei),ni.removeItem(ei,ti)}clearOptions(ei){let ti=(ei||this.clearFilter).bind(this);this.loadedSearches={},this.userOptions={},this.clearCache();let ni={};En(this.options,(ri,oi)=>{ti(ri,oi)&&(ni[oi]=ri)}),this.options=this.sifter.items=ni,this.lastQuery=null,this.trigger("option_clear")}clearFilter(ei,ti){return this.items.indexOf(ti)>=0}getOption(ei,ti=!1){let ni=Xn(ei);if(ni===null)return null;let ri=this.options[ni];if(ri!=null){if(ri.$div)return ri.$div;if(ti)return this._render("option",ri)}return null}getAdjacent(ei,ti,ni="option"){var ri=this,oi;if(!ei)return null;ni=="item"?oi=ri.controlChildren():oi=ri.dropdown_content.querySelectorAll("[data-selectable]");for(let si=0;si0?oi[si+1]:oi[si-1];return null}getItem(ei){if(typeof ei=="object")return ei;var ti=Xn(ei);return ti!==null?this.control.querySelector(`[data-value="${Lc(ti)}"]`):null}addItems(ei,ti){var ni=this,ri=Array.isArray(ei)?ei:[ei];ri=ri.filter(si=>ni.items.indexOf(si)===-1);let oi=ri[ri.length-1];ri.forEach(si=>{ni.isPending=si!==oi,ni.addItem(si,ti)})}addItem(ei,ti){var ni=ti?[]:["change","dropdown_close"];Oc(this,ni,()=>{var ri,oi;let si=this,ai=si.settings.mode,li=Xn(ei);if(!(li&&si.items.indexOf(li)!==-1&&(ai==="single"&&si.close(),ai==="single"||!si.settings.duplicates))&&!(li===null||!si.options.hasOwnProperty(li))&&(ai==="single"&&si.clear(ti),!(ai==="multi"&&si.isFull()))){if(ri=si._render("item",si.options[li]),si.control.contains(ri)&&(ri=ri.cloneNode(!0)),oi=si.isFull(),si.items.splice(si.caretPos,0,li),si.insertAtCaret(ri),si.isSetup){if(!si.isPending&&si.settings.hideSelected){let ui=si.getOption(li),ci=si.getAdjacent(ui,1);ci&&si.setActiveOption(ci)}!si.isPending&&!si.settings.closeAfterSelect&&si.refreshOptions(si.isFocused&&ai!=="single"),si.settings.closeAfterSelect!=!1&&si.isFull()?si.close():si.isPending||si.positionDropdown(),si.trigger("item_add",li,ri),si.isPending||si.updateOriginalInput({silent:ti})}(!si.isPending||!oi&&si.isFull())&&(si.inputState(),si.refreshState())}})}removeItem(ei=null,ti){let ni=this;if(ei=ni.getItem(ei),!ei)return;var ri,oi;let si=ei.dataset.value;ri=Nc(ei),ei.remove(),ei.classList.contains("active")&&(oi=ni.activeItems.indexOf(ei),ni.activeItems.splice(oi,1),bo(ei,"active")),ni.items.splice(ri,1),ni.lastQuery=null,!ni.settings.persist&&ni.userOptions.hasOwnProperty(si)&&ni.removeOption(si,ti),ri{}){arguments.length===3&&(ti=arguments[2]),typeof ti!="function"&&(ti=()=>{});var ni=this,ri=ni.caretPos,oi;if(ei=ei||ni.inputValue(),!ni.canCreate(ei))return ti(),!1;ni.lock();var si=!1,ai=li=>{if(ni.unlock(),!li||typeof li!="object")return ti();var ui=Xn(li[ni.settings.valueField]);if(typeof ui!="string")return ti();ni.setTextboxValue(),ni.addOption(li,!0),ni.setCaret(ri),ni.addItem(ui),ti(li),si=!0};return typeof ni.settings.create=="function"?oi=ni.settings.create.call(this,ei,ai):oi={[ni.settings.labelField]:ei,[ni.settings.valueField]:ei},si||ai(oi),!0}refreshItems(){var ei=this;ei.lastQuery=null,ei.isSetup&&ei.addItems(ei.items),ei.updateOriginalInput(),ei.refreshState()}refreshState(){let ei=this;ei.refreshValidityState();let ti=ei.isFull(),ni=ei.isLocked;ei.wrapper.classList.toggle("rtl",ei.rtl);let ri=ei.wrapper.classList;ri.toggle("focus",ei.isFocused),ri.toggle("disabled",ei.isDisabled),ri.toggle("readonly",ei.isReadOnly),ri.toggle("required",ei.isRequired),ri.toggle("invalid",!ei.isValid),ri.toggle("locked",ni),ri.toggle("full",ti),ri.toggle("input-active",ei.isFocused&&!ei.isInputHidden),ri.toggle("dropdown-active",ei.isOpen),ri.toggle("has-options",Wd(ei.options)),ri.toggle("has-items",ei.items.length>0)}refreshValidityState(){var ei=this;ei.input.validity&&(ei.isValid=ei.input.validity.valid,ei.isInvalid=!ei.isValid)}isFull(){return this.settings.maxItems!==null&&this.items.length>=this.settings.maxItems}updateOriginalInput(ei={}){let ti=this;var ni,ri;let oi=ti.input.querySelector('option[value=""]');if(ti.is_select_tag){let li=function(ui,ci,di){return ui||(ui=no('")),ui!=oi&&ti.input.append(ui),si.push(ui),(ui!=oi||ai>0)&&(ui.selected=!0),ui},si=[],ai=ti.input.querySelectorAll("option:checked").length;ti.input.querySelectorAll("option:checked").forEach(ui=>{ui.selected=!1}),ti.items.length==0&&ti.settings.mode=="single"?li(oi,"",""):ti.items.forEach(ui=>{if(ni=ti.options[ui],ri=ni[ti.settings.labelField]||"",si.includes(ni.$option)){let ci=ti.input.querySelector(`option[value="${Lc(ui)}"]:not(:checked)`);li(ci,ui,ri)}else ni.$option=li(ni.$option,ui,ri)})}else ti.input.value=ti.getValue();ti.isSetup&&(ei.silent||ti.trigger("change",ti.getValue()))}open(){var ei=this;ei.isLocked||ei.isOpen||ei.settings.mode==="multi"&&ei.isFull()||(ei.isOpen=!0,an(ei.focus_node,{"aria-expanded":"true"}),ei.refreshState(),ua(ei.dropdown,{visibility:"hidden",display:"block"}),ei.positionDropdown(),ua(ei.dropdown,{visibility:"visible",display:"block"}),ei.focus(),ei.trigger("dropdown_open",ei.dropdown))}close(ei=!0){var ti=this,ni=ti.isOpen;ei&&(ti.setTextboxValue(),ti.settings.mode==="single"&&ti.items.length&&ti.inputState()),ti.isOpen=!1,an(ti.focus_node,{"aria-expanded":"false"}),ua(ti.dropdown,{display:"none"}),ti.settings.hideSelected&&ti.clearActiveOption(),ti.refreshState(),ni&&ti.trigger("dropdown_close",ti.dropdown)}positionDropdown(){if(this.settings.dropdownParent==="body"){var ei=this.control,ti=ei.getBoundingClientRect(),ni=ei.offsetHeight+ti.top+window.scrollY,ri=ti.left+window.scrollX;ua(this.dropdown,{width:ti.width+"px",top:ni+"px",left:ri+"px"})}}clear(ei){var ti=this;if(ti.items.length){var ni=ti.controlChildren();En(ni,ri=>{ti.removeItem(ri,!0)}),ti.inputState(),ei||ti.updateOriginalInput(),ti.trigger("clear")}}insertAtCaret(ei){let ti=this,ni=ti.caretPos,ri=ti.control;ri.insertBefore(ei,ri.children[ni]||null),ti.setCaret(ni+1)}deleteSelection(ei){var ti,ni,ri,oi,si=this;ti=ei&&ei.keyCode===8?-1:1,ni=zd(si.control_input);let ai=[];if(si.activeItems.length)oi=kc(si.activeItems,ti),ri=Nc(oi),ti>0&&ri++,En(si.activeItems,li=>ai.push(li));else if((si.isFocused||si.settings.mode==="single")&&si.items.length){let li=si.controlChildren(),ui;ti<0&&ni.start===0&&ni.length===0?ui=li[si.caretPos-1]:ti>0&&ni.start===si.inputValue().length&&(ui=li[si.caretPos]),ui!==void 0&&ai.push(ui)}if(!si.shouldDelete(ai,ei))return!1;for(fn(ei,!0),typeof ri!="undefined"&&si.setCaret(ri);ai.length;)si.removeItem(ai.pop());return si.inputState(),si.positionDropdown(),si.refreshOptions(!1),!0}shouldDelete(ei,ti){let ni=ei.map(ri=>ri.dataset.value);return!(!ni.length||typeof this.settings.onDelete=="function"&&this.settings.onDelete(ni,ti)===!1)}advanceSelection(ei,ti){var ni,ri,oi=this;oi.rtl&&(ei*=-1),!oi.inputValue().length&&(Io(fa,ti)||Io("shiftKey",ti)?(ni=oi.getLastActive(ei),ni?ni.classList.contains("active")?ri=oi.getAdjacent(ni,ei,"item"):ri=ni:ei>0?ri=oi.control_input.nextElementSibling:ri=oi.control_input.previousElementSibling,ri&&(ri.classList.contains("active")&&oi.removeActiveItem(ni),oi.setActiveItemClass(ri))):oi.moveCaret(ei))}moveCaret(ei){}getLastActive(ei){let ti=this.control.querySelector(".last-active");if(ti)return ti;var ni=this.control.querySelectorAll(".active");if(ni)return kc(ni,ei)}setCaret(ei){this.caretPos=this.items.length}controlChildren(){return Array.from(this.control.querySelectorAll("[data-ts-item]"))}lock(){this.setLocked(!0)}unlock(){this.setLocked(!1)}setLocked(ei=this.isReadOnly||this.isDisabled){this.isLocked=ei,this.refreshState()}disable(){this.setDisabled(!0),this.close()}enable(){this.setDisabled(!1)}setDisabled(ei){this.focus_node.tabIndex=ei?-1:this.tabIndex,this.isDisabled=ei,this.input.disabled=ei,this.control_input.disabled=ei,this.setLocked()}setReadOnly(ei){this.isReadOnly=ei,this.input.readOnly=ei,this.control_input.readOnly=ei,this.setLocked()}destroy(){var ei=this,ti=ei.revertSettings;ei.trigger("destroy"),ei.off(),ei.wrapper.remove(),ei.dropdown.remove(),ei.input.innerHTML=ti.innerHTML,ei.input.tabIndex=ti.tabIndex,bo(ei.input,"tomselected","ts-hidden-accessible"),ei._destroy(),delete ei.input.tomselect}render(ei,ti){var ni,ri;let oi=this;if(typeof this.settings.render[ei]!="function"||(ri=oi.settings.render[ei].call(this,ti,sl),!ri))return null;if(ri=no(ri),ei==="option"||ei==="option_create"?ti[oi.settings.disabledField]?an(ri,{"aria-disabled":"true"}):an(ri,{"data-selectable":""}):ei==="optgroup"&&(ni=ti.group[oi.settings.optgroupValueField],an(ri,{"data-group":ni}),ti.group[oi.settings.disabledField]&&an(ri,{"data-disabled":""})),ei==="option"||ei==="item"){let si=ca(ti[oi.settings.valueField]);an(ri,{"data-value":si}),ei==="item"?(jn(ri,oi.settings.itemClass),an(ri,{"data-ts-item":""})):(jn(ri,oi.settings.optionClass),an(ri,{role:"option",id:ti.$id}),ti.$div=ri,oi.options[si]=ti)}return ri}_render(ei,ti){let ni=this.render(ei,ti);if(ni==null)throw"HTMLElement expected";return ni}clearCache(){En(this.options,ei=>{ei.$div&&(ei.$div.remove(),delete ei.$div)})}uncacheValue(ei){let ti=this.getOption(ei);ti&&ti.remove()}canCreate(ei){return this.settings.create&&ei.length>0&&this.settings.createFilter.call(this,ei)}hook(ei,ti,ni){var ri=this,oi=ri[ti];ri[ti]=function(){var si,ai;return ei==="after"&&(si=oi.apply(ri,arguments)),ai=ni.apply(ri,arguments),ei==="instead"?ai:(ei==="before"&&(si=oi.apply(ri,arguments)),si)}}};var pb=(ii,ei,ti,ni)=>{ii.addEventListener(ei,ti,ni)};function Xd(){pb(this.input,"change",()=>{this.sync()})}var mb=ii=>typeof ii=="undefined"||ii===null?null:gb(ii),gb=ii=>typeof ii=="boolean"?ii?"1":"0":ii+"",Jd=(ii,ei=!1)=>{ii&&(ii.preventDefault(),ei&&ii.stopPropagation())},vb=ii=>{if(ii.jquery)return ii[0];if(ii instanceof HTMLElement)return ii;if(yb(ii)){var ei=document.createElement("template");return ei.innerHTML=ii.trim(),ei.content.firstChild}return document.querySelector(ii)},yb=ii=>typeof ii=="string"&&ii.indexOf("<")>-1;function Zd(ii){var ei=this,ti=ei.onOptionSelect;ei.settings.hideSelected=!1;let ni=Object.assign({className:"tomselect-checkbox",checkedClassNames:void 0,uncheckedClassNames:void 0},ii);var ri=function(ai,li){li?(ai.checked=!0,ni.uncheckedClassNames&&ai.classList.remove(...ni.uncheckedClassNames),ni.checkedClassNames&&ai.classList.add(...ni.checkedClassNames)):(ai.checked=!1,ni.checkedClassNames&&ai.classList.remove(...ni.checkedClassNames),ni.uncheckedClassNames&&ai.classList.add(...ni.uncheckedClassNames))},oi=function(ai){setTimeout(()=>{var li=ai.querySelector("input."+ni.className);li instanceof HTMLInputElement&&ri(li,ai.classList.contains("selected"))},1)};ei.hook("after","setupTemplates",()=>{var si=ei.settings.render.option;ei.settings.render.option=(ai,li)=>{var ui=vb(si.call(ei,ai,li)),ci=document.createElement("input");ni.className&&ci.classList.add(ni.className),ci.addEventListener("click",function(pi){Jd(pi)}),ci.type="checkbox";let di=mb(ai[ei.settings.valueField]);return ri(ci,!!(di&&ei.items.indexOf(di)>-1)),ui.prepend(ci),ui}}),ei.on("item_remove",si=>{var ai=ei.getOption(si);ai&&(ai.classList.remove("selected"),oi(ai))}),ei.on("item_add",si=>{var ai=ei.getOption(si);ai&&oi(ai)}),ei.hook("instead","onOptionSelect",(si,ai)=>{if(ai.classList.contains("selected")){ai.classList.remove("selected"),ei.removeItem(ai.dataset.value),ei.refreshOptions(),Jd(si,!0);return}ti.call(ei,si,ai),oi(ai)})}var bb=ii=>{if(ii.jquery)return ii[0];if(ii instanceof HTMLElement)return ii;if(_b(ii)){var ei=document.createElement("template");return ei.innerHTML=ii.trim(),ei.content.firstChild}return document.querySelector(ii)},_b=ii=>typeof ii=="string"&&ii.indexOf("<")>-1;function ef(ii){let ei=this,ti=Object.assign({className:"clear-button",title:"Clear All",html:ni=>`
    `},ii);ei.on("initialize",()=>{var ni=bb(ti.html(ti));ni.addEventListener("click",ri=>{ei.isLocked||(ei.clear(),ei.settings.mode==="single"&&ei.settings.allowEmptyOption&&ei.addItem(""),ri.preventDefault(),ri.stopPropagation())}),ei.control.appendChild(ni)})}var Eb=(ii,ei=!1)=>{ii&&(ii.preventDefault(),ei&&ii.stopPropagation())},Os=(ii,ei,ti,ni)=>{ii.addEventListener(ei,ti,ni)},wb=(ii,ei)=>{if(Array.isArray(ii))ii.forEach(ei);else for(var ti in ii)ii.hasOwnProperty(ti)&&ei(ii[ti],ti)},xb=ii=>{if(ii.jquery)return ii[0];if(ii instanceof HTMLElement)return ii;if(Tb(ii)){var ei=document.createElement("template");return ei.innerHTML=ii.trim(),ei.content.firstChild}return document.querySelector(ii)},Tb=ii=>typeof ii=="string"&&ii.indexOf("<")>-1,Cb=(ii,ei)=>{wb(ei,(ti,ni)=>{ti==null?ii.removeAttribute(ni):ii.setAttribute(ni,""+ti)})},Sb=(ii,ei)=>{var ti;(ti=ii.parentNode)==null||ti.insertBefore(ei,ii.nextSibling)},Ab=(ii,ei)=>{var ti;(ti=ii.parentNode)==null||ti.insertBefore(ei,ii)},Db=(ii,ei)=>{do{var ti;if(ei=(ti=ei)==null?void 0:ti.previousElementSibling,ii==ei)return!0}while(ei&&ei.previousElementSibling);return!1};function tf(){var ii=this;if(ii.settings.mode!=="multi")return;var ei=ii.lock,ti=ii.unlock;let ni=!0,ri;ii.hook("after","setupTemplates",()=>{var oi=ii.settings.render.item;ii.settings.render.item=(si,ai)=>{let li=xb(oi.call(ii,si,ai));Cb(li,{draggable:"true"});let ui=vi=>{ni||Eb(vi),vi.stopPropagation()},ci=vi=>{ri=li,setTimeout(()=>{li.classList.add("ts-dragging")},0)},di=vi=>{vi.preventDefault(),li.classList.add("ts-drag-over"),yi(li,ri)},pi=()=>{li.classList.remove("ts-drag-over")},yi=(vi,Ei)=>{Ei!==void 0&&(Db(Ei,li)?Sb(vi,Ei):Ab(vi,Ei))},gi=()=>{var vi;document.querySelectorAll(".ts-drag-over").forEach(Si=>Si.classList.remove("ts-drag-over")),(vi=ri)==null||vi.classList.remove("ts-dragging"),ri=void 0;var Ei=[];ii.control.querySelectorAll("[data-value]").forEach(Si=>{if(Si.dataset.value){let xi=Si.dataset.value;xi&&Ei.push(xi)}}),ii.setValue(Ei)};return Os(li,"mousedown",ui),Os(li,"dragstart",ci),Os(li,"dragenter",di),Os(li,"dragover",di),Os(li,"dragleave",pi),Os(li,"dragend",gi),li}}),ii.hook("instead","lock",()=>(ni=!1,ei.call(ii))),ii.hook("instead","unlock",()=>(ni=!0,ti.call(ii)))}var Ob=(ii,ei=!1)=>{ii&&(ii.preventDefault(),ei&&ii.stopPropagation())},Lb=ii=>{if(ii.jquery)return ii[0];if(ii instanceof HTMLElement)return ii;if(Mb(ii)){var ei=document.createElement("template");return ei.innerHTML=ii.trim(),ei.content.firstChild}return document.querySelector(ii)},Mb=ii=>typeof ii=="string"&&ii.indexOf("<")>-1;function nf(ii){let ei=this,ti=Object.assign({title:"Untitled",headerClass:"dropdown-header",titleRowClass:"dropdown-header-title",labelClass:"dropdown-header-label",closeClass:"dropdown-header-close",html:ni=>'
    '+ni.title+'×
    '},ii);ei.on("initialize",()=>{var ni=Lb(ti.html(ti)),ri=ni.querySelector("."+ti.closeClass);ri&&ri.addEventListener("click",oi=>{Ob(oi,!0),ei.close()}),ei.dropdown.insertBefore(ni,ei.dropdown.firstChild)})}var kb=(ii,ei)=>{if(Array.isArray(ii))ii.forEach(ei);else for(var ti in ii)ii.hasOwnProperty(ti)&&ei(ii[ti],ti)},Nb=(ii,...ei)=>{var ti=Rb(ei);ii=Ib(ii),ii.map(ni=>{ti.map(ri=>{ni.classList.remove(ri)})})},Rb=ii=>{var ei=[];return kb(ii,ti=>{typeof ti=="string"&&(ti=ti.trim().split(/[\t\n\f\r\s]/)),Array.isArray(ti)&&(ei=ei.concat(ti))}),ei.filter(Boolean)},Ib=ii=>(Array.isArray(ii)||(ii=[ii]),ii),Hb=(ii,ei)=>{if(!ii)return-1;ei=ei||ii.nodeName;for(var ti=0;ii=ii.previousElementSibling;)ii.matches(ei)&&ti++;return ti};function rf(){var ii=this;ii.hook("instead","setCaret",ei=>{ii.settings.mode==="single"||!ii.control.contains(ii.control_input)?ei=ii.items.length:(ei=Math.max(0,Math.min(ii.items.length,ei)),ei!=ii.caretPos&&!ii.isPending&&ii.controlChildren().forEach((ti,ni)=>{ni{if(!ii.isFocused)return;let ti=ii.getLastActive(ei);if(ti){let ni=Hb(ti);ii.setCaret(ei>0?ni+1:ni),ii.setActiveItem(),Nb(ti,"last-active")}else ii.setCaret(ii.caretPos+ei)})}var Pb=(ii,ei=!1)=>{ii&&(ii.preventDefault(),ei&&ii.stopPropagation())},Fb=(ii,ei,ti,ni)=>{ii.addEventListener(ei,ti,ni)},$b=(ii,ei)=>{if(Array.isArray(ii))ii.forEach(ei);else for(var ti in ii)ii.hasOwnProperty(ti)&&ei(ii[ti],ti)},of=ii=>{if(ii.jquery)return ii[0];if(ii instanceof HTMLElement)return ii;if(Bb(ii)){var ei=document.createElement("template");return ei.innerHTML=ii.trim(),ei.content.firstChild}return document.querySelector(ii)},Bb=ii=>typeof ii=="string"&&ii.indexOf("<")>-1,zb=(ii,...ei)=>{var ti=Vb(ei);ii=jb(ii),ii.map(ni=>{ti.map(ri=>{ni.classList.add(ri)})})},Vb=ii=>{var ei=[];return $b(ii,ti=>{typeof ti=="string"&&(ti=ti.trim().split(/[\t\n\f\r\s]/)),Array.isArray(ti)&&(ei=ei.concat(ti))}),ei.filter(Boolean)},jb=ii=>(Array.isArray(ii)||(ii=[ii]),ii);function sf(){let ii=this;ii.settings.shouldOpen=!0,ii.hook("before","setup",()=>{ii.focus_node=ii.control,zb(ii.control_input,"dropdown-input");let ei=of('