From e34f8a5b49c5b6352766463bff7f74b6fc34a4cf Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:15:25 -0600 Subject: [PATCH 01/43] =?UTF-8?q?Integraci=C3=B3n=20de=20ArticleViewSet=20?= =?UTF-8?q?en=20el=20enrutador=20y=20actualizaci=C3=B3n=20de=20URLs=20prin?= =?UTF-8?q?cipales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/api_router.py | 4 +++- config/urls.py | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/config/api_router.py b/config/api_router.py index b9c2b59..ab68c50 100644 --- a/config/api_router.py +++ b/config/api_router.py @@ -2,8 +2,9 @@ from rest_framework.routers import DefaultRouter, SimpleRouter from reference.api.v1.views import ReferenceViewSet +from markup_doc.api.v1.views import ArticleViewSet -app_name = "reference" +#app_name = "reference" if settings.DEBUG: router = DefaultRouter() @@ -11,5 +12,6 @@ router = SimpleRouter() router.register("reference", ReferenceViewSet, basename="reference") +router.register("first_block", ArticleViewSet, basename="first_block") urlpatterns = router.urls \ No newline at end of file diff --git a/config/urls.py b/config/urls.py index faf51ac..11e09b9 100644 --- a/config/urls.py +++ b/config/urls.py @@ -11,9 +11,10 @@ from core.search import views as search_views from reference import views as reference_views +from config import api_router as api_router urlpatterns = [ - path("admin/autocomplete/", include(autocomplete_admin_urls)), + #path("admin/autocomplete/", include(autocomplete_admin_urls)), path("django-admin/", admin.site.urls), path("admin/", include(wagtailadmin_urls)), path("documents/", include(wagtaildocs_urls)), @@ -21,13 +22,15 @@ # JWT path("api/v1/auth/token/", TokenObtainPairView.as_view(), name="token_obtain_pair"), path("api/v1/auth/token/refresh/", TokenRefreshView.as_view(), name="token_refresh"), - path("api/v1/mix_citation/", include("config.api_router", namespace="reference")), + path("api/v1/", include(api_router)), + #path("api/v1/mix_citation/", include("config.api_router", namespace="reference")), # URL para trocar idioma path('i18n/', include('django.conf.urls.i18n')), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # URLs com prefixo de idioma urlpatterns += i18n_patterns( + path("admin/autocomplete/", include(autocomplete_admin_urls)), path("admin/", include(wagtailadmin_urls)), path("documents/", include(wagtaildocs_urls)), path("search/", search_views.search, name="search"), From ab31a5e147ee2de08ecc7579393d258035bf491a Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:15:52 -0600 Subject: [PATCH 02/43] =?UTF-8?q?Actualizaci=C3=B3n=20de=20settings:=20cam?= =?UTF-8?q?bio=20en=20directorio=20de=20modelos,=20inclusi=C3=B3n=20de=20n?= =?UTF-8?q?uevas=20apps=20y=20aumento=20del=20l=C3=ADmite=20de=20campos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/settings/base.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/config/settings/base.py b/config/settings/base.py index 51948db..50a8559 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -24,8 +24,7 @@ ROOT_DIR = Path(__file__).resolve(strict=True).parent.parent.parent # core/ APPS_DIR = ROOT_DIR / "core" -LLAMA_MODEL_DIR = ROOT_DIR / "llama3/llama-3.2" -MODEL_LLAMA = "llama-3.2-3b-instruct-q4_k_m.gguf" +LLAMA_MODEL_DIR = ROOT_DIR / "model_ai/download" env = environ.Env() READ_DOT_ENV_FILE = env.bool("DJANGO_READ_DOT_ENV_FILE", default=False) @@ -82,6 +81,9 @@ "tracker", "reference", "xml_manager", + "markup_doc", + "markuplib", + "model_ai" ] INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS + WAGTAIL @@ -294,4 +296,7 @@ "ACCESS_TOKEN_LIFETIME": timedelta(minutes=60), "REFRESH_TOKEN_LIFETIME": timedelta(days=1), # "AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",), -} \ No newline at end of file +} + +#Aumento en el límite de campos +DATA_UPLOAD_MAX_NUMBER_FIELDS = 10000 \ No newline at end of file From b2e953816b2efdcf27889256165e6ebd94767138 Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:16:45 -0600 Subject: [PATCH 03/43] =?UTF-8?q?Ampliaci=C3=B3n=20de=20core.models:=20nue?= =?UTF-8?q?vos=20modelos=20de=20g=C3=A9nero,=20idioma,=20licencias,=20text?= =?UTF-8?q?os=20con=20idioma=20y=20manejo=20flexible=20de=20fechas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/models.py | 496 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 494 insertions(+), 2 deletions(-) diff --git a/core/models.py b/core/models.py index d6e90be..bc46070 100644 --- a/core/models.py +++ b/core/models.py @@ -1,6 +1,15 @@ -from django.db import models +import os +from django.db import models, IntegrityError +from django.db.models import Case, When, Value, IntegerField from django.contrib.auth import get_user_model from django.utils.translation import gettext_lazy as _ +from wagtail.admin.panels import FieldPanel +from wagtail.fields import RichTextField +from wagtail.search import index +from wagtailautocomplete.edit_handlers import AutocompletePanel + +from . import choices +from .utils.utils import language_iso User = get_user_model() @@ -43,4 +52,487 @@ class CommonControlField(models.Model): ) class Meta: - abstract = True \ No newline at end of file + abstract = True + + +class Gender(CommonControlField): + """ + Class of gender + + Fields: + sex: physical state of being either male, female, or intersex + """ + + code = models.CharField(_("Code"), max_length=5, null=True, blank=True) + + gender = models.CharField(_("Sex"), max_length=50, null=True, blank=True) + + autocomplete_search_filter = "code" + + def autocomplete_label(self): + return str(self) + + panels = [ + FieldPanel("code"), + FieldPanel("gender"), + ] + + + class Meta: + unique_together = [("code", "gender")] + + + def __unicode__(self): + return self.gender or self.code + + def __str__(self): + return self.gender or self.code + + @classmethod + def load(cls, user): + for item in choices.GENDER_CHOICES: + code, value = item + cls.create_or_update(user, code=code, gender=value) + + @classmethod + def _get(cls, code=None, gender=None): + try: + return cls.objects.get(code=code, gender=gender) + except cls.MultipleObjectsReturned: + return cls.objects.filter(code=code, gender=gender).first() + + @classmethod + def _create(cls, user, code=None, gender=None): + try: + obj = cls() + obj.gender = gender + obj.code = code + obj.creator = user + obj.save() + return obj + except IntegrityError: + return cls._get(code, gender) + + @classmethod + def create_or_update(cls, user, code, gender=None): + try: + return cls._get(code, gender) + except cls.DoesNotExist: + return cls._create(user, code, gender) + + +class Language(CommonControlField): + """ + Represent the list of states + + Fields: + name + code2 + """ + + name = models.TextField(_("Language Name"), blank=True, null=True) + code2 = models.TextField(_("Language code 2"), blank=True, null=True) + + autocomplete_search_field = "name" + + def autocomplete_label(self): + return str(self) + + class Meta: + verbose_name = _("Language") + verbose_name_plural = _("Languages") + + def __unicode__(self): + if self.name or self.code2: + return f"{self.name} | {self.code2}" + return "None" + + def __str__(self): + if self.name or self.code2: + return f"{self.name} | {self.code2}" + return "None" + + @classmethod + def load(cls, user): + if cls.objects.count() == 0: + for k, v in choices.LANGUAGE: + cls.get_or_create(name=v, code2=k, creator=user) + + @classmethod + def get_or_create(cls, name=None, code2=None, creator=None): + code2 = language_iso(code2) + if code2: + try: + return cls.objects.get(code2=code2) + except cls.DoesNotExist: + pass + + if name: + try: + return cls.objects.get(name=name) + except cls.DoesNotExist: + pass + + if name or code2: + obj = Language() + obj.name = name + obj.code2 = code2 or "" + obj.creator = creator + obj.save() + return obj + + +class TextWithLang(models.Model): + text = models.TextField(_("Text"), null=True, blank=True) + language = models.ForeignKey( + Language, + on_delete=models.SET_NULL, + verbose_name=_("Language"), + null=True, + blank=True, + ) + + panels = [FieldPanel("text"), AutocompletePanel("language")] + + class Meta: + abstract = True + + +class TextLanguageMixin(models.Model): + rich_text = RichTextField(_("Rich Text"), null=True, blank=True) + plain_text = models.TextField(_("Plain Text"), null=True, blank=True) + language = models.ForeignKey( + Language, + on_delete=models.SET_NULL, + verbose_name=_("Language"), + null=True, + blank=True, + ) + + panels = [ + AutocompletePanel("language"), + FieldPanel("rich_text"), + FieldPanel("plain_text"), + ] + + class Meta: + abstract = True + + +class LanguageFallbackManager(models.Manager): + def get_object_in_preferred_language(self, language): + mission = self.filter(language=language) + if mission: + return mission + + language_order = ['pt', 'es', 'en'] + langs = self.all().values_list("language", flat=True) + languages = Language.objects.filter(id__in=langs) + + # Define a ordem baseado na lista language_order + order = [When(code2=lang, then=Value(i)) for i, lang in enumerate(language_order)] + ordered_languages = languages.annotate( + language_order=Case(*order, default=Value(len(language_order)), output_field=IntegerField()) + ).order_by('language_order') + + + for lang in ordered_languages: + mission = self.filter(language=lang) + if mission: + return mission + return None + + +class RichTextWithLanguage(models.Model): + rich_text = RichTextField(_("Rich Text"), null=True, blank=True) + language = models.ForeignKey( + Language, + on_delete=models.SET_NULL, + verbose_name=_("Language"), + null=True, + blank=True, + ) + + panels = [ + AutocompletePanel("language"), + FieldPanel("rich_text"), + ] + + objects = LanguageFallbackManager() + + class Meta: + abstract = True + + +class FlexibleDate(models.Model): + year = models.IntegerField(_("Year"), null=True, blank=True) + month = models.IntegerField(_("Month"), null=True, blank=True) + day = models.IntegerField(_("Day"), null=True, blank=True) + + def __unicode__(self): + return "%s/%s/%s" % (self.year, self.month, self.day) + + def __str__(self): + return "%s/%s/%s" % (self.year, self.month, self.day) + + @property + def data(self): + return dict( + date__year=self.year, + date__month=self.month, + date__day=self.day, + ) + + +class License(CommonControlField): + license_type = models.CharField(max_length=255, null=True, blank=True) + + autocomplete_search_field = "license_type" + + def autocomplete_label(self): + return str(self) + + panels = [ + FieldPanel("license_type"), + ] + + class Meta: + unique_together = [("license_type", )] + verbose_name = _("License") + verbose_name_plural = _("Licenses") + indexes = [ + models.Index( + fields=[ + "license_type", + ] + ), + ] + + def __unicode__(self): + return self.license_type or "" + + def __str__(self): + return self.license_type or "" + + @classmethod + def load(cls, user): + for license_type, v in choices.LICENSE_TYPES: + cls.create_or_update(user, license_type) + + @classmethod + def get( + cls, + license_type, + ): + if not license_type: + raise ValueError("License.get requires license_type parameters") + filters = dict( + license_type__iexact=license_type + ) + try: + return cls.objects.get(**filters) + except cls.MultipleObjectsReturned: + return cls.objects.filter(**filters).first() + + @classmethod + def create( + cls, + user, + license_type=None, + ): + try: + obj = cls() + obj.creator = user + obj.license_type = license_type or obj.license_type + obj.save() + return obj + except IntegrityError: + return cls.get(license_type=license_type) + + @classmethod + def create_or_update( + cls, + user, + license_type=None, + ): + try: + return cls.get(license_type=license_type) + except cls.DoesNotExist: + return cls.create(user, license_type) + + +class LicenseStatement(CommonControlField): + url = models.CharField(max_length=255, null=True, blank=True) + license_p = RichTextField(null=True, blank=True) + language = models.ForeignKey( + Language, on_delete=models.SET_NULL, null=True, blank=True + ) + license = models.ForeignKey( + License, on_delete=models.SET_NULL, null=True, blank=True) + + panels = [ + FieldPanel("url"), + FieldPanel("license_p"), + AutocompletePanel("language"), + AutocompletePanel("license"), + ] + + class Meta: + unique_together = [("url", "license_p", "language")] + verbose_name = _("License") + verbose_name_plural = _("Licenses") + indexes = [ + models.Index( + fields=[ + "url", + ] + ), + ] + + def __unicode__(self): + return self.url or "" + + def __str__(self): + return self.url or "" + + @classmethod + def get( + cls, + url=None, + license_p=None, + language=None, + ): + if not url and not license_p: + raise ValueError("LicenseStatement.get requires url or license_p") + try: + return cls.objects.get( + url__iexact=url, license_p__iexact=license_p, language=language) + except cls.MultipleObjectsReturned: + return cls.objects.filter( + url__iexact=url, license_p__iexact=license_p, language=language + ).first() + + @classmethod + def create( + cls, + user, + url=None, + license_p=None, + language=None, + license=None, + ): + if not url and not license_p: + raise ValueError("LicenseStatement.create requires url or license_p") + try: + obj = cls() + obj.creator = user + obj.url = url or obj.url + obj.license_p = license_p or obj.license_p + obj.language = language or obj.language + # instance of License + obj.license = license or obj.license + obj.save() + return obj + except IntegrityError: + return cls.get(url, license_p, language) + + @classmethod + def create_or_update( + cls, + user, + url=None, + license_p=None, + language=None, + license=None, + ): + try: + data = dict( + url=url, + license_p=license_p, + language=language and language.code2 + ) + try: + obj = cls.get(url, license_p, language) + obj.updated_by = user + obj.url = url or obj.url + obj.license_p = license_p or obj.license_p + obj.language = language or obj.language + # instance of License + obj.license = license or obj.license + obj.save() + return obj + except cls.DoesNotExist: + return cls.create(user, url, license_p, language, license) + except Exception as e: + raise ValueError(f"Unable to create or update LicenseStatement for {data}: {type(e)} {e}") + + @staticmethod + def parse_url(url): + license_type = None + license_version = None + license_language = None + + url = url.lower() + url_parts = url.split("/") + if not url_parts: + return {} + + license_types = dict(choices.LICENSE_TYPES) + for lic_type in license_types.keys(): + if lic_type in url_parts: + license_type = lic_type + + try: + version = url.split(f"/{license_type}/") + version = version[-1].split("/")[0] + isdigit = False + for c in version.split("."): + if c.isdigit(): + isdigit = True + continue + else: + isdigit = False + break + if isdigit: + license_version = version + except (AttributeError, TypeError, ValueError): + pass + break + + return dict( + license_type=license_type, + license_version=license_version, + license_language=license_language, + ) + + +class FileWithLang(models.Model): + file = models.ForeignKey( + "wagtaildocs.Document", + null=True, + blank=True, + on_delete=models.SET_NULL, + verbose_name=_("File"), + help_text='', + related_name="+", + ) + + language = models.ForeignKey( + Language, + on_delete=models.SET_NULL, + verbose_name=_("Language"), + null=True, + blank=True, + ) + + panels = [ + AutocompletePanel("language"), + FieldPanel("file"), + ] + + @property + def filename(self): + return os.path.basename(self.file.name) + + class Meta: + abstract = True From d7395d916d3cb2ed19d1e4f59aa6e773d2943cb2 Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:17:23 -0600 Subject: [PATCH 04/43] =?UTF-8?q?Actualizaci=C3=B3n=20en=20Reference:=20us?= =?UTF-8?q?o=20de=20ReferenceStatus=20y=20ajuste=20en=20creaci=C3=B3n=20de?= =?UTF-8?q?=20referencias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/api/v1/views.py | 8 ++++---- reference/models.py | 22 +++++++++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/reference/api/v1/views.py b/reference/api/v1/views.py index e7dceaf..82511df 100755 --- a/reference/api/v1/views.py +++ b/reference/api/v1/views.py @@ -6,11 +6,11 @@ from rest_framework.response import Response from reference.api.v1.serializers import ReferenceSerializer from reference.marker import mark_references -from reference.tasks import get_reference +from reference.data_utils import get_reference import json -from reference.models import Reference, ElementCitation +from reference.models import Reference, ElementCitation, ReferenceStatus # Create your views here. @@ -19,7 +19,7 @@ class ReferenceViewSet( CreateModelMixin, # handles POSTs ): serializer_class = ReferenceSerializer - permission_classes = [IsAuthenticated] + permission_classes = [IsAuthenticated] http_method_names = [ "post", ] @@ -40,7 +40,7 @@ def api_reference(self, request): except Reference.DoesNotExist: new_reference = Reference.objects.create( mixed_citation=post_reference, - estatus=1, + estatus=ReferenceStatus.CREATING, creator=self.request.user, ) diff --git a/reference/models.py b/reference/models.py index b38dd2a..3eccba1 100755 --- a/reference/models.py +++ b/reference/models.py @@ -10,11 +10,23 @@ from django.core.validators import MinValueValidator, MaxValueValidator from core.forms import CoreAdminModelForm + +class ReferenceStatus(models.IntegerChoices): + NO_REFERENCE = 0, _("No reference") + CREATING = 1, _("Creating reference") + READY = 2, _("Reference ready") + + # Create your models here class Reference(CommonControlField, ClusterableModel): - mixed_citation = models.TextField(_("Mixed Citation"), null=False, blank=True) + mixed_citation = models.TextField(("Mixed Citation"), null=False, blank=True) - estatus = models.IntegerField(default=0) + estatus = models.IntegerField( + _("Reference estatus"), + choices=ReferenceStatus.choices, + blank=True, + default=ReferenceStatus.NO_REFERENCE + ) panels = [ FieldPanel('mixed_citation'), @@ -26,10 +38,6 @@ class Reference(CommonControlField, ClusterableModel): def __str__(self): return self.mixed_citation - class Meta: - verbose_name = _("Referência") - verbose_name_plural = _("Referências") - class ElementCitation(Orderable): reference = ParentalKey( @@ -45,7 +53,7 @@ class ElementCitation(Orderable): MinValueValidator(1), # Mínimo 1 MaxValueValidator(10) # Máximo 10 ], - help_text=_("Rating from 1 to 10") + help_text="Rating from 1 to 10" ) panels = [ From 02654a5e1115ffbed7784c96b69b697f4a11cba3 Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:18:19 -0600 Subject: [PATCH 05/43] =?UTF-8?q?Refactor=20en=20reference.config:=20seria?= =?UTF-8?q?lizaci=C3=B3n=20de=20ejemplos=20con=20json.dumps=20y=20ampliaci?= =?UTF-8?q?=C3=B3n=20de=20tipos=20soportados=20(confproc,=20full=5Ftext,?= =?UTF-8?q?=20etc.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/config.py | 140 ++++++++++++++++++++++++++------------------ 1 file changed, 84 insertions(+), 56 deletions(-) diff --git a/reference/config.py b/reference/config.py index 4b8ac25..7c385e0 100644 --- a/reference/config.py +++ b/reference/config.py @@ -1,3 +1,5 @@ +import json + MESSAGES = [ { 'role': 'system', 'content': 'You are an assistant who distinguishes all the components of a citation in an article with output in JSON' @@ -6,7 +8,7 @@ 'content': 'Bachman, S., J. Moat, A. W. Hill, J. de la Torre and B. Scott. 2011. Supporting Red List threat assessments with GeoCAT: geospatial conservation assessment tool. ZooKeys 150: 117-126. DOI: https://doi.org/10.3897/zookeys.150.2109' }, { 'role': 'assistant', - 'content': { + 'content': json.dumps({ 'reftype': 'journal', 'authors': [ { 'surname': 'Bachman', 'fname': 'S.' }, @@ -15,51 +17,54 @@ { 'surname': 'de la Torre', 'fname': 'J.' }, { 'surname': 'Scott', 'fname': 'B.' }, ], + 'full_text': 'Bachman, S., J. Moat, A. W. Hill, J. de la Torre and B. Scott. 2011. Supporting Red List threat assessments with GeoCAT: geospatial conservation assessment tool. ZooKeys 150: 117-126. DOI: https://doi.org/10.3897/zookeys.150.2109', 'date': 2011, 'title': 'Supporting Red List threat assessments with GeoCAT: geospatial conservation assessment tool', 'source': 'ZooKeys', 'vol': '150', 'num': None, - 'pages': '117-126', + 'fpage': '117', + 'lpage': '126', 'doi': '10.3897/zookeys.150.2109', - } + }) }, { 'role': 'user', 'content': 'Brunel, J. F. 1987. Sur le genre Phyllanthus L. et quelques genres voisins de la Tribu des Phyllantheae Dumort. (Euphorbiaceae, Phyllantheae) en Afrique intertropicale et à Madagascar. Thèse de doctorat de l’Université L. Pasteur. Strasbourg, France. 760 pp.' }, { 'role': 'assistant', - 'content': { + 'content': json.dumps({ 'reftype': 'Thesis', 'authors': [ { 'surname': 'Brunel', 'fname': 'J. F.' }, ], + 'full_text': 'Brunel, J. F. 1987. Sur le genre Phyllanthus L. et quelques genres voisins de la Tribu des Phyllantheae Dumort. (Euphorbiaceae, Phyllantheae) en Afrique intertropicale et à Madagascar. Thèse de doctorat de l’Université L. Pasteur. Strasbourg, France. 760 pp.', 'date': 1987, - 'title': 'Sur le genre Phyllanthus L. et quelques genres voisins de la Tribu des Phyllantheae Dumort. (Euphorbiaceae, Phyllantheae) en Afrique intertropicale et à Madagascar', + 'source': 'Sur le genre Phyllanthus L. et quelques genres voisins de la Tribu des Phyllantheae Dumort. (Euphorbiaceae, Phyllantheae) en Afrique intertropicale et à Madagascar', 'degree': 'doctorat', 'organization': 'l’Université L. Pasteur', 'city': 'Strasbourg', - 'country': 'France', + 'location': 'Strasbourg, France', 'num_pages': 760 - }, + }), }, { 'role': 'user', 'content': 'Hernández-López, L. 1995. The endemic flora of Jalisco, Mexico: Centers of endemism and implications for conservation. Tesis de maestría. Universidad de Wisconsin. Madison, USA. 74 pp.' }, { 'role': 'assistant', - 'content': { + 'content': json.dumps({ 'reftype': 'Thesis', 'authors': [ { 'surname': 'Hernández-López', 'fname': 'L.' }, ], + 'full_text': 'Hernández-López, L. 1995. The endemic flora of Jalisco, Mexico: Centers of endemism and implications for conservation. Tesis de maestría. Universidad de Wisconsin. Madison, USA. 74 pp.', 'date': 1995, - 'title': 'The endemic flora of Jalisco, Mexico: Centers of endemism and implications for conservation', + 'source': 'The endemic flora of Jalisco, Mexico: Centers of endemism and implications for conservation', 'degree': 'maestría', 'organization': 'Universidad de Wisconsin', - 'city': 'Madison', - 'country': 'USA', + 'location': 'Madison, USA', 'num_pages': 74 - }, + }), }, { 'role': 'user', @@ -67,18 +72,18 @@ }, { 'role': 'assistant', - 'content': { + 'content': json.dumps({ 'reftype': 'book', 'authors':[ { 'surname': 'Schimper', 'fname': 'A. F. W.' }, ], + 'full_text': 'Schimper, A. F. W. 1903. Plant geography upon a physiological basis. Clarendon Press. Oxford, UK. 839 pp.', 'date': 1903, - 'title': 'Plant geography upon a physiological basis', + 'source': 'Plant geography upon a physiological basis', 'organization': 'Clarendon Press', - 'city': 'Oxford', - 'country': 'UK', + 'location': 'Oxford, UK', 'num_pages': 839 - } + }) }, { 'role': 'user', @@ -86,20 +91,20 @@ }, { 'role': 'assistant', - 'content': { + 'content': json.dumps({ 'reftype': 'book', 'authors':[ { 'surname': 'Correa', 'fname': 'M. D.' }, { 'surname': 'Galdames', 'fname': 'C.' }, { 'surname': 'Stapf', 'fname': 'M.' }, ], + 'full_text': 'Correa, M. D., C. Galdames and M. Stapf. 2004. Catálogo de Plantas Vasculares de Panamá. Smithsonian Tropical Research Institute. Ciudad de Panamá, Panamá. 599 pp.', 'date': 2004, - 'title': 'Catálogo de Plantas Vasculares de Panamá', + 'source': 'Catálogo de Plantas Vasculares de Panamá', 'organization': 'Smithsonian Tropical Research Institute', - 'city': 'Ciudad de Panamá', - 'country': 'Panamá', + 'location': 'Ciudad de Panamá, Panamá', 'num_pages': 599 - } + }) }, { 'role': 'user', @@ -107,19 +112,19 @@ }, { 'role': 'assistant', - 'content': { + 'content': json.dumps({ 'reftype': 'data', 'authors':[ { 'surname': 'Hernández-López', 'fname': 'L.' }, ], + 'full_text': 'Hernández-López, L. 2019. Las especies endémicas de plantas en el estado de Jalisco: su distribución y conservación. Comisión Nacional para el Conocimiento y Uso de la Biodiversidad (CONABIO). Cd. Mx., México. https://doi.org/10.15468/ktvqds (consultado diciembre de 2019).', 'date': 2019, 'title': 'Las especies endémicas de plantas en el estado de Jalisco: su distribución y conservación', - 'organization': 'Comisión Nacional para el Conocimiento y Uso de la Biodiversidad (CONABIO)', - 'city': 'Cd. Mx.', - 'country': 'México', + 'source': 'Comisión Nacional para el Conocimiento y Uso de la Biodiversidad (CONABIO)', + 'location': 'Cd. Mx. México', 'doi': '10.15468/ktvqds', 'access_date': 'diciembre de 2019' - } + }) }, { 'role': 'user', @@ -127,17 +132,18 @@ }, { 'role': 'assistant', - 'content': { + 'content': json.dumps({ 'reftype': 'webpage', 'authors':[ { 'collab': 'INAFED' }, ], + 'full_text': 'INAFED. 2010. Enciclopedia de los Municipios y Delegaciones de México: Jalisco. Instituto Nacional para el Federalismo y el Desarrollo Municipal. http://www.inafed.gob.mx/ work/enciclopedia/EMM21puebla/index.html (consultado diciembre de 2018).', 'date': 2010, - 'title': 'Enciclopedia de los Municipios y Delegaciones de México: Jalisco', + 'source': 'Enciclopedia de los Municipios y Delegaciones de México: Jalisco', 'organization': 'Instituto Nacional para el Federalismo y el Desarrollo Municipal', 'uri': 'http://www.inafed.gob.mx/ work/enciclopedia/EMM21puebla/index.html', 'access_date': 'diciembre de 2018' - } + }) }, { 'role': 'user', @@ -145,17 +151,41 @@ }, { 'role': 'assistant', - 'content': { + 'content': json.dumps({ 'reftype': 'software', 'authors':[ { 'collab': 'Nikon Corporation' }, ], + 'full_text': 'Nikon Corporation. 1991-2006. NIS- Elements, version 2.33. Tokio, Japón.', 'date': 2006, 'source': 'NIS- Elements', 'version': '2.33', 'city': 'Tokio', 'country': 'Japón', - } + }) + }, + { + 'role': 'user', + 'content': 'Furton EJ, Dort V, editors. Addiction and compulsive behaviors. Proceedings of the 17th Workshop for Bishops; 1999; Dallas, TX. Boston: National Catholic Bioethics Center (US); 2000. 258 p.' + }, + { + 'role': 'assistant', + 'content': json.dumps({ + 'reftype': 'confproc', + 'full_text': 'Furton EJ, Dort V, editors. Addiction and compulsive behaviors. Proceedings of the 17th Workshop for Bishops; 1999; Dallas, TX. Boston: National Catholic Bioethics Center (US); 2000. 258 p.', + 'authors':[ + { 'surname': 'Furton', 'fname': 'EJ' }, + { 'surname': 'Dort', 'fname': 'V' }, + ], + 'date': 2000, + 'source': 'Addiction and compulsive behaviors', + 'title': 'Proceedings of the 17th Workshop for Bishops', + 'location': 'Dallas, TX', + 'num': '17', + 'organization': 'National Catholic Bioethics Center (US)', + 'org_location': 'Boston', + 'pages': '258 p' + }) }, ] @@ -164,7 +194,7 @@ 'schema':{ 'type': 'object', 'properties': { - 'reftype': {'type': 'string', 'enum': ['journal', 'thesis', 'book', 'data', 'webpage', 'software']}, + 'reftype': {'type': 'string', 'enum': ['journal', 'thesis', 'book', 'data', 'webpage', 'software', 'confproc']}, 'authors': {'type': 'array', 'items': { 'type': 'object', @@ -175,29 +205,27 @@ } } }, - 'date': {'type': 'integer'}, - 'title': {'type': 'string'}, - 'source': {'type': 'string'}, - 'vol': {'type': 'integer'}, - 'num': {'type': 'integer'}, - 'pages': {'type': 'string'}, - 'doi': {'type': 'string'}, - 'degree': {'type': 'string'}, - 'organization': {'type': 'string'}, - 'city': {'type': 'string'}, - 'country': {'type': 'string'}, - 'num_pages': {'type': 'integer'}, - 'uri': {'type': 'string'}, - 'access_date': {'type': 'string'}, - 'version': {'type': 'string'}, + "full_text": {"type": "integer"}, + "date": {"type": "integer"}, + "title": {"type": "string"}, + "chapter": {"type": "string"}, + "edition": {"type": "string"}, + "source": {"type": "string"}, + "vol": {"type": "integer"}, + "num": {"type": "integer"}, + "pages": {"type": "string"}, + "fpage": {"type": "string"}, + "lpage": {"type": "string"}, + "doi": {"type": "string"}, + "degree": {"type": "string"}, + "organization": {"type": "string"}, + "location": {"type": "string"}, + "org_location": {"type": "string"}, + "num_pages": {"type": "integer"}, + "uri": {"type": "string"}, + "access_id": {"type": "string"}, + "access_date": {"type": "string"}, + "version": {"type": "string"}, }, - 'required':{ - 'journal': ['reftype', 'authors', 'date', 'title', 'source', 'vol', 'num', 'pages', 'doi'], - 'thesis': ['reftype', 'authors', 'date', 'title', 'degree', 'organization', 'city', 'country', 'num_pages'], - 'book': ['reftype', 'authors', 'date', 'title', 'organization', 'city', 'country', 'num_pages'], - 'data': ['reftype', 'authors', 'date', 'title', 'organization', 'city', 'country', 'num_pages', 'doi', 'access_date'], - 'webpage': ['reftype', 'authors', 'date', 'title', 'organization', 'uri', 'access_date'], - 'software': ['reftype', 'authors', 'date', 'source', 'version', 'city', 'country'] - } } } \ No newline at end of file From e40b6be17760ccb0a64ddff28c512459c81687c8 Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:18:49 -0600 Subject: [PATCH 06/43] =?UTF-8?q?Refactor=20en=20marker:=20actualizaci?= =?UTF-8?q?=C3=B3n=20de=20importaci=C3=B3n=20de=20GenericLlama=20desde=20m?= =?UTF-8?q?odel=5Fai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/marker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/marker.py b/reference/marker.py index 63582e9..32b838d 100644 --- a/reference/marker.py +++ b/reference/marker.py @@ -1,4 +1,4 @@ -from llama3.generic_llama import GenericLlama +from model_ai.generic_llama import GenericLlama from reference.config import MESSAGES, RESPONSE_FORMAT From d88c9c59d28c7a78b09286812265c0209f770285 Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:19:55 -0600 Subject: [PATCH 07/43] =?UTF-8?q?Eliminaci=C3=B3n=20de=20reference.tasks?= =?UTF-8?q?=20(responsabilidad=20movida=20a=20data=5Futils=20y=20model=5Fa?= =?UTF-8?q?i)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/tasks.py | 120 --------------------------------------------- 1 file changed, 120 deletions(-) delete mode 100644 reference/tasks.py diff --git a/reference/tasks.py b/reference/tasks.py deleted file mode 100644 index 51d4eff..0000000 --- a/reference/tasks.py +++ /dev/null @@ -1,120 +0,0 @@ -from config import celery_app -from reference.marker import mark_references -from reference.models import Reference, ElementCitation -import json -from lxml import etree -import re - -meses = { - "enero": "01", "febrero": "02", "marzo": "03", "abril": "04", "mayo": "05", "junio": "06", - "julio": "07", "agosto": "08", "septiembre": "09", "octubre": "10", "noviembre": "11", "diciembre": "12", - "january": "01", "february": "02", "march": "03", "april": "04", "may": "05", "june": "06", - "july": "07", "august": "08", "september": "09", "october": "10", "november": "11", "december": "12", - "janeiro": "01", "fevereiro": "02", "março": "03", "abril": "04", "maio": "05", "junho": "06", - "julho": "07", "agosto": "08", "setembro": "09", "outubro": "10", "novembro": "11", "dezembro": "12" -} - -def get_number_of_month(texto): - texto = texto.lower() - for mes, numero in meses.items(): - if re.search(rf"\b{mes}\b", texto): - return numero - return None # Si no encuentra un mes - -def get_xml(json_reference): - json_reference = json.loads(json_reference) - root = etree.Element('element-citation', - attrib = { - 'publication-type': json_reference['reftype'], - }) - - if json_reference['reftype'] in ['webpage', 'data']: - NSMAP = {'xlink': 'http://www.w3.org/1999/xlink'} - root = etree.Element('element-citation', - attrib = { - 'publication-type': json_reference['reftype'], - },nsmap=NSMAP) - - if 'authors' in json_reference: - person_group = etree.SubElement(root, "person-group", - attrib = { - 'person-group-type': 'author', - } - ) - for author in json_reference['authors']: - name = etree.Element('name') - if 'fname' in author: - etree.SubElement(name, 'surname').text = author['fname'] - if 'surname' in author: - etree.SubElement(name, 'given-names').text = author['surname'] - if 'collab' in author: - etree.SubElement(name, 'collab').text = author['collab'] - person_group.append(name) - - if json_reference['reftype'] == 'journal': - if 'title' in json_reference: - etree.SubElement(root, 'article-title').text = json_reference['title'] - if 'source' in json_reference: - etree.SubElement(root, 'source').text = json_reference['source'] - if 'vol' in json_reference: - etree.SubElement(root, 'volume').text = str(json_reference['vol']) - if 'num' in json_reference: - etree.SubElement(root, 'issue').text = str(json_reference['num']) - if 'pages' in json_reference and len(str(json_reference['pages']).split('-')) > 0: - etree.SubElement(root, 'fpage').text = str(json_reference['pages']).split('-')[0].strip() - if 'pages' in json_reference and len(str(json_reference['pages']).split('-')) > 1: - etree.SubElement(root, 'lpage').text = str(json_reference['pages']).split('-')[1].strip() - if 'doi' in json_reference: - etree.SubElement(root, 'doi', attrib = { 'pub-id-type': 'doi' }).text = json_reference['doi'] - - if json_reference['reftype'] == 'thesis': - if 'title' in json_reference: - etree.SubElement(root, 'source').text = json_reference['title'] - if 'degree' in json_reference: - etree.SubElement(root, 'comment', attrib = { 'content-type': 'degree' }).text = json_reference['degree'] - if 'organization' in json_reference: - etree.SubElement(root, 'publisher-name').text = json_reference['organization'] - - if json_reference['reftype'] in ['webpage', 'data']: - if 'title' in json_reference: - etree.SubElement(root, 'source').text = json_reference['title'] - if 'uri' in json_reference: - etree.SubElement(root, 'ext-link', attrib = { - 'ext-link-type': 'uri', - '{http://www.w3.org/1999/xlink}href': json_reference['uri'] - }).text = json_reference['uri'] - if 'organization' in json_reference: - etree.SubElement(root, 'publisher-name').text = json_reference['organization'] - if 'country' in json_reference: - etree.SubElement(root, 'publisher-loc').text = json_reference['country'] - if 'doi' in json_reference: - etree.SubElement(root, 'doi', attrib = { 'pub-id-type': 'doi' }).text = json_reference['doi'] - if 'access_date' in json_reference: - match = re.search(r'\b\d{4}\b', json_reference['access_date']) - year = match.group() - month = get_number_of_month(json_reference['access_date']) - etree.SubElement(root, 'date-in-citation', attrib = { - 'content-type': 'access-date', - 'iso-8601-date': year+'-'+month+'-00' - }).text = json_reference['access_date'] - - if 'date' in json_reference: - etree.SubElement(root, 'year').text = str(json_reference['date']) - - - return root - - -#@celery_app.task() -def get_reference(obj_id): - obj_reference = Reference.objects.get(id=obj_id) - marked = mark_references(obj_reference.mixed_citation) - for item in marked: - for i in item['choices']: - ElementCitation.objects.create( - reference=obj_reference, - marked=i, - marked_xml=etree.tostring(get_xml(i), pretty_print=True, encoding='unicode') - ) - obj_reference.estatus = 2 - obj_reference.save() From 3159c3bc5f0f50a5bc7de15c4ae3d9359b16b0ee Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:20:35 -0600 Subject: [PATCH 08/43] Refactor en wagtail_hooks: uso de SnippetViewSet y soporte para descarga de modelos --- reference/wagtail_hooks.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/reference/wagtail_hooks.py b/reference/wagtail_hooks.py index 8730e19..c6b42c1 100644 --- a/reference/wagtail_hooks.py +++ b/reference/wagtail_hooks.py @@ -8,12 +8,22 @@ from wagtail_modeladmin.views import CreateView from wagtail.admin.menu import MenuItem -from reference.tasks import get_reference +from reference.data_utils import get_reference from reference.models import ( Reference ) +from wagtail.snippets.views.snippets import ( + CreateView, + EditView, + SnippetViewSet, + SnippetViewSetGroup +) + +from wagtail.snippets.models import register_snippet +from model_ai.tasks import download_model + class ReferenceCreateView(CreateView): def form_valid(self, form): @@ -37,10 +47,9 @@ def form_valid(self, form): return HttpResponseRedirect(self.get_success_url()) - -class ReferenceAdmin(ModelAdmin): +class ReferenceModelViewSet(SnippetViewSet): model = Reference - create_view_class = ReferenceCreateView + add_view_class = ReferenceCreateView #edit_view_class = ArticleDocxEditView menu_label = _("Reference") menu_icon = "folder" @@ -52,4 +61,4 @@ class ReferenceAdmin(ModelAdmin): list_per_page = 20 -modeladmin_register(ReferenceAdmin) \ No newline at end of file +register_snippet(ReferenceModelViewSet) \ No newline at end of file From 8746d0281c9210653fdda9aa18f8ffbe2cf4c266 Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:21:55 -0600 Subject: [PATCH 09/43] =?UTF-8?q?Actualizaci=C3=B3n=20de=20dependencias:?= =?UTF-8?q?=20inclusi=C3=B3n=20de=20langid,=20google-generativeai=20y=20py?= =?UTF-8?q?thon-docx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements/base.txt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 32d29e8..d822d40 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -48,4 +48,13 @@ git+https://git@github.com/scieloorg/packtools@4.12.0#egg=packtools # Langdetect # ------------------------------------------------------------------------------ -langdetect~=1.0.9 \ No newline at end of file +langdetect~=1.0.9 +langid + +# Gemini +# +google-generativeai==0.3.2 + +# Docx +# +python-docx==1.1.2 \ No newline at end of file From a9305e61accd39e01e358aade06cc77fdafe5a88 Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:34:42 -0600 Subject: [PATCH 10/43] =?UTF-8?q?Creaci=C3=B3n=20y=20ampliaci=C3=B3n=20de?= =?UTF-8?q?=20la=20app=20core:=20modelos=20comunes,=20formularios,=20vista?= =?UTF-8?q?s=20de=20b=C3=BAsqueda,=20utilidades=20y=20hooks=20de=20Wagtail?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/choices.py | 227 ++++++++++++++++++++++++++++++++++++++++++++ core/utils/utils.py | 95 ++++++++++++++++++ 2 files changed, 322 insertions(+) create mode 100644 core/choices.py create mode 100644 core/utils/utils.py diff --git a/core/choices.py b/core/choices.py new file mode 100644 index 0000000..68cc554 --- /dev/null +++ b/core/choices.py @@ -0,0 +1,227 @@ +from django.utils.translation import gettext_lazy as _ + +LANGUAGE = [ + ("aa", "Afar"), + ("af", "Afrikaans"), + ("ak", "Akan"), + ("sq", "Albanian"), + ("am", "Amharic"), + ("ar", "Arabic"), + ("an", "Aragonese"), + ("hy", "Armenian"), + ("as", "Assamese"), + ("av", "Avaric"), + ("ae", "Avestan"), + ("ay", "Aymara"), + ("az", "Azerbaijani"), + ("bm", "Bambara"), + ("ba", "Bashkir"), + ("eu", "Basque"), + ("be", "Belarusian"), + ("bn", "Bengali"), + ("bi", "Bislama"), + ("bs", "Bosnian"), + ("br", "Breton"), + ("bg", "Bulgarian"), + ("my", "Burmese"), + ("ca", "Catalan, Valencian"), + ("ch", "Chamorro"), + ("ce", "Chechen"), + ("ny", "Chichewa, Chewa, Nyanja"), + ("zh", "Chinese"), + ( + "cu", + "Church Slavic, Old Slavonic, Church Slavonic, Old Bulgarian, Old Church Slavonic", + ), + ("cv", "Chuvash"), + ("kw", "Cornish"), + ("co", "Corsican"), + ("cr", "Cree"), + ("hr", "Croatian"), + ("cs", "Czech"), + ("da", "Danish"), + ("dv", "Divehi, Dhivehi, Maldivian"), + ("nl", "Dutch, Flemish"), + ("dz", "Dzongkha"), + ("en", "English"), + ("eo", "Esperanto"), + ("et", "Estonian"), + ("ee", "Ewe"), + ("fo", "Faroese"), + ("fj", "Fijian"), + ("fi", "Finnish"), + ("fr", "French"), + ("fy", "Western Frisian"), + ("ff", "Fulah"), + ("gd", "Gaelic, Scottish Gaelic"), + ("gl", "Galician"), + ("lg", "Ganda"), + ("ka", "Georgian"), + ("de", "German"), + ("el", "Greek, Modern (1453–)"), + ("kl", "Kalaallisut, Greenlandic"), + ("gn", "Guarani"), + ("gu", "Gujarati"), + ("ht", "Haitian, Haitian Creole"), + ("ha", "Hausa"), + ("he", "Hebrew"), + ("hz", "Herero"), + ("hi", "Hindi"), + ("ho", "Hiri Motu"), + ("hu", "Hungarian"), + ("is", "Icelandic"), + ("io", "Ido"), + ("ig", "Igbo"), + ("id", "Indonesian"), + ("ia", "Interlingua (International Auxiliary Language Association)"), + ("ie", "Interlingue, Occidental"), + ("iu", "Inuktitut"), + ("ik", "Inupiaq"), + ("ga", "Irish"), + ("it", "Italian"), + ("ja", "Japanese"), + ("jv", "Javanese"), + ("kn", "Kannada"), + ("kr", "Kanuri"), + ("ks", "Kashmiri"), + ("kk", "Kazakh"), + ("km", "Central Khmer"), + ("ki", "Kikuyu, Gikuyu"), + ("rw", "Kinyarwanda"), + ("ky", "Kirghiz, Kyrgyz"), + ("kv", "Komi"), + ("kg", "Kongo"), + ("ko", "Korean"), + ("kj", "Kuanyama, Kwanyama"), + ("ku", "Kurdish"), + ("lo", "Lao"), + ("la", "Latin"), + ("lv", "Latvian"), + ("li", "Limburgan, Limburger, Limburgish"), + ("ln", "Lingala"), + ("lt", "Lithuanian"), + ("lu", "Luba-Katanga"), + ("lb", "Luxembourgish, Letzeburgesch"), + ("mk", "Macedonian"), + ("mg", "Malagasy"), + ("ms", "Malay"), + ("ml", "Malayalam"), + ("mt", "Maltese"), + ("gv", "Manx"), + ("mi", "Maori"), + ("mr", "Marathi"), + ("mh", "Marshallese"), + ("mn", "Mongolian"), + ("na", "Nauru"), + ("nv", "Navajo, Navaho"), + ("nd", "North Ndebele"), + ("nr", "South Ndebele"), + ("ng", "Ndonga"), + ("ne", "Nepali"), + ("no", "Norwegian"), + ("nb", "Norwegian Bokmål"), + ("nn", "Norwegian Nynorsk"), + ("ii", "Sichuan Yi, Nuosu"), + ("oc", "Occitan"), + ("oj", "Ojibwa"), + ("or", "Oriya"), + ("om", "Oromo"), + ("os", "Ossetian, Ossetic"), + ("pi", "Pali"), + ("ps", "Pashto, Pushto"), + ("fa", "Persian"), + ("pl", "Polish"), + ("pt", "Português"), + ("pa", "Punjabi, Panjabi"), + ("qu", "Quechua"), + ("ro", "Romanian, Moldavian, Moldovan"), + ("rm", "Romansh"), + ("rn", "Rundi"), + ("ru", "Russian"), + ("se", "Northern Sami"), + ("sm", "Samoan"), + ("sg", "Sango"), + ("sa", "Sanskrit"), + ("sc", "Sardinian"), + ("sr", "Serbian"), + ("sn", "Shona"), + ("sd", "Sindhi"), + ("si", "Sinhala, Sinhalese"), + ("sk", "Slovak"), + ("sl", "Slovenian"), + ("so", "Somali"), + ("st", "Southern Sotho"), + ("es", "Español"), + ("su", "Sundanese"), + ("sw", "Swahili"), + ("ss", "Swati"), + ("sv", "Swedish"), + ("tl", "Tagalog"), + ("ty", "Tahitian"), + ("tg", "Tajik"), + ("ta", "Tamil"), + ("tt", "Tatar"), + ("te", "Telugu"), + ("th", "Thai"), + ("bo", "Tibetan"), + ("ti", "Tigrinya"), + ("to", "Tonga (Tonga Islands)"), + ("ts", "Tsonga"), + ("tn", "Tswana"), + ("tr", "Turkish"), + ("tk", "Turkmen"), + ("tw", "Twi"), + ("ug", "Uighur, Uyghur"), + ("uk", "Ukrainian"), + ("ur", "Urdu"), + ("uz", "Uzbek"), + ("ve", "Venda"), + ("vi", "Vietnamese"), + ("vo", "Volapük"), + ("wa", "Walloon"), + ("cy", "Welsh"), + ("wo", "Wolof"), + ("xh", "Xhosa"), + ("yi", "Yiddish"), + ("yo", "Yoruba"), + ("za", "Zhuang, Chuang"), + ("zu", "Zulu"), +] + +ROLE = [ + ("Editor-Chefe", _("Editor-Chefe")), + ("Editor(es) Executivo", _("Editor(es) Executivo")), + ("Editor(es) Associados ou de Seção", _("Editor(es) Associados ou de Seção")), + ("Equipe Técnica", _("Equipe Técnica")), +] + +MONTHS = [ + ("01", _("January")), + ("02", _("February")), + ("03", _("March")), + ("04", _("April")), + ("05", _("May")), + ("06", _("June")), + ("07", _("July")), + ("08", _("August")), + ("09", _("September")), + ("10", _("October")), + ("11", _("November")), + ("12", _("December")), +] + +# https://creativecommons.org/share-your-work/cclicenses/ +# There are six different license types, listed from most to least permissive here: +LICENSE_TYPES = [ + ("by", _("by")), + ("by-sa", _("by-sa")), + ("by-nc", _("by-nc")), + ("by-nc-sa", _("by-nc-sa")), + ("by-nd", _("by-nd")), + ("by-nc-nd", _("by-nc-nd")), +] + +GENDER_CHOICES = [ + ('M', _('Male')), + ('F', _('Female')), +] \ No newline at end of file diff --git a/core/utils/utils.py b/core/utils/utils.py new file mode 100644 index 0000000..0397338 --- /dev/null +++ b/core/utils/utils.py @@ -0,0 +1,95 @@ +import logging +import re + +import requests +from langcodes import standardize_tag, tag_is_valid +from tenacity import ( + retry, + retry_if_exception_type, + stop_after_attempt, + wait_exponential, +) +from urllib3.util import Retry +from django.contrib.auth import get_user_model + + +logger = logging.getLogger(__name__) +User = get_user_model() + + +def language_iso(code): + code = re.split(r"-|_", code)[0] if code else "" + if tag_is_valid(code): + return standardize_tag(code) + return "" + + +class RetryableError(Exception): + """Recoverable error without having to modify the data state on the client + side, e.g. timeouts, errors from network partitioning, etc. + """ + + +class NonRetryableError(Exception): + """Recoverable error without having to modify the data state on the client + side, e.g. timeouts, errors from network partitioning, etc. + """ + + +@retry( + retry=retry_if_exception_type(RetryableError), + wait=wait_exponential(multiplier=1, min=1, max=5), + stop=stop_after_attempt(5), +) +def fetch_data(url, headers=None, json=False, timeout=2, verify=True): + """ + Get the resource with HTTP + Retry: Wait 2^x * 1 second between each retry starting with 4 seconds, + then up to 10 seconds, then 10 seconds afterwards + Args: + url: URL address + headers: HTTP headers + json: True|False + verify: Verify the SSL. + Returns: + Return a requests.response object. + Except: + Raise a RetryableError to retry. + """ + + try: + logger.info("Fetching the URL: %s" % url) + response = requests.get(url, headers=headers, timeout=timeout, verify=verify) + except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as exc: + logger.error("Erro fetching the content: %s, retry..., erro: %s" % (url, exc)) + raise RetryableError(exc) from exc + except ( + requests.exceptions.InvalidSchema, + requests.exceptions.MissingSchema, + requests.exceptions.InvalidURL, + ) as exc: + raise NonRetryableError(exc) from exc + try: + response.raise_for_status() + except requests.HTTPError as exc: + if 400 <= exc.response.status_code < 500: + raise NonRetryableError(exc) from exc + elif 500 <= exc.response.status_code < 600: + logger.error( + "Erro fetching the content: %s, retry..., erro: %s" % (url, exc) + ) + raise RetryableError(exc) from exc + else: + raise + + return response.content if not json else response.json() + + +def _get_user(request, username=None, user_id=None): + try: + return User.objects.get(pk=request.user_id) + except AttributeError: + if user_id: + return User.objects.get(pk=user_id) + if username: + return User.objects.get(username=username) \ No newline at end of file From 95a8153c0901fd5df44d04305ccb44c5e5e216cc Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:35:09 -0600 Subject: [PATCH 11/43] Nueva app markup_doc: modelos ArticleDocx, API REST, tareas de marcado, utilidades y hooks de Wagtail --- markup_doc/__init__.py | 0 markup_doc/admin.py | 3 + markup_doc/api/__init__.py | 0 markup_doc/api/v1/__init__.py | 0 markup_doc/api/v1/serializers.py | 7 + markup_doc/api/v1/views.py | 43 + markup_doc/apps.py | 6 + markup_doc/choices.py | 121 + markup_doc/forms.py | 1 + markup_doc/issue_proc.py | 150 + markup_doc/labeling_utils.py | 1125 +++++ markup_doc/marker.py | 37 + markup_doc/migrations/0001_initial.py | 2291 ++++++++++ ...0002_alter_articledocx_estatus_and_more.py | 23 + markup_doc/migrations/__init__.py | 0 markup_doc/models.py | 521 +++ markup_doc/pkg_zip_builder.py | 183 + markup_doc/static/css/article.css | 4 + markup_doc/static/css/bootstrap.min.css | 10 + markup_doc/static/jats/jats-preview.css | 216 + markup_doc/static/js/scielo-bundle-min.js | 2 + markup_doc/static/js/xref-button.js | 530 +++ markup_doc/static/xsl/jats-html.xsl | 4028 +++++++++++++++++ markup_doc/static/xsl/xml-tree.xsl | 103 + markup_doc/sync_api.py | 117 + markup_doc/tasks.py | 326 ++ markup_doc/tests.py | 3 + markup_doc/views.py | 575 +++ markup_doc/wagtail_hooks.py | 269 ++ markup_doc/xml.py | 864 ++++ 30 files changed, 11558 insertions(+) create mode 100644 markup_doc/__init__.py create mode 100644 markup_doc/admin.py create mode 100644 markup_doc/api/__init__.py create mode 100644 markup_doc/api/v1/__init__.py create mode 100644 markup_doc/api/v1/serializers.py create mode 100755 markup_doc/api/v1/views.py create mode 100644 markup_doc/apps.py create mode 100644 markup_doc/choices.py create mode 100644 markup_doc/forms.py create mode 100644 markup_doc/issue_proc.py create mode 100644 markup_doc/labeling_utils.py create mode 100644 markup_doc/marker.py create mode 100644 markup_doc/migrations/0001_initial.py create mode 100644 markup_doc/migrations/0002_alter_articledocx_estatus_and_more.py create mode 100644 markup_doc/migrations/__init__.py create mode 100644 markup_doc/models.py create mode 100644 markup_doc/pkg_zip_builder.py create mode 100644 markup_doc/static/css/article.css create mode 100644 markup_doc/static/css/bootstrap.min.css create mode 100644 markup_doc/static/jats/jats-preview.css create mode 100644 markup_doc/static/js/scielo-bundle-min.js create mode 100644 markup_doc/static/js/xref-button.js create mode 100644 markup_doc/static/xsl/jats-html.xsl create mode 100644 markup_doc/static/xsl/xml-tree.xsl create mode 100644 markup_doc/sync_api.py create mode 100644 markup_doc/tasks.py create mode 100644 markup_doc/tests.py create mode 100644 markup_doc/views.py create mode 100644 markup_doc/wagtail_hooks.py create mode 100644 markup_doc/xml.py diff --git a/markup_doc/__init__.py b/markup_doc/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/markup_doc/admin.py b/markup_doc/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/markup_doc/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/markup_doc/api/__init__.py b/markup_doc/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/markup_doc/api/v1/__init__.py b/markup_doc/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/markup_doc/api/v1/serializers.py b/markup_doc/api/v1/serializers.py new file mode 100644 index 0000000..c099f0e --- /dev/null +++ b/markup_doc/api/v1/serializers.py @@ -0,0 +1,7 @@ +from rest_framework import serializers +from markup_doc.models import ArticleDocx + +class ArticleDocxSerializer(serializers.ModelSerializer): + class Meta: + model = ArticleDocx + fields = "__all__" \ No newline at end of file diff --git a/markup_doc/api/v1/views.py b/markup_doc/api/v1/views.py new file mode 100755 index 0000000..66938bf --- /dev/null +++ b/markup_doc/api/v1/views.py @@ -0,0 +1,43 @@ +from django.shortcuts import render +from django.http import JsonResponse +from rest_framework.permissions import IsAuthenticated +from rest_framework.viewsets import GenericViewSet +from rest_framework.mixins import CreateModelMixin +from rest_framework.response import Response +from markup_doc.api.v1.serializers import ArticleDocxSerializer +from markup_doc.marker import mark_article + +import json + +# Create your views here. + +class ArticleViewSet( + GenericViewSet, # generic view functionality + CreateModelMixin, # handles POSTs +): + serializer_class = ArticleDocxSerializer + permission_classes = [IsAuthenticated] + http_method_names = [ + "post", + ] + + def create(self, request, *args, **kwargs): + return self.api_article(request) + + def api_article(self, request): + try: + data = json.loads(request.body) + post_text = data.get('text') # Obtiene el parámetro + post_metadata = data.get('metadata') # Obtiene el parámetro + + resp_data = mark_article(post_text, post_metadata) + + response_data = { + 'message': resp_data, + } + except json.JSONDecodeError: + response_data = { + 'error': 'Error processing' + } + + return JsonResponse(response_data) \ No newline at end of file diff --git a/markup_doc/apps.py b/markup_doc/apps.py new file mode 100644 index 0000000..87efcb1 --- /dev/null +++ b/markup_doc/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class MarkupDocConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "markup_doc" diff --git a/markup_doc/choices.py b/markup_doc/choices.py new file mode 100644 index 0000000..d113911 --- /dev/null +++ b/markup_doc/choices.py @@ -0,0 +1,121 @@ +front_labels = [ + ('', ''), + ('', ''), + ('', ''), + ('', ''), + ('', ''), + ('', ''), + ('', ''), + ('', ''), + ('', ''), + ('', ''), + ('', ''), + ('', ''), + ('', ''), + ('', ''), + ('', ''), + ('

', '

'), + ('', ''), + ('', ''), + ('', ''), + ('', '
'), + ('', ''), + ('', '<title>'), + ('<trans-abstract>', '<trans-abstract>'), + ('<trans-title>', '<trans-title>'), + ('<translate-front>', '<translate-front>'), + ('<translate-body>', '<translate-body>'), + ('<disp-formula>', '<disp-formula>'), + ('<inline-formula>', '<inline-formula>'), + ('<formula>', '<formula>'), + +] + +order_labels = { + '<article-id>':{ + 'pos' : 1, + 'next' : '<subject>' + }, + '<subject>':{ + 'pos' : 2, + 'next' : '<article-title>' + }, + '<article-title>':{ + 'pos' : 3, + 'next' : '<trans-title>', + 'lan' : True + }, + '<trans-title>':{ + 'size' : 14, + 'bold' : True, + 'lan' : True, + 'next' : '<contrib>' + }, + '<contrib>':{ + 'reset' : True, + 'size' : 12, + 'next' : '<aff>' + }, + '<aff>':{ + 'reset' : True, + 'size' : 12, + }, + '<abstract>':{ + 'size' : 12, + 'bold' : True, + 'lan' : True, + 'next' : '<p>' + }, + '<p>':{ + 'size' : 12, + 'next' : '<p>', + 'repeat' : True + }, + '<trans-abstract>':{ + 'size' : 12, + 'bold' : True, + 'lan' : True, + 'next' : '<p>' + }, + '<kwd-group>':{ + 'size' : 12, + 'regex' : r'(?i)(palabra.*clave.*:|keyword.*:)', + }, + '<history>':{ + 'size' : 12, + 'regex' : r'\d{2}/\d{2}/\d{4}', + }, + '<corresp>':{ + 'size' : 12, + 'regex' : r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' + }, + '<sec>':{ + 'size' : 16, + 'bold' : True, + 'next' : None + }, + '<sub-sec>':{ + 'size' : 12, + 'italic' : True, + 'next' : None + }, + '<sub-sec-2>':{ + 'size' : 14, + 'bold' : True, + 'next' : None + }, +} + +order_labels_body = { + '<sec>':{ + 'size' : 16, + 'bold' : True, + }, + '<sub-sec>':{ + 'size' : 12, + 'italic' : True, + }, + '<p>':{ + 'size' : 12, + }, +} \ No newline at end of file diff --git a/markup_doc/forms.py b/markup_doc/forms.py new file mode 100644 index 0000000..e8abe2e --- /dev/null +++ b/markup_doc/forms.py @@ -0,0 +1 @@ +from wagtail.admin.forms.models import WagtailAdminModelForm diff --git a/markup_doc/issue_proc.py b/markup_doc/issue_proc.py new file mode 100644 index 0000000..c291b08 --- /dev/null +++ b/markup_doc/issue_proc.py @@ -0,0 +1,150 @@ +from lxml import etree +from urllib.parse import urlparse +from packtools.sps.pid_provider.xml_sps_lib import get_xml_with_pre +import os + + +class Asset: + def __init__(self, wagtail_image): + self.file = wagtail_image.file # tiene .path (ruta absoluta) + self.original_href = wagtail_image.file.name # nombre en el storage + + +class XmlIssueProc: + def __init__(self, registro): + self.registro = registro + self.xmltree = self._extract_xml_tree() + self.journal_proc = self._extract_journal_proc() + self.issue_folder = self._extract_issue_folder() + + def _extract_xml_tree(self): + return get_xml_with_pre(self.registro.text_xml).xmltree + + def _extract_journal_proc(self): + acron = self.xmltree.findtext(".//journal-id[@journal-id-type='publisher-id']") + return type("JournalProc", (), {"acron": acron or "journal"}) + + def _get_issn(self): + issn = self.xmltree.findtext(".//issn[@pub-type='epub']") + if not issn: + issn = self.xmltree.findtext(".//issn[@pub-type='ppub']") + return issn + + def _extract_issue_folder(self, lot=None): + issn = self._get_issn() or "" + acron = self.journal_proc.acron or "" + vol = (self.xmltree.findtext(".//volume") or "").strip() + issue = (self.xmltree.findtext(".//issue") or "").strip().lower() + year = self.xmltree.findtext(".//pub-date[@date-type='collection']/year") + + parts = [p for p in [issn, acron] if p] + + # volumen + if vol: + parts.append(f"v{vol}") + + # issue puede ser número, suplemento o especial + if issue: + if issue.startswith("suppl"): + # suplemento de volumen → v10s2 + parts[-1] = parts[-1] + f"s{issue.replace('suppl','').strip()}" + elif "suppl" in issue: + # suplemento de número → v10n4s2 + tokens = issue.split() + num = tokens[0] + sup = tokens[1:] + parts.append(f"n{num}") + sup_num = "".join(sup).replace("suppl", "").strip() + parts[-1] = parts[-1] + f"s{sup_num}" + elif issue.startswith("spe"): + # número especial → v10nspe1 + parts[-1] = parts[-1] + f"nspe{issue.replace('spe','').strip()}" + else: + # número normal → v4n10 + parts.append(f"n{issue}") + + # carpeta de publicación continua con lote + if lot and year: + lot_str = f"{lot:02d}{year[-2:]}" + parts.append(lot_str) + + return "-".join(parts) + + def build_pkg_name(self, lang=None): + issn = self._get_issn() or "" + acron = self.journal_proc.acron or "" + + # base igual que issue_folder, pero sin el ISSN y acron aún + vol = (self.xmltree.findtext(".//volume") or "").strip() + issue = (self.xmltree.findtext(".//issue") or "").strip().lower() + + parts = [issn, acron] + + if vol: + parts.append(vol) + + if issue: + if issue.startswith("suppl"): + # suplemento de volumen + parts[-1] = parts[-1] + f"s{issue.replace('suppl','').strip()}" + elif "suppl" in issue: + # suplemento de número + tokens = issue.split() + num = tokens[0] + sup = tokens[1:] + parts.append(num) + sup_num = "".join(sup).replace("suppl", "").strip() + parts[-1] = parts[-1] + f"s{sup_num}" + elif issue.startswith("spe"): + # número especial + parts[-1] = parts[-1] + f"nspe{issue.replace('spe','').strip()}" + else: + # número normal + parts.append(issue) + + # ARTID + elocation = self.xmltree.findtext(".//elocation-id") + fpage = self.xmltree.findtext(".//fpage") + pid = self.xmltree.findtext(".//article-id[@specific-use='scielo-v2']") + + if elocation: + parts.append(elocation.strip()) + elif fpage: + parts.append(fpage.strip()) + elif pid: + parts.append(pid.strip()) + else: + parts.append("na") # fallback si no hay nada + + # idioma solo si es traducción + if lang: + parts.append(lang) + + return "-".join(parts) + + def find_asset(self, basename, name): + """ + Devuelve las imágenes del StreamField como Asset + si coinciden con el nombre puesto en el XML (original_filename) + o con el nombre real en storage. + """ + assets = [] + if self.registro.content_body: + for block in self.registro.content_body: + if block.block_type == "image" and block.value: + wagtail_image = block.value.get("image") + if not wagtail_image: + continue + + # Nombre real en storage (ej: foto1.abcd1234.jpg) + storage_basename = os.path.basename(wagtail_image.file.name) + + # Nombre usado en el XML (ej: foto1.jpg) + original_url = wagtail_image.get_rendition("original").url + xml_basename = os.path.basename(urlparse(original_url).path) + + # Si coincide con cualquiera → se acepta + if basename in (storage_basename, xml_basename): + assets.append(Asset(wagtail_image)) + + return assets diff --git a/markup_doc/labeling_utils.py b/markup_doc/labeling_utils.py new file mode 100644 index 0000000..ebd5409 --- /dev/null +++ b/markup_doc/labeling_utils.py @@ -0,0 +1,1125 @@ +import requests +import json +import re +from lxml import etree +from .choices import order_labels +from rest_framework_simplejwt.tokens import RefreshToken +from model_ai.models import LlamaModel + + +def getLLM(): + model_ai = LlamaModel.objects.first() + + if model_ai.api_key_gemini: + return 'GEMINI' + else: + return 'LLAMA' + + +def split_in_three(obj_reference, chunk_size=15): + if not obj_reference: + return [] + return [obj_reference[i:i + chunk_size] + for i in range(0, len(obj_reference), chunk_size)] + + +def extract_label_and_title(text): + """ + Extrae el Label (Figura/Figure/Tabla/Table/Tabela + número) y el Title (resto del texto limpio). + Ignora mayúsculas y minúsculas y limpia puntuación/espacios entre el número y el título. + """ + # Acepta Figura/Figure y Tabla/Table/Tabela + pattern = r'\b(Imagen|Imágen|Image|Imagem|Figura|Figure|Tabla|Table|Tabela)\s+(\d+)\b' + match = re.search(pattern, text, re.IGNORECASE) + + if match: + word = match.group(1).capitalize() # Normaliza capitalización + number = match.group(2) + label = f"{word} {number}" + + # Texto después del número + rest = text[match.end():] + + # Quita puntuación/espacios iniciales (.,;: guiones, etc.) + rest_clean = re.sub(r'^[\s\.,;:–—-]+', '', rest) + + return {"label": label, "title": rest_clean.strip()} + else: + return {"label": None, "title": text.strip()} + + +def create_special_content_object(item, stream_data_body, counts): + """Create objects for special content types (image, table, list, compound)""" + obj = {} + + if item.get('type') == 'image': + obj = {} + counts['numfig'] += 1 + obj['type'] = 'image' + obj['value'] = { + 'figid' : f"f{counts['numfig']}", + 'label' : '<fig>', + 'image' : item.get('image') + } + + #Obitiene el elemento aterior + try: + prev_element = stream_data_body[-1] + label_title = extract_label_and_title(prev_element['value']['paragraph']) + obj['value']['figlabel'] = label_title['label'] + obj['value']['title'] = label_title['title'] + stream_data_body.pop(-1) + except: + pass + + elif item.get('type') == 'table': + obj = {} + counts['numtab'] += 1 + obj['type'] = 'table' + obj['value'] = { + 'tabid' : f"t{counts['numtab']}", + 'label' : '<table>', + 'content' : item.get('table') + } + + #Obitiene el elemento aterior + try: + prev_element = stream_data_body[-1] + label_title = extract_label_and_title(prev_element['value']['paragraph']) + obj['value']['tablabel'] = label_title['label'] + obj['value']['title'] = label_title['title'] + stream_data_body.pop(-1) + except: + #No hay elemento anterior + pass + + elif item.get('type') == 'list': + obj = {} + obj['type'] = 'paragraph' + obj['value'] = { + 'label' : '<list>', + 'paragraph' : item.get('list') + } + + elif item.get('type') == 'compound': + obj = {} + counts['numeq'] += 1 + obj['type'] = 'compound_paragraph' + obj['value'] = { + 'eid' : f"e{counts['numeq']}", + #'label' : '<formula>', + 'content': item.get('text') + } + text_count = sum( + 1 for c in obj['value']['content'] + if c['type'] == 'text' + ) + + if text_count > 1: + obj['value']['label'] = '<inline-formula>' + return obj, counts + + if text_count == 0: + obj['value']['label'] = '<disp-formula>' + return obj, counts + + text_value = next( + item['value'] + for item in obj['value']['content'] + if item['type'] == 'text' + ) + text = is_number_parenthesis(text_value) + if text: + obj['value']['label'] = '<disp-formula>' + next( + item + for item in obj['value']['content'] + if item['type'] == 'text' + )['value'] = text + else: + obj['value']['label'] = '<inline-formula>' + + return obj, counts + + +from django.contrib.auth import get_user_model + +User = get_user_model() + + +def process_reference(num_ref, obj, user_id): + payload = { + 'reference': obj['value']['paragraph'] + } + + model = LlamaModel.objects.first() + + if model.name_file: + user = User.objects.get(pk=user_id) + refresh = RefreshToken.for_user(user) + access_token = refresh.access_token + + #url = "http://172.17.0.1:8400/api/v1/mix_citation/reference/" + #url = "http://172.17.0.1:8009/api/v1/mix_citation/reference/" + url = "http://django:8000/api/v1/reference/" + + headers = { + 'Authorization': f'Bearer {access_token}', + 'Content-Type': 'application/json' + } + + response = requests.post(url, json=payload, headers=headers) + + if response.status_code == 200: + response_json = response.json() + message_str = response_json['message'] + + json_str = message_str.replace('reference: ', '', 1) + + ref_json = json.loads(json_str) + + #ref_json = json.loads(response) + obj['type'] = 'ref_paragraph' + obj['value'] = { + 'paragraph': ref_json.get('full_text', None), + 'label': '<p>', + 'reftype': ref_json.get('reftype', None), + 'refid': 'B'+str(num_ref), + 'date': ref_json.get('date', None), + 'title': ref_json.get('title', None), + 'chapter': ref_json.get('chapter', None), + 'edition': ref_json.get('edition', None), + 'source': ref_json.get('source', None), + 'vol': ref_json.get('vol', None), + 'issue': ref_json.get('num', None), + 'pages': ref_json.get('pages', None), + 'lpage': ref_json.get('lpage', None), + 'fpage': ref_json.get('fpage', None), + 'doi': ref_json.get('doi', None), + 'access_id': ref_json.get('access_id', None), + 'degree': ref_json.get('degree', None), + 'organization': ref_json.get('organization', None), + 'location': ref_json.get('location', None), + 'org_location': ref_json.get('org_location', None), + 'num_pages': ref_json.get('num_pages', None), + 'uri': ref_json.get('uri', None), + 'version': ref_json.get('version', None), + 'access_date': ref_json.get('access_date', None), + 'authors': [] + } + authors = ref_json.get('authors', []) + for author in authors: + obj_auth = {} + obj_auth['type'] = 'Author' + obj_auth['value'] = {} + obj_auth['value']['surname'] = author.get('surname', None) + obj_auth['value']['given_names'] = author.get('fname', None) + obj['value']['authors'].append(obj_auth) + + return obj + + +def process_references(num_refs, references): + arr_references = [] + + for i, ref_json in enumerate(references): + obj = {} + obj['type'] = 'ref_paragraph' + obj['value'] = { + 'paragraph': ref_json.get('full_text', None), + 'label': '<p>', + 'reftype': ref_json.get('reftype', None), + 'refid': 'B'+str(num_refs[i] if i < len(num_refs) else ''), + 'date': ref_json.get('date', None), + 'title': ref_json.get('title', None), + 'chapter': ref_json.get('chapter', None), + 'edition': ref_json.get('edition', None), + 'source': ref_json.get('source', None), + 'vol': ref_json.get('vol', None), + 'issue': ref_json.get('num', None), + 'pages': ref_json.get('pages', None), + 'lpage': ref_json.get('lpage', None), + 'fpage': ref_json.get('fpage', None), + 'doi': ref_json.get('doi', None), + 'access_id': ref_json.get('access_id', None), + 'degree': ref_json.get('degree', None), + 'organization': ref_json.get('organization', None), + 'location': ref_json.get('location', None), + 'org_location': ref_json.get('org_location', None), + 'num_pages': ref_json.get('num_pages', None), + 'uri': ref_json.get('uri', None), + 'version': ref_json.get('version', None), + 'access_date': ref_json.get('access_date', None), + 'authors': [] + } + authors = ref_json.get('authors', []) + for author in authors: + obj_auth = {} + obj_auth['type'] = 'Author' + obj_auth['value'] = {} + obj_auth['value']['surname'] = author.get('surname', None) + obj_auth['value']['given_names'] = author.get('fname', None) + obj['value']['authors'].append(obj_auth) + arr_references.append(obj) + + return arr_references + + +def get_data_first_block(text, metadata, user_id): + payload = { + 'text': text, + 'metadata': metadata + } + + model = LlamaModel.objects.first() + + if model.name_file: + user = User.objects.get(pk=user_id) + refresh = RefreshToken.for_user(user) + access_token = refresh.access_token + + url = "http://django:8000/api/v1/first_block/" + + headers = { + 'Authorization': f'Bearer {access_token}', + 'Content-Type': 'application/json' + } + + response = requests.post(url, json=payload, headers=headers) + + if response.status_code == 200: + response_json = response.json() + message_str = response_json['message'] + + resp_json = json.loads(message_str) + + return resp_json + +def match_by_regex(text, order_labels): + return next( + (key_obj for key_obj in order_labels.items() + if "regex" in key_obj[1] and re.search(key_obj[1]["regex"], text)), + None + ) + + +def match_by_style_and_size(item, order_labels, style='bold'): + return next( + (key_obj for key_obj in order_labels.items() + if "size" in key_obj[1] and style in key_obj[1] and + key_obj[1]["size"] == item.get('font_size') and + key_obj[1][style] == item.get(style)), + None + ) + + +def match_next_label(item, label_next, order_labels): + return next( + (key_obj for key_obj in order_labels.items() + if "size" in key_obj[1] and key_obj[1]["size"] == item.get('font_size') + and key_obj[0] == label_next), + None + ) + + +def match_paragraph(item, order_labels): + return next( + (key_obj for key_obj in order_labels.items() + if "size" in key_obj[1] and + "next" in key_obj[1] and + key_obj[1]["size"] == item.get('font_size') and + key_obj[1]["next"] == "<p>"), + None + ) + + +def match_section(item, sections): + return {'label': '<sec>', 'body': True} if ( + item.get('font_size') == sections[0].get('size') and + item.get('bold') == sections[0].get('bold') and + item.get('text', '').isupper() == sections[0].get('isupper') + ) else None + + +def match_subsection(item, sections): + return {'label': '<sub-sec>', 'body': True} if ( + item.get('font_size') == sections[1].get('size') and + item.get('bold') == sections[1].get('bold') and + item.get('text', '').isupper() == sections[1].get('isupper') + ) else None + + +def extract_keywords(text): + # Quitar punto final si existe + text = text.strip() + if text.endswith('.'): + text = text[:-1].strip() + + # Ver si contiene una etiqueta con dos puntos + match = re.match(r'(?i)\s*(.+?)\s*:\s*(.+)', text) + + if match: + label = match.group(1).strip() + content = match.group(2).strip() + else: + label = None + content = text + + # Separar por punto y coma o coma + keywords = re.split(r'\s*[;,]\s*', content) + clean_keywords = [p.strip() for p in keywords if p.strip()] + clean_keywords = ", ".join(keywords) + + return {"title": label, "keywords": clean_keywords} + + +def extract_subsection(text): + # Quitar punto final si existe + text = text.strip() + + # Ver si contiene una etiqueta con dos puntos + match = re.match(r'(?i)\s*(.+?)\s*:\s*(.+)', text) + + if match: + label = match.group(1).strip() + content = match.group(2).strip() + else: + label = None + content = text + + return {"title": label, "content": content} + + +def create_labeled_object2(i, item, state, sections): + obj = {} + result = None + + if match_section(item, sections): + result = match_section(item, sections) + state['label'] = result.get('label') + state['body'] = result.get('body') + + if match_subsection(item, sections): + result = match_subsection(item, sections) + state['label'] = result.get('label') + state['body'] = result.get('body') + + if state.get('body') and re.search(r"^(refer)", item.get('text').lower()) and match_section(item, sections): + state['label'] = '<sec>' + state['body'] = False + state['back'] = True + obj['type'] = 'paragraph' + obj['value'] = { + 'label': state['label'], + 'paragraph': item.get('text') + } + + if not result: + result = {'label': '<p>', 'body': state['body'], 'back': state['back']} + state['label'] = result.get('label') + state['body'] = result.get('body') + state['back'] = result.get('back') + + if result: + pass + else: + if state.get('label_next'): + if state.get('repeat'): + result = match_by_regex(item.get('text'), order_labels) + if result: + state['label'] = result[0] + else: + result = match_by_style_and_size(item, order_labels, style='bold') + if result: + state['label'] = result[0] + state['repeat'] = None + state['reset'] = None + state['label_next'] = result[1].get("next") + state['body'] = result[1].get("size") == 16 + if state['body'] and re.search(r"^(refer)", item.get('text').lower()): + state['body'] = False + state['back'] = True + if not result: + result = match_next_label(item, state['label_next'], order_labels) + if result: + state['label'] = result[0] + state['label_next_reset'] = result[1].get("next") + state['reset'] = result[1].get("reset", False) + state['repeat'] = result[1].get("repeat", False) + else: + result = match_by_style_and_size(item, order_labels, style='bold') + if result: + state['label'] = result[0] + state['label_next'] = result[1].get("next") + if state.get('body') and re.search(r"^(refer)", item.get('text').lower()): + state['body'] = False + state['back'] = True + else: + result = match_by_style_and_size(item, order_labels, style='italic') + if result: + state['label'] = re.sub(r"-\d+", "", result[0]) + state['label_next'] = result[1].get("next") + else: + result = match_by_regex(item.get('text'), order_labels) + if result: + state['label'] = result[0] + else: + result = match_paragraph(item, order_labels) + if result: + state['label'] = result[0] + + if result: + if state['label'] in ['<abstract>']: + order_labels.pop(state['label'], None) + + #label_info = result[1] + #obj['type'] = 'paragraph_with_language' if label_info.get("lan") else 'paragraph' + obj['type'] = 'paragraph' + + obj['value'] = { + 'label': state['label'], + 'paragraph': item.get('text') + } + + if state['label'] == '<contrib>': + obj['type'] = 'author_paragraph' + elif state['label'] == '<aff>': + obj['type'] = 'aff_paragraph' + + if re.search(r"^(translation)", item.get('text').lower()): + state['label'] = '<translate-fron>' + state['body'] = False + state['back'] = False + obj['type'] = 'paragraph_with_language' + obj['value'] = { + 'label': state['label'], + 'paragraph': item.get('text') + } + + return obj, result, state + + +def buscar_refid_por_surname_y_date(data_back, surname_buscado, date_buscado): + """ + Busca un bloque RefParagraphBlock que contenga un author con el surname especificado + y que coincida con la fecha dada. Retorna el refid si encuentra una coincidencia. + """ + for bloque in data_back: # Reemplaza 'contenido' con el nombre de tu StreamField + if bloque['type'] == 'ref_paragraph': # o el nombre que usaste en el StreamField + data = bloque['value'] + + # Verificar la fecha + if str(data.get('date')) != str(date_buscado[:4]): + continue + + # Revisar autores + authors = data.get('authors', []) + + surname_buscados = surname_buscado.split(',') + + for surname_buscado in surname_buscados: + if ' y ' in surname_buscado or ' and ' in surname_buscado or ' e ' in surname_buscado or ' & ' in surname_buscado: + if ' y ' in surname_buscado: + surname1 = surname_buscado.split(' y ')[0].strip().lower() + surname2 = surname_buscado.split(' y ')[1].strip().lower() + + if ' and ' in surname_buscado: + surname1 = surname_buscado.split(' and ')[0].strip().lower() + surname2 = surname_buscado.split(' and ')[1].strip().lower() + + if ' & ' in surname_buscado: + surname1 = surname_buscado.split(' & ')[0].strip().lower() + surname2 = surname_buscado.split(' & ')[1].strip().lower() + + if ' e ' in surname_buscado: + surname1 = surname_buscado.split(' e ')[0].strip().lower() + surname2 = surname_buscado.split(' e ')[1].strip().lower() + + for author_bloque in authors: + if author_bloque['type'] == 'Author': + author_data = author_bloque['value'] + if surname1 in (author_data.get('surname') or '').lower() + ' ' + (author_data.get('given_names') or '').lower(): + for author_bloque2 in authors: + if author_bloque2['type'] == 'Author': + author_data = author_bloque2['value'] + if surname2 in (author_data.get('surname') or '').lower() + ' ' + (author_data.get('given_names') or '').lower(): + return data.get('refid') + + for author_bloque in authors: + if author_bloque['type'] == 'Author': + author_data = author_bloque['value'] + + if surname_buscado.strip().lower() in (author_data.get('surname') or '').lower() + ' ' + (author_data.get('given_names') or '').lower(): + return data.get('refid') + + if surname_buscado.strip().lower() in (data.get('paragraph') or '').lower(): + return data.get('refid') + + return None + + +def extract_citation_apa(texto, data_back): + """ + Extrae citas en formato APA dentro de un texto y devuelve: + - la cita completa, + - el primer autor, + - el año. + Acepta múltiples espacios entre palabras y símbolos. + """ + + # Preposiciones comunes en apellidos + preposiciones = r'(?:de|del|la|los|las|da|do|dos|das|van|von)' + # Apellido compuesto o con preposición (incluye caracteres portugueses: ç, ã, õ, etc.) + apellido = rf'[A-ZÁÉÍÓÚÑÇÃÕÂÊÎÔÛ][a-záéíóúñçãõâêîôû]+(?:[-‐\s]+(?:{preposiciones})?\s*[A-ZÁÉÍÓÚÑÇÃÕÂÊÎÔÛ]?[a-záéíóúñçãõâêîôû]+)*' + resultados = [] + + # 1. Buscar todas las citas dentro de paréntesis + for paren in re.finditer(r'\(([^)]+)\)', texto): + contenido_completo = paren.group(1) + + # Si hay punto y coma, dividir las citas + if ';' in contenido_completo: + partes = [parte for parte in contenido_completo.split(';')] + else: + partes = [contenido_completo] + + # Variable para rastrear el contexto de autores dentro del mismo paréntesis + autores_en_parentesis = [] + + for i, parte in enumerate(partes): + parte = parte # Agregar strip aquí para limpiar espacios + if not parte: + continue + + # Caso especial: solo año (para citas como "2017" después de "2014;") + # MEJORADO: Solo aplicar si hay citas previas EN EL MISMO PARÉNTESIS + if re.match(r'^\s*\d{4}[a-z]?\s*$', parte): + # Solo usar el último autor si hay autores en el mismo paréntesis + if autores_en_parentesis: + ultimo_autor = autores_en_parentesis[-1] + refid = buscar_refid_por_surname_y_date(data_back, ultimo_autor, parte) + resultados.append({ + "cita": parte, + "autor": ultimo_autor, + "anio": parte, + "refid": refid + }) + # Si no hay autores previos en el paréntesis, ignorar (posible error) + continue + + # Patrones para diferentes tipos de citas + cita_encontrada = False + + # Patrón 1: Múltiples autores con & y coma antes del año + # Ejemplo: "Porta, Lopez-De-Silanes, & Shleifer, 1999" + pattern1 = rf'(?P<autores>{apellido}(?:\s*,\s*{apellido})*\s*,?\s*&\s*{apellido})\s*,\s*(?P<anio>\d{{4}}[a-z]?)' + match = re.search(pattern1, parte) + if match: + autores_completos = match.group("autores") + anio = match.group("anio") + primer_autor = re.split(r'\s*,\s*', autores_completos)[0] + autores_en_parentesis.append(primer_autor) + refid = buscar_refid_por_surname_y_date(data_back, primer_autor, anio) + resultados.append({ + "cita": parte, + "autor": primer_autor, + "anio": anio, + "refid": refid + }) + cita_encontrada = True + + # Patrón 2: Múltiples autores con & SIN coma antes del año + # Ejemplo: "Silva, Peixoto, & Tizziotti 2021" + if not cita_encontrada: + pattern2 = rf'(?P<autores>{apellido}(?:\s*,\s*{apellido})*\s*,?\s*&\s*{apellido})\s+(?P<anio>\d{{4}}[a-z]?)' + match = re.search(pattern2, parte) + if match: + autores_completos = match.group("autores") + anio = match.group("anio") + primer_autor = re.split(r'\s*,\s*', autores_completos)[0] + autores_en_parentesis.append(primer_autor) + refid = buscar_refid_por_surname_y_date(data_back, primer_autor, anio) + resultados.append({ + "cita": parte, + "autor": primer_autor, + "anio": anio, + "refid": refid + }) + cita_encontrada = True + + # Patrón 3: Dos autores con & (simple) + # Ejemplo: "Crisóstomo & Brandão, 2019" + if not cita_encontrada: + pattern3 = rf'(?P<autor1>{apellido})\s*&\s*(?P<autor2>{apellido})\s*,\s*(?P<anio>\d{{4}}[a-z]?)' + match = re.search(pattern3, parte) + if match: + primer_autor = match.group("autor1") + anio = match.group("anio") + autores_en_parentesis.append(primer_autor) + refid = buscar_refid_por_surname_y_date(data_back, primer_autor, anio) + resultados.append({ + "cita": parte, + "autor": primer_autor, + "anio": anio, + "refid": refid + }) + cita_encontrada = True + + # Patrón 4: Autor con "et al." con coma + # Ejemplo: "Brandão et al., 2019" + if not cita_encontrada: + pattern4 = rf'(?P<autor>{apellido})\s+et\s+al\s*\.?\s*,\s*(?P<anio>\d{{4}}[a-z]?)' + match = re.search(pattern4, parte) + if match: + autor = match.group("autor") + anio = match.group("anio") + autores_en_parentesis.append(autor) + refid = buscar_refid_por_surname_y_date(data_back, autor, anio) + resultados.append({ + "cita": parte, + "autor": autor, + "anio": anio, + "refid": refid + }) + cita_encontrada = True + + # Patrón 5: Autor con "et al." sin coma + # Ejemplo: "Brandão et al. 2019" + if not cita_encontrada: + pattern5 = rf'(?P<autor>{apellido})\s+et\s+al\s*\.?\s+(?P<anio>\d{{4}}[a-z]?)' + match = re.search(pattern5, parte) + if match: + autor = match.group("autor") + anio = match.group("anio") + autores_en_parentesis.append(autor) + refid = buscar_refid_por_surname_y_date(data_back, autor, anio) + resultados.append({ + "cita": parte, + "autor": autor, + "anio": anio, + "refid": refid + }) + cita_encontrada = True + + # Patrón 6: Múltiples autores solo con comas (sin &) + # Ejemplo: "Adam, Tene, Mucci, Beck, 2020" o "Correia, Amaral, Louvet, 2014a" + if not cita_encontrada: + pattern6 = rf'(?P<autores>{apellido}(?:\s*,\s*{apellido}){{2,}})\s*,\s*(?P<anio>\d{{4}}[a-z]?)' + match = re.search(pattern6, parte) + if match: + autores_completos = match.group("autores") + anio = match.group("anio") + primer_autor = re.split(r'\s*,\s*', autores_completos)[0] + autores_en_parentesis.append(primer_autor) + refid = buscar_refid_por_surname_y_date(data_back, primer_autor, anio) + resultados.append({ + "cita": parte, + "autor": primer_autor, + "anio": anio, + "refid": refid + }) + cita_encontrada = True + + # Patrón 7: Autor simple con coma + # Ejemplo: "Smith, 2020" + if not cita_encontrada: + pattern7 = rf'(?P<autor>{apellido})\s*,\s*(?P<anio>\d{{4}}[a-z]?)' + match = re.search(pattern7, parte) + if match: + autor = match.group("autor") + anio = match.group("anio") + autores_en_parentesis.append(autor) + refid = buscar_refid_por_surname_y_date(data_back, autor, anio) + resultados.append({ + "cita": parte, + "autor": autor, + "anio": anio, + "refid": refid + }) + cita_encontrada = True + + # 2. Citas fuera del paréntesis: Nombre (2000) o Nombre et al. (2000) + # MEJORADO: Filtrar citas que están precedidas por preposiciones + + # Lista de preposiciones a evitar + preposiciones_evitar = ['de', 'del', 'la', 'los', 'las', 'da', 'do', 'dos', 'das', 'van', 'von'] + + # Patrón para citas con múltiples años: Autor (2018, 2019) + patron_multiples_años = rf'(?P<autor>{apellido})(?:\s*[-‐]\s*{apellido})*(?:\s+et\s+al\s*\.?|\s+(?:y|and|&)\s+{apellido})?\s*\(\s*(?P<años>\d{{4}}[a-z]?(?:\s*,\s*\d{{4}}[a-z]?)+)\s*\)' + + for match in re.finditer(patron_multiples_años, texto): + # Verificar que no haya preposición antes de la cita + inicio_match = match.start() + texto_anterior = texto[:inicio_match].split() + + # Si hay palabras antes y la última es una preposición, saltarse esta cita + if texto_anterior and texto_anterior[-1].lower() in preposiciones_evitar: + continue + + autor = match.group("autor") + años_str = match.group("años") + # Separar los años y crear una cita para cada uno + años = [año for año in años_str.split(',')] + + for año in años: + refid = buscar_refid_por_surname_y_date(data_back, autor, año) + resultados.append({ + "cita": f"{autor} et al. ({año})" if "et al" in match.group(0) else f"{autor} ({año})", + "autor": autor, + "anio": año, + "refid": refid + }) + + # Patrón para citas simples: Nombre (2000) o Nombre et al. (2000) + patron_afuera = rf'(?P<autor>{apellido})(?:\s*[-‐]\s*{apellido})*(?:\s+et\s+al\s*\.?|\s+(?:y|and|&)\s+{apellido})?\s*\(\s*(?P<anio>\d{{4}}[a-z]?)\s*\)' + + for match in re.finditer(patron_afuera, texto): + # Verificar que no haya preposición antes de la cita + inicio_match = match.start() + texto_anterior = texto[:inicio_match].split() + + # Si hay palabras antes y la última es una preposición, saltarse esta cita + if texto_anterior and texto_anterior[-1].lower() in preposiciones_evitar: + continue + + autor = match.group("autor") + anio = match.group("anio") + + # Verificar que no sea parte de una cita con múltiples años ya procesada + cita_completa = match.group(0) + es_multiple = False + for resultado in resultados: + if resultado["autor"] == autor and resultado["anio"] == anio and "," in cita_completa: + es_multiple = True + break + + if not es_multiple: + refid = buscar_refid_por_surname_y_date(data_back, autor, anio) + resultados.append({ + "cita": cita_completa, + "autor": autor, + "anio": anio, + "refid": refid + }) + + return resultados + + +def clean_labels(texto): + """ + Elimina todas las etiquetas XML del texto. + """ + # Patrón para encontrar etiquetas XML (apertura y cierre) + patron_etiquetas = r'<[^>]+>' + texto_limpio = re.sub(patron_etiquetas, '', texto) + + # Limpiar espacios múltiples que puedan haber quedado + #texto_limpio = re.sub(r'\s+', ' ', texto_limpio) + + return texto_limpio#.strip() + + +def map_text(texto): + """ + Crea un mapa de TODO lo que esté etiquetado en el texto. + Clave: texto sin etiquetas, Valor: texto con etiquetas + """ + mapa = {} + + # Buscar TODAS las etiquetas y su contenido + patron = r'<[^>]+>.*?</[^>]+>|<[^/>]+/>' + matches = re.findall(patron, texto, re.DOTALL) + + for match in matches: + contenido_limpio = clean_labels(match)#.strip() + if contenido_limpio: # Solo si hay contenido real + mapa[contenido_limpio] = match#.strip() + + return mapa + + +def search_position(texto, substring): + """ + Encuentra todas las posiciones donde aparece un substring en el texto. + """ + posiciones = [] + inicio = 0 + while True: + pos = texto.find(substring, inicio) + if pos == -1: + break + posiciones.append((pos, pos + len(substring))) + inicio = pos + 1 + return posiciones + + +def extract_labels(texto_original, texto_limpio, pos_inicio, pos_fin): + """ + Extrae un fragmento específico del texto original basado en posiciones del texto limpio. + """ + contador_chars_limpios = 0 + resultado = "" + dentro_del_rango = False + + i = 0 + while i < len(texto_original) and contador_chars_limpios <= pos_fin: + char = texto_original[i] + + if char == '<': + # Encontrar el final de la etiqueta + fin_etiqueta = texto_original.find('>', i) + if fin_etiqueta != -1: + etiqueta = texto_original[i:fin_etiqueta + 1] + + # Si estamos dentro del rango, incluir la etiqueta + if dentro_del_rango: + resultado += etiqueta + + i = fin_etiqueta + 1 + continue + + # Verificar si entramos o salimos del rango + if contador_chars_limpios == pos_inicio: + dentro_del_rango = True + elif contador_chars_limpios == pos_fin: + dentro_del_rango = False + break + + # Si estamos dentro del rango, incluir el caracter + if dentro_del_rango: + resultado += char + + contador_chars_limpios += 1 + i += 1 + + return resultado + + +def restore_labels_ref(ref, mapa_etiquetado, texto_original, texto_limpio): + """ + Restaura las etiquetas en una referencia específica usando el mapa y verificando posición. + Solo reemplaza si el contenido estaba realmente etiquetado en esa posición específica. + """ + # Encontrar todas las posiciones donde aparece esta ref en el texto limpio + posiciones_ref = search_position(texto_limpio, ref) + + if not posiciones_ref: + return ref + + # Para cada posición, extraer el fragmento original y ver si contiene etiquetas + mejores_candidatos = [] + + for pos_inicio, pos_fin in posiciones_ref: + fragmento_original = extract_labels( + texto_original, texto_limpio, pos_inicio, pos_fin + ) + + # Si el fragmento original es diferente al ref, significa que tenía etiquetas + if fragmento_original != ref: + mejores_candidatos.append(fragmento_original) + + # Si encontramos candidatos con etiquetas, devolver el primero + if mejores_candidatos: + return mejores_candidatos[0] + + # Si no hay candidatos con etiquetas, devolver el ref original sin modificar + return ref + + +def proccess_labeled_text(texto, data_back): + """ + Procesa un texto eliminando etiquetas XML, extrae citas APA y las devuelve + con sus etiquetas originales restauradas. + + Args: + texto (str): Texto original con etiquetas XML + extraer_citas_apa (function): Función que extrae citas del texto limpio + + Returns: + list: Lista de citas con etiquetas XML restauradas + """ + + # Crear mapa de transformaciones + mapa_transformaciones = map_text(texto) + #print(f"mapa: {mapa_transformaciones}") + + # Limpiar texto eliminando etiquetas + texto_limpio = clean_labels(texto) + + # Extraer citas del texto limpio + refs = extract_citation_apa(texto_limpio, data_back) + #print(f"refs: {refs}") + + # 4. Para cada ref, usar posición para restaurar solo lo que realmente estaba etiquetado + refs_con_etiquetas = [] + for ref in refs: + ref_restaurada = ref + ref_restaurada['cita'] = restore_labels_ref(ref['cita'], mapa_transformaciones, texto, texto_limpio) + refs_con_etiquetas.append(ref_restaurada) + + return refs_con_etiquetas + + +def search_special_id(data_body, label): + for d in data_body: + if d['type'] in ['image', 'table']: + data = d['value'] + clean_label = re.sub(r'^[\s\.,;:–—-]+', '', label).capitalize() + + if d['type'] == 'image': + if clean_label == data['figlabel']: + return data.get('figid') + if data['figid'][0] == clean_label.lower()[0] and data['figid'][1] in clean_label.lower(): + return data.get('figid') + + if d['type'] == 'table': + if clean_label == data['tablabel']: + return data.get('tabid') + if data['tabid'][0] == clean_label.lower()[0] and data['tabid'][1] in clean_label.lower(): + return data.get('tabid') + + for d in data_body: + if d['type'] in ['compound_paragraph']: + data = d['value'] + clean_label = re.sub(r'^[\s\.,;:–—-]+', '', label).lower() + + if d['type'] == 'compound_paragraph': + if data['eid'][0] in clean_label[0] and data['eid'][1] in clean_label: + return data.get('eid') + + return None + + +def is_number_parenthesis(text): + pattern = re.compile(r'^\s*\(\s*(\d+)\s*\)\s*$') + match = pattern.fullmatch(text) + if match: + return f"({match.group(1)})" + return None + + +def proccess_special_content(text, data_body): + # normaliza espacios no separables por si acaso + text = re.sub(r'[\u00A0\u2007\u202F]', ' ', text) + + pattern = r""" + (?<!\w) # inicio no al medio de una palabra + (?: + Imagen|Imágen|Image|Imagem| + Figura|Figure| + Tabla|Table|Tabela| + Ecuaci[oó]n|Equa(?:ç[aã]o|cao)|Equation| + F[oó]rmula|Formula| + Eq\.|Ec\.|Form\.|F[óo]rm\. + )\s* + (?:\(\s*\d+\s*\)|\d+) # 1 o (1) + (?!\w) # que no siga una letra/número + """ + + res = [] + dict_type = {'f': 'fig', 't': 'table', 'e': 'disp-formula'} + + try: + for match in re.finditer(pattern, text, re.IGNORECASE | re.UNICODE | re.VERBOSE): + label = match.group(0) + + id = search_special_id(data_body, label) + + res.append({ + "label": label, + "id": id, + "reftype": dict_type.get(id[0].lower(), 'other') + }) + except Exception as exc: + print(f'ERROR proccess_special_content: {exc}') + pass + + return res + + +def remove_unpaired_tags(text): + # Match opening/closing tags, capturing only the tag name (before any space or >) + pattern = re.compile(r'<(/?)([a-zA-Z0-9]+)(?:\s[^>]*)?>') + + result = [] + stack = [] # Stores (tag_name, position_in_result) + + i = 0 + for match in pattern.finditer(text): + is_closing, tag_name = match.groups() + is_closing = bool(is_closing) + + # Text between tags + if match.start() > i: + result.append(text[i:match.start()]) + + tag_text = text[match.start():match.end()] + + if not is_closing: + # Opening tag + stack.append((tag_name, len(result))) + result.append(tag_text) + else: + # Closing tag + if stack and stack[-1][0] == tag_name: + stack.pop() + result.append(tag_text) + else: + # Orphan closing tag - skip + pass + + i = match.end() + + # Append remaining text + if i < len(text): + result.append(text[i:]) + + # Remove unclosed opening tags + for tag_name, pos in sorted(stack, reverse=True, key=lambda x: x[1]): + result.pop(pos) + + return ''.join(result) + + +def append_fragment(node_dest, val): + if not val: + parent = node_dest.getparent() + if parent: + parent.remove(node_dest) + return + + # 1) Limpiezas mínimas + # - eliminar <br> / <br/> + # - quitar saltos de línea + clean = re.sub(r"(?i)<br\s*/?>", "", val) + clean = clean.replace("\n", "") + + # normaliza entidades problemáticas + clean = clean.replace(" ", " ") + clean = re.sub(r'&(?!\w+;|#\d+;)', '&', clean) + + clean = remove_unpaired_tags(clean) + + if clean == "": + parent = node_dest.getparent() + if parent: + parent.remove(node_dest) + return + + # 2) Si no hay etiquetas, es texto plano + if "<" not in clean: + node_dest.text = (node_dest.text or "") + clean + return + + # 3) Envolver para que sea XML bien formado aunque empiece con texto + wrapper = etree.XML(f"<_wrap_>{clean}</_wrap_>") + + # 4) Pasar el texto inicial (antes del primer tag) + if wrapper.text: + node_dest.text = (node_dest.text or "") + wrapper.text + + # 5) Mover cada hijo al destino (sus .tail se conservan) + for child in list(wrapper): + node_dest.append(child) + + \ No newline at end of file diff --git a/markup_doc/marker.py b/markup_doc/marker.py new file mode 100644 index 0000000..a811cbd --- /dev/null +++ b/markup_doc/marker.py @@ -0,0 +1,37 @@ +from model_ai.generic_llama import GenericLlama +from model_ai.function_llama import functionsLlama + +import re + + +def mark_article(text, metadata): + if metadata == 'author': + messages, response_format = functionsLlama.getAuthorConfig() + if metadata == 'affiliation': + messages, response_format = functionsLlama.getAffiliations() + if metadata == 'doi': + messages, response_format = functionsLlama.getDoiAndSection() + if metadata == 'title': + messages, response_format = functionsLlama.getTitles() + + gll = GenericLlama(messages, response_format) + output = gll.run(text) + output = output['choices'][0]['message']['content'] + if metadata == 'doi': + output = re.search(r'\{.*\}', output, re.DOTALL) + else: + output = re.search(r'\[.*\]', output, re.DOTALL) + if output: + output = output.group(0) + return output + +def mark_references(reference_block): + for ref_row in reference_block.split("\n"): + ref_row = ref_row.strip() + if ref_row: + choices = mark_reference(ref_row) + yield { + "reference": ref_row, + "choices": list(choices) + } + diff --git a/markup_doc/migrations/0001_initial.py b/markup_doc/migrations/0001_initial.py new file mode 100644 index 0000000..74340ef --- /dev/null +++ b/markup_doc/migrations/0001_initial.py @@ -0,0 +1,2291 @@ +# Generated by Django 5.0.3 on 2025-09-07 17:04 + +import django.db.models.deletion +import markup_doc.models +import wagtail.blocks +import wagtail.fields +import wagtail.images.blocks +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="CollectionValuesModel", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("acron", models.CharField(max_length=10, unique=True)), + ("name", models.CharField(max_length=255)), + ], + ), + migrations.CreateModel( + name="ArticleDocx", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created", + models.DateTimeField( + auto_now_add=True, verbose_name="Creation date" + ), + ), + ( + "updated", + models.DateTimeField( + auto_now=True, verbose_name="Last update date" + ), + ), + ( + "title", + models.TextField( + blank=True, null=True, verbose_name="Document Title" + ), + ), + ( + "file", + models.FileField( + blank=True, + null=True, + upload_to="uploads_docx/", + verbose_name="Document", + ), + ), + ("estatus", models.IntegerField(default=0)), + ( + "creator", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_creator", + to=settings.AUTH_USER_MODEL, + verbose_name="Creator", + ), + ), + ( + "updated_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_last_mod_user", + to=settings.AUTH_USER_MODEL, + verbose_name="Updater", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="ArticleDocxMarkup", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created", + models.DateTimeField( + auto_now_add=True, verbose_name="Creation date" + ), + ), + ( + "updated", + models.DateTimeField( + auto_now=True, verbose_name="Last update date" + ), + ), + ( + "title", + models.TextField( + blank=True, null=True, verbose_name="Document Title" + ), + ), + ( + "file", + models.FileField( + blank=True, + null=True, + upload_to="uploads_docx/", + verbose_name="Document", + ), + ), + ("estatus", models.IntegerField(default=0)), + ( + "collection", + models.CharField( + default=markup_doc.models.get_default_collection_acron, + max_length=10, + ), + ), + ( + "journal_title", + models.TextField( + blank=True, null=True, verbose_name="Journal Title" + ), + ), + ( + "acronym", + models.TextField(blank=True, null=True, verbose_name="Acronym"), + ), + ( + "short_title", + models.TextField(blank=True, null=True, verbose_name="Short Title"), + ), + ( + "title_nlm", + models.TextField(blank=True, null=True, verbose_name="NLM Title"), + ), + ( + "issn", + models.TextField( + blank=True, null=True, verbose_name="ISSN (id SciELO)" + ), + ), + ( + "pissn", + models.TextField(blank=True, null=True, verbose_name="Print ISSN"), + ), + ( + "eissn", + models.TextField( + blank=True, null=True, verbose_name="Electronic ISSN" + ), + ), + ( + "nimtitle", + models.TextField(blank=True, null=True, verbose_name="Nimtitle"), + ), + ( + "pubname", + models.TextField( + blank=True, null=True, verbose_name="Publisher Name" + ), + ), + ( + "license", + models.URLField( + blank=True, + max_length=500, + null=True, + verbose_name="License (URL)", + ), + ), + ( + "vol", + models.IntegerField(blank=True, null=True, verbose_name="Volume"), + ), + ( + "supplvol", + models.IntegerField( + blank=True, null=True, verbose_name="Suppl Volume" + ), + ), + ( + "issue", + models.IntegerField(blank=True, null=True, verbose_name="Issue"), + ), + ( + "supplno", + models.IntegerField( + blank=True, null=True, verbose_name="Suppl Num" + ), + ), + ( + "issid_part", + models.TextField(blank=True, null=True, verbose_name="Isid Part"), + ), + ( + "dateiso", + models.TextField(blank=True, null=True, verbose_name="Dateiso"), + ), + ( + "month", + models.TextField( + blank=True, null=True, verbose_name="Month/Season" + ), + ), + ( + "fpage", + models.TextField(blank=True, null=True, verbose_name="First Page"), + ), + ("seq", models.TextField(blank=True, null=True, verbose_name="@Seq")), + ( + "lpage", + models.TextField(blank=True, null=True, verbose_name="Last Page"), + ), + ( + "elocatid", + models.TextField( + blank=True, null=True, verbose_name="Elocation ID" + ), + ), + ( + "order", + models.TextField( + blank=True, null=True, verbose_name="Order (In TOC)" + ), + ), + ( + "pagcount", + models.TextField(blank=True, null=True, verbose_name="Pag count"), + ), + ( + "doctopic", + models.TextField(blank=True, null=True, verbose_name="Doc Topic"), + ), + ( + "language", + models.CharField( + blank=True, + choices=[ + ("aa", "Afar"), + ("af", "Afrikaans"), + ("ak", "Akan"), + ("sq", "Albanian"), + ("am", "Amharic"), + ("ar", "Arabic"), + ("an", "Aragonese"), + ("hy", "Armenian"), + ("as", "Assamese"), + ("av", "Avaric"), + ("ae", "Avestan"), + ("ay", "Aymara"), + ("az", "Azerbaijani"), + ("bm", "Bambara"), + ("ba", "Bashkir"), + ("eu", "Basque"), + ("be", "Belarusian"), + ("bn", "Bengali"), + ("bi", "Bislama"), + ("bs", "Bosnian"), + ("br", "Breton"), + ("bg", "Bulgarian"), + ("my", "Burmese"), + ("ca", "Catalan, Valencian"), + ("ch", "Chamorro"), + ("ce", "Chechen"), + ("ny", "Chichewa, Chewa, Nyanja"), + ("zh", "Chinese"), + ( + "cu", + "Church Slavic, Old Slavonic, Church Slavonic, Old Bulgarian, Old Church Slavonic", + ), + ("cv", "Chuvash"), + ("kw", "Cornish"), + ("co", "Corsican"), + ("cr", "Cree"), + ("hr", "Croatian"), + ("cs", "Czech"), + ("da", "Danish"), + ("dv", "Divehi, Dhivehi, Maldivian"), + ("nl", "Dutch, Flemish"), + ("dz", "Dzongkha"), + ("en", "English"), + ("eo", "Esperanto"), + ("et", "Estonian"), + ("ee", "Ewe"), + ("fo", "Faroese"), + ("fj", "Fijian"), + ("fi", "Finnish"), + ("fr", "French"), + ("fy", "Western Frisian"), + ("ff", "Fulah"), + ("gd", "Gaelic, Scottish Gaelic"), + ("gl", "Galician"), + ("lg", "Ganda"), + ("ka", "Georgian"), + ("de", "German"), + ("el", "Greek, Modern (1453–)"), + ("kl", "Kalaallisut, Greenlandic"), + ("gn", "Guarani"), + ("gu", "Gujarati"), + ("ht", "Haitian, Haitian Creole"), + ("ha", "Hausa"), + ("he", "Hebrew"), + ("hz", "Herero"), + ("hi", "Hindi"), + ("ho", "Hiri Motu"), + ("hu", "Hungarian"), + ("is", "Icelandic"), + ("io", "Ido"), + ("ig", "Igbo"), + ("id", "Indonesian"), + ( + "ia", + "Interlingua (International Auxiliary Language Association)", + ), + ("ie", "Interlingue, Occidental"), + ("iu", "Inuktitut"), + ("ik", "Inupiaq"), + ("ga", "Irish"), + ("it", "Italian"), + ("ja", "Japanese"), + ("jv", "Javanese"), + ("kn", "Kannada"), + ("kr", "Kanuri"), + ("ks", "Kashmiri"), + ("kk", "Kazakh"), + ("km", "Central Khmer"), + ("ki", "Kikuyu, Gikuyu"), + ("rw", "Kinyarwanda"), + ("ky", "Kirghiz, Kyrgyz"), + ("kv", "Komi"), + ("kg", "Kongo"), + ("ko", "Korean"), + ("kj", "Kuanyama, Kwanyama"), + ("ku", "Kurdish"), + ("lo", "Lao"), + ("la", "Latin"), + ("lv", "Latvian"), + ("li", "Limburgan, Limburger, Limburgish"), + ("ln", "Lingala"), + ("lt", "Lithuanian"), + ("lu", "Luba-Katanga"), + ("lb", "Luxembourgish, Letzeburgesch"), + ("mk", "Macedonian"), + ("mg", "Malagasy"), + ("ms", "Malay"), + ("ml", "Malayalam"), + ("mt", "Maltese"), + ("gv", "Manx"), + ("mi", "Maori"), + ("mr", "Marathi"), + ("mh", "Marshallese"), + ("mn", "Mongolian"), + ("na", "Nauru"), + ("nv", "Navajo, Navaho"), + ("nd", "North Ndebele"), + ("nr", "South Ndebele"), + ("ng", "Ndonga"), + ("ne", "Nepali"), + ("no", "Norwegian"), + ("nb", "Norwegian Bokmål"), + ("nn", "Norwegian Nynorsk"), + ("ii", "Sichuan Yi, Nuosu"), + ("oc", "Occitan"), + ("oj", "Ojibwa"), + ("or", "Oriya"), + ("om", "Oromo"), + ("os", "Ossetian, Ossetic"), + ("pi", "Pali"), + ("ps", "Pashto, Pushto"), + ("fa", "Persian"), + ("pl", "Polish"), + ("pt", "Português"), + ("pa", "Punjabi, Panjabi"), + ("qu", "Quechua"), + ("ro", "Romanian, Moldavian, Moldovan"), + ("rm", "Romansh"), + ("rn", "Rundi"), + ("ru", "Russian"), + ("se", "Northern Sami"), + ("sm", "Samoan"), + ("sg", "Sango"), + ("sa", "Sanskrit"), + ("sc", "Sardinian"), + ("sr", "Serbian"), + ("sn", "Shona"), + ("sd", "Sindhi"), + ("si", "Sinhala, Sinhalese"), + ("sk", "Slovak"), + ("sl", "Slovenian"), + ("so", "Somali"), + ("st", "Southern Sotho"), + ("es", "Español"), + ("su", "Sundanese"), + ("sw", "Swahili"), + ("ss", "Swati"), + ("sv", "Swedish"), + ("tl", "Tagalog"), + ("ty", "Tahitian"), + ("tg", "Tajik"), + ("ta", "Tamil"), + ("tt", "Tatar"), + ("te", "Telugu"), + ("th", "Thai"), + ("bo", "Tibetan"), + ("ti", "Tigrinya"), + ("to", "Tonga (Tonga Islands)"), + ("ts", "Tsonga"), + ("tn", "Tswana"), + ("tr", "Turkish"), + ("tk", "Turkmen"), + ("tw", "Twi"), + ("ug", "Uighur, Uyghur"), + ("uk", "Ukrainian"), + ("ur", "Urdu"), + ("uz", "Uzbek"), + ("ve", "Venda"), + ("vi", "Vietnamese"), + ("vo", "Volapük"), + ("wa", "Walloon"), + ("cy", "Welsh"), + ("wo", "Wolof"), + ("xh", "Xhosa"), + ("yi", "Yiddish"), + ("yo", "Yoruba"), + ("za", "Zhuang, Chuang"), + ("zu", "Zulu"), + ], + max_length=10, + null=True, + verbose_name="Language", + ), + ), + ( + "spsversion", + models.TextField(blank=True, null=True, verbose_name="Sps version"), + ), + ( + "artdate", + models.DateField(blank=True, null=True, verbose_name="Artdate"), + ), + ( + "ahpdate", + models.DateField(blank=True, null=True, verbose_name="Ahpdate"), + ), + ( + "file_xml", + models.FileField( + blank=True, + null=True, + upload_to="generate_xml/", + verbose_name="Document xml", + ), + ), + ( + "text_xml", + models.TextField(blank=True, null=True, verbose_name="Text XML"), + ), + ( + "content", + wagtail.fields.StreamField( + [ + ( + "paragraph_with_language", + wagtail.blocks.StructBlock( + [ + ( + "label", + wagtail.blocks.ChoiceBlock( + choices=[ + ("<abstract>", "<abstract>"), + ( + "<abstract-title>", + "<abstract-title>", + ), + ("<aff>", "<aff>"), + ("<article-id>", "<article-id>"), + ( + "<article-title>", + "<article-title>", + ), + ( + "<author-notes>", + "<author-notes>", + ), + ("<contrib>", "<contrib>"), + ( + "<date-accepted>", + "<date-accepted>", + ), + ( + "<date-received>", + "<date-received>", + ), + ("<fig>", "<fig>"), + ("<fig-attrib>", "<fig-attrib>"), + ("<history>", "<history>"), + ("<kwd-title>", "<kwd-title>"), + ("<kwd-group>", "<kwd-group>"), + ("<list>", "<list>"), + ("<p>", "<p>"), + ("<sec>", "<sec>"), + ("<sub-sec>", "<sub-sec>"), + ("<subject>", "<subject>"), + ("<table>", "<table>"), + ("<table-foot>", "<table-foot>"), + ("<title>", "<title>"), + ( + "<trans-abstract>", + "<trans-abstract>", + ), + ("<trans-title>", "<trans-title>"), + ( + "<translate-front>", + "<translate-front>", + ), + ( + "<translate-body>", + "<translate-body>", + ), + ( + "<disp-formula>", + "<disp-formula>", + ), + ( + "<inline-formula>", + "<inline-formula>", + ), + ("<formula>", "<formula>"), + ], + label="Label", + required=False, + ), + ), + ( + "language", + wagtail.blocks.ChoiceBlock( + choices=[ + ("aa", "Afar"), + ("af", "Afrikaans"), + ("ak", "Akan"), + ("sq", "Albanian"), + ("am", "Amharic"), + ("ar", "Arabic"), + ("an", "Aragonese"), + ("hy", "Armenian"), + ("as", "Assamese"), + ("av", "Avaric"), + ("ae", "Avestan"), + ("ay", "Aymara"), + ("az", "Azerbaijani"), + ("bm", "Bambara"), + ("ba", "Bashkir"), + ("eu", "Basque"), + ("be", "Belarusian"), + ("bn", "Bengali"), + ("bi", "Bislama"), + ("bs", "Bosnian"), + ("br", "Breton"), + ("bg", "Bulgarian"), + ("my", "Burmese"), + ("ca", "Catalan, Valencian"), + ("ch", "Chamorro"), + ("ce", "Chechen"), + ("ny", "Chichewa, Chewa, Nyanja"), + ("zh", "Chinese"), + ( + "cu", + "Church Slavic, Old Slavonic, Church Slavonic, Old Bulgarian, Old Church Slavonic", + ), + ("cv", "Chuvash"), + ("kw", "Cornish"), + ("co", "Corsican"), + ("cr", "Cree"), + ("hr", "Croatian"), + ("cs", "Czech"), + ("da", "Danish"), + ( + "dv", + "Divehi, Dhivehi, Maldivian", + ), + ("nl", "Dutch, Flemish"), + ("dz", "Dzongkha"), + ("en", "English"), + ("eo", "Esperanto"), + ("et", "Estonian"), + ("ee", "Ewe"), + ("fo", "Faroese"), + ("fj", "Fijian"), + ("fi", "Finnish"), + ("fr", "French"), + ("fy", "Western Frisian"), + ("ff", "Fulah"), + ("gd", "Gaelic, Scottish Gaelic"), + ("gl", "Galician"), + ("lg", "Ganda"), + ("ka", "Georgian"), + ("de", "German"), + ("el", "Greek, Modern (1453–)"), + ("kl", "Kalaallisut, Greenlandic"), + ("gn", "Guarani"), + ("gu", "Gujarati"), + ("ht", "Haitian, Haitian Creole"), + ("ha", "Hausa"), + ("he", "Hebrew"), + ("hz", "Herero"), + ("hi", "Hindi"), + ("ho", "Hiri Motu"), + ("hu", "Hungarian"), + ("is", "Icelandic"), + ("io", "Ido"), + ("ig", "Igbo"), + ("id", "Indonesian"), + ( + "ia", + "Interlingua (International Auxiliary Language Association)", + ), + ("ie", "Interlingue, Occidental"), + ("iu", "Inuktitut"), + ("ik", "Inupiaq"), + ("ga", "Irish"), + ("it", "Italian"), + ("ja", "Japanese"), + ("jv", "Javanese"), + ("kn", "Kannada"), + ("kr", "Kanuri"), + ("ks", "Kashmiri"), + ("kk", "Kazakh"), + ("km", "Central Khmer"), + ("ki", "Kikuyu, Gikuyu"), + ("rw", "Kinyarwanda"), + ("ky", "Kirghiz, Kyrgyz"), + ("kv", "Komi"), + ("kg", "Kongo"), + ("ko", "Korean"), + ("kj", "Kuanyama, Kwanyama"), + ("ku", "Kurdish"), + ("lo", "Lao"), + ("la", "Latin"), + ("lv", "Latvian"), + ( + "li", + "Limburgan, Limburger, Limburgish", + ), + ("ln", "Lingala"), + ("lt", "Lithuanian"), + ("lu", "Luba-Katanga"), + ( + "lb", + "Luxembourgish, Letzeburgesch", + ), + ("mk", "Macedonian"), + ("mg", "Malagasy"), + ("ms", "Malay"), + ("ml", "Malayalam"), + ("mt", "Maltese"), + ("gv", "Manx"), + ("mi", "Maori"), + ("mr", "Marathi"), + ("mh", "Marshallese"), + ("mn", "Mongolian"), + ("na", "Nauru"), + ("nv", "Navajo, Navaho"), + ("nd", "North Ndebele"), + ("nr", "South Ndebele"), + ("ng", "Ndonga"), + ("ne", "Nepali"), + ("no", "Norwegian"), + ("nb", "Norwegian Bokmål"), + ("nn", "Norwegian Nynorsk"), + ("ii", "Sichuan Yi, Nuosu"), + ("oc", "Occitan"), + ("oj", "Ojibwa"), + ("or", "Oriya"), + ("om", "Oromo"), + ("os", "Ossetian, Ossetic"), + ("pi", "Pali"), + ("ps", "Pashto, Pushto"), + ("fa", "Persian"), + ("pl", "Polish"), + ("pt", "Português"), + ("pa", "Punjabi, Panjabi"), + ("qu", "Quechua"), + ( + "ro", + "Romanian, Moldavian, Moldovan", + ), + ("rm", "Romansh"), + ("rn", "Rundi"), + ("ru", "Russian"), + ("se", "Northern Sami"), + ("sm", "Samoan"), + ("sg", "Sango"), + ("sa", "Sanskrit"), + ("sc", "Sardinian"), + ("sr", "Serbian"), + ("sn", "Shona"), + ("sd", "Sindhi"), + ("si", "Sinhala, Sinhalese"), + ("sk", "Slovak"), + ("sl", "Slovenian"), + ("so", "Somali"), + ("st", "Southern Sotho"), + ("es", "Español"), + ("su", "Sundanese"), + ("sw", "Swahili"), + ("ss", "Swati"), + ("sv", "Swedish"), + ("tl", "Tagalog"), + ("ty", "Tahitian"), + ("tg", "Tajik"), + ("ta", "Tamil"), + ("tt", "Tatar"), + ("te", "Telugu"), + ("th", "Thai"), + ("bo", "Tibetan"), + ("ti", "Tigrinya"), + ("to", "Tonga (Tonga Islands)"), + ("ts", "Tsonga"), + ("tn", "Tswana"), + ("tr", "Turkish"), + ("tk", "Turkmen"), + ("tw", "Twi"), + ("ug", "Uighur, Uyghur"), + ("uk", "Ukrainian"), + ("ur", "Urdu"), + ("uz", "Uzbek"), + ("ve", "Venda"), + ("vi", "Vietnamese"), + ("vo", "Volapük"), + ("wa", "Walloon"), + ("cy", "Welsh"), + ("wo", "Wolof"), + ("xh", "Xhosa"), + ("yi", "Yiddish"), + ("yo", "Yoruba"), + ("za", "Zhuang, Chuang"), + ("zu", "Zulu"), + ], + label="Language", + required=False, + ), + ), + ( + "paragraph", + wagtail.blocks.TextBlock( + label="Title", required=False + ), + ), + ] + ), + ), + ( + "paragraph", + wagtail.blocks.StructBlock( + [ + ( + "label", + wagtail.blocks.ChoiceBlock( + choices=[ + ("<abstract>", "<abstract>"), + ( + "<abstract-title>", + "<abstract-title>", + ), + ("<aff>", "<aff>"), + ("<article-id>", "<article-id>"), + ( + "<article-title>", + "<article-title>", + ), + ( + "<author-notes>", + "<author-notes>", + ), + ("<contrib>", "<contrib>"), + ( + "<date-accepted>", + "<date-accepted>", + ), + ( + "<date-received>", + "<date-received>", + ), + ("<fig>", "<fig>"), + ("<fig-attrib>", "<fig-attrib>"), + ("<history>", "<history>"), + ("<kwd-title>", "<kwd-title>"), + ("<kwd-group>", "<kwd-group>"), + ("<list>", "<list>"), + ("<p>", "<p>"), + ("<sec>", "<sec>"), + ("<sub-sec>", "<sub-sec>"), + ("<subject>", "<subject>"), + ("<table>", "<table>"), + ("<table-foot>", "<table-foot>"), + ("<title>", "<title>"), + ( + "<trans-abstract>", + "<trans-abstract>", + ), + ("<trans-title>", "<trans-title>"), + ( + "<translate-front>", + "<translate-front>", + ), + ( + "<translate-body>", + "<translate-body>", + ), + ( + "<disp-formula>", + "<disp-formula>", + ), + ( + "<inline-formula>", + "<inline-formula>", + ), + ("<formula>", "<formula>"), + ], + label="Label", + required=False, + ), + ), + ( + "paragraph", + wagtail.blocks.TextBlock( + label="Paragraph", required=False + ), + ), + ] + ), + ), + ( + "author_paragraph", + wagtail.blocks.StructBlock( + [ + ( + "label", + wagtail.blocks.ChoiceBlock( + choices=[ + ("<abstract>", "<abstract>"), + ( + "<abstract-title>", + "<abstract-title>", + ), + ("<aff>", "<aff>"), + ("<article-id>", "<article-id>"), + ( + "<article-title>", + "<article-title>", + ), + ( + "<author-notes>", + "<author-notes>", + ), + ("<contrib>", "<contrib>"), + ( + "<date-accepted>", + "<date-accepted>", + ), + ( + "<date-received>", + "<date-received>", + ), + ("<fig>", "<fig>"), + ("<fig-attrib>", "<fig-attrib>"), + ("<history>", "<history>"), + ("<kwd-title>", "<kwd-title>"), + ("<kwd-group>", "<kwd-group>"), + ("<list>", "<list>"), + ("<p>", "<p>"), + ("<sec>", "<sec>"), + ("<sub-sec>", "<sub-sec>"), + ("<subject>", "<subject>"), + ("<table>", "<table>"), + ("<table-foot>", "<table-foot>"), + ("<title>", "<title>"), + ( + "<trans-abstract>", + "<trans-abstract>", + ), + ("<trans-title>", "<trans-title>"), + ( + "<translate-front>", + "<translate-front>", + ), + ( + "<translate-body>", + "<translate-body>", + ), + ( + "<disp-formula>", + "<disp-formula>", + ), + ( + "<inline-formula>", + "<inline-formula>", + ), + ("<formula>", "<formula>"), + ], + label="Label", + required=False, + ), + ), + ( + "paragraph", + wagtail.blocks.TextBlock( + label="Paragraph", required=False + ), + ), + ( + "surname", + wagtail.blocks.TextBlock( + label="Surname", required=False + ), + ), + ( + "given_names", + wagtail.blocks.TextBlock( + label="Given names", required=False + ), + ), + ( + "orcid", + wagtail.blocks.TextBlock( + label="Orcid", required=False + ), + ), + ( + "affid", + wagtail.blocks.TextBlock( + label="Aff id", required=False + ), + ), + ( + "char", + wagtail.blocks.TextBlock( + label="Char link", required=False + ), + ), + ] + ), + ), + ( + "aff_paragraph", + wagtail.blocks.StructBlock( + [ + ( + "label", + wagtail.blocks.ChoiceBlock( + choices=[ + ("<abstract>", "<abstract>"), + ( + "<abstract-title>", + "<abstract-title>", + ), + ("<aff>", "<aff>"), + ("<article-id>", "<article-id>"), + ( + "<article-title>", + "<article-title>", + ), + ( + "<author-notes>", + "<author-notes>", + ), + ("<contrib>", "<contrib>"), + ( + "<date-accepted>", + "<date-accepted>", + ), + ( + "<date-received>", + "<date-received>", + ), + ("<fig>", "<fig>"), + ("<fig-attrib>", "<fig-attrib>"), + ("<history>", "<history>"), + ("<kwd-title>", "<kwd-title>"), + ("<kwd-group>", "<kwd-group>"), + ("<list>", "<list>"), + ("<p>", "<p>"), + ("<sec>", "<sec>"), + ("<sub-sec>", "<sub-sec>"), + ("<subject>", "<subject>"), + ("<table>", "<table>"), + ("<table-foot>", "<table-foot>"), + ("<title>", "<title>"), + ( + "<trans-abstract>", + "<trans-abstract>", + ), + ("<trans-title>", "<trans-title>"), + ( + "<translate-front>", + "<translate-front>", + ), + ( + "<translate-body>", + "<translate-body>", + ), + ( + "<disp-formula>", + "<disp-formula>", + ), + ( + "<inline-formula>", + "<inline-formula>", + ), + ("<formula>", "<formula>"), + ], + label="Label", + required=False, + ), + ), + ( + "paragraph", + wagtail.blocks.TextBlock( + label="Paragraph", required=False + ), + ), + ( + "affid", + wagtail.blocks.TextBlock( + label="Aff id", required=False + ), + ), + ( + "text_aff", + wagtail.blocks.TextBlock( + label="Full text Aff", required=False + ), + ), + ( + "char", + wagtail.blocks.TextBlock( + label="Char link", required=False + ), + ), + ( + "orgname", + wagtail.blocks.TextBlock( + label="Orgname", required=False + ), + ), + ( + "orgdiv2", + wagtail.blocks.TextBlock( + label="Orgdiv2", required=False + ), + ), + ( + "orgdiv1", + wagtail.blocks.TextBlock( + label="Orgdiv1", required=False + ), + ), + ( + "zipcode", + wagtail.blocks.TextBlock( + label="Zipcode", required=False + ), + ), + ( + "city", + wagtail.blocks.TextBlock( + label="City", required=False + ), + ), + ( + "state", + wagtail.blocks.TextBlock( + label="State", required=False + ), + ), + ( + "country", + wagtail.blocks.TextBlock( + label="Country", required=False + ), + ), + ( + "code_country", + wagtail.blocks.TextBlock( + label="Code country", required=False + ), + ), + ( + "original", + wagtail.blocks.TextBlock( + label="Original", required=False + ), + ), + ] + ), + ), + ], + blank=True, + use_json_field=True, + ), + ), + ( + "content_body", + wagtail.fields.StreamField( + [ + ( + "paragraph", + wagtail.blocks.StructBlock( + [ + ( + "label", + wagtail.blocks.ChoiceBlock( + choices=[ + ("<abstract>", "<abstract>"), + ( + "<abstract-title>", + "<abstract-title>", + ), + ("<aff>", "<aff>"), + ("<article-id>", "<article-id>"), + ( + "<article-title>", + "<article-title>", + ), + ( + "<author-notes>", + "<author-notes>", + ), + ("<contrib>", "<contrib>"), + ( + "<date-accepted>", + "<date-accepted>", + ), + ( + "<date-received>", + "<date-received>", + ), + ("<fig>", "<fig>"), + ("<fig-attrib>", "<fig-attrib>"), + ("<history>", "<history>"), + ("<kwd-title>", "<kwd-title>"), + ("<kwd-group>", "<kwd-group>"), + ("<list>", "<list>"), + ("<p>", "<p>"), + ("<sec>", "<sec>"), + ("<sub-sec>", "<sub-sec>"), + ("<subject>", "<subject>"), + ("<table>", "<table>"), + ("<table-foot>", "<table-foot>"), + ("<title>", "<title>"), + ( + "<trans-abstract>", + "<trans-abstract>", + ), + ("<trans-title>", "<trans-title>"), + ( + "<translate-front>", + "<translate-front>", + ), + ( + "<translate-body>", + "<translate-body>", + ), + ( + "<disp-formula>", + "<disp-formula>", + ), + ( + "<inline-formula>", + "<inline-formula>", + ), + ("<formula>", "<formula>"), + ], + label="Label", + required=False, + ), + ), + ( + "paragraph", + wagtail.blocks.TextBlock( + label="Paragraph", required=False + ), + ), + ] + ), + ), + ( + "paragraph_with_language", + wagtail.blocks.StructBlock( + [ + ( + "label", + wagtail.blocks.ChoiceBlock( + choices=[ + ("<abstract>", "<abstract>"), + ( + "<abstract-title>", + "<abstract-title>", + ), + ("<aff>", "<aff>"), + ("<article-id>", "<article-id>"), + ( + "<article-title>", + "<article-title>", + ), + ( + "<author-notes>", + "<author-notes>", + ), + ("<contrib>", "<contrib>"), + ( + "<date-accepted>", + "<date-accepted>", + ), + ( + "<date-received>", + "<date-received>", + ), + ("<fig>", "<fig>"), + ("<fig-attrib>", "<fig-attrib>"), + ("<history>", "<history>"), + ("<kwd-title>", "<kwd-title>"), + ("<kwd-group>", "<kwd-group>"), + ("<list>", "<list>"), + ("<p>", "<p>"), + ("<sec>", "<sec>"), + ("<sub-sec>", "<sub-sec>"), + ("<subject>", "<subject>"), + ("<table>", "<table>"), + ("<table-foot>", "<table-foot>"), + ("<title>", "<title>"), + ( + "<trans-abstract>", + "<trans-abstract>", + ), + ("<trans-title>", "<trans-title>"), + ( + "<translate-front>", + "<translate-front>", + ), + ( + "<translate-body>", + "<translate-body>", + ), + ( + "<disp-formula>", + "<disp-formula>", + ), + ( + "<inline-formula>", + "<inline-formula>", + ), + ("<formula>", "<formula>"), + ], + label="Label", + required=False, + ), + ), + ( + "language", + wagtail.blocks.ChoiceBlock( + choices=[ + ("aa", "Afar"), + ("af", "Afrikaans"), + ("ak", "Akan"), + ("sq", "Albanian"), + ("am", "Amharic"), + ("ar", "Arabic"), + ("an", "Aragonese"), + ("hy", "Armenian"), + ("as", "Assamese"), + ("av", "Avaric"), + ("ae", "Avestan"), + ("ay", "Aymara"), + ("az", "Azerbaijani"), + ("bm", "Bambara"), + ("ba", "Bashkir"), + ("eu", "Basque"), + ("be", "Belarusian"), + ("bn", "Bengali"), + ("bi", "Bislama"), + ("bs", "Bosnian"), + ("br", "Breton"), + ("bg", "Bulgarian"), + ("my", "Burmese"), + ("ca", "Catalan, Valencian"), + ("ch", "Chamorro"), + ("ce", "Chechen"), + ("ny", "Chichewa, Chewa, Nyanja"), + ("zh", "Chinese"), + ( + "cu", + "Church Slavic, Old Slavonic, Church Slavonic, Old Bulgarian, Old Church Slavonic", + ), + ("cv", "Chuvash"), + ("kw", "Cornish"), + ("co", "Corsican"), + ("cr", "Cree"), + ("hr", "Croatian"), + ("cs", "Czech"), + ("da", "Danish"), + ( + "dv", + "Divehi, Dhivehi, Maldivian", + ), + ("nl", "Dutch, Flemish"), + ("dz", "Dzongkha"), + ("en", "English"), + ("eo", "Esperanto"), + ("et", "Estonian"), + ("ee", "Ewe"), + ("fo", "Faroese"), + ("fj", "Fijian"), + ("fi", "Finnish"), + ("fr", "French"), + ("fy", "Western Frisian"), + ("ff", "Fulah"), + ("gd", "Gaelic, Scottish Gaelic"), + ("gl", "Galician"), + ("lg", "Ganda"), + ("ka", "Georgian"), + ("de", "German"), + ("el", "Greek, Modern (1453–)"), + ("kl", "Kalaallisut, Greenlandic"), + ("gn", "Guarani"), + ("gu", "Gujarati"), + ("ht", "Haitian, Haitian Creole"), + ("ha", "Hausa"), + ("he", "Hebrew"), + ("hz", "Herero"), + ("hi", "Hindi"), + ("ho", "Hiri Motu"), + ("hu", "Hungarian"), + ("is", "Icelandic"), + ("io", "Ido"), + ("ig", "Igbo"), + ("id", "Indonesian"), + ( + "ia", + "Interlingua (International Auxiliary Language Association)", + ), + ("ie", "Interlingue, Occidental"), + ("iu", "Inuktitut"), + ("ik", "Inupiaq"), + ("ga", "Irish"), + ("it", "Italian"), + ("ja", "Japanese"), + ("jv", "Javanese"), + ("kn", "Kannada"), + ("kr", "Kanuri"), + ("ks", "Kashmiri"), + ("kk", "Kazakh"), + ("km", "Central Khmer"), + ("ki", "Kikuyu, Gikuyu"), + ("rw", "Kinyarwanda"), + ("ky", "Kirghiz, Kyrgyz"), + ("kv", "Komi"), + ("kg", "Kongo"), + ("ko", "Korean"), + ("kj", "Kuanyama, Kwanyama"), + ("ku", "Kurdish"), + ("lo", "Lao"), + ("la", "Latin"), + ("lv", "Latvian"), + ( + "li", + "Limburgan, Limburger, Limburgish", + ), + ("ln", "Lingala"), + ("lt", "Lithuanian"), + ("lu", "Luba-Katanga"), + ( + "lb", + "Luxembourgish, Letzeburgesch", + ), + ("mk", "Macedonian"), + ("mg", "Malagasy"), + ("ms", "Malay"), + ("ml", "Malayalam"), + ("mt", "Maltese"), + ("gv", "Manx"), + ("mi", "Maori"), + ("mr", "Marathi"), + ("mh", "Marshallese"), + ("mn", "Mongolian"), + ("na", "Nauru"), + ("nv", "Navajo, Navaho"), + ("nd", "North Ndebele"), + ("nr", "South Ndebele"), + ("ng", "Ndonga"), + ("ne", "Nepali"), + ("no", "Norwegian"), + ("nb", "Norwegian Bokmål"), + ("nn", "Norwegian Nynorsk"), + ("ii", "Sichuan Yi, Nuosu"), + ("oc", "Occitan"), + ("oj", "Ojibwa"), + ("or", "Oriya"), + ("om", "Oromo"), + ("os", "Ossetian, Ossetic"), + ("pi", "Pali"), + ("ps", "Pashto, Pushto"), + ("fa", "Persian"), + ("pl", "Polish"), + ("pt", "Português"), + ("pa", "Punjabi, Panjabi"), + ("qu", "Quechua"), + ( + "ro", + "Romanian, Moldavian, Moldovan", + ), + ("rm", "Romansh"), + ("rn", "Rundi"), + ("ru", "Russian"), + ("se", "Northern Sami"), + ("sm", "Samoan"), + ("sg", "Sango"), + ("sa", "Sanskrit"), + ("sc", "Sardinian"), + ("sr", "Serbian"), + ("sn", "Shona"), + ("sd", "Sindhi"), + ("si", "Sinhala, Sinhalese"), + ("sk", "Slovak"), + ("sl", "Slovenian"), + ("so", "Somali"), + ("st", "Southern Sotho"), + ("es", "Español"), + ("su", "Sundanese"), + ("sw", "Swahili"), + ("ss", "Swati"), + ("sv", "Swedish"), + ("tl", "Tagalog"), + ("ty", "Tahitian"), + ("tg", "Tajik"), + ("ta", "Tamil"), + ("tt", "Tatar"), + ("te", "Telugu"), + ("th", "Thai"), + ("bo", "Tibetan"), + ("ti", "Tigrinya"), + ("to", "Tonga (Tonga Islands)"), + ("ts", "Tsonga"), + ("tn", "Tswana"), + ("tr", "Turkish"), + ("tk", "Turkmen"), + ("tw", "Twi"), + ("ug", "Uighur, Uyghur"), + ("uk", "Ukrainian"), + ("ur", "Urdu"), + ("uz", "Uzbek"), + ("ve", "Venda"), + ("vi", "Vietnamese"), + ("vo", "Volapük"), + ("wa", "Walloon"), + ("cy", "Welsh"), + ("wo", "Wolof"), + ("xh", "Xhosa"), + ("yi", "Yiddish"), + ("yo", "Yoruba"), + ("za", "Zhuang, Chuang"), + ("zu", "Zulu"), + ], + label="Language", + required=False, + ), + ), + ( + "paragraph", + wagtail.blocks.TextBlock( + label="Title", required=False + ), + ), + ] + ), + ), + ( + "compound_paragraph", + wagtail.blocks.StructBlock( + [ + ( + "label", + wagtail.blocks.ChoiceBlock( + choices=[ + ("<abstract>", "<abstract>"), + ( + "<abstract-title>", + "<abstract-title>", + ), + ("<aff>", "<aff>"), + ("<article-id>", "<article-id>"), + ( + "<article-title>", + "<article-title>", + ), + ( + "<author-notes>", + "<author-notes>", + ), + ("<contrib>", "<contrib>"), + ( + "<date-accepted>", + "<date-accepted>", + ), + ( + "<date-received>", + "<date-received>", + ), + ("<fig>", "<fig>"), + ("<fig-attrib>", "<fig-attrib>"), + ("<history>", "<history>"), + ("<kwd-title>", "<kwd-title>"), + ("<kwd-group>", "<kwd-group>"), + ("<list>", "<list>"), + ("<p>", "<p>"), + ("<sec>", "<sec>"), + ("<sub-sec>", "<sub-sec>"), + ("<subject>", "<subject>"), + ("<table>", "<table>"), + ("<table-foot>", "<table-foot>"), + ("<title>", "<title>"), + ( + "<trans-abstract>", + "<trans-abstract>", + ), + ("<trans-title>", "<trans-title>"), + ( + "<translate-front>", + "<translate-front>", + ), + ( + "<translate-body>", + "<translate-body>", + ), + ( + "<disp-formula>", + "<disp-formula>", + ), + ( + "<inline-formula>", + "<inline-formula>", + ), + ("<formula>", "<formula>"), + ], + label="Label", + required=False, + ), + ), + ( + "eid", + wagtail.blocks.TextBlock( + label="Equation id", required=False + ), + ), + ( + "content", + wagtail.blocks.StreamBlock( + [ + ( + "text", + wagtail.blocks.TextBlock( + label="Text" + ), + ), + ( + "formula", + wagtail.blocks.TextBlock( + label="Formula" + ), + ), + ], + label="Content", + required=True, + ), + ), + ] + ), + ), + ( + "image", + wagtail.blocks.StructBlock( + [ + ( + "label", + wagtail.blocks.ChoiceBlock( + choices=[ + ("<abstract>", "<abstract>"), + ( + "<abstract-title>", + "<abstract-title>", + ), + ("<aff>", "<aff>"), + ("<article-id>", "<article-id>"), + ( + "<article-title>", + "<article-title>", + ), + ( + "<author-notes>", + "<author-notes>", + ), + ("<contrib>", "<contrib>"), + ( + "<date-accepted>", + "<date-accepted>", + ), + ( + "<date-received>", + "<date-received>", + ), + ("<fig>", "<fig>"), + ("<fig-attrib>", "<fig-attrib>"), + ("<history>", "<history>"), + ("<kwd-title>", "<kwd-title>"), + ("<kwd-group>", "<kwd-group>"), + ("<list>", "<list>"), + ("<p>", "<p>"), + ("<sec>", "<sec>"), + ("<sub-sec>", "<sub-sec>"), + ("<subject>", "<subject>"), + ("<table>", "<table>"), + ("<table-foot>", "<table-foot>"), + ("<title>", "<title>"), + ( + "<trans-abstract>", + "<trans-abstract>", + ), + ("<trans-title>", "<trans-title>"), + ( + "<translate-front>", + "<translate-front>", + ), + ( + "<translate-body>", + "<translate-body>", + ), + ( + "<disp-formula>", + "<disp-formula>", + ), + ( + "<inline-formula>", + "<inline-formula>", + ), + ("<formula>", "<formula>"), + ], + label="Label", + required=False, + ), + ), + ( + "figid", + wagtail.blocks.TextBlock( + label="Fig id", required=False + ), + ), + ( + "figlabel", + wagtail.blocks.TextBlock( + label="Fig label", required=False + ), + ), + ( + "title", + wagtail.blocks.TextBlock( + label="Title", required=False + ), + ), + ( + "alttext", + wagtail.blocks.TextBlock( + label="Alt text", required=False + ), + ), + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=True + ), + ), + ] + ), + ), + ( + "table", + wagtail.blocks.StructBlock( + [ + ( + "label", + wagtail.blocks.ChoiceBlock( + choices=[ + ("<abstract>", "<abstract>"), + ( + "<abstract-title>", + "<abstract-title>", + ), + ("<aff>", "<aff>"), + ("<article-id>", "<article-id>"), + ( + "<article-title>", + "<article-title>", + ), + ( + "<author-notes>", + "<author-notes>", + ), + ("<contrib>", "<contrib>"), + ( + "<date-accepted>", + "<date-accepted>", + ), + ( + "<date-received>", + "<date-received>", + ), + ("<fig>", "<fig>"), + ("<fig-attrib>", "<fig-attrib>"), + ("<history>", "<history>"), + ("<kwd-title>", "<kwd-title>"), + ("<kwd-group>", "<kwd-group>"), + ("<list>", "<list>"), + ("<p>", "<p>"), + ("<sec>", "<sec>"), + ("<sub-sec>", "<sub-sec>"), + ("<subject>", "<subject>"), + ("<table>", "<table>"), + ("<table-foot>", "<table-foot>"), + ("<title>", "<title>"), + ( + "<trans-abstract>", + "<trans-abstract>", + ), + ("<trans-title>", "<trans-title>"), + ( + "<translate-front>", + "<translate-front>", + ), + ( + "<translate-body>", + "<translate-body>", + ), + ( + "<disp-formula>", + "<disp-formula>", + ), + ( + "<inline-formula>", + "<inline-formula>", + ), + ("<formula>", "<formula>"), + ], + label="Label", + required=False, + ), + ), + ( + "tabid", + wagtail.blocks.TextBlock( + label="Table id", required=False + ), + ), + ( + "tablabel", + wagtail.blocks.TextBlock( + label="Table label", required=False + ), + ), + ( + "title", + wagtail.blocks.TextBlock( + label="Title", required=False + ), + ), + ( + "content", + wagtail.blocks.TextBlock( + label="Content", required=False + ), + ), + ] + ), + ), + ], + blank=True, + use_json_field=True, + ), + ), + ( + "content_back", + wagtail.fields.StreamField( + [ + ( + "paragraph", + wagtail.blocks.StructBlock( + [ + ( + "label", + wagtail.blocks.ChoiceBlock( + choices=[ + ("<abstract>", "<abstract>"), + ( + "<abstract-title>", + "<abstract-title>", + ), + ("<aff>", "<aff>"), + ("<article-id>", "<article-id>"), + ( + "<article-title>", + "<article-title>", + ), + ( + "<author-notes>", + "<author-notes>", + ), + ("<contrib>", "<contrib>"), + ( + "<date-accepted>", + "<date-accepted>", + ), + ( + "<date-received>", + "<date-received>", + ), + ("<fig>", "<fig>"), + ("<fig-attrib>", "<fig-attrib>"), + ("<history>", "<history>"), + ("<kwd-title>", "<kwd-title>"), + ("<kwd-group>", "<kwd-group>"), + ("<list>", "<list>"), + ("<p>", "<p>"), + ("<sec>", "<sec>"), + ("<sub-sec>", "<sub-sec>"), + ("<subject>", "<subject>"), + ("<table>", "<table>"), + ("<table-foot>", "<table-foot>"), + ("<title>", "<title>"), + ( + "<trans-abstract>", + "<trans-abstract>", + ), + ("<trans-title>", "<trans-title>"), + ( + "<translate-front>", + "<translate-front>", + ), + ( + "<translate-body>", + "<translate-body>", + ), + ( + "<disp-formula>", + "<disp-formula>", + ), + ( + "<inline-formula>", + "<inline-formula>", + ), + ("<formula>", "<formula>"), + ], + label="Label", + required=False, + ), + ), + ( + "paragraph", + wagtail.blocks.TextBlock( + label="Paragraph", required=False + ), + ), + ] + ), + ), + ( + "ref_paragraph", + wagtail.blocks.StructBlock( + [ + ( + "label", + wagtail.blocks.ChoiceBlock( + choices=[ + ("<abstract>", "<abstract>"), + ( + "<abstract-title>", + "<abstract-title>", + ), + ("<aff>", "<aff>"), + ("<article-id>", "<article-id>"), + ( + "<article-title>", + "<article-title>", + ), + ( + "<author-notes>", + "<author-notes>", + ), + ("<contrib>", "<contrib>"), + ( + "<date-accepted>", + "<date-accepted>", + ), + ( + "<date-received>", + "<date-received>", + ), + ("<fig>", "<fig>"), + ("<fig-attrib>", "<fig-attrib>"), + ("<history>", "<history>"), + ("<kwd-title>", "<kwd-title>"), + ("<kwd-group>", "<kwd-group>"), + ("<list>", "<list>"), + ("<p>", "<p>"), + ("<sec>", "<sec>"), + ("<sub-sec>", "<sub-sec>"), + ("<subject>", "<subject>"), + ("<table>", "<table>"), + ("<table-foot>", "<table-foot>"), + ("<title>", "<title>"), + ( + "<trans-abstract>", + "<trans-abstract>", + ), + ("<trans-title>", "<trans-title>"), + ( + "<translate-front>", + "<translate-front>", + ), + ( + "<translate-body>", + "<translate-body>", + ), + ( + "<disp-formula>", + "<disp-formula>", + ), + ( + "<inline-formula>", + "<inline-formula>", + ), + ("<formula>", "<formula>"), + ], + label="Label", + required=False, + ), + ), + ( + "paragraph", + wagtail.blocks.TextBlock( + label="Paragraph", required=False + ), + ), + ( + "reftype", + wagtail.blocks.TextBlock( + label="Ref type", required=False + ), + ), + ( + "refid", + wagtail.blocks.TextBlock( + label="Ref id", required=False + ), + ), + ( + "authors", + wagtail.blocks.StreamBlock( + [ + ( + "Author", + wagtail.blocks.StructBlock( + [ + ( + "surname", + wagtail.blocks.TextBlock( + label="Surname", + required=False, + ), + ), + ( + "given_names", + wagtail.blocks.TextBlock( + label="Given names", + required=False, + ), + ), + ] + ), + ) + ], + label="Authors", + required=False, + ), + ), + ( + "date", + wagtail.blocks.TextBlock( + label="Date", required=False + ), + ), + ( + "title", + wagtail.blocks.TextBlock( + label="Title", required=False + ), + ), + ( + "chapter", + wagtail.blocks.TextBlock( + label="Chapter", required=False + ), + ), + ( + "edition", + wagtail.blocks.TextBlock( + label="Edition", required=False + ), + ), + ( + "source", + wagtail.blocks.TextBlock( + label="Source", required=False + ), + ), + ( + "vol", + wagtail.blocks.TextBlock( + label="Vol", required=False + ), + ), + ( + "issue", + wagtail.blocks.TextBlock( + label="Issue", required=False + ), + ), + ( + "pages", + wagtail.blocks.TextBlock( + label="Pages", required=False + ), + ), + ( + "fpage", + wagtail.blocks.TextBlock( + label="First page", required=False + ), + ), + ( + "lpage", + wagtail.blocks.TextBlock( + label="Last page", required=False + ), + ), + ( + "doi", + wagtail.blocks.TextBlock( + label="DOI", required=False + ), + ), + ( + "access_id", + wagtail.blocks.TextBlock( + label="Access id", required=False + ), + ), + ( + "degree", + wagtail.blocks.TextBlock( + label="Degree", required=False + ), + ), + ( + "organization", + wagtail.blocks.TextBlock( + label="Organization", required=False + ), + ), + ( + "location", + wagtail.blocks.TextBlock( + label="Location", required=False + ), + ), + ( + "org_location", + wagtail.blocks.TextBlock( + label="Org location", required=False + ), + ), + ( + "num_pages", + wagtail.blocks.TextBlock( + label="Num pages", required=False + ), + ), + ( + "uri", + wagtail.blocks.TextBlock( + label="Uri", required=False + ), + ), + ( + "version", + wagtail.blocks.TextBlock( + label="Version", required=False + ), + ), + ( + "access_date", + wagtail.blocks.TextBlock( + label="Access date", required=False + ), + ), + ] + ), + ), + ], + blank=True, + use_json_field=True, + ), + ), + ( + "creator", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_creator", + to=settings.AUTH_USER_MODEL, + verbose_name="Creator", + ), + ), + ( + "updated_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_last_mod_user", + to=settings.AUTH_USER_MODEL, + verbose_name="Updater", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="MarkupXML", + fields=[], + options={ + "proxy": True, + "indexes": [], + "constraints": [], + }, + bases=("markup_doc.articledocxmarkup",), + ), + migrations.CreateModel( + name="UploadDocx", + fields=[], + options={ + "proxy": True, + "indexes": [], + "constraints": [], + }, + bases=("markup_doc.articledocxmarkup",), + ), + migrations.CreateModel( + name="CollectionModel", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "collection", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="markup_doc.collectionvaluesmodel", + ), + ), + ], + ), + migrations.CreateModel( + name="JournalModel", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "title", + models.TextField(blank=True, null=True, verbose_name="Title"), + ), + ( + "short_title", + models.TextField(blank=True, null=True, verbose_name="Short Title"), + ), + ( + "title_nlm", + models.TextField(blank=True, null=True, verbose_name="NLM Title"), + ), + ( + "acronym", + models.TextField(blank=True, null=True, verbose_name="Acronym"), + ), + ( + "issn", + models.TextField( + blank=True, null=True, verbose_name="ISSN (id SciELO)" + ), + ), + ( + "pissn", + models.TextField(blank=True, null=True, verbose_name="Print ISSN"), + ), + ( + "eissn", + models.TextField( + blank=True, null=True, verbose_name="Electronic ISSN" + ), + ), + ( + "pubname", + models.TextField( + blank=True, null=True, verbose_name="Publisher Name" + ), + ), + ], + options={ + "unique_together": {("title",)}, + }, + ), + migrations.AddField( + model_name="articledocxmarkup", + name="journal", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="markup_doc.journalmodel", + ), + ), + ] diff --git a/markup_doc/migrations/0002_alter_articledocx_estatus_and_more.py b/markup_doc/migrations/0002_alter_articledocx_estatus_and_more.py new file mode 100644 index 0000000..600fba0 --- /dev/null +++ b/markup_doc/migrations/0002_alter_articledocx_estatus_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 5.0.8 on 2025-09-21 23:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('markup_doc', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='articledocx', + name='estatus', + field=models.IntegerField(blank=True, choices=[(1, 'Processing'), (2, 'Processed')], default=1, verbose_name='Process estatus'), + ), + migrations.AlterField( + model_name='articledocxmarkup', + name='estatus', + field=models.IntegerField(blank=True, choices=[(1, 'Processing'), (2, 'Processed')], default=1, verbose_name='Process estatus'), + ), + ] diff --git a/markup_doc/migrations/__init__.py b/markup_doc/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/markup_doc/models.py b/markup_doc/models.py new file mode 100644 index 0000000..bfd4722 --- /dev/null +++ b/markup_doc/models.py @@ -0,0 +1,521 @@ +import os +import sys +import requests + +from django.db import models +from django.utils.translation import gettext_lazy as _ +from django import forms +from django.utils.html import format_html +from django.urls import reverse + +from modelcluster.fields import ParentalKey +from modelcluster.models import ClusterableModel +from wagtail.admin.panels import FieldPanel, InlinePanel, ObjectList, TabbedInterface +from wagtailautocomplete.edit_handlers import AutocompletePanel +from wagtail.documents.models import Document + +from core.forms import CoreAdminModelForm +from core.choices import LANGUAGE +from core.models import ( + CommonControlField, + Language, + TextWithLang +) +from wagtail.fields import StreamField +from wagtail.blocks import StructBlock, TextBlock, CharBlock, ChoiceBlock, ListBlock, StreamBlock +from wagtail.images.blocks import ImageChooserBlock +from .choices import front_labels + + +class ProcessStatus(models.IntegerChoices): + PROCESSING = 1, _("Processing") + PROCESSED = 2, _("Processed") + + +class ReadOnlyFileWidget(forms.Widget): + def render(self, name, value, attrs=None, renderer=None): + if value: + # Muestra el archivo como un enlace de descarga + #return format_html('<a href="{}" target="_blank" download>{}</a>', value.url, value.name.split('/')[-1]) + instance = value.instance + url = reverse('generate_xml', args=[instance.pk]) + return format_html('<a href="{}" target="_blank" download>Download XML</a>', url) + return "" + +# Create your models here. +class ArticleDocx(CommonControlField): + title = models.TextField(_("Document Title"), null=True, blank=True) + file = models.FileField( + null=True, + blank=True, + verbose_name=_("Document"), + upload_to='uploads_docx/', + ) + estatus = models.IntegerField( + _("Process estatus"), + choices=ProcessStatus.choices, + blank=True, + default=ProcessStatus.PROCESSING + ) + + panels = [ + FieldPanel("title"), + FieldPanel("file"), + ] + + base_form_class = CoreAdminModelForm + + def __unicode__(self): + return f"{self.title} | {self.estatus}" + + def __str__(self): + return f"{self.title} | {self.estatus}" + + @classmethod + def get( + cls, + title): + return cls.objects.get(title=title) + + @classmethod + def update(cls, title, estatus): + try: + obj = cls.get(title=title) + except (cls.DoesNotExist, ValueError): + pass + + obj.estatus = estatus + obj.save() + return obj + + +class ParagraphWithLanguageBlock(StructBlock): + label = ChoiceBlock( + choices=front_labels, + required=False, + label=_("Label") + ) + language = ChoiceBlock( + choices=LANGUAGE, + required=False, + label="Language" + ) + paragraph = TextBlock(required=False, label=_("Title")) + + class Meta: + label = _("Paragraph with Language") + + +class ParagraphBlock(StructBlock): + label = ChoiceBlock( + choices=front_labels, + required=False, + label=_("Label") + ) + paragraph = TextBlock(required=False, label=_("Paragraph")) + + class Meta: + label = _("Paragraph") + + +class CompoundParagraphBlock(StructBlock): + label = ChoiceBlock( + choices=front_labels, + required=False, + label=_("Label") + ) + eid = TextBlock(required=False, label=_("Equation id")) + content = StreamBlock([ + ('text', TextBlock(label=_("Text"))), + ('formula', TextBlock(label=_("Formula"))), + ], label=_("Content"), required=True) + + class Meta: + label = _("Compound paragraph") + + +class ImageBlock(StructBlock): + label = ChoiceBlock( + choices=front_labels, + required=False, + label=_("Label") + ) + figid = TextBlock(required=False, label=_("Fig id")) + figlabel = TextBlock(required=False, label=_("Fig label")) + title = TextBlock(required=False, label=_("Title")) + alttext = TextBlock(required=False, label=_("Alt text")) + image = ImageChooserBlock(required=True) + + class Meta: + label = _("Image") + + +class TableBlock(StructBlock): + label = ChoiceBlock( + choices=front_labels, + required=False, + label=_("Label") + ) + tabid = TextBlock(required=False, label=_("Table id")) + tablabel = TextBlock(required=False, label=_("Table label")) + title = TextBlock(required=False, label=_("Title")) + content = TextBlock(required=False, label=_("Content")) + + class Meta: + label = _("Table") + + +class AuthorParagraphBlock(ParagraphBlock): + surname = TextBlock(required=False, label=_("Surname")) + given_names = TextBlock(required=False, label=_("Given names")) + orcid = TextBlock(required=False, label=_("Orcid")) + affid = TextBlock(required=False, label=_("Aff id")) + char = TextBlock(required=False, label=_("Char link")) + + class Meta: + label = _("Author Paragraph") + + +class AffParagraphBlock(ParagraphBlock): + affid = TextBlock(required=False, label=_("Aff id")) + text_aff = TextBlock(required=False, label=_("Full text Aff")) + char = TextBlock(required=False, label=_("Char link")) + orgname = TextBlock(required=False, label=_("Orgname")) + orgdiv2 = TextBlock(required=False, label=_("Orgdiv2")) + orgdiv1 = TextBlock(required=False, label=_("Orgdiv1")) + zipcode = TextBlock(required=False, label=_("Zipcode")) + city = TextBlock(required=False, label=_("City")) + state = TextBlock(required=False, label=_("State")) + country = TextBlock(required=False, label=_("Country")) + code_country = TextBlock(required=False, label=_("Code country")) + original = TextBlock(required=False, label=_("Original")) + + class Meta: + label = _("Aff Paragraph") + + +class RefNameBlock(StructBlock): + surname = TextBlock(required=False, label=_("Surname")) + given_names = TextBlock(required=False, label=_("Given names")) + + +class RefParagraphBlock(ParagraphBlock): + reftype = TextBlock(required=False, label=_("Ref type")) + refid = TextBlock(required=False, label=_("Ref id")) + #authors = ListBlock(RefNameBlock(), label=_("Authors")) + authors = StreamBlock([ + ('Author', RefNameBlock()), + ], label=_("Authors"), required=False) + date = TextBlock(required=False, label=_("Date")) + title = TextBlock(required=False, label=_("Title")) + chapter = TextBlock(required=False, label=_("Chapter")) + edition = TextBlock(required=False, label=_("Edition")) + source = TextBlock(required=False, label=_("Source")) + vol = TextBlock(required=False, label=_("Vol")) + issue = TextBlock(required=False, label=_("Issue")) + pages = TextBlock(required=False, label=_("Pages")) + fpage = TextBlock(required=False, label=_("First page")) + lpage = TextBlock(required=False, label=_("Last page")) + doi = TextBlock(required=False, label=_("DOI")) + access_id = TextBlock(required=False, label=_("Access id")) + degree = TextBlock(required=False, label=_("Degree")) + organization = TextBlock(required=False, label=_("Organization")) + location = TextBlock(required=False, label=_("Location")) + org_location = TextBlock(required=False, label=_("Org location")) + num_pages = TextBlock(required=False, label=_("Num pages")) + uri = TextBlock(required=False, label=_("Uri")) + version = TextBlock(required=False, label=_("Version")) + access_date = TextBlock(required=False, label=_("Access date")) + + class Meta: + label = _("Ref Paragraph") + + +class CollectionValuesModel(models.Model): + acron = models.CharField(max_length=10, unique=True) + name = models.CharField(max_length=255) + + autocomplete_search_field = "acron" + + def autocomplete_label(self): + return str(self) + + def __str__(self): + return f"{self.acron.upper()} - {self.name}" + + +class CollectionModel(models.Model): + collection = models.ForeignKey(CollectionValuesModel, null=True, blank=True, on_delete=models.SET_NULL) + + autocomplete_search_field = "collection.acron" + + def autocomplete_label(self): + return str(self) + + panels = [ + AutocompletePanel('collection'), + ] + + def __str__(self): + return f"{self.collection.acron.upper()} - {self.collection.acron}" + + +class JournalModel(models.Model): + title = models.TextField(_("Title"), null=True, blank=True) + short_title = models.TextField(_("Short Title"), null=True, blank=True) + title_nlm = models.TextField(_("NLM Title"), null=True, blank=True) + acronym = models.TextField(_("Acronym"), null=True, blank=True) + issn = models.TextField(_("ISSN (id SciELO)"), null=True, blank=True) + pissn = models.TextField(_("Print ISSN"), null=True, blank=True) + eissn = models.TextField(_("Electronic ISSN"), null=True, blank=True) + pubname = models.TextField(_("Publisher Name"), null=True, blank=True) + + autocomplete_search_field = "title" + + class Meta: + unique_together = ('title',) + + def autocomplete_label(self): + return str(self) + + def __str__(self): + return self.title + + +def get_default_collection_acron(): + try: + obj = CollectionModel.objects.select_related('collection').first() + return obj.collection.acron if obj and obj.collection else '' + except Exception: + return '' + + +class ArticleDocxMarkup(CommonControlField, ClusterableModel): + title = models.TextField(_("Document Title"), null=True, blank=True) + file = models.FileField( + null=True, + blank=True, + verbose_name=_("Document"), + upload_to='uploads_docx/', + ) + estatus = models.IntegerField( + _("Process estatus"), + choices=ProcessStatus.choices, + blank=True, + default=ProcessStatus.PROCESSING + ) + + collection = models.CharField(max_length=10, default=get_default_collection_acron) + journal = models.ForeignKey(JournalModel, null=True, blank=True, on_delete=models.SET_NULL) + + journal_title = models.TextField(_("Journal Title"), null=True, blank=True) + acronym = models.TextField(_("Acronym"), null=True, blank=True) + short_title = models.TextField(_("Short Title"), null=True, blank=True) + title_nlm = models.TextField(_("NLM Title"), null=True, blank=True) + issn = models.TextField(_("ISSN (id SciELO)"), null=True, blank=True) + pissn = models.TextField(_("Print ISSN"), null=True, blank=True) + eissn = models.TextField(_("Electronic ISSN"), null=True, blank=True) + nimtitle = models.TextField(_("Nimtitle"), null=True, blank=True) + pubname = models.TextField(_("Publisher Name"), null=True, blank=True) + license = models.URLField( + max_length=500, + blank=True, + null=True, + verbose_name=_("License (URL)") + ) + vol = models.IntegerField( + verbose_name=_("Volume"), + null=True, + blank=True + ) + supplvol = models.IntegerField( + verbose_name=_("Suppl Volume"), + null=True, + blank=True + ) + issue = models.IntegerField( + verbose_name=_("Issue"), + null=True, + blank=True + ) + supplno = models.IntegerField( + verbose_name=_("Suppl Num"), + null=True, + blank=True + ) + issid_part = models.TextField(_("Isid Part"), null=True, blank=True) + dateiso = models.TextField(_("Dateiso"), null=True, blank=True) + month = models.TextField(_("Month/Season"), null=True, blank=True) + fpage = models.TextField(_("First Page"), null=True, blank=True) + seq = models.TextField(_("@Seq"), null=True, blank=True) + lpage = models.TextField(_("Last Page"), null=True, blank=True) + elocatid = models.TextField(_("Elocation ID"), null=True, blank=True) + order = models.TextField(_("Order (In TOC)"), null=True, blank=True) + pagcount = models.TextField(_("Pag count"), null=True, blank=True) + doctopic = models.TextField(_("Doc Topic"), null=True, blank=True) + language = models.CharField( + _("Language"), + max_length=10, + choices=LANGUAGE, + null=True, + blank=True + ) + spsversion = models.TextField(_("Sps version"), null=True, blank=True) + artdate = models.DateField(_("Artdate"), null=True, blank=True) + ahpdate = models.DateField(_("Ahpdate"), null=True, blank=True) + + file_xml = models.FileField( + null=True, + blank=True, + verbose_name=_("Document xml"), + upload_to='generate_xml/', + ) + + text_xml = models.TextField(_("Text XML"), null=True, blank=True) + + content = StreamField([ + ('paragraph_with_language', ParagraphWithLanguageBlock()), + ('paragraph', ParagraphBlock()), + ('author_paragraph', AuthorParagraphBlock()), + ('aff_paragraph', AffParagraphBlock()), + ], blank=True, use_json_field=True) + + content_body = StreamField([ + ('paragraph', ParagraphBlock()), + ('paragraph_with_language', ParagraphWithLanguageBlock()), + ('compound_paragraph', CompoundParagraphBlock()), + ('image', ImageBlock()), + ('table', TableBlock()), + ], blank=True, use_json_field=True) + + content_back = StreamField([ + ('paragraph', ParagraphBlock()), + ('ref_paragraph', RefParagraphBlock()), + ], blank=True, use_json_field=True) + + panels = [ + FieldPanel("title"), + FieldPanel("file"), + FieldPanel("collection"), + AutocompletePanel("journal") + ] + + def __unicode__(self): + return f"{self.title} | {self.estatus}" + + def __str__(self): + return f"{self.title} | {self.estatus}" + + @property + def url_download(self): + return self.file_xml.url if self.file_xml else None + + @classmethod + def create(cls, title, doi): + obj = cls() + obj.title = title + obj.doi = doi + obj.save() + return obj + + @classmethod + def get( + cls, + title): + return cls.objects.get(title=title) + + @classmethod + def update(cls, title, estatus): + try: + obj = cls.get(title=title) + except (cls.DoesNotExist, ValueError): + pass + + obj.estatus = estatus + obj.save() + return obj + + base_form_class = CoreAdminModelForm + + +class UploadDocx(ArticleDocxMarkup): + panels_doc = [ + FieldPanel("title"), + FieldPanel("file"), + ] + + edit_handler = TabbedInterface( + [ + ObjectList(panels_doc, heading=_("Document")), + ] + ) + + class Meta: + proxy = True + + +class MarkupXML(ArticleDocxMarkup): + panels_front = [ + FieldPanel('content'), + #InlinePanel("element_docx", label=_("Elements Docx")), + ] + + panels_body = [ + FieldPanel('content_body'), + ] + + panels_back = [ + FieldPanel('content_back'), + ] + + panels_xml = [ + FieldPanel('file_xml', widget=ReadOnlyFileWidget()), + FieldPanel('text_xml'), + ] + + panels_details = [ + FieldPanel('collection'), + AutocompletePanel('journal'), + FieldPanel('journal_title'), + FieldPanel('short_title'), + FieldPanel('title_nlm'), + FieldPanel('acronym'), + FieldPanel('issn'), + FieldPanel('pissn'), + FieldPanel('eissn'), + FieldPanel('nimtitle'), + FieldPanel('pubname'), + FieldPanel('license'), + FieldPanel('vol'), + FieldPanel('supplvol'), + FieldPanel('issue'), + FieldPanel('supplno'), + FieldPanel('issid_part'), + + FieldPanel('dateiso'), + FieldPanel('month'), + FieldPanel('fpage'), + FieldPanel('seq'), + FieldPanel('lpage'), + FieldPanel('elocatid'), + FieldPanel('order'), + FieldPanel('pagcount'), + FieldPanel('doctopic'), + FieldPanel('language'), + FieldPanel('spsversion'), + FieldPanel('artdate'), + FieldPanel('ahpdate'), + ] + + edit_handler = TabbedInterface( + [ + ObjectList(panels_xml, heading="XML"), + ObjectList(panels_details, heading=_("Details")), + ObjectList(panels_front, heading="Front"), + ObjectList(panels_body, heading="Body"), + ObjectList(panels_back, heading="Back"), + ] + ) + + class Meta: + proxy = True \ No newline at end of file diff --git a/markup_doc/pkg_zip_builder.py b/markup_doc/pkg_zip_builder.py new file mode 100644 index 0000000..b3168ac --- /dev/null +++ b/markup_doc/pkg_zip_builder.py @@ -0,0 +1,183 @@ +from zipfile import ZipFile, ZIP_DEFLATED +import os, sys + +from packtools.sps.models.v2.article_assets import ArticleAssets +from packtools.sps.models.article_and_subarticles import ArticleAndSubArticles + +class PkgZipBuilder: + def __init__(self, xml_with_pre): + self.xml_with_pre = xml_with_pre + self.sps_pkg_name = xml_with_pre.sps_pkg_name + self.components = {} + self.texts = {} + + def build_sps_package( + self, + output_folder, + renditions, + translations, + main_paragraphs_lang, + issue_proc, + ): + """ + A partir do XML original ou gerado a partir do HTML, e + dos ativos digitais, todos registrados em MigratedFile, + cria o zip com nome no padrão SPS (ISSN-ACRON-VOL-NUM-SUPPL-ARTICLE) e + o armazena em SPSPkg.not_optimised_zip_file. + Neste momento o XML não contém pid v3. + """ + # gera nome de pacote padrão SPS ISSN-ACRON-VOL-NUM-SUPPL-ARTICLE + + sps_pkg_zip_path = os.path.join(output_folder, f"{self.sps_pkg_name}.zip") + + # cria pacote zip + with ZipFile(sps_pkg_zip_path, "w", compression=ZIP_DEFLATED) as zf: + + # A partir do XML, obtém os nomes dos arquivos dos ativos digitais + self._build_sps_package_add_assets(zf, issue_proc) + + # add renditions (pdf) to zip + result = self._build_sps_package_add_renditions( + zf, renditions, translations, main_paragraphs_lang + ) + self.texts.update(result) + + # adiciona XML em zip + self._build_sps_package_add_xml(zf) + + return sps_pkg_zip_path + + def _build_sps_package_add_renditions( + self, zf, renditions, translations, main_paragraphs_lang + ): + xml = ArticleAndSubArticles(self.xml_with_pre.xmltree) + xml_langs = [] + for item in xml.data: + if item.get("lang"): + xml_langs.append(item.get("lang")) + + pdf_langs = [] + + for rendition in renditions: + try: + if rendition.lang: + sps_filename = f"{self.sps_pkg_name}-{rendition.lang}.pdf" + pdf_langs.append(rendition.lang) + else: + sps_filename = f"{self.sps_pkg_name}.pdf" + pdf_langs.append(xml_langs[0]) + + zf.write(rendition.file.path, arcname=sps_filename) + + self.components[sps_filename] = { + "lang": rendition.lang, + "legacy_uri": rendition.original_href, + "component_type": "rendition", + } + except Exception as e: + exc_type, exc_value, exc_traceback = sys.exc_info() + self.components[rendition.original_name] = { + "failures": format_traceback(exc_traceback), + } + html_langs = list(translations.keys()) + try: + if main_paragraphs_lang: + html_langs.append(main_paragraphs_lang) + except Exception as e: + pass + + return { + "xml_langs": xml_langs, + "pdf_langs": pdf_langs, + "html_langs": html_langs, + } + + def _build_sps_package_add_assets(self, zf, issue_proc): + replacements = {} + subdir = os.path.join( + issue_proc.journal_proc.acron, + issue_proc.issue_folder, + ) + xml_assets = ArticleAssets(self.xml_with_pre.xmltree) + for xml_graphic in xml_assets.items: + try: + if replacements.get(xml_graphic.xlink_href): + continue + + basename = os.path.basename(xml_graphic.xlink_href) + name, ext = os.path.splitext(basename) + + found = False + + # procura a "imagem" no contexto do "issue" + for asset in issue_proc.find_asset(basename, name): + found = True + self._build_sps_package_add_asset( + zf, + asset, + xml_graphic, + replacements, + ) + + if not found: + self.components[xml_graphic.xlink_href] = { + "failures": "Not found", + } + + except Exception as e: + exc_type, exc_value, exc_traceback = sys.exc_info() + #self.components[xml_graphic.xlink_href] = { + # "failures": format_traceback(exc_traceback), + #} + print(e) + print(exc_traceback) + xml_assets.replace_names(replacements) + + def _build_sps_package_add_asset( + self, + zf, + asset, + xml_graphic, + replacements, + ): + try: + # obtém o nome do arquivo no padrão sps + sps_filename = xml_graphic.name_canonical(self.sps_pkg_name) + + # indica a troca de href original para o padrão SPS + replacements[xml_graphic.xlink_href] = sps_filename + + # adiciona arquivo ao zip + zf.write(asset.file.path, arcname=sps_filename) + + component_type = ( + "supplementary-material" + if xml_graphic.is_supplementary_material + else "asset" + ) + self.components[sps_filename] = { + "xml_elem_id": xml_graphic.id, + "legacy_uri": asset.original_href, + "component_type": component_type, + } + except Exception as e: + exc_type, exc_value, exc_traceback = sys.exc_info() + #self.components[xml_graphic.xlink_href] = { + # "failures": format_traceback(exc_traceback), + #} + print(e) + print(exc_traceback) + + def _build_sps_package_add_xml(self, zf): + try: + sps_xml_name = self.sps_pkg_name + ".xml" + zf.writestr(sps_xml_name, self.xml_with_pre.tostring(pretty_print=True)) + self.components[sps_xml_name] = {"component_type": "xml"} + except Exception as e: + exc_type, exc_value, exc_traceback = sys.exc_info() + #self.components[sps_xml_name] = { + #"component_type": "xml", + #"failures": format_traceback(exc_traceback), + #} + print(e) + print(exc_traceback) diff --git a/markup_doc/static/css/article.css b/markup_doc/static/css/article.css new file mode 100644 index 0000000..07c1ba4 --- /dev/null +++ b/markup_doc/static/css/article.css @@ -0,0 +1,4 @@ +@charset "UTF-8";/*! + * Article + */@-webkit-keyframes bounce{0%,100%,20%,50%,80%{-webkit-transform:translateY(0)}40%{-webkit-transform:translateY(30px)}60%{-webkit-transform:translateY(15px)}}@-moz-keyframes bounce{0%,100%,20%,50%,80%{-moz-transform:translateY(0)}40%{-moz-transform:translateY(30px)}60%{-moz-transform:translateY(15px)}}@-ms-keyframes bounce{0%,100%,20%,50%,80%{-ms-transform:translateY(0)}40%{-ms-transform:translateY(30px)}60%{-ms-transform:translateY(15px)}}@-o-keyframes bounce{0%,100%,20%,50%,80%{-o-transform:translateY(0)}40%{-o-transform:translateY(30px)}60%{-o-transform:translateY(15px)}}@keyframes bounce{0%,100%,20%,50%,80%{transform:translateY(0)}40%{transform:translateY(30px)}60%{transform:translateY(15px)}}@-webkit-keyframes slideInUp{from{-webkit-transform:translate3d(0,30%,0);transform:translate3d(0,30%,0);visibility:visible;opacity:0}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}.scielo__shadow-1{box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24)}.scielo__shadow-2{box-shadow:0 3px 6px rgba(0,0,0,.16),0 3px 6px rgba(0,0,0,.23)}.scielo__shadow-3{box-shadow:0 10px 20px rgba(0,0,0,.19),0 6px 6px rgba(0,0,0,.23)}.scielo__shadow-4{box-shadow:0 14px 28px rgba(0,0,0,.25),0 10px 10px rgba(0,0,0,.22)}.scielo__shadow-5{box-shadow:0 19px 38px rgba(0,0,0,.3),0 15px 12px rgba(0,0,0,.22)}.article .zindexFix{z-index:98!important}.article a.goto{white-space:nowrap;text-decoration:none}.article a.goto .glyphBtn{margin-right:-5px}.article .levelMenu{padding:18px 0;margin:0;height:100px}.article .levelMenu a.selected:after{border-bottom-color:#fff;display:none}.article .levelMenu .downloadOptions li,.article .levelMenu .downloadOptions ul{display:inline;margin:0;padding:0}.article .levelMenu .downloadOptions li{list-style:none}.article .levelMenu .downloadOptions ul.dropdown-menu{display:none;min-width:inherit;width:100%;border-color:#dedddb;font-size:.9em;border-top-left-radius:0;border-top-right-radius:0;border-top:0}.article .levelMenu .downloadOptions .group:hover ul.dropdown-menu{display:block}.article .levelMenu .downloadOptions .group:hover a.btn{color:#fff}.article .levelMenu .downloadOptions .group:hover a.btn .glyphBtn.pdfDownload{background-position:center -2800px}.article .levelMenu .downloadOptions .group:hover a.btn .glyphBtn.xmlDownload{background-position:center -2845px}.article .levelMenu .downloadOptions .group:hover a.btn .glyphBtn.epubDownload{background-position:center -3700px}.article .levelMenu .downloadOptions .btn-group .group:not(:first-child):not(:last-child) .btn{border-radius:0}.article .levelMenu .downloadOptions .btn-group .group:first-child:not(:last-child) .btn{border-bottom-right-radius:0;border-top-right-radius:0}.article .levelMenu .downloadOptions .btn-group .group:first-child:not(:last-child) .btn{border-bottom-right-radius:0;border-top-right-radius:0}.article .levelMenu .downloadOptions .btn-group .group:last-child:not(:first-child) .btn{border-bottom-left-radius:0;border-top-left-radius:0}.article .levelMenu .downloadOptions .group{display:block;float:left;position:relative}.article .levelMenu .downloadOptions .group a.btn{width:100%}.article .levelMenu .downloadOptions .group+.group{margin-left:-1px}.article .levelMenu .downloadOptions .btn{text-align:left}.article .share{display:flex;justify-content:flex-end;align-items:center;height:36px}.article .share a{margin:0 3px}.article .share .sendViaMail{margin-left:4px}.article .journalMenu .language{top:10px}.article .alternativeHeader{top:0!important}.article .alternativeHeader .mainNav{height:55px}.article .mainNav{height:55px}.article .mainMenu{top:-7px}.article .xref{display:inline-block;font-weight:700;text-align:center;color:#3867ce;cursor:pointer}.scielo__theme--dark .article .xref{color:#86acff}.scielo__theme--light .article .xref{color:#3867ce}.article .xref.big{margin-top:0;vertical-align:middle;color:#b67f00}.article .xref a{text-decoration:none;color:#b67f00}.article sup.xref{padding:4px 0 3px}.article .ref{position:relative;display:inline}@media screen and (max-width:575px){.article .ref{position:static}}.article .ref .refCtt{-webkit-box-shadow:2px 2px 7px 0 rgba(0,0,0,.2);-moz-box-shadow:2px 2px 7px 0 rgba(0,0,0,.2);box-shadow:2px 2px 7px 0 rgba(0,0,0,.2)}.article .ref .closed{display:none}.article .ref .opened{margin-top:1.4em;padding:14px;position:absolute;width:350px;height:auto!important;overflow-y:inherit!important;overflow-x:hidden;text-overflow:ellipsis;border-radius:4px;z-index:99;background:#3867ce;color:#fff}@media screen and (max-width:575px){.article .ref .opened{width:90%}}.scielo__theme--dark .article .ref .opened{background:#86acff;color:#333}.scielo__theme--light .article .ref .opened{background:#3867ce;color:#fff}.article .ref .opened:before{content:'';display:block;width:100%;position:absolute;height:.6em;margin-top:-1.6em;background:0 0;left:0}.article .ref .opened a{color:#fff!important}.article .ref .opened a:hover{text-decoration:underline}.article .ref .opened strong{display:block;margin:0 0 5px}.article .ref .opened .source{display:block;margin-top:5px}.article .ref .opened .refOverflow{overflow-x:hidden;text-overflow:ellipsis}.article .ref.footnote{letter-spacing:0}.article .ref.footnote .refCtt{padding:0}.article .ref.footnote .refCtt .refCttPadding{display:block;padding:14px}.article .ref.footnote .refCtt.opened{background:#fef5e8;border:1px solid #fce0b7;color:#333;padding:5px 10px}.article .ref.footnote .fn-title{display:block;text-transform:uppercase;color:#b67f00}.article .ref.footnote .footref{cursor:default}.article .ref.footnote .smallRef{font-size:1em;position:relative;display:block;padding:14px;width:100%;color:#fff;border:0;border-radius:0}.article .ref.footnote .smallRef .xref{position:absolute;top:12px;cursor:default}.article .ref.footnote .smallRef .xref:first-child{font-size:11px!important}.article .ref.footnote .smallRef .footrefCtt{display:block;padding-left:14px}.article .refList{margin:0;padding:0;width:100%}.article .refList *{line-height:130%}.article .refList [class*=" material-icons"],.article .refList [class^=material-icons]{line-height:1}.article .refList a{overflow-x:hidden;text-overflow:ellipsis}.article .refList.outer{padding-bottom:10px;overflow:hidden;-webkit-box-shadow:inset 0 -7px 7px -7px rgba(0,0,0,.2);box-shadow:inset 0 -7px 7px -7px rgba(0,0,0,.2)}.article .refList.full{position:absolute;height:auto!important;overflow:inherit!important;background:#fff;z-index:99;padding-bottom:0;-webkit-box-shadow:0 0 10px 0 rgba(0,0,0,.2);box-shadow:0 0 10px 0 rgba(0,0,0,.2)}.article .refList li{list-style:none;padding:16px 8px 16px 0;margin:0;width:100%;border-bottom:1px dotted #ccc}.scielo__theme--dark .article .refList li{border-bottom:1px dotted rgba(255,255,255,.3)}.scielo__theme--light .article .refList li{border-bottom:1px dotted #ccc}.article .refList li:last-child{background:0 0}.article .refList li:after{content:'';clear:both;display:block;height:1px;float:none;width:100%}.article .refList li.highlight{background-color:#f0f3fb}.article .refList li.highlight .closed{display:none}.article .refList li.highlight .opened{display:inline-block}.article .refList li strong{margin:0 0 10px}.article .refList sup{border-radius:30px}.article .refList .source{font-style:italic}.article .refList.footnote .xref.big{color:#b67f00}.article .ref-list .refList .xref{width:33px;padding:5px 10px;cursor:default;position:absolute;left:0;top:5px;margin-top:1%}.article .ref-list .refList .refCtt.opened{margin-top:1.4em}.article .ref-list .refList li{position:relative;padding-left:30px;text-overflow:ellipsis;z-index:1}.article .ref-list .refList div{display:block;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto}.article .ref-list .refList div strong{display:inline}.article .ref-list .refList.footnote li{padding:0 8px 8px 0}.article .ref-list .refList.footnote li .xref.big{position:static;width:auto}.articleCtt{background:#f7f6f4}.scielo__theme--dark .articleCtt{background:#393939}.scielo__theme--light .articleCtt{background:#f7f6f4}.articleCtt hr{border:0;background:url(../img/dashline.png) bottom left repeat-x;height:1px;margin:50px 0}.articleCtt .sci-ico-fileFigure:before,.articleCtt .sci-ico-fileFormula:before,.articleCtt .sci-ico-fileTable:before{margin-left:-2px;margin-right:-4px}.articleCtt .open-asset-modal{white-space:nowrap}.articleCtt .container{position:relative}.articleCtt .articleBlock h1{margin:0;font-size:1.9em}.articleCtt .articleBlock a:active,.articleCtt .articleBlock a:focus,.articleCtt .articleBlock a:visited{text-decoration:none}.articleCtt .articleMeta,.articleCtt .editionMeta{text-align:center;font-size:.85em}.articleCtt .articleMeta span,.articleCtt .editionMeta span{font-size:1em;margin:0;font-weight:400;color:#a7a49e}.articleCtt .articleMeta .atricleLink,.articleCtt .editionMeta .atricleLink{width:18px;background-position:center -2576px}.articleCtt .articleMeta{line-height:24px}.articleCtt .articleMeta .sci-ico-cr,.articleCtt .articleMeta .sci-ico-public-domain{font-size:21px}.articleCtt .articleMeta label{margin-left:8px;width:10%;border:1px solid #e0e0df;cursor:pointer}.articleCtt .articleMeta div{display:inline}.articleCtt .articleMeta div:first-child{margin-right:60px}.articleCtt .articleMeta .doi{color:#1b92e4}.articleCtt .license{letter-spacing:-16.28px;vertical-align:middle;line-height:44px;white-space:nowrap;display:inline-block;margin-bottom:5px;cursor:pointer}.articleCtt .license [class*=" sci-ico-"],.articleCtt .license [class^=sci-ico-]{cursor:pointer;font-size:44px}.articleCtt .license [class*=" sci-ico-"].sci-ico-cc,.articleCtt .license [class^=sci-ico-].sci-ico-cc{margin-right:4px}.articleCtt .contribGroup{color:#403d39;margin:15px 10%;font-size:1.1em;text-align:center}.articleCtt .contribGroup a.btn-fechar{display:inline-block;border-radius:100%;cursor:pointer;width:30px;height:30px;font-size:86%;padding:5px 0;text-align:center;margin-top:10px}.articleCtt .contribGroup a.btn-fechar:hover{color:#fff}.articleCtt .contribGroup .sci-ico-emailOutlined{font-size:20px;vertical-align:baseline}.articleCtt .contribGroup .dropdown{display:inline-block;padding:0 10px}.articleCtt .contribGroup .dropdown .dropdown-toggle{white-space:nowrap}.articleCtt .contribGroup .dropdown .dropdown-menu{padding:0 20px 10px 20px;color:#fff;text-align:left;box-shadow:none;border:none}.articleCtt .contribGroup .dropdown .dropdown-menu strong{display:block;margin:20px 0 8px 0;font-size:11px;color:#00314c;text-transform:uppercase}.articleCtt .contribGroup .dropdown a{cursor:pointer}.articleCtt .contribGroup .dropdown a span{display:inline-block;padding:5px 0}.articleCtt .contribGroup .dropdown.open a{color:#fff}.articleCtt .contribGroup.contribGroupAlignLeft{text-align:left;margin-left:0;margin-top:0}.articleCtt .contribGroup.contribGroupAlignLeft .dropdown:first-child{margin-left:-10px}.articleCtt .linkGroup{position:relative;font-size:.85em}.articleCtt .linkGroup a.selected{position:relative}.articleCtt .linkGroup a.selected:after{content:'';display:block;position:absolute;bottom:-16px;left:4px;width:16px;height:7px;background:url(../img/articleContent-arrow.png) bottom center no-repeat;z-index:999}.articleCtt .floatInformation{margin-top:9px;border:1px solid #ddd;padding:15px;position:absolute;display:none;z-index:99;width:100%;background:#f7f6f4}.scielo__theme--dark .articleCtt .floatInformation{background:#393939}.scielo__theme--light .articleCtt .floatInformation{background:#f7f6f4}.articleCtt .floatInformation .close{margin-top:-7px}.articleCtt .floatInformation ul{margin:0;padding:0}.articleCtt .floatInformation li{list-style:none;margin-bottom:7px;padding-left:20px}.articleCtt .floatInformation li .xref:first-child{margin-left:-22px}.articleCtt .floatInformation .rowBlock{padding:7px 15px;background:url(../img/dashline.png) bottom left repeat-x}.articleCtt .floatInformation .rowBlock:last-child{background:0 0}.articleCtt .floatInformation h3{margin:0 0 10px}.articleCtt .articleTxt{position:relative;padding:0 50px 100px;margin-bottom:60px;overflow-x:hidden;box-shadow:0 3px 6px rgba(0,0,0,.16),0 3px 6px rgba(0,0,0,.23);border-radius:4px;background:#fff}.scielo__theme--dark .articleCtt .articleTxt{background:#333}.scielo__theme--light .articleCtt .articleTxt{background:#fff}.articleCtt .articleTxt .article-title,.articleCtt .articleTxt .articleSectionTitle{margin:25px 0 12px}@media screen and (max-width:575px){.articleCtt .articleTxt .article-title,.articleCtt .articleTxt .articleSectionTitle{font-weight:700;font-size:1.75rem;line-height:1.2em;letter-spacing:-.14px}}.articleCtt .articleTxt .articleBadge-editionMeta-doi-copyLink{font-size:.85em;margin:0;font-weight:400;padding:10px 0 0;text-align:center;min-height:35px;line-height:110%;color:#6c6b6b}.scielo__theme--dark .articleCtt .articleTxt .articleBadge-editionMeta-doi-copyLink{color:#adadad}.scielo__theme--light .articleCtt .articleTxt .articleBadge-editionMeta-doi-copyLink{color:#6c6b6b}.articleCtt .articleTxt .articleBadge-editionMeta-doi-copyLink ._articleBadge{font-weight:700;opacity:1}.articleCtt .articleTxt .articleBadge-editionMeta-doi-copyLink .group-doi{white-space:nowrap;display:inline-block}.articleCtt .articleTxt .articleBadge-editionMeta-doi-copyLink ._doi{color:#3867ce}@media screen and (max-width:575px){.articleCtt .articleTxt .articleBadge-editionMeta-doi-copyLink ._doi{display:table;white-space:pre-wrap;margin:12px 0}}.scielo__theme--dark .articleCtt .articleTxt .articleBadge-editionMeta-doi-copyLink ._doi{color:#86acff}.scielo__theme--light .articleCtt .articleTxt .articleBadge-editionMeta-doi-copyLink ._doi{color:#3867ce}.articleCtt .articleTxt .articleBadge-editionMeta-doi-copyLink .copyLink{white-space:nowrap;margin:0 0 8px 8px}.articleCtt .articleTxt .article-title{text-align:center}@media screen and (max-width:575px){.articleCtt .articleTxt .article-title{font-weight:700;font-size:1.75rem;line-height:1.2em;letter-spacing:-.14px}}.articleCtt .articleTxt .article-title .sci-ico-openAccess{margin-bottom:7px}.articleCtt .articleTxt .article-title .short-link{position:relative;visibility:hidden;cursor:pointer;text-decoration:none}.articleCtt .articleTxt .article-title .short-link [class^=sci-ico-]{vertical-align:baseline!important;margin-left:.5rem}.articleCtt .articleTxt .article-title .short-link:after{position:absolute;background:#34ad65;top:100%;left:0;right:0;bottom:0;z-index:2;text-align:center;font-family:scielo-glyphs!important;content:"\e924";color:#fff;font-size:20px;visibility:hidden;vertical-align:middle;display:flex;justify-content:center;align-items:center;border-radius:4px}.articleCtt .articleTxt .article-title .short-link.copyFeedback:after{top:0;visibility:visible}.articleCtt .articleTxt .article-title .ref .opened{margin-top:2.4em}.articleCtt .articleTxt .article-title .ref.footnote .xref:first-child{font-size:1.5rem}.articleCtt .articleTxt .article-title .ref.footnote .refCtt.opened{text-align:left;font-weight:400;font-size:18px;letter-spacing:inherit;background:#fef5e8;border:1px solid #fce0b7;color:#403d39}.articleCtt .articleTxt .article-title .ref.footnote .refCtt .refCttPadding{line-height:1.5rem}.articleCtt .articleTxt .article-title:hover .short-link{visibility:visible}.articleCtt .articleTxt h2.article-title{font-weight:400}.articleCtt .articleTxt .article-correction-title{margin:10px 15% 20px;border:2px solid #f5d431;padding:20px}.articleCtt .articleTxt .article-correction-title .panel-heading{font-size:13px;font-weight:700;text-align:left;padding:3px;padding:5px}.articleCtt .articleTxt .article-correction-title .panel-body{padding:0}.articleCtt .articleTxt .article-correction-title ul{margin:0;padding:0;text-align:left;font-size:14px}.articleCtt .articleTxt .article-correction-title li{list-style:none;padding-left:15px;position:relative}.articleCtt .articleTxt .article-correction-title li:before{content:'\00bb';font-weight:700;position:absolute;left:0}.articleCtt .articleTxt .article-correction-title a{font-weight:700}.articleCtt .articleTxt .article-correction-title a:hover{text-decoration:underline}.articleCtt .articleTxt .articleSection{padding:0 0 1px;background:url(../img/dashline.png) bottom left repeat-x}.articleCtt .articleTxt .articleSection .article-title{text-align:left}@media screen and (max-width:575px){.articleCtt .articleTxt .articleSection .article-title{font-weight:700;font-size:1.75rem;line-height:1.2em;letter-spacing:-.14px}}.articleCtt .articleTxt .articleSection:last-child{background:0 0}.articleCtt .articleTxt .articleSection .articleSignature{font-size:15px;font-style:italic}.articleCtt .articleTxt .articleSection .articleSignature small{display:block}.articleCtt .articleTxt .articleSection.articleSection--abstract h3,.articleCtt .articleTxt .articleSection.articleSection--resumen h3,.articleCtt .articleTxt .articleSection.articleSection--resumo h3{text-transform:lowercase!important}.articleCtt .articleTxt .articleSection.articleSection--abstract h3::first-letter,.articleCtt .articleTxt .articleSection.articleSection--resumen h3::first-letter,.articleCtt .articleTxt .articleSection.articleSection--resumo h3::first-letter{text-transform:uppercase!important}.articleCtt .articleTxt .paragraph{position:relative;margin-bottom:25px;font-size:1em;line-height:1.7em}.articleCtt .articleTxt .btn.primary{background:#fff;font-size:1.1em;padding:10px 15px}.articleCtt .articleTxt .btn.primary:hover{color:#fff}.articleCtt .articleTxt span.formula{display:block;margin:20px 0;padding:7px;text-align:center;font-size:2em;border-radius:3px}.articleCtt .articleTxt span.formula img{max-width:95%}.articleCtt .articleTxt p{margin:0 0 15px;padding:0;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto}.articleCtt .articleTxt .articleReferral{display:flex;align-items:center;position:relative;margin-bottom:20px;padding:15px 50px 15px 140px;border:1px solid #f3f2e4;vertical-align:middle;min-height:168px}.articleCtt .articleTxt .articleReferral .arText{padding-left:25px}.articleCtt .articleTxt .articleReferral .arText h2{margin-top:0}.articleCtt .articleTxt .articleReferral .arText p{margin-bottom:0}.articleCtt .articleTxt .articleReferral .arPicture{position:relative;width:98px;margin-left:-120px}.articleCtt .articleTxt .articleReferral .arPicture small{font-size:62%;white-space:nowrap}.articleCtt .articleTxt .articleReferral .arPicture small span{display:block}.articleCtt .articleTxt .articleReferral.noPicture{padding:15px 40px}.articleCtt .articleTxt .articleReferral.noPicture .arText{padding-left:0}.articleCtt .articleTxt .articleReferral.biography .arPicture{margin-top:-40px}.articleCtt .articleMenu{position:absolute;margin:25px 0 90px 0;padding:0 15px 0 0;font-size:.85em}.articleCtt .articleMenu.fixed{position:fixed;top:50px}.articleCtt .articleMenu.fixedBottom{position:absolute;top:initial;bottom:50px}.articleCtt .articleMenu li{list-style:none;padding-left:17px}.articleCtt .articleMenu li:before{content:'\00bb';display:inline-block;width:12px;text-align:center;margin-left:-17px;vertical-align:middle;margin-bottom:5px;color:#6c6b6b}.scielo__theme--dark .articleCtt .articleMenu li:before{color:#adadad}.scielo__theme--light .articleCtt .articleMenu li:before{color:#6c6b6b}.articleCtt .articleMenu li.link-to-top{margin-top:20px}.articleCtt .articleMenu li.link-to-top:before{content:'';display:inline;width:auto}.articleCtt .articleMenu li.link-to-top a .circle{width:20px;height:20px;display:inline-block;color:#fff;border-radius:100px;padding:0 0 0 3px;font-size:125%}.articleCtt .articleMenu a{display:inline-block;width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;margin-bottom:5px;text-decoration:none;color:#6c6b6b;text-transform:lowercase!important}.scielo__theme--dark .articleCtt .articleMenu a{color:#adadad}.scielo__theme--light .articleCtt .articleMenu a{color:#6c6b6b}.articleCtt .articleMenu a::first-letter{text-transform:uppercase!important}.articleCtt .articleMenu ul{margin:0;padding:0}.articleCtt .articleMenu li li{padding-left:7px}.articleCtt .articleMenu li li:before{display:none}.articleCtt .articleMenu li.selected:before,.articleCtt .articleMenu li.selected>a{font-weight:700;color:#00314c}.scielo__theme--dark .articleCtt .articleMenu li.selected:before,.scielo__theme--dark .articleCtt .articleMenu li.selected>a{color:#eee}.scielo__theme--light .articleCtt .articleMenu li.selected:before,.scielo__theme--light .articleCtt .articleMenu li.selected>a{color:#00314c}.articleCtt .articleMenu li.selected li a,.articleCtt .articleMenu li.selected li:before{color:#00314c}.scielo__theme--dark .articleCtt .articleMenu li.selected li a,.scielo__theme--dark .articleCtt .articleMenu li.selected li:before{color:#eee}.scielo__theme--light .articleCtt .articleMenu li.selected li a,.scielo__theme--light .articleCtt .articleMenu li.selected li:before{color:#00314c}.articleCtt .articleMenu a:active,.articleCtt .articleMenu a:focus,.articleCtt .articleMenu a:visited{text-decoration:none}.articleCtt .articleFigure{position:absolute;border:4px solid #efeeec}.articleCtt .table-notes a{display:block;padding:5px 0}.articleCtt .nav-tabs li:first-child{margin-left:15px}.articleCtt .nav-tabs a{border:1px solid #ddd;background:#fff}.articleCtt .nav-tabs a:hover{background:#f7f6f4}.scielo__theme--dark .articleCtt .nav-tabs a:hover{background:#393939}.scielo__theme--light .articleCtt .nav-tabs a:hover{background:#f7f6f4}.articleCtt .articleTimeline{margin:0 0 25px;padding:0;font-size:.9em}.articleCtt .articleTimeline li{display:inline-block;width:33%;height:40px;padding-left:25px;list-style:none}.articleCtt .articleTimeline li:before{content:'\00bb';margin-left:-25px;display:inline-block;width:22px;text-align:center}.articleCtt .documentLicense{margin:20px 0}.articleCtt .documentLicense .container-license{font-size:.8em;padding:25px;width:100%;background:#efeeec}.scielo__theme--dark .articleCtt .documentLicense .container-license{background:#414141}.scielo__theme--light .articleCtt .documentLicense .container-license{background:#efeeec}.articleCtt .documentLicense .container-license .row div:first-child{text-align:center}.articleCtt .documentLicense .container-license .row div:last-child{padding-left:0}.articleCtt .documentLicense .container-license a{cursor:pointer;display:inline-block}.articleCtt .documentLicense img{margin:0 auto;width:100%}.articleCtt .journalLicense .row{padding-bottom:25px;font-size:.9em}.articleCtt .share{text-align:center;margin-top:-3px;background:url(../img/dashline.png) bottom left repeat-x;padding-bottom:5px}.articleCtt .collapseBlock{font-size:.9em}.articleCtt .collapseBlock .collapseTitle{position:relative;display:block;background:url(../img/dashline.png) bottom left repeat-x;padding:7px 2px}.articleCtt .collapseBlock .collapseTitle .collapseIcon{position:absolute;right:0}.articleCtt .collapseBlock .collapseTitle:active,.articleCtt .collapseBlock .collapseTitle:focus{text-decoration:none}.articleCtt .collapseContent{background:#f7f6f5;font-size:.9em;padding:15px}.articleCtt .collapseContent ul{margin:0;padding:0}.articleCtt .collapseContent li{list-style:none;padding-left:15px;margin-bottom:5px}.articleCtt .collapseContent li:before{content:'\00bb';display:inline-block;width:13px;text-align:center;margin-left:-15px}.articleCtt .collapseContent .logos:before{width:22px;height:12px;display:inline-block;content:'';background:url(../img/button.glyphs.png) no-repeat}.articleCtt .collapseContent .logos.scielo:before{background-position:center -4556px}.articleCtt .collapseContent .logos.fapesp:before{background-position:center -4506px}.articleCtt .collapseContent .logos.google:before{background-position:center -4531px}.articleCtt .functionsBlock{position:absolute;right:0;z-index:99}.articleCtt .articleBadge{text-align:center}.articleCtt .articleBadge span{display:inline-block;padding:5px 10px;margin:0 0 15px 0;border-radius:4px;position:relative;font-size:20px}.articleCtt .articleBadge span:after{content:'';position:absolute;left:0;right:0;bottom:0}.articleCtt .articleCttLeft .article-title,.articleCtt .articleCttLeft .articleBadge,.articleCtt .articleCttLeft .articleMeta,.articleCtt .articleCttLeft .editionMeta{text-align:left!important}.articleCtt .articleCttLeft .contribGroup{margin-left:0;margin-right:0;text-align:left}.articleCtt .articleCttLeft .contribGroup .dropdown:first-child{margin-left:-10px}#translateArticleModal .modal-body{font-size:.9em;background:#f7f6f4}.scielo__theme--dark #translateArticleModal .modal-body{background:#393939}.scielo__theme--light #translateArticleModal .modal-body{background:#f7f6f4}#translateArticleModal .modal-footer{margin-top:0}#translateArticleModal .dashline{padding-bottom:5px;background:url(../img/dashline.png) bottom left repeat-x}#translateArticleModal th{padding:12px;border:1px solid #ddd;border-radius:4px;background:#fdfcf9}#translateArticleModal table{width:100%}#translateArticleModal td{padding:8px 10px;border-bottom:1px solid #dee5f5;text-align:center}#translateArticleModal th{vertical-align:top}.ModalDefault .tab-pane,.articleCtt .tab-pane{font-size:.9em}.ModalDefault .tab-pane p,.articleCtt .tab-pane p{margin:10px 0}.ModalDefault .tab-pane .center,.articleCtt .tab-pane .center{text-align:center}.ModalDefault .tab-pane label,.articleCtt .tab-pane label{font-weight:400;color:#888}.ModalDefault .tab-pane .big,.articleCtt .tab-pane .big{font-size:2em;font-weight:400}.ModalDefault .tab-pane table td,.ModalDefault .tab-pane table th,.articleCtt .tab-pane table td,.articleCtt .tab-pane table th{padding:7px 10px}.ModalDefault .tab-pane table th,.articleCtt .tab-pane table th{font-weight:400;color:#b7b7b7}.ModalDefault .tab-pane a.midGlyph,.articleCtt .tab-pane a.midGlyph{display:block;text-align:center}.ModalDefault .fig,.ModalDefault .table,.articleCtt .fig,.articleCtt .table{margin-top:10px;margin-bottom:40px;position:relative;width:initial}.ModalDefault .fig .col-md-8,.ModalDefault .table .col-md-8,.articleCtt .fig .col-md-8,.articleCtt .table .col-md-8{padding-top:10px}.ModalDefault .fig strong,.ModalDefault .table strong,.articleCtt .fig strong,.articleCtt .table strong{padding:0}.ModalDefault .fig .thumb,.ModalDefault .fig .thumbOff,.ModalDefault .table .thumb,.ModalDefault .table .thumbOff,.articleCtt .fig .thumb,.articleCtt .fig .thumbOff,.articleCtt .table .thumb,.articleCtt .table .thumbOff{height:160px;background-size:100% auto;text-indent:-5000px;background-color:#e5e4e3;cursor:pointer;border-radius:3px;position:relative;border:4px solid #ccc}.scielo__theme--dark .ModalDefault .fig .thumb,.scielo__theme--dark .ModalDefault .fig .thumbOff,.scielo__theme--dark .ModalDefault .table .thumb,.scielo__theme--dark .ModalDefault .table .thumbOff,.scielo__theme--dark .articleCtt .fig .thumb,.scielo__theme--dark .articleCtt .fig .thumbOff,.scielo__theme--dark .articleCtt .table .thumb,.scielo__theme--dark .articleCtt .table .thumbOff{border:4px solid rgba(255,255,255,.3)}.scielo__theme--light .ModalDefault .fig .thumb,.scielo__theme--light .ModalDefault .fig .thumbOff,.scielo__theme--light .ModalDefault .table .thumb,.scielo__theme--light .ModalDefault .table .thumbOff,.scielo__theme--light .articleCtt .fig .thumb,.scielo__theme--light .articleCtt .fig .thumbOff,.scielo__theme--light .articleCtt .table .thumb,.scielo__theme--light .articleCtt .table .thumbOff{border:4px solid #ccc}.ModalDefault .fig .thumb img,.ModalDefault .fig .thumbOff img,.ModalDefault .table .thumb img,.ModalDefault .table .thumbOff img,.articleCtt .fig .thumb img,.articleCtt .fig .thumbOff img,.articleCtt .table .thumb img,.articleCtt .table .thumbOff img{width:100%}.ModalDefault .fig .thumb .zoom,.ModalDefault .fig .thumbOff .zoom,.ModalDefault .table .thumb .zoom,.ModalDefault .table .thumbOff .zoom,.articleCtt .fig .thumb .zoom,.articleCtt .fig .thumbOff .zoom,.articleCtt .table .thumb .zoom,.articleCtt .table .thumbOff .zoom{position:absolute;bottom:10px;right:10px;border-radius:4px;font-size:24px;text-align:center;width:30px;height:30px;line-height:30px;text-indent:0;background-color:#3867ce;color:#fff}.scielo__theme--dark .ModalDefault .fig .thumb .zoom,.scielo__theme--dark .ModalDefault .fig .thumbOff .zoom,.scielo__theme--dark .ModalDefault .table .thumb .zoom,.scielo__theme--dark .ModalDefault .table .thumbOff .zoom,.scielo__theme--dark .articleCtt .fig .thumb .zoom,.scielo__theme--dark .articleCtt .fig .thumbOff .zoom,.scielo__theme--dark .articleCtt .table .thumb .zoom,.scielo__theme--dark .articleCtt .table .thumbOff .zoom{background-color:#86acff;color:#333}.scielo__theme--light .ModalDefault .fig .thumb .zoom,.scielo__theme--light .ModalDefault .fig .thumbOff .zoom,.scielo__theme--light .ModalDefault .table .thumb .zoom,.scielo__theme--light .ModalDefault .table .thumbOff .zoom,.scielo__theme--light .articleCtt .fig .thumb .zoom,.scielo__theme--light .articleCtt .fig .thumbOff .zoom,.scielo__theme--light .articleCtt .table .thumb .zoom,.scielo__theme--light .articleCtt .table .thumbOff .zoom{background-color:#3867ce;color:#fff}.ModalDefault .fig .thumbOff,.ModalDefault .table .thumbOff,.articleCtt .fig .thumbOff,.articleCtt .table .thumbOff{font-family:'Material Icons Outlined'!important;text-align:center;line-height:140px;font-size:100px;color:#6c6b6b;text-indent:0;overflow:hidden;background:#fff}.scielo__theme--dark .ModalDefault .fig .thumbOff,.scielo__theme--dark .ModalDefault .table .thumbOff,.scielo__theme--dark .articleCtt .fig .thumbOff,.scielo__theme--dark .articleCtt .table .thumbOff{background:#333;color:#adadad}.scielo__theme--light .ModalDefault .fig .thumbOff,.scielo__theme--light .ModalDefault .table .thumbOff,.scielo__theme--light .articleCtt .fig .thumbOff,.scielo__theme--light .articleCtt .table .thumbOff{background:#fff;color:#6c6b6b}.ModalDefault .fig .thumbOff:before,.ModalDefault .table .thumbOff:before,.articleCtt .fig .thumbOff:before,.articleCtt .table .thumbOff:before{content:"table_chart"}.ModalDefault .fig .thumbImg,.ModalDefault .table .thumbImg,.articleCtt .fig .thumbImg,.articleCtt .table .thumbImg{position:relative;overflow:hidden;box-sizing:border-box;height:140px;border:4px solid #ccc;border-radius:3px;background-color:#ccc;cursor:pointer}.scielo__theme--dark .ModalDefault .fig .thumbImg,.scielo__theme--dark .ModalDefault .table .thumbImg,.scielo__theme--dark .articleCtt .fig .thumbImg,.scielo__theme--dark .articleCtt .table .thumbImg{border:4px solid rgba(255,255,255,.3);background-color:rgba(255,255,255,.3)}.scielo__theme--light .ModalDefault .fig .thumbImg,.scielo__theme--light .ModalDefault .table .thumbImg,.scielo__theme--light .articleCtt .fig .thumbImg,.scielo__theme--light .articleCtt .table .thumbImg{border:4px solid #ccc;background-color:#ccc}.ModalDefault .fig .thumbImg img,.ModalDefault .table .thumbImg img,.articleCtt .fig .thumbImg img,.articleCtt .table .thumbImg img{width:100%;height:auto;min-height:131px;display:block}.ModalDefault .fig .thumbImg .zoom,.ModalDefault .table .thumbImg .zoom,.articleCtt .fig .thumbImg .zoom,.articleCtt .table .thumbImg .zoom{position:absolute;bottom:10px;right:10px;width:30px;height:30px;border-radius:4px;padding:5px;display:inline-block;font-size:24px;line-height:50%;background-color:#3867ce;color:#fff}.scielo__theme--dark .ModalDefault .fig .thumbImg .zoom,.scielo__theme--dark .ModalDefault .table .thumbImg .zoom,.scielo__theme--dark .articleCtt .fig .thumbImg .zoom,.scielo__theme--dark .articleCtt .table .thumbImg .zoom{background-color:#86acff;color:#333}.scielo__theme--light .ModalDefault .fig .thumbImg .zoom,.scielo__theme--light .ModalDefault .table .thumbImg .zoom,.scielo__theme--light .articleCtt .fig .thumbImg .zoom,.scielo__theme--light .articleCtt .table .thumbImg .zoom{background-color:#3867ce;color:#fff}.ModalDefault .fig .preview,.ModalDefault .table .preview,.articleCtt .fig .preview,.articleCtt .table .preview{position:absolute;border-radius:3px;border:4px solid #e5e4e3;background-color:#fff;top:0;right:0;z-index:99;padding:10px}.ModalDefault .fig .preview img,.ModalDefault .table .preview img,.articleCtt .fig .preview img,.articleCtt .table .preview img{width:100%}.ModalDefault .fig .figInfo,.ModalDefault .table .figInfo,.articleCtt .fig .figInfo,.articleCtt .table .figInfo{padding:10px 10px 10px 45px;line-height:1.4em;color:#8a8987;position:relative}.ModalDefault .fig .figInfo .glyphBtn,.ModalDefault .table .figInfo .glyphBtn,.articleCtt .fig .figInfo .glyphBtn,.articleCtt .table .figInfo .glyphBtn{position:absolute;top:10px;margin-left:-34px}.ModalDefault .formula,.articleCtt .formula{text-align:center;font-family:"Times New Roman",Times,serif;margin-bottom:15px}.ModalDefault .formula span,.articleCtt .formula span{font-family:Arial;font-weight:700;font-size:16px;display:block;width:100%}.ModalDefault .formula .formula-container,.articleCtt .formula .formula-container{width:100%;display:flex;align-content:center;align-items:center;position:relative;flex-direction:column}.ModalDefault .formula .formula-container .MathJax_Display,.ModalDefault .formula .formula-container .MathJax_SVG,.ModalDefault .formula .formula-container .MathJax_SVG_Display,.ModalDefault .formula .formula-container .formula-body,.articleCtt .formula .formula-container .MathJax_Display,.articleCtt .formula .formula-container .MathJax_SVG,.articleCtt .formula .formula-container .MathJax_SVG_Display,.articleCtt .formula .formula-container .formula-body{flex:99;font-size:1.4rem!important}.ModalDefault .formula .formula-container>span,.articleCtt .formula .formula-container>span{flex:1}.ModalDefault .formula .formula-container .label,.articleCtt .formula .formula-container .label{flex:1;color:#000;font-size:1.4rem;display:block;width:auto}.ModalDefault .formula .formula-container .label:first-child,.articleCtt .formula .formula-container .label:first-child{left:0}.ModalDefault .formula .formula-container .label:last-child,.articleCtt .formula .formula-container .label:last-child{right:0}.ModalDefault .formula svg,.articleCtt .formula svg{display:block;width:100%}.ModalDefault .modal-center{text-align:center}.ModalDefault .md-list{margin:0;padding:0;list-style:none}.ModalDefault .md-list li{margin-bottom:4px}.ModalDefault .md-list li:last-child{margin-bottom:0}.ModalDefault .md-list li.colspan3{margin-bottom:10px}.ModalDefault .md-list li.colspan3 a{display:flex;vertical-align:middle;justify-content:center;align-items:center;height:63px;white-space:normal;overflow:hidden}.ModalDefault .md-list.inline li{float:left;min-width:18%;margin-right:10px}.ModalDefault .md-tabs{margin:0;padding:0}.ModalDefault .md-tabs>li{display:flex;align-items:center;justify-content:center;text-align:center;padding:0}.ModalDefault .md-tabs>li a{padding:5px;display:inline-block;margin:0;border:none;color:#7f7a71}.ModalDefault .md-tabs>li a:focus,.ModalDefault .md-tabs>li a:hover{background:0 0}.ModalDefault .md-tabs>li.active a:focus,.ModalDefault .md-tabs>li.active a:hover{border:none;background:0 0}.ModalDefault .md-tabs>li.active .figureIconGray{background-position:center -4414px}.ModalDefault .md-tabs>li.active .tableIconGray{background-position:center -4368px}.ModalDefault .md-tabs>li .glyphBtn{width:40px;height:40px}.ModalDefault .fig,.ModalDefault .table{margin-top:20px;margin-bottom:20px}.ModalTutors .info{padding:28px 0;border-bottom:1px dotted #ccc}.scielo__theme--dark .ModalTutors .info{border-bottom:1px dotted rgba(255,255,255,.3)}.scielo__theme--light .ModalTutors .info{border-bottom:1px dotted #ccc}.ModalTutors .info:last-child{border-bottom:0}.ModalTutors .info:first-child{padding-top:0}.ModalTutors .info h3{margin:0 0 15px;font-size:1.429em;font-weight:400}.ModalTutors .info .tutors{margin-bottom:25px}.ModalTutors .info .tutors strong:first-child{font-size:1.071em}.ModalTutors .info .tutors:last-child{margin-bottom:0}.ModalTutors ul li{margin-top:10px;border-color:#e0e0df}.ModalTutors ul li.inline li{display:inline}#ModalDownloads strong{display:inline-block;padding:15px 0}#ModalDownloads .glyphBtn{width:40px;height:40px}#ModalDownloads [class^=sci-ico-file]{line-height:40px!important;font-size:40px}#ModalArticles .md-tabs,#ModalMetrics .md-tabs{margin:0 0 25px}#ModalArticles .md-tabs>li,#ModalMetrics .md-tabs>li{min-height:50px}#ModalMetrics .outlineFadeLink{margin:0 0 20px;padding:12px;font-size:15px;display:block;text-align:center}#ModalArticles #how2cite-export{margin:20px 0 2px;background:url(../img/dashline.png) top left repeat-x}#ModalArticles #how2cite-export .col-md-2.col-sm-2{width:20%}#ModalArticles .outlineFadeLink{margin-left:0}#ModalArticles .download{display:block}#ModalArticles #citation-ctt{position:absolute;top:-5000px}#ModalArticles #citationCut{position:absolute;top:-5000px}.ModalFigs .modal-title .sci-ico-fileFigure,.ModalFigs .modal-title .sci-ico-fileTable,.ModalTables .modal-title .sci-ico-fileFigure,.ModalTables .modal-title .sci-ico-fileTable{font-size:24px}.ModalFigs .link-newWindow,.ModalTables .link-newWindow{text-decoration:none}.ModalFigs .link-newWindow:hover,.ModalTables .link-newWindow:hover{opacity:1}.ModalFigs .modal-footer,.ModalTables .modal-footer{margin-top:0;text-align:left;background:#f7f6f4}.scielo__theme--dark .ModalFigs .modal-footer,.scielo__theme--dark .ModalTables .modal-footer{background:#393939}.scielo__theme--light .ModalFigs .modal-footer,.scielo__theme--light .ModalTables .modal-footer{background:#f7f6f4}.ModalFigs .modal-title{width:calc(100% - 70px)}.ModalFigs img{float:none}.ModalFigs .modal-body{padding:1rem}.ModalTables .modal-body{overflow:auto}.ModalTables .modal-body:after{content:'';position:absolute;top:0;bottom:0;left:0;right:0;background:#fff url(../img/list.loading.gif) center center no-repeat}.scielo__theme--dark .ModalTables .modal-body:after{background:#333 url(../img/list.loading.gif) center center no-repeat}.scielo__theme--light .ModalTables .modal-body:after{background:#fff url(../img/list.loading.gif) center center no-repeat}.ModalTables .modal-body.cached:after{display:none}.ModalTables .table{margin-top:0;font-size:14px;position:relative;z-index:1}.ModalTables .table .autoWidth{width:auto}.ModalTables .table .striped{background-color:#f8f8f8}.ModalTables .table .inline-graphic{width:100%}.ModalTables .table-hover .table>tbody>tr:hover>td,.ModalTables .table-hover .table>tbody>tr:hover>th{background-color:#f0f3fb}.ModalTables .table-hover .table>tbody>tr:hover>td.striped,.ModalTables .table-hover .table>tbody>tr:hover>th.striped{background-color:#e8eaf2}.ModalTables .ref-list h2{font-size:14px}.ModalTables .ref-list .refList .xref.big{padding:5px 10px}.ModalTables .refList li{padding-bottom:0}.ModalTables .xref{cursor:text}#ModalRelatedArticles .inline li{min-width:48%}#ModalRelatedArticles .inline li:nth-child(2),#ModalRelatedArticles .inline li:nth-child(4){margin-right:0}#ModalVersionsTranslations .modal-body .md-body-dashVertical{display:inline-block;min-height:150px;background:url(../img/dashline.v.png) top center repeat-y}#ModalVersionsTranslations strong{display:inline-block;padding:15px 0}.ModalDefault .md-list li a.lattes,.ModalDefault .md-list li a.researcherid,.ModalDefault .md-list li a.scopus,.articleCtt .contribGroup .btnContribLinks.lattes,.articleCtt .contribGroup .btnContribLinks.researcherid,.articleCtt .contribGroup .btnContribLinks.scopus{padding-left:30px}.ModalDefault .md-list li a.scopus,.articleCtt .contribGroup .btnContribLinks.scopus{background:url(../img/authorIcon-scopus.png) 10px center no-repeat}.ModalDefault .md-list li a.lattes,.articleCtt .contribGroup .btnContribLinks.lattes{background:url(../img/authorIcon-lattes.png) 10px center no-repeat}.ModalDefault .md-list li a.researcherid,.articleCtt .contribGroup .btnContribLinks.researcherid{background:url(../img/authorIcon-researcherid.png) 10px center no-repeat}.ModalDefault .md-list li a.lattes-matteWhite,.articleCtt .contribGroup .btnContribLinks.lattes-matteWhite{background:url(../img/authorIcon-lattes-matteWhite.png) 10px center no-repeat}.articleCtt .article-title.page-header-title,.articleCtt .only-renditions-available p{text-align:center}.articleCtt .only-renditions-available .jumbotron{background-color:#f6f8fa;margin-top:35px}.levelMenu{background:#f7f6f4}.scielo__theme--dark .levelMenu{background:#393939}.scielo__theme--light .levelMenu{background:#f7f6f4}.levelMenu .btn{min-height:38px}.levelMenu .btn.group{width:auto;padding-left:16px!important;padding-right:16px!important}.levelMenu .btn:hover{color:#fff}.levelMenu .btn:hover [class^=sci-ico-]{color:#fff}.levelMenu .dropdown-menu a.current{position:relative;width:100%;font-weight:700}.levelMenu .dropdown-menu a.current:after{content:"✓";display:inline-block;position:absolute;right:5px}.levelMenu-xs .btn-group.btn-group-nav-mobile{width:100%;display:table}.levelMenu-xs .btn-group.btn-group-nav-mobile>.btn{display:table-cell;width:60%}.levelMenu-xs .btn-group.btn-group-nav-mobile>.btn:first-of-type{width:20%}.levelMenu-xs .btn-group.btn-group-nav-mobile>.btn:last-of-type{width:20%}.levelMenu-xs .btn-group.btn-group-nav-mobile>.btn .sci-ico-socialOther{display:inline-block;width:70%}.levelMenu-xs .btn-group.btn-group-nav-mobile-content{width:100%;display:table;padding:5px 2px}.levelMenu-xs .btn-group.btn-group-nav-mobile-content>.dropdown{display:table-cell;width:33%;padding-right:4px}.levelMenu-xs .btn-group.btn-group-nav-mobile-content>.dropdown:last-child{padding-right:0}.levelMenu-xs .btn-group.btn-group-nav-mobile-content>.dropdown:last-child .btn span{width:auto}.levelMenu-xs .btn-group.btn-group-nav-mobile-content>.dropdown:last-child .btn span:nth-child(2){width:55%}.levelMenu-xs .btn-group.btn-group-nav-mobile-content>.dropdown .btn{width:100%;position:relative}.levelMenu-xs .btn-group.btn-group-nav-mobile-content>.dropdown .btn span{width:90%;display:inline-block}.levelMenu-xs .btn-group.btn-group-nav-mobile-content>.dropdown .btn span:last-child{width:auto}.levelMenu-xs .btn-group.btn-group-nav-mobile-content>.dropdown .btn span.caret{position:absolute;right:10px;top:17px}.ref .xref a{color:#b67f00;pointer-events:none}.scielo__theme--dark .ref .xref a{color:#b67f00}.scielo__theme--light .ref .xref a{color:#b67f00}.ref .xref.xrefblue a{color:#3867ce}.scielo__theme--dark .ref .xref.xrefblue a{color:#86acff}.scielo__theme--light .ref .xref.xrefblue a{color:#3867ce}@media screen and (max-width:575px){.ref{position:static}}.ref .opened{background:#3867ce;color:#fff}@media screen and (max-width:575px){.ref .opened{width:90%;margin-left:5%}}.scielo__theme--dark .ref .opened{background:#86acff;color:#333}.scielo__theme--light .ref .opened{background:#3867ce;color:#fff}.h5,h3,h4,h5:not(.modal-title){margin:25px 0 12px}.modal .info{padding-left:24px}.modal .info div{margin-bottom:16px}.modal .info span{list-style:disc;display:list-item}.xref{color:#3867ce}.scielo__theme--dark .xref{color:#86acff}.scielo__theme--light .xref{color:#3867ce} +/*# sourceMappingURL=article.css.map */ \ No newline at end of file diff --git a/markup_doc/static/css/bootstrap.min.css b/markup_doc/static/css/bootstrap.min.css new file mode 100644 index 0000000..efab8ae --- /dev/null +++ b/markup_doc/static/css/bootstrap.min.css @@ -0,0 +1,10 @@ +@charset "UTF-8";/*! + * Bootstrap v5.0.0-beta1 (https://getbootstrap.com/) + * Copyright 2011-2020 The Bootstrap Authors + * Copyright 2011-2020 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */@import url(https://fonts.googleapis.com/css2?family=Arapey&family=Noto+Sans:ital,wght@0,400;0,700;1,400;1,700&display=swap);@import url(https://fonts.googleapis.com/icon?family=Material+Icons&display=swap);@import url(https://fonts.googleapis.com/icon?family=Material+Icons+Outlined);@-webkit-keyframes bounce{0%,100%,20%,50%,80%{-webkit-transform:translateY(0)}40%{-webkit-transform:translateY(30px)}60%{-webkit-transform:translateY(15px)}}@-moz-keyframes bounce{0%,100%,20%,50%,80%{-moz-transform:translateY(0)}40%{-moz-transform:translateY(30px)}60%{-moz-transform:translateY(15px)}}@-ms-keyframes bounce{0%,100%,20%,50%,80%{-ms-transform:translateY(0)}40%{-ms-transform:translateY(30px)}60%{-ms-transform:translateY(15px)}}@-o-keyframes bounce{0%,100%,20%,50%,80%{-o-transform:translateY(0)}40%{-o-transform:translateY(30px)}60%{-o-transform:translateY(15px)}}@keyframes bounce{0%,100%,20%,50%,80%{transform:translateY(0)}40%{transform:translateY(30px)}60%{transform:translateY(15px)}}@-webkit-keyframes slideInUp{from{-webkit-transform:translate3d(0,30%,0);transform:translate3d(0,30%,0);visibility:visible;opacity:0}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}.scielo__shadow-1{box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24)}.scielo__shadow-2{box-shadow:0 3px 6px rgba(0,0,0,.16),0 3px 6px rgba(0,0,0,.23)}.scielo__shadow-3{box-shadow:0 10px 20px rgba(0,0,0,.19),0 6px 6px rgba(0,0,0,.23)}.scielo__shadow-4{box-shadow:0 14px 28px rgba(0,0,0,.25),0 10px 10px rgba(0,0,0,.22)}.scielo__shadow-5{box-shadow:0 19px 38px rgba(0,0,0,.3),0 15px 12px rgba(0,0,0,.22)}:root{--scielo-blue:#3867CE;--scielo-indigo:#6628EE;--scielo-purple:#8D5DF8;--scielo-pink:#C32AA3;--scielo-red:#C63800;--scielo-orange:#FF7E4A;--scielo-yellow:#B67F00;--scielo-green:#2C9D45;--scielo-teal:#30A47F;--scielo-cyan:#2195A9;--scielo-white:#fff;--scielo-gray:#333;--scielo-gray-dark:#00314C;--scielo-primary:#3867CE;--scielo-secondary:#fff;--scielo-success:#2C9D45;--scielo-info:#2195A9;--scielo-warning:#B67F00;--scielo-danger:#C63800;--scielo-light:#F7F6F4;--scielo-dark:#393939;--scielo-font-sans-serif:"Noto Sans",sans-serif;--scielo-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--scielo-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0))}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--scielo-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#393939;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#3867ce;text-decoration:underline}a:hover{color:#2d52a5}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--scielo-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#c32aa3;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#393939;border-radius:.12 .5rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(0,0,0,.6);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:rgba(0,0,0,.6)}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.3);border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:rgba(0,0,0,.6)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--scielo-gutter-x,.5rem);padding-left:var(--scielo-gutter-x,.5rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:100%}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--scielo-gutter-x:1rem;--scielo-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--scielo-gutter-y) * -1);margin-right:calc(var(--scielo-gutter-x)/ -2);margin-left:calc(var(--scielo-gutter-x)/ -2)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--scielo-gutter-x)/ 2);padding-left:calc(var(--scielo-gutter-x)/ 2);margin-top:var(--scielo-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333%}.col-2{flex:0 0 auto;width:16.66667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333%}.col-5{flex:0 0 auto;width:41.66667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333%}.col-8{flex:0 0 auto;width:66.66667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333%}.col-11{flex:0 0 auto;width:91.66667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}.g-0,.gx-0{--scielo-gutter-x:0}.g-0,.gy-0{--scielo-gutter-y:0}.g-1,.gx-1{--scielo-gutter-x:0.25rem}.g-1,.gy-1{--scielo-gutter-y:0.25rem}.g-2,.gx-2{--scielo-gutter-x:0.5rem}.g-2,.gy-2{--scielo-gutter-y:0.5rem}.g-3,.gx-3{--scielo-gutter-x:1rem}.g-3,.gy-3{--scielo-gutter-y:1rem}.g-4,.gx-4{--scielo-gutter-x:1.5rem}.g-4,.gy-4{--scielo-gutter-y:1.5rem}.g-5,.gx-5{--scielo-gutter-x:3rem}.g-5,.gy-5{--scielo-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333%}.col-sm-2{flex:0 0 auto;width:16.66667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333%}.col-sm-5{flex:0 0 auto;width:41.66667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333%}.col-sm-8{flex:0 0 auto;width:66.66667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333%}.col-sm-11{flex:0 0 auto;width:91.66667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}.g-sm-0,.gx-sm-0{--scielo-gutter-x:0}.g-sm-0,.gy-sm-0{--scielo-gutter-y:0}.g-sm-1,.gx-sm-1{--scielo-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--scielo-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--scielo-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--scielo-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--scielo-gutter-x:1rem}.g-sm-3,.gy-sm-3{--scielo-gutter-y:1rem}.g-sm-4,.gx-sm-4{--scielo-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--scielo-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--scielo-gutter-x:3rem}.g-sm-5,.gy-sm-5{--scielo-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333%}.col-md-2{flex:0 0 auto;width:16.66667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333%}.col-md-5{flex:0 0 auto;width:41.66667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333%}.col-md-8{flex:0 0 auto;width:66.66667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333%}.col-md-11{flex:0 0 auto;width:91.66667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}.g-md-0,.gx-md-0{--scielo-gutter-x:0}.g-md-0,.gy-md-0{--scielo-gutter-y:0}.g-md-1,.gx-md-1{--scielo-gutter-x:0.25rem}.g-md-1,.gy-md-1{--scielo-gutter-y:0.25rem}.g-md-2,.gx-md-2{--scielo-gutter-x:0.5rem}.g-md-2,.gy-md-2{--scielo-gutter-y:0.5rem}.g-md-3,.gx-md-3{--scielo-gutter-x:1rem}.g-md-3,.gy-md-3{--scielo-gutter-y:1rem}.g-md-4,.gx-md-4{--scielo-gutter-x:1.5rem}.g-md-4,.gy-md-4{--scielo-gutter-y:1.5rem}.g-md-5,.gx-md-5{--scielo-gutter-x:3rem}.g-md-5,.gy-md-5{--scielo-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333%}.col-lg-2{flex:0 0 auto;width:16.66667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333%}.col-lg-5{flex:0 0 auto;width:41.66667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333%}.col-lg-8{flex:0 0 auto;width:66.66667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333%}.col-lg-11{flex:0 0 auto;width:91.66667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}.g-lg-0,.gx-lg-0{--scielo-gutter-x:0}.g-lg-0,.gy-lg-0{--scielo-gutter-y:0}.g-lg-1,.gx-lg-1{--scielo-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--scielo-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--scielo-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--scielo-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--scielo-gutter-x:1rem}.g-lg-3,.gy-lg-3{--scielo-gutter-y:1rem}.g-lg-4,.gx-lg-4{--scielo-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--scielo-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--scielo-gutter-x:3rem}.g-lg-5,.gy-lg-5{--scielo-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333%}.col-xl-2{flex:0 0 auto;width:16.66667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333%}.col-xl-5{flex:0 0 auto;width:41.66667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333%}.col-xl-8{flex:0 0 auto;width:66.66667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333%}.col-xl-11{flex:0 0 auto;width:91.66667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}.g-xl-0,.gx-xl-0{--scielo-gutter-x:0}.g-xl-0,.gy-xl-0{--scielo-gutter-y:0}.g-xl-1,.gx-xl-1{--scielo-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--scielo-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--scielo-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--scielo-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--scielo-gutter-x:1rem}.g-xl-3,.gy-xl-3{--scielo-gutter-y:1rem}.g-xl-4,.gx-xl-4{--scielo-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--scielo-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--scielo-gutter-x:3rem}.g-xl-5,.gy-xl-5{--scielo-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333%}.col-xxl-2{flex:0 0 auto;width:16.66667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333%}.col-xxl-5{flex:0 0 auto;width:41.66667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333%}.col-xxl-8{flex:0 0 auto;width:66.66667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333%}.col-xxl-11{flex:0 0 auto;width:91.66667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333%}.offset-xxl-2{margin-left:16.66667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333%}.offset-xxl-5{margin-left:41.66667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333%}.offset-xxl-8{margin-left:66.66667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333%}.offset-xxl-11{margin-left:91.66667%}.g-xxl-0,.gx-xxl-0{--scielo-gutter-x:0}.g-xxl-0,.gy-xxl-0{--scielo-gutter-y:0}.g-xxl-1,.gx-xxl-1{--scielo-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--scielo-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--scielo-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--scielo-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--scielo-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--scielo-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--scielo-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--scielo-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--scielo-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--scielo-gutter-y:3rem}}.table{--scielo-table-bg:transparent;--scielo-table-striped-color:#393939;--scielo-table-striped-bg:rgba(0, 0, 0, 0.05);--scielo-table-active-color:#393939;--scielo-table-active-bg:rgba(0, 0, 0, 0.1);--scielo-table-hover-color:#393939;--scielo-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#393939;vertical-align:top;border-color:rgba(0,0,0,.3)}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--scielo-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--scielo-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--scielo-table-accent-bg:var(--scielo-table-striped-bg);color:var(--scielo-table-striped-color)}.table-active{--scielo-table-accent-bg:var(--scielo-table-active-bg);color:var(--scielo-table-active-color)}.table-hover>tbody>tr:hover{--scielo-table-accent-bg:var(--scielo-table-hover-bg);color:var(--scielo-table-hover-color)}.table-primary{--scielo-table-bg:#d7e1f5;--scielo-table-striped-bg:#ccd6e9;--scielo-table-striped-color:#000;--scielo-table-active-bg:#c2cbdd;--scielo-table-active-color:#000;--scielo-table-hover-bg:#c7d0e3;--scielo-table-hover-color:#000;color:#000;border-color:#c2cbdd}.table-secondary{--scielo-table-bg:white;--scielo-table-striped-bg:#f2f2f2;--scielo-table-striped-color:#000;--scielo-table-active-bg:#e6e6e6;--scielo-table-active-color:#000;--scielo-table-hover-bg:#ececec;--scielo-table-hover-color:#000;color:#000;border-color:#e6e6e6}.table-success{--scielo-table-bg:#d5ebda;--scielo-table-striped-bg:#cadfcf;--scielo-table-striped-color:#000;--scielo-table-active-bg:#c0d4c4;--scielo-table-active-color:#000;--scielo-table-hover-bg:#c5d9ca;--scielo-table-hover-color:#000;color:#000;border-color:#c0d4c4}.table-info{--scielo-table-bg:#d3eaee;--scielo-table-striped-bg:#c8dee2;--scielo-table-striped-color:#000;--scielo-table-active-bg:#bed3d6;--scielo-table-active-color:#000;--scielo-table-hover-bg:#c3d8dc;--scielo-table-hover-color:#000;color:#000;border-color:#bed3d6}.table-warning{--scielo-table-bg:#f0e5cc;--scielo-table-striped-bg:#e4dac2;--scielo-table-striped-color:#000;--scielo-table-active-bg:#d8ceb8;--scielo-table-active-color:#000;--scielo-table-hover-bg:#ded4bd;--scielo-table-hover-color:#000;color:#000;border-color:#d8ceb8}.table-danger{--scielo-table-bg:#f4d7cc;--scielo-table-striped-bg:#e8ccc2;--scielo-table-striped-color:#000;--scielo-table-active-bg:#dcc2b8;--scielo-table-active-color:#000;--scielo-table-hover-bg:#e2c7bd;--scielo-table-hover-color:#000;color:#000;border-color:#dcc2b8}.table-light{--scielo-table-bg:#F7F6F4;--scielo-table-striped-bg:#ebeae8;--scielo-table-striped-color:#000;--scielo-table-active-bg:#dedddc;--scielo-table-active-color:#000;--scielo-table-hover-bg:#e4e4e2;--scielo-table-hover-color:#000;color:#000;border-color:#dedddc}.table-dark{--scielo-table-bg:#393939;--scielo-table-striped-bg:#434343;--scielo-table-striped-color:#fff;--scielo-table-active-bg:#4d4d4d;--scielo-table-active-color:#fff;--scielo-table-hover-bg:#484848;--scielo-table-hover-color:#fff;color:#fff;border-color:#4d4d4d}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:rgba(0,0,0,.6)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#393939;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.4);appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#393939;background-color:#fff;border-color:#9cb3e7;outline:0;box-shadow:0 0 0 .25rem rgba(56,103,206,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::placeholder{color:rgba(0,0,0,.6);opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#efeeec;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#393939;background-color:#efeeec;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e3e2e0}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#393939;background-color:#efeeec;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#e3e2e0}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#393939;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.12 .5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 1rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#393939;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23414141' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid rgba(0,0,0,.4);border-radius:.25rem;appearance:none}.form-select:focus{border-color:#9cb3e7;outline:0;box-shadow:0 0 0 .25rem rgba(56,103,206,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{color:rgba(0,0,0,.6);background-color:#efeeec}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #393939}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);appearance:none;color-adjust:exact;transition:background-color .15s ease-in-out,background-position .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-check-input{transition:none}}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#9cb3e7;outline:0;box-shadow:0 0 0 .25rem rgba(56,103,206,.25)}.form-check-input:checked{background-color:#3867ce;border-color:#3867ce}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#3867ce;border-color:#3867ce;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%239cb3e7'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(56,103,206,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(56,103,206,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#3867ce;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#c3d1f0}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:rgba(0,0,0,.3);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#3867ce;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#c3d1f0}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:rgba(0,0,0,.3);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(0,0,0,.5)}.form-range:disabled::-moz-range-thumb{background-color:rgba(0,0,0,.5)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);padding:1rem .75rem}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#393939;text-align:center;white-space:nowrap;background-color:#efeeec;border:1px solid rgba(0,0,0,.4);border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.12 .5rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:1.75rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#2c9d45}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#000;background-color:rgba(44,157,69,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#2c9d45;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%232C9D45' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#2c9d45;box-shadow:0 0 0 .25rem rgba(44,157,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#2c9d45;padding-right:calc(.75em + 2.3125rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23414141' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%232C9D45' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 1.75rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#2c9d45;box-shadow:0 0 0 .25rem rgba(44,157,69,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#2c9d45}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#2c9d45}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(44,157,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#2c9d45}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#c63800}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(198,56,0,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#c63800;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23C63800'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23C63800' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#c63800;box-shadow:0 0 0 .25rem rgba(198,56,0,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#c63800;padding-right:calc(.75em + 2.3125rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23414141' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23C63800'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23C63800' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 1.75rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#c63800;box-shadow:0 0 0 .25rem rgba(198,56,0,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#c63800}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#c63800}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(198,56,0,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#c63800}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#393939;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#393939}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(56,103,206,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#3867ce;border-color:#3867ce}.btn-primary:hover{color:#fff;background-color:#3058af;border-color:#2d52a5}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#3058af;border-color:#2d52a5;box-shadow:0 0 0 .25rem rgba(86,126,213,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#2d52a5;border-color:#2a4d9b}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(86,126,213,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#3867ce;border-color:#3867ce}.btn-secondary{color:#000;background-color:#fff;border-color:#fff}.btn-secondary:hover{color:#000;background-color:#fff;border-color:#fff}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#000;background-color:#fff;border-color:#fff;box-shadow:0 0 0 .25rem rgba(217,217,217,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#000;background-color:#fff;border-color:#fff}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,217,217,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#000;background-color:#fff;border-color:#fff}.btn-success{color:#000;background-color:#2c9d45;border-color:#2c9d45}.btn-success:hover{color:#000;background-color:#4cac61;border-color:#41a758}.btn-check:focus+.btn-success,.btn-success:focus{color:#000;background-color:#4cac61;border-color:#41a758;box-shadow:0 0 0 .25rem rgba(37,133,59,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#000;background-color:#56b16a;border-color:#41a758}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(37,133,59,.5)}.btn-success.disabled,.btn-success:disabled{color:#000;background-color:#2c9d45;border-color:#2c9d45}.btn-info{color:#000;background-color:#2195a9;border-color:#2195a9}.btn-info:hover{color:#000;background-color:#42a5b6;border-color:#37a0b2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#42a5b6;border-color:#37a0b2;box-shadow:0 0 0 .25rem rgba(28,127,144,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#4daaba;border-color:#37a0b2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(28,127,144,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#2195a9;border-color:#2195a9}.btn-warning{color:#000;background-color:#b67f00;border-color:#b67f00}.btn-warning:hover{color:#000;background-color:#c19226;border-color:#bd8c1a}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#c19226;border-color:#bd8c1a;box-shadow:0 0 0 .25rem rgba(155,108,0,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#c59933;border-color:#bd8c1a}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(155,108,0,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#b67f00;border-color:#b67f00}.btn-danger{color:#fff;background-color:#c63800;border-color:#c63800}.btn-danger:hover{color:#fff;background-color:#a83000;border-color:#9e2d00}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#a83000;border-color:#9e2d00;box-shadow:0 0 0 .25rem rgba(207,86,38,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#9e2d00;border-color:#952a00}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(207,86,38,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#c63800;border-color:#c63800}.btn-light{color:#000;background-color:#f7f6f4;border-color:#f7f6f4}.btn-light:hover{color:#000;background-color:#f8f7f6;border-color:#f8f7f5}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f8f7f6;border-color:#f8f7f5;box-shadow:0 0 0 .25rem rgba(210,209,207,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9f8f6;border-color:#f8f7f5}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(210,209,207,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f7f6f4;border-color:#f7f6f4}.btn-dark{color:#fff;background-color:#393939;border-color:#393939}.btn-dark:hover{color:#fff;background-color:#303030;border-color:#2e2e2e}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#303030;border-color:#2e2e2e;box-shadow:0 0 0 .25rem rgba(87,87,87,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#2e2e2e;border-color:#2b2b2b}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(87,87,87,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#393939;border-color:#393939}.btn-outline-primary{color:#3867ce;border-color:#3867ce}.btn-outline-primary:hover{color:#fff;background-color:#3867ce;border-color:#3867ce}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(56,103,206,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#3867ce;border-color:#3867ce}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(56,103,206,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#3867ce;background-color:transparent}.btn-outline-secondary{color:#fff;border-color:#fff}.btn-outline-secondary:hover{color:#000;background-color:#fff;border-color:#fff}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(255,255,255,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#000;background-color:#fff;border-color:#fff}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(255,255,255,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#fff;background-color:transparent}.btn-outline-success{color:#2c9d45;border-color:#2c9d45}.btn-outline-success:hover{color:#000;background-color:#2c9d45;border-color:#2c9d45}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(44,157,69,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#000;background-color:#2c9d45;border-color:#2c9d45}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(44,157,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#2c9d45;background-color:transparent}.btn-outline-info{color:#2195a9;border-color:#2195a9}.btn-outline-info:hover{color:#000;background-color:#2195a9;border-color:#2195a9}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(33,149,169,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#2195a9;border-color:#2195a9}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(33,149,169,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#2195a9;background-color:transparent}.btn-outline-warning{color:#b67f00;border-color:#b67f00}.btn-outline-warning:hover{color:#000;background-color:#b67f00;border-color:#b67f00}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(182,127,0,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#b67f00;border-color:#b67f00}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(182,127,0,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#b67f00;background-color:transparent}.btn-outline-danger{color:#c63800;border-color:#c63800}.btn-outline-danger:hover{color:#fff;background-color:#c63800;border-color:#c63800}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(198,56,0,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#c63800;border-color:#c63800}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(198,56,0,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#c63800;background-color:transparent}.btn-outline-light{color:#f7f6f4;border-color:#f7f6f4}.btn-outline-light:hover{color:#000;background-color:#f7f6f4;border-color:#f7f6f4}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(247,246,244,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f7f6f4;border-color:#f7f6f4}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(247,246,244,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f7f6f4;background-color:transparent}.btn-outline-dark{color:#393939;border-color:#393939}.btn-outline-dark:hover{color:#fff;background-color:#393939;border-color:#393939}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(57,57,57,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#393939;border-color:#393939}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(57,57,57,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#393939;background-color:transparent}.btn-link{font-weight:400;color:#3867ce;text-decoration:underline}.btn-link:hover{color:#2d52a5}.btn-link.disabled,.btn-link:disabled{color:rgba(0,0,0,.6)}.btn-group-lg>.btn,.btn-group.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.btn-group-sm>.btn,.btn-group.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.12 .5rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#393939;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu{top:0;right:auto;left:100%}.dropend .dropdown-menu[data-bs-popper]{margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu{top:0;right:100%;left:auto}.dropstart .dropdown-menu[data-bs-popper]{margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#393939;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#333;background-color:#f7f6f4}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#3867ce}.dropdown-item.disabled,.dropdown-item:disabled{color:rgba(0,0,0,.6);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:rgba(0,0,0,.6);white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#393939}.dropdown-menu-dark{color:rgba(0,0,0,.3);background-color:#414141;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:rgba(0,0,0,.3)}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#3867ce}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:rgba(0,0,0,.5)}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:rgba(0,0,0,.3)}.dropdown-menu-dark .dropdown-header{color:rgba(0,0,0,.5)}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link.disabled{color:rgba(0,0,0,.6);pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid rgba(0,0,0,.3)}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#efeeec #efeeec rgba(0,0,0,.3);isolation:isolate}.nav-tabs .nav-link.disabled{color:rgba(0,0,0,.6);background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:rgba(0,0,0,.7);background-color:#fff;border-color:rgba(0,0,0,.3) rgba(0,0,0,.3) #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#3867ce}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--scielo-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.5rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#393939;text-align:left;background-color:transparent;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#325db9;background-color:#ebf0fa;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23325db9'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23393939'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#9cb3e7;outline:0;box-shadow:0 0 0 .25rem rgba(56,103,206,.25)}.accordion-header{margin-bottom:0}.accordion-item{margin-bottom:-1px;background-color:transparent;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:last-of-type{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:rgba(0,0,0,.6);content:var(--scielo-breadcrumb-divider, "/")}.breadcrumb-item.active{color:rgba(0,0,0,.6)}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#3867ce;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.3);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#2d52a5;background-color:#efeeec;border-color:rgba(0,0,0,.3)}.page-link:focus{z-index:3;color:#2d52a5;background-color:#efeeec;outline:0;box-shadow:0 0 0 .25rem rgba(56,103,206,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#3867ce;border-color:#3867ce}.page-item.disabled .page-link{color:rgba(0,0,0,.6);pointer-events:none;background-color:#fff;border-color:rgba(0,0,0,.3)}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.12 .5rem;border-bottom-left-radius:.12 .5rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.12 .5rem;border-bottom-right-radius:.12 .5rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#223e7c;background-color:#d7e1f5;border-color:#c3d1f0}.alert-primary .alert-link{color:#1b3263}.alert-secondary{color:#666;background-color:#fff;border-color:#fff}.alert-secondary .alert-link{color:#525252}.alert-success{color:#1a5e29;background-color:#d5ebda;border-color:#c0e2c7}.alert-success .alert-link{color:#154b21}.alert-info{color:#145965;background-color:#d3eaee;border-color:#bcdfe5}.alert-info .alert-link{color:#104751}.alert-warning{color:#6d4c00;background-color:#f0e5cc;border-color:#e9d9b3}.alert-warning .alert-link{color:#573d00}.alert-danger{color:#720;background-color:#f4d7cc;border-color:#eec3b3}.alert-danger .alert-link{color:#5f1b00}.alert-light{color:#636262;background-color:#fdfdfd;border-color:#fdfcfc}.alert-light .alert-link{color:#4f4e4e}.alert-dark{color:#222;background-color:#d7d7d7;border-color:#c4c4c4}.alert-dark .alert-link{color:#1b1b1b}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#efeeec;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#3867ce;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:rgba(0,0,0,.7);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:rgba(0,0,0,.7);text-decoration:none;background-color:#f7f6f4}.list-group-item-action:active{color:#393939;background-color:#efeeec}.list-group-item{position:relative;display:block;padding:.5rem 1rem;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:rgba(0,0,0,.6);pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#3867ce;border-color:#3867ce}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#223e7c;background-color:#d7e1f5}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#223e7c;background-color:#c2cbdd}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#223e7c;border-color:#223e7c}.list-group-item-secondary{color:#666;background-color:#fff}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#666;background-color:#e6e6e6}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#666;border-color:#666}.list-group-item-success{color:#1a5e29;background-color:#d5ebda}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#1a5e29;background-color:#c0d4c4}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#1a5e29;border-color:#1a5e29}.list-group-item-info{color:#145965;background-color:#d3eaee}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#145965;background-color:#bed3d6}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#145965;border-color:#145965}.list-group-item-warning{color:#6d4c00;background-color:#f0e5cc}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#6d4c00;background-color:#d8ceb8}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#6d4c00;border-color:#6d4c00}.list-group-item-danger{color:#720;background-color:#f4d7cc}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#720;background-color:#dcc2b8}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#720;border-color:#720}.list-group-item-light{color:#636262;background-color:#fdfdfd}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636262;background-color:#e4e4e4}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636262;border-color:#636262}.list-group-item-dark{color:#222;background-color:#d7d7d7}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#222;background-color:#c2c2c2}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#222;border-color:#222}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(56,103,206,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.5rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:rgba(0,0,0,.6);background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.5rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid rgba(0,0,0,.3);border-top-left-radius:calc(.5rem - 1px);border-top-right-radius:calc(.5rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid rgba(0,0,0,.3);border-bottom-right-radius:calc(.5rem - 1px);border-bottom-left-radius:calc(.5rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--scielo-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--scielo-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.5rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid #d8d8d8;border-top-left-radius:calc(.5rem - 1px);border-top-right-radius:calc(.5rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#393939}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#3867ce}.link-primary:focus,.link-primary:hover{color:#2d52a5}.link-secondary{color:#fff}.link-secondary:focus,.link-secondary:hover{color:#fff}.link-success{color:#2c9d45}.link-success:focus,.link-success:hover{color:#56b16a}.link-info{color:#2195a9}.link-info:focus,.link-info:hover{color:#4daaba}.link-warning{color:#b67f00}.link-warning:focus,.link-warning:hover{color:#c59933}.link-danger{color:#c63800}.link-danger:focus,.link-danger:hover{color:#9e2d00}.link-light{color:#f7f6f4}.link-light:focus,.link-light:hover{color:#f9f8f6}.link-dark{color:#393939}.link-dark:focus,.link-dark:hover{color:#2e2e2e}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--scielo-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--scielo-aspect-ratio:100%}.ratio-4x3{--scielo-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--scielo-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--scielo-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid rgba(0,0,0,.3)!important}.border-0{border:0!important}.border-top{border-top:1px solid rgba(0,0,0,.3)!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid rgba(0,0,0,.3)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid rgba(0,0,0,.3)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid rgba(0,0,0,.3)!important}.border-start-0{border-left:0!important}.border-primary{border-color:#3867ce!important}.border-secondary{border-color:#fff!important}.border-success{border-color:#2c9d45!important}.border-info{border-color:#2195a9!important}.border-warning{border-color:#b67f00!important}.border-danger{border-color:#c63800!important}.border-light{border-color:#f7f6f4!important}.border-dark{border-color:#393939!important}.border-white{border-color:#fff!important}.border-0{border-width:0!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--scielo-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{color:#3867ce!important}.text-secondary{color:#fff!important}.text-success{color:#2c9d45!important}.text-info{color:#2195a9!important}.text-warning{color:#b67f00!important}.text-danger{color:#c63800!important}.text-light{color:#f7f6f4!important}.text-dark{color:#393939!important}.text-white{color:#fff!important}.text-body{color:#393939!important}.text-muted{color:rgba(0,0,0,.6)!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-reset{color:inherit!important}.bg-primary{background-color:#3867ce!important}.bg-secondary{background-color:#fff!important}.bg-success{background-color:#2c9d45!important}.bg-info{background-color:#2195a9!important}.bg-warning{background-color:#b67f00!important}.bg-danger{background-color:#c63800!important}.bg-light{background-color:#f7f6f4!important}.bg-dark{background-color:#393939!important}.bg-body{background-color:#fff!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--scielo-gradient)!important}.user-select-all{user-select:all!important}.user-select-auto{user-select:auto!important}.user-select-none{user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.12 .5rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.5rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}.h1,.h2,.h3,.h4,.h5,.h6,body,h1,h2,h3,h4,h5,h6,input,p,textarea{text-rendering:optimizeLegibility}body.top-nav-visible{padding-top:115px}@media (min-width:768px){body.top-nav-visible{padding-top:74px}}.journalInfo{margin-top:74px}::-moz-selection{background:#f8f567}.scielo__theme--dark ::-moz-selection{background:#070a98}.scielo__theme--light ::-moz-selection{background:#f8f567}::selection{background:#f8f567}.scielo__theme--dark ::selection{background:#070a98}.scielo__theme--light ::selection{background:#f8f567}.scielo__theme--light{background:#fff;color:#333}.scielo__theme--dark{background:#333;color:#c4c4c4}.container{padding-left:16px;padding-right:16px}@media screen and (min-width:576px){.col,.container,[class*=col-]{padding-left:10px;padding-right:10px}.row{margin-left:-10px;margin-right:-10px}}@media screen and (min-width:768px){.col,.container,[class*=col-]{padding-left:12px;padding-right:12px}.row{margin-left:-12px;margin-right:-12px}}@media screen and (min-width:992px){.col,.container,[class*=col-]{padding-left:16px;padding-right:16px}.row{margin-left:-16px;margin-right:-16px}}@media screen and (min-width:1200px){.col,.container,[class*=col-]{padding-left:20px;padding-right:20px}.row{margin-left:-20px;margin-right:-20px}}a{color:#3867ce;text-decoration:none;word-wrap:break-word}a:hover{text-decoration:underline}a:hover{color:#254895}.scielo__theme--dark a{color:#86acff}.scielo__theme--dark a:hover{color:#d3e0ff}.scielo__theme--light a{color:#3867ce;text-decoration:none;word-wrap:break-word}.scielo__theme--light a:hover{text-decoration:underline}.scielo__theme--light a:hover{color:#254895}a .material-icons,a .material-icons-outlined{vertical-align:text-bottom}p{line-height:1.6;margin-bottom:1.5rem}p .material-icons,p .material-icons-outlined{vertical-align:text-bottom}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:#00314c;margin-bottom:1.5rem}.h1 .material-icons,.h1 .material-icons-outlined,.h2 .material-icons,.h2 .material-icons-outlined,.h3 .material-icons,.h3 .material-icons-outlined,.h4 .material-icons,.h4 .material-icons-outlined,.h5 .material-icons,.h5 .material-icons-outlined,.h6 .material-icons,.h6 .material-icons-outlined,h1 .material-icons,h1 .material-icons-outlined,h2 .material-icons,h2 .material-icons-outlined,h3 .material-icons,h3 .material-icons-outlined,h4 .material-icons,h4 .material-icons-outlined,h5 .material-icons,h5 .material-icons-outlined,h6 .material-icons,h6 .material-icons-outlined{vertical-align:text-bottom;font-size:inherit;line-height:inherit;display:inline-block}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{color:#333;font-weight:inherit}.scielo__theme--dark .h1,.scielo__theme--dark .h2,.scielo__theme--dark .h3,.scielo__theme--dark .h4,.scielo__theme--dark .h5,.scielo__theme--dark .h6,.scielo__theme--dark h1,.scielo__theme--dark h2,.scielo__theme--dark h3,.scielo__theme--dark h4,.scielo__theme--dark h5,.scielo__theme--dark h6{color:#eee}.scielo__theme--dark .h1 .small,.scielo__theme--dark .h1 small,.scielo__theme--dark .h2 .small,.scielo__theme--dark .h2 small,.scielo__theme--dark .h3 .small,.scielo__theme--dark .h3 small,.scielo__theme--dark .h4 .small,.scielo__theme--dark .h4 small,.scielo__theme--dark .h5 .small,.scielo__theme--dark .h5 small,.scielo__theme--dark .h6 .small,.scielo__theme--dark .h6 small,.scielo__theme--dark h1 .small,.scielo__theme--dark h1 small,.scielo__theme--dark h2 .small,.scielo__theme--dark h2 small,.scielo__theme--dark h3 .small,.scielo__theme--dark h3 small,.scielo__theme--dark h4 .small,.scielo__theme--dark h4 small,.scielo__theme--dark h5 .small,.scielo__theme--dark h5 small,.scielo__theme--dark h6 .small,.scielo__theme--dark h6 small{color:#c4c4c4}.scielo__theme--light .h1,.scielo__theme--light .h2,.scielo__theme--light .h3,.scielo__theme--light .h4,.scielo__theme--light .h5,.scielo__theme--light .h6,.scielo__theme--light h1,.scielo__theme--light h2,.scielo__theme--light h3,.scielo__theme--light h4,.scielo__theme--light h5,.scielo__theme--light h6{color:#00314c}.scielo__theme--light .h1 .small,.scielo__theme--light .h1 small,.scielo__theme--light .h2 .small,.scielo__theme--light .h2 small,.scielo__theme--light .h3 .small,.scielo__theme--light .h3 small,.scielo__theme--light .h4 .small,.scielo__theme--light .h4 small,.scielo__theme--light .h5 .small,.scielo__theme--light .h5 small,.scielo__theme--light .h6 .small,.scielo__theme--light .h6 small,.scielo__theme--light h1 .small,.scielo__theme--light h1 small,.scielo__theme--light h2 .small,.scielo__theme--light h2 small,.scielo__theme--light h3 .small,.scielo__theme--light h3 small,.scielo__theme--light h4 .small,.scielo__theme--light h4 small,.scielo__theme--light h5 .small,.scielo__theme--light h5 small,.scielo__theme--light h6 .small,.scielo__theme--light h6 small{color:#333;font-weight:inherit}.h1,.scielo__text-title--1,h1{font-weight:700;font-size:2.5rem;line-height:1.2em;letter-spacing:-.2px}.h1 .material-icons,.h1 .material-icons-outlined,.scielo__text-title--1 .material-icons,.scielo__text-title--1 .material-icons-outlined,h1 .material-icons,h1 .material-icons-outlined{vertical-align:text-bottom;font-size:inherit;line-height:inherit;display:inline-block}.h2,.scielo__text-title--2,h2{font-weight:700;font-size:2rem;line-height:1.2em;letter-spacing:-.16px}.h2 .material-icons,.h2 .material-icons-outlined,.scielo__text-title--2 .material-icons,.scielo__text-title--2 .material-icons-outlined,h2 .material-icons,h2 .material-icons-outlined{vertical-align:text-bottom;font-size:inherit;line-height:inherit;display:inline-block}.h3,.scielo__text-title--3,h3{font-weight:700;font-size:1.75rem;line-height:1.2em;letter-spacing:-.14px}.h3 .material-icons,.h3 .material-icons-outlined,.scielo__text-title--3 .material-icons,.scielo__text-title--3 .material-icons-outlined,h3 .material-icons,h3 .material-icons-outlined{vertical-align:text-bottom;font-size:inherit;line-height:inherit;display:inline-block}.h4,.scielo__text-title--4,h4{font-weight:700;font-size:1.5rem;line-height:1.2em;letter-spacing:-.12px}.h4 .material-icons,.h4 .material-icons-outlined,.scielo__text-title--4 .material-icons,.scielo__text-title--4 .material-icons-outlined,h4 .material-icons,h4 .material-icons-outlined{vertical-align:text-bottom;font-size:inherit;line-height:inherit;display:inline-block}.h5,.scielo__text-subtitle,h5{font-weight:700;font-size:1.3125rem;line-height:1.25em;letter-spacing:0}.h5 .material-icons,.h5 .material-icons-outlined,.scielo__text-subtitle .material-icons,.scielo__text-subtitle .material-icons-outlined,h5 .material-icons,h5 .material-icons-outlined{vertical-align:text-bottom;font-size:inherit;line-height:inherit;display:inline-block}.h6,.scielo__text-subtitle--small,h6{font-size:1.03125rem;letter-spacing:0}.h6 .material-icons,.h6 .material-icons-outlined,.scielo__text-subtitle--small .material-icons,.scielo__text-subtitle--small .material-icons-outlined,h6 .material-icons,h6 .material-icons-outlined{vertical-align:text-bottom;font-size:inherit;line-height:inherit;display:inline-block}.scielo__text-body{font-weight:400;font-size:1rem;line-height:1.6em;letter-spacing:.1px}.scielo__text-body--large{font-size:1.125rem}.scielo__text-body--small{font-size:.75rem;letter-spacing:.06}.scielo__text-body--micro{font-size:.75rem}.scielo__text-overline{font-weight:700;font-size:.75rem;line-height:1.2em;letter-spacing:.06px}.scielo__text-caption{font-weight:400;font-size:1rem;line-height:1.2em}.scielo__text-caption--large{font-weight:700;font-size:1;line-height:1.2em;letter-spacing:0}.scielo__text-button{font-weight:400!important;font-size:1rem;letter-spacing:.1px!important;white-space:nowrap}.scielo__text-button--large{font-size:1.25rem}.mark,mark{background:rgba(0,176,230,.2)}.scielo__theme--dark .mark,.scielo__theme--dark mark{color:#c4c4c4}.scielo__theme--light .mark,.scielo__theme--light mark{color:#333}code{font-size:1.125rem;color:#00314c;background:rgba(0,176,230,.2)}.scielo__theme--dark code{color:#eee}.scielo__theme--light code{color:#00314c}abbr[data-original-title],abbr[title]{text-decoration:none;border-bottom:1px dotted #333}.scielo__theme--dark abbr[data-original-title],.scielo__theme--dark abbr[title]{border-bottom-color:#c4c4c4}.scielo__theme--light abbr[data-original-title],.scielo__theme--light abbr[title]{border-bottom-color:#333}html{font-size:16px}.articleCtt{font-size:18px}.display-1,.display-2,.display-3,.display-4,.h1,.h2,.h3,.h4,.h5,.h6,.lead{color:#00314c}.display-1 .material-icons,.display-1 .material-icons-outlined,.display-2 .material-icons,.display-2 .material-icons-outlined,.display-3 .material-icons,.display-3 .material-icons-outlined,.display-4 .material-icons,.display-4 .material-icons-outlined,.h1 .material-icons,.h1 .material-icons-outlined,.h2 .material-icons,.h2 .material-icons-outlined,.h3 .material-icons,.h3 .material-icons-outlined,.h4 .material-icons,.h4 .material-icons-outlined,.h5 .material-icons,.h5 .material-icons-outlined,.h6 .material-icons,.h6 .material-icons-outlined,.lead .material-icons,.lead .material-icons-outlined{vertical-align:text-bottom;font-size:inherit;line-height:inherit;display:inline-block}.display-1 .small,.display-1 small,.display-2 .small,.display-2 small,.display-3 .small,.display-3 small,.display-4 .small,.display-4 small,.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,.lead .small,.lead small{color:#333;font-weight:inherit}.scielo__theme--dark .display-1,.scielo__theme--dark .display-2,.scielo__theme--dark .display-3,.scielo__theme--dark .display-4,.scielo__theme--dark .h1,.scielo__theme--dark .h2,.scielo__theme--dark .h3,.scielo__theme--dark .h4,.scielo__theme--dark .h5,.scielo__theme--dark .h6,.scielo__theme--dark .lead{color:#eee}.scielo__theme--dark .display-1 .small,.scielo__theme--dark .display-1 small,.scielo__theme--dark .display-2 .small,.scielo__theme--dark .display-2 small,.scielo__theme--dark .display-3 .small,.scielo__theme--dark .display-3 small,.scielo__theme--dark .display-4 .small,.scielo__theme--dark .display-4 small,.scielo__theme--dark .h1 .small,.scielo__theme--dark .h1 small,.scielo__theme--dark .h2 .small,.scielo__theme--dark .h2 small,.scielo__theme--dark .h3 .small,.scielo__theme--dark .h3 small,.scielo__theme--dark .h4 .small,.scielo__theme--dark .h4 small,.scielo__theme--dark .h5 .small,.scielo__theme--dark .h5 small,.scielo__theme--dark .h6 .small,.scielo__theme--dark .h6 small,.scielo__theme--dark .lead .small,.scielo__theme--dark .lead small{color:#c4c4c4}.scielo__theme--light .display-1,.scielo__theme--light .display-2,.scielo__theme--light .display-3,.scielo__theme--light .display-4,.scielo__theme--light .h1,.scielo__theme--light .h2,.scielo__theme--light .h3,.scielo__theme--light .h4,.scielo__theme--light .h5,.scielo__theme--light .h6,.scielo__theme--light .lead{color:#00314c}.scielo__theme--light .display-1 .small,.scielo__theme--light .display-1 small,.scielo__theme--light .display-2 .small,.scielo__theme--light .display-2 small,.scielo__theme--light .display-3 .small,.scielo__theme--light .display-3 small,.scielo__theme--light .display-4 .small,.scielo__theme--light .display-4 small,.scielo__theme--light .h1 .small,.scielo__theme--light .h1 small,.scielo__theme--light .h2 .small,.scielo__theme--light .h2 small,.scielo__theme--light .h3 .small,.scielo__theme--light .h3 small,.scielo__theme--light .h4 .small,.scielo__theme--light .h4 small,.scielo__theme--light .h5 .small,.scielo__theme--light .h5 small,.scielo__theme--light .h6 .small,.scielo__theme--light .h6 small,.scielo__theme--light .lead .small,.scielo__theme--light .lead small{color:#333}.display-1,.h1{font-weight:700;font-size:2.5rem;line-height:1.2em;letter-spacing:-.2px}.display-1 .material-icons,.display-1 .material-icons-outlined,.h1 .material-icons,.h1 .material-icons-outlined{vertical-align:text-bottom;font-size:inherit;line-height:inherit;display:inline-block}.display-2,.h2{font-weight:700;font-size:2rem;line-height:1.2em;letter-spacing:-.16px}.display-2 .material-icons,.display-2 .material-icons-outlined,.h2 .material-icons,.h2 .material-icons-outlined{vertical-align:text-bottom;font-size:inherit;line-height:inherit;display:inline-block}.display-3,.h3{font-weight:700;font-size:1.75rem;line-height:1.2em;letter-spacing:-.14px}.display-3 .material-icons,.display-3 .material-icons-outlined,.h3 .material-icons,.h3 .material-icons-outlined{vertical-align:text-bottom;font-size:inherit;line-height:inherit;display:inline-block}.display-4,.h4{font-weight:700;font-size:1.5rem;line-height:1.2em;letter-spacing:-.12px}.display-4 .material-icons,.display-4 .material-icons-outlined,.h4 .material-icons,.h4 .material-icons-outlined{vertical-align:text-bottom;font-size:inherit;line-height:inherit;display:inline-block}.h5,.lead{font-weight:700;font-size:1.3125rem;line-height:1.25em;letter-spacing:0}.h5 .material-icons,.h5 .material-icons-outlined,.lead .material-icons,.lead .material-icons-outlined{vertical-align:text-bottom;font-size:inherit;line-height:inherit;display:inline-block}.h6{font-size:1.03125rem;letter-spacing:0}.h6 .material-icons,.h6 .material-icons-outlined{vertical-align:text-bottom;font-size:inherit;line-height:inherit;display:inline-block}.blockquote,blockquote{margin:0 0 1rem;padding:.8rem 1.4rem;border-left:4px solid rgba(0,0,0,.3);background-color:#efeeec}.scielo__theme--dark .blockquote,.scielo__theme--dark blockquote{border-left-color:#414141}.scielo__theme--light .blockquote,.scielo__theme--light blockquote{border-left-color:#efeeec}cite{display:block;font-size:.86667rem}cite:before{content:"— "}.form-text,.text-muted{color:#6c6b6b!important}.scielo__theme--dark .form-text,.scielo__theme--dark .text-muted{color:#adadad!important}.scielo__theme--light .form-text,.scielo__theme--light .text-muted{color:#6c6b6b!important}@media (min-width:768px){.scielo__truncate{display:block;max-width:285px}}@font-face{font-family:scielo-social-network;src:url(../fonts/scielo-social-network.eot?dhp6e8);src:url(../fonts/scielo-social-network.eot?dhp6e8#iefix) format("embedded-opentype"),url(../fonts/scielo-social-network.ttf?dhp6e8) format("truetype"),url(../fonts/scielo-social-network.woff?dhp6e8) format("woff"),url(../fonts/scielo-social-network.svg?dhp6e8#scielo-social-network) format("svg");font-weight:400;font-style:normal;font-display:block}[class*=" icon-"],[class^=icon-]{font-family:scielo-social-network!important;speak:never;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-bluesky:before{content:"\e900";color:#616060}.icon-mastodon:before{content:"\e901";color:#616060}.icon-linkedin:before{content:"\e902";color:#616060}.icon-facebook:before{content:"\e903";color:#616060}.icon-youtube:before{content:"\e904";color:#616060}.scielo__social-network-links a{text-decoration:none!important}.scielo__social-network-links a:hover [class*=" icon-"]::before,.scielo__social-network-links a:hover [class^=icon-]::before{color:#3867ce}.logo-open-access{height:2em;width:auto}.h1 .logo-open-access,.h2 .logo-open-access,.h3 .logo-open-access,.h4 .logo-open-access,.h5 .logo-open-access,.h6 .logo-open-access,h1 .logo-open-access,h2 .logo-open-access,h3 .logo-open-access,h4 .logo-open-access,h5 .logo-open-access,h6 .logo-open-access{height:.9em;width:auto}footer .logo-open-access{height:1.5em;width:auto}.scielo__logo-scielo{background-image:url(../img/logo-scielo-no-label.svg);background-size:contain;background-repeat:no-repeat;display:inline-block;width:4rem;height:4rem}.scielo__theme--dark .scielo__logo-scielo{background-image:url(../img/logo-scielo-no-label-negative.svg)}.scielo__theme--light .scielo__logo-scielo{background-image:url(../img/logo-scielo-no-label.svg)}.scielo__logo-scielo--large{background-image:url(../img/logo-scielo-no-label.svg);background-size:contain;background-repeat:no-repeat;display:inline-block;width:15.625rem;height:15.625rem}.scielo__theme--dark .scielo__logo-scielo--large{background-image:url(../img/logo-scielo-no-label-negative.svg)}.scielo__theme--light .scielo__logo-scielo--large{background-image:url(../img/logo-scielo-no-label.svg)}.scielo__logo-scielo--medium{background-image:url(../img/logo-scielo-no-label.svg);background-size:contain;background-repeat:no-repeat;display:inline-block;width:9.375rem;height:9.375rem}.scielo__theme--dark .scielo__logo-scielo--medium{background-image:url(../img/logo-scielo-no-label-negative.svg)}.scielo__theme--light .scielo__logo-scielo--medium{background-image:url(../img/logo-scielo-no-label.svg)}.scielo__logo-scielo--medium.scielo__logo-scielo--caption{margin-bottom:2rem}.scielo__logo-scielo--medium.scielo__logo-scielo--caption .small,.scielo__logo-scielo--medium.scielo__logo-scielo--caption small{position:relative;font-size:1.875rem;font-family:Arapey,serif;color:#333;font-style:italic;padding-left:60px;border-bottom:1px solid #ccc;padding-bottom:12px;padding-right:5px;top:80px;left:110px}.scielo__theme--dark .scielo__logo-scielo--medium.scielo__logo-scielo--caption .small,.scielo__theme--dark .scielo__logo-scielo--medium.scielo__logo-scielo--caption small{color:#c4c4c4;border-color:rgba(255,255,255,.3)}.scielo__theme--light .scielo__logo-scielo--medium.scielo__logo-scielo--caption .small,.scielo__theme--light .scielo__logo-scielo--medium.scielo__logo-scielo--caption small{color:#333;border-color:#ccc}.scielo__logo-scielo--medium.scielo__logo-scielo--caption span{position:relative;left:50%;transform:translateX(-7.1875rem);top:6.25rem;display:block;font-size:1.5rem;font-family:Arapey,serif;color:#333;white-space:nowrap;width:14.375rem}.scielo__theme--dark .scielo__logo-scielo--medium.scielo__logo-scielo--caption span{color:#c4c4c4}.scielo__theme--light .scielo__logo-scielo--medium.scielo__logo-scielo--caption span{color:#333}.scielo__logo-scielo--small{background-image:url(../img/logo-scielo-no-label.svg);background-size:contain;background-repeat:no-repeat;display:inline-block;width:4rem;height:4rem}.scielo__theme--dark .scielo__logo-scielo--small{background-image:url(../img/logo-scielo-no-label-negative.svg)}.scielo__theme--light .scielo__logo-scielo--small{background-image:url(../img/logo-scielo-no-label.svg)}.scielo__logo-scielo--small.scielo__logo-scielo--caption strong{position:relative;left:4.5rem;top:1.75rem;color:#333}.scielo__theme--dark .scielo__logo-scielo--small.scielo__logo-scielo--caption strong{color:#c4c4c4}.scielo__theme--light .scielo__logo-scielo--small.scielo__logo-scielo--caption strong{color:#333}.scielo__logo-scielo-caption{position:relative;width:16.875rem;height:6.25rem;background-image:url(../img/logo-scielo-no-label.svg);background-repeat:no-repeat;background-size:75px auto;background-position-x:calc(50% - 22px);display:inline-block}@media (min-width:576px){.scielo__logo-scielo-caption{width:21.875rem;height:11.375rem;background-size:150px auto;background-position-x:calc(50% - 55px)}}.scielo__theme--dark .scielo__logo-scielo-caption{background-image:url(../img/logo-scielo-no-label-negative.svg)}.scielo__theme--light .scielo__logo-scielo-caption{background-image:url(../img/logo-scielo-no-label.svg)}.scielo__logo-scielo-caption:after{content:"Scientific Electronic Library Online";position:absolute;top:4.375rem;display:block;font-size:1.2rem;font-family:Arapey,serif;color:#333;white-space:nowrap;width:100%;text-align:center}@media (min-width:576px){.scielo__logo-scielo-caption:after{top:9.375rem;font-size:1.5rem}}.scielo__theme--dark .scielo__logo-scielo-caption:after{color:#c4c4c4}.scielo__theme--light .scielo__logo-scielo-caption:after{color:#333}.scielo__logo-scielo-caption .small,.scielo__logo-scielo-caption small{position:absolute;font-size:1rem;font-family:Arapey,serif;color:#333;font-style:italic;border-bottom:1px solid #ccc;padding-bottom:10px;padding-left:24px;padding-right:0;top:40px;left:8.125rem;line-height:1rem}@media (min-width:576px){.scielo__logo-scielo-caption .small,.scielo__logo-scielo-caption small{font-size:1.875rem;padding-bottom:12px;padding-left:60px;padding-right:5px;top:80px;left:9.375rem;line-height:normal}}.scielo__theme--dark .scielo__logo-scielo-caption .small,.scielo__theme--dark .scielo__logo-scielo-caption small{color:#c4c4c4;border-color:rgba(255,255,255,.3)}.scielo__theme--light .scielo__logo-scielo-caption .small,.scielo__theme--light .scielo__logo-scielo-caption small{color:#333;border-color:#ccc}.scielo__logo-scielo-collection{position:relative;background-image:url(../img/logo-scielo-no-label.svg);background-size:contain;background-repeat:no-repeat;display:inline-block;width:4rem;height:4rem}.scielo__theme--dark .scielo__logo-scielo-collection{background-image:url(../img/logo-scielo-no-label-negative.svg)}.scielo__theme--light .scielo__logo-scielo-collection{background-image:url(../img/logo-scielo-no-label.svg)}.scielo__logo-scielo-collection .small,.scielo__logo-scielo-collection small{position:absolute;left:4.5rem;top:1.75rem;color:#333;font-weight:bolder}.scielo__theme--dark .scielo__logo-scielo-collection .small,.scielo__theme--dark .scielo__logo-scielo-collection small{color:#c4c4c4}.scielo__theme--light .scielo__logo-scielo-collection .small,.scielo__theme--light .scielo__logo-scielo-collection small{color:#333}footer .scielo__logo-scielo,header .scielo__logo-scielo{width:64px;height:64px}.scielo__logo-periodico{max-height:100px}.btn{position:relative;display:inline-block;padding:.625rem 1rem;border-radius:.25rem;line-height:1.25rem;height:2.5rem;font-weight:400!important;font-size:1rem;letter-spacing:.1px!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;background-position:center;transition:all .8s;margin:0 0 1rem;background-color:#fff;border:1px solid #ccc;color:#333}.btn:focus{box-shadow:0 0 0 .125rem rgba(56,103,206,.25);outline:0}.btn:focus:active{box-shadow:0 0 0 .25rem rgba(56,103,206,.25)}.btn:focus{box-shadow:0 0 0 .125rem rgba(204,204,204,.25);outline:0}.btn:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.btn:active{box-shadow:0 0 0 .25rem rgba(204,204,204,.25)}.btn:focus{background-color:#fff;color:#333}.btn:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.btn.active:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background-color:#d9d9d9;color:#333}.show>.btn.dropdown-toggle{background-color:#d9d9d9;color:#333}.btn:hover:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background:#d9d9d9 radial-gradient(circle,transparent 1%,#d9d9d9 1%) center/15000%;color:#333;text-decoration:none}.btn:active:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background-color:#1a1a1a;background-size:100%;transition:background 0s;color:#333}.btn:hover:not(:disabled):not(.disabled){border:1px solid #ccc;background:hoverBgColor radial-gradient(circle,transparent 1%,hoverBgColor 1%) center/15000%;color:#333}.btn:active:not(:disabled):not(.disabled){border:1px solid #ccc;background-color:gray;background-size:100%;transition:background 0s;color:#333}.btn:focus{border-color:#ccc}.scielo__theme--dark .btn{background-color:#c4c4c4;border:1px solid rgba(255,255,255,.3);color:#333}.scielo__theme--dark .btn:focus{background-color:#c4c4c4;color:#333}.scielo__theme--dark .btn.active:not(:disabled):not(.disabled){background-color:#a7a7a7;color:#333}.scielo__theme--dark .btn:hover:not(:disabled):not(.disabled){border:1px solid #dcdcdc;background:#dcdcdc radial-gradient(circle,transparent 1%,#dcdcdc 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .btn:active:not(:disabled):not(.disabled){border:1px solid #dcdcdc;background-color:#f9f9f9;background-size:100%;transition:background 0s;color:#333}.scielo__theme--dark .btn:hover:not(:disabled):not(.disabled){border:1px solid rgba(255,255,255,.3);background:hoverBgColor radial-gradient(circle,transparent 1%,hoverBgColor 1%) center/15000%;color:#333}.scielo__theme--dark .btn:active:not(:disabled):not(.disabled){border:1px solid rgba(255,255,255,.3);background-color:#f9f9f9;background-size:100%;transition:background 0s;color:#333}.scielo__theme--dark .btn:focus{border-color:rgba(255,255,255,.3)}.scielo__theme--light .btn{background-color:#fff;border-color:1px solid #ccc;color:#333}.scielo__theme--light .btn:focus{background-color:#fff;color:#333}.scielo__theme--light .btn.active:not(:disabled):not(.disabled){background-color:#fff;color:#333}.scielo__theme--light .btn:hover:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background:#d9d9d9 radial-gradient(circle,transparent 1%,#d9d9d9 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--light .btn:active:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background-color:#1a1a1a;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn:hover:not(:disabled):not(.disabled){border:1px solid #ccc;background:hoverBgColor radial-gradient(circle,transparent 1%,hoverBgColor 1%) center/15000%;color:#333}.scielo__theme--light .btn:active:not(:disabled):not(.disabled){border:1px solid #ccc;background-color:gray;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn:focus{border-color:#ccc}.btn-light,.btn-primary{background-color:#3867ce;border:1px solid #3867ce;color:#fff}.btn-light:focus,.btn-primary:focus{box-shadow:0 0 0 .125rem rgba(56,103,206,.25);outline:0}.btn-light:focus-visible,.btn-primary:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.btn-light:focus:active,.btn-primary:focus:active{box-shadow:0 0 0 .25rem rgba(56,103,206,.25)}.btn-light:focus,.btn-primary:focus{background-color:#3867ce;color:#fff}.btn-light:focus-visible,.btn-primary:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.btn-light.active:not(:disabled):not(.disabled),.btn-primary.active:not(:disabled):not(.disabled){border:1px solid #3058af;background-color:#3058af;color:#fff}.show>.btn-light.dropdown-toggle,.show>.btn-primary.dropdown-toggle{background-color:#3058af;color:#fff}.btn-light:hover:not(:disabled):not(.disabled),.btn-primary:hover:not(:disabled):not(.disabled){border:1px solid #3058af;background:#3058af radial-gradient(circle,transparent 1%,#3058af 1%) center/15000%;color:#fff;text-decoration:none}.btn-light:active:not(:disabled):not(.disabled),.btn-primary:active:not(:disabled):not(.disabled){border:1px solid #3058af;background-color:#060a15;background-size:100%;transition:background 0s;color:#fff}.scielo__theme--dark .btn-light,.scielo__theme--dark .btn-primary{background-color:#86acff;border:1px solid #86acff;color:#333}.scielo__theme--dark .btn-light:focus,.scielo__theme--dark .btn-primary:focus{background-color:#86acff;color:#333}.scielo__theme--dark .btn-light.active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-primary.active:not(:disabled):not(.disabled){background-color:#7292d9;color:#333}.scielo__theme--dark .btn-light:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-primary:hover:not(:disabled):not(.disabled){border:1px solid #b6cdff;background:#b6cdff radial-gradient(circle,transparent 1%,#b6cdff 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .btn-light:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-primary:active:not(:disabled):not(.disabled){border:1px solid #b6cdff;background-color:#f3f7ff;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn-light,.scielo__theme--light .btn-primary{background-color:#3867ce;border-color:1px solid #3867ce;color:#fff}.scielo__theme--light .btn-light:focus,.scielo__theme--light .btn-primary:focus{background-color:#3867ce;color:#fff}.scielo__theme--light .btn-light.active:not(:disabled):not(.disabled),.scielo__theme--light .btn-primary.active:not(:disabled):not(.disabled){background-color:#567ed5;color:#fff}.scielo__theme--light .btn-light:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-primary:hover:not(:disabled):not(.disabled){border:1px solid #3058af;background:#3058af radial-gradient(circle,transparent 1%,#3058af 1%) center/15000%;color:#fff;text-decoration:none}.scielo__theme--light .btn-light:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-primary:active:not(:disabled):not(.disabled){border:1px solid #3058af;background-color:#060a15;background-size:100%;transition:background 0s;color:#fff}.btn-info{background-color:#2195a9;border:1px solid #2195a9;color:#fff}.btn-info:focus{box-shadow:0 0 0 .125rem rgba(33,149,169,.25);outline:0}.btn-info:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.btn-info:focus:active{box-shadow:0 0 0 .25rem rgba(33,149,169,.25)}.btn-info:focus{background-color:#2195a9;color:#fff}.btn-info:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.btn-info.active:not(:disabled):not(.disabled){border:1px solid #1c7f90;background-color:#1c7f90;color:#fff}.show>.btn-info.dropdown-toggle{background-color:#1c7f90;color:#fff}.btn-info:hover:not(:disabled):not(.disabled){border:1px solid #1c7f90;background:#1c7f90 radial-gradient(circle,transparent 1%,#1c7f90 1%) center/15000%;color:#fff;text-decoration:none}.btn-info:active:not(:disabled):not(.disabled){border:1px solid #1c7f90;background-color:#030f11;background-size:100%;transition:background 0s;color:#fff}.scielo__theme--dark .btn-info{background-color:#2299ad;border:1px solid #2299ad;color:#333}.scielo__theme--dark .btn-info:focus{background-color:#2299ad;color:#333}.scielo__theme--dark .btn-info.active:not(:disabled):not(.disabled){background-color:#1d8293;color:#333}.scielo__theme--dark .btn-info:hover:not(:disabled):not(.disabled){border:1px solid #7ac2ce;background:#7ac2ce radial-gradient(circle,transparent 1%,#7ac2ce 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .btn-info:active:not(:disabled):not(.disabled){border:1px solid #7ac2ce;background-color:#e9f5f7;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn-info{background-color:#2195a9;border-color:1px solid #2195a9;color:#fff}.scielo__theme--light .btn-info:focus{background-color:#2195a9;color:#fff}.scielo__theme--light .btn-info.active:not(:disabled):not(.disabled){background-color:#42a5b6;color:#fff}.scielo__theme--light .btn-info:hover:not(:disabled):not(.disabled){border:1px solid #1c7f90;background:#1c7f90 radial-gradient(circle,transparent 1%,#1c7f90 1%) center/15000%;color:#fff;text-decoration:none}.scielo__theme--light .btn-info:active:not(:disabled):not(.disabled){border:1px solid #1c7f90;background-color:#030f11;background-size:100%;transition:background 0s;color:#fff}.btn-dark{background-color:#fff;border:1px solid #ccc;color:#333}.btn-dark:focus{box-shadow:0 0 0 .125rem rgba(204,204,204,.25);outline:0}.btn-dark:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.btn-dark:active{box-shadow:0 0 0 .25rem rgba(204,204,204,.25)}.btn-dark:focus{background-color:#fff;color:#333}.btn-dark:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.btn-dark.active:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background-color:#d9d9d9;color:#333}.show>.btn-dark.dropdown-toggle{background-color:#d9d9d9;color:#333}.btn-dark:hover:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background:#d9d9d9 radial-gradient(circle,transparent 1%,#d9d9d9 1%) center/15000%;color:#333;text-decoration:none}.btn-dark:active:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background-color:#1a1a1a;background-size:100%;transition:background 0s;color:#333}.btn-dark:hover:not(:disabled):not(.disabled){border:1px solid #ccc;background:hoverBgColor radial-gradient(circle,transparent 1%,hoverBgColor 1%) center/15000%;color:#333}.btn-dark:active:not(:disabled):not(.disabled){border:1px solid #ccc;background-color:gray;background-size:100%;transition:background 0s;color:#333}.btn-dark:focus{border-color:#ccc}.scielo__theme--dark .btn-dark{background-color:#c4c4c4;border:1px solid rgba(255,255,255,.3);color:#333}.scielo__theme--dark .btn-dark:focus{background-color:#c4c4c4;color:#333}.scielo__theme--dark .btn-dark.active:not(:disabled):not(.disabled){background-color:#a7a7a7;color:#333}.scielo__theme--dark .btn-dark:hover:not(:disabled):not(.disabled){border:1px solid #dcdcdc;background:#dcdcdc radial-gradient(circle,transparent 1%,#dcdcdc 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .btn-dark:active:not(:disabled):not(.disabled){border:1px solid #dcdcdc;background-color:#f9f9f9;background-size:100%;transition:background 0s;color:#333}.scielo__theme--dark .btn-dark:hover:not(:disabled):not(.disabled){border:1px solid rgba(255,255,255,.3);background:hoverBgColor radial-gradient(circle,transparent 1%,hoverBgColor 1%) center/15000%;color:#333}.scielo__theme--dark .btn-dark:active:not(:disabled):not(.disabled){border:1px solid rgba(255,255,255,.3);background-color:#f9f9f9;background-size:100%;transition:background 0s;color:#333}.scielo__theme--dark .btn-dark:focus{border-color:rgba(255,255,255,.3)}.scielo__theme--light .btn-dark{background-color:#fff;border-color:1px solid #ccc;color:#333}.scielo__theme--light .btn-dark:focus{background-color:#fff;color:#333}.scielo__theme--light .btn-dark.active:not(:disabled):not(.disabled){background-color:#fff;color:#333}.scielo__theme--light .btn-dark:hover:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background:#d9d9d9 radial-gradient(circle,transparent 1%,#d9d9d9 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--light .btn-dark:active:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background-color:#1a1a1a;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn-dark:hover:not(:disabled):not(.disabled){border:1px solid #ccc;background:hoverBgColor radial-gradient(circle,transparent 1%,hoverBgColor 1%) center/15000%;color:#333}.scielo__theme--light .btn-dark:active:not(:disabled):not(.disabled){border:1px solid #ccc;background-color:gray;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn-dark:focus{border-color:#ccc}.btn-success{background-color:#2c9d45;border:1px solid #2c9d45;color:#fff}.btn-success:focus{box-shadow:0 0 0 .125rem rgba(44,157,69,.25);outline:0}.btn-success:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.btn-success:focus:active{box-shadow:0 0 0 .25rem rgba(44,157,69,.25)}.btn-success:focus{background-color:#2c9d45;color:#fff}.btn-success:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.btn-success.active:not(:disabled):not(.disabled){border:1px solid #25853b;background-color:#25853b;color:#fff}.show>.btn-success.dropdown-toggle{background-color:#25853b;color:#fff}.btn-success:hover:not(:disabled):not(.disabled){border:1px solid #25853b;background:#25853b radial-gradient(circle,transparent 1%,#25853b 1%) center/15000%;color:#fff;text-decoration:none}.btn-success:active:not(:disabled):not(.disabled){border:1px solid #25853b;background-color:#041007;background-size:100%;transition:background 0s;color:#fff}.scielo__theme--dark .btn-success{background-color:#2c9d45;border:1px solid #2c9d45;color:#333}.scielo__theme--dark .btn-success:focus{background-color:#2c9d45;color:#333}.scielo__theme--dark .btn-success.active:not(:disabled):not(.disabled){background-color:#25853b;color:#333}.scielo__theme--dark .btn-success:hover:not(:disabled):not(.disabled){border:1px solid #80c48f;background:#80c48f radial-gradient(circle,transparent 1%,#80c48f 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .btn-success:active:not(:disabled):not(.disabled){border:1px solid #80c48f;background-color:#eaf5ec;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn-success{background-color:#2c9d45;border-color:1px solid #2c9d45;color:#fff}.scielo__theme--light .btn-success:focus{background-color:#2c9d45;color:#fff}.scielo__theme--light .btn-success.active:not(:disabled):not(.disabled){background-color:#4cac61;color:#fff}.scielo__theme--light .btn-success:hover:not(:disabled):not(.disabled){border:1px solid #25853b;background:#25853b radial-gradient(circle,transparent 1%,#25853b 1%) center/15000%;color:#fff;text-decoration:none}.scielo__theme--light .btn-success:active:not(:disabled):not(.disabled){border:1px solid #25853b;background-color:#041007;background-size:100%;transition:background 0s;color:#fff}.btn-danger{background-color:#c63800;border:1px solid #c63800;color:#fff}.btn-danger:focus{box-shadow:0 0 0 .125rem rgba(198,56,0,.25);outline:0}.btn-danger:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.btn-danger:focus:active{box-shadow:0 0 0 .25rem rgba(198,56,0,.25)}.btn-danger:focus{background-color:#c63800;color:#fff}.btn-danger:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.btn-danger.active:not(:disabled):not(.disabled){border:1px solid #a83000;background-color:#a83000;color:#fff}.show>.btn-danger.dropdown-toggle{background-color:#a83000;color:#fff}.btn-danger:hover:not(:disabled):not(.disabled){border:1px solid #a83000;background:#a83000 radial-gradient(circle,transparent 1%,#a83000 1%) center/15000%;color:#fff;text-decoration:none}.btn-danger:active:not(:disabled):not(.disabled){border:1px solid #a83000;background-color:#140600;background-size:100%;transition:background 0s;color:#fff}.scielo__theme--dark .btn-danger{background-color:#ff7e4a;border:1px solid #ff7e4a;color:#333}.scielo__theme--dark .btn-danger:focus{background-color:#ff7e4a;color:#333}.scielo__theme--dark .btn-danger.active:not(:disabled):not(.disabled){background-color:#d96b3f;color:#333}.scielo__theme--dark .btn-danger:hover:not(:disabled):not(.disabled){border:1px solid #ffb292;background:#ffb292 radial-gradient(circle,transparent 1%,#ffb292 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .btn-danger:active:not(:disabled):not(.disabled){border:1px solid #ffb292;background-color:#fff2ed;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn-danger{background-color:#c63800;border-color:1px solid #c63800;color:#fff}.scielo__theme--light .btn-danger:focus{background-color:#c63800;color:#fff}.scielo__theme--light .btn-danger.active:not(:disabled):not(.disabled){background-color:#cf5626;color:#fff}.scielo__theme--light .btn-danger:hover:not(:disabled):not(.disabled){border:1px solid #a83000;background:#a83000 radial-gradient(circle,transparent 1%,#a83000 1%) center/15000%;color:#fff;text-decoration:none}.scielo__theme--light .btn-danger:active:not(:disabled):not(.disabled){border:1px solid #a83000;background-color:#140600;background-size:100%;transition:background 0s;color:#fff}.btn-warning{background-color:#b67f00;border:1px solid #b67f00;color:#fff}.btn-warning:focus{box-shadow:0 0 0 .125rem rgba(182,127,0,.25);outline:0}.btn-warning:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.btn-warning:focus:active{box-shadow:0 0 0 .25rem rgba(182,127,0,.25)}.btn-warning:focus{background-color:#b67f00;color:#fff}.btn-warning:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.btn-warning.active:not(:disabled):not(.disabled){border:1px solid #9b6c00;background-color:#9b6c00;color:#fff}.show>.btn-warning.dropdown-toggle{background-color:#9b6c00;color:#fff}.btn-warning:hover:not(:disabled):not(.disabled){border:1px solid #9b6c00;background:#9b6c00 radial-gradient(circle,transparent 1%,#9b6c00 1%) center/15000%;color:#fff;text-decoration:none}.btn-warning:active:not(:disabled):not(.disabled){border:1px solid #9b6c00;background-color:#120d00;background-size:100%;transition:background 0s;color:#fff}.scielo__theme--dark .btn-warning{background-color:#b67f00;border:1px solid #b67f00;color:#333}.scielo__theme--dark .btn-warning:focus{background-color:#b67f00;color:#333}.scielo__theme--dark .btn-warning.active:not(:disabled):not(.disabled){background-color:#9b6c00;color:#333}.scielo__theme--dark .btn-warning:hover:not(:disabled):not(.disabled){border:1px solid #d3b266;background:#d3b266 radial-gradient(circle,transparent 1%,#d3b266 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .btn-warning:active:not(:disabled):not(.disabled){border:1px solid #d3b266;background-color:#f8f2e6;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn-warning{background-color:#b67f00;border-color:1px solid #b67f00;color:#fff}.scielo__theme--light .btn-warning:focus{background-color:#b67f00;color:#fff}.scielo__theme--light .btn-warning.active:not(:disabled):not(.disabled){background-color:#c19226;color:#fff}.scielo__theme--light .btn-warning:hover:not(:disabled):not(.disabled){border:1px solid #9b6c00;background:#9b6c00 radial-gradient(circle,transparent 1%,#9b6c00 1%) center/15000%;color:#fff;text-decoration:none}.scielo__theme--light .btn-warning:active:not(:disabled):not(.disabled){border:1px solid #9b6c00;background-color:#120d00;background-size:100%;transition:background 0s;color:#fff}.btn.disabled,.btn:disabled{pointer-events:auto;cursor:not-allowed;background-color:#f7f6f4;border:1px solid #ccc;color:rgba(0,0,0,.396);opacity:1}.btn.disabled:focus,.btn:disabled:focus{background-color:#f7f6f4;color:rgba(0,0,0,.396)}.btn.disabled:focus-visible,.btn:disabled:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.btn.disabled.active:not(:disabled):not(.disabled),.btn:disabled.active:not(:disabled):not(.disabled){border:1px solid #d2d1cf;background-color:#d2d1cf;color:rgba(0,0,0,.396)}.show>.btn.disabled.dropdown-toggle,.show>.btn:disabled.dropdown-toggle{background-color:#d2d1cf;color:rgba(0,0,0,.396)}.btn.disabled:hover:not(:disabled):not(.disabled),.btn:disabled:hover:not(:disabled):not(.disabled){border:1px solid #d2d1cf;background:#d2d1cf radial-gradient(circle,transparent 1%,#d2d1cf 1%) center/15000%;color:rgba(0,0,0,.396);text-decoration:none}.btn.disabled:active:not(:disabled):not(.disabled),.btn:disabled:active:not(:disabled):not(.disabled){border:1px solid #d2d1cf;background-color:#191918;background-size:100%;transition:background 0s;color:rgba(0,0,0,.396)}.scielo__theme--dark .btn.disabled,.scielo__theme--dark .btn:disabled{background-color:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.3);color:#c4c4c4}.scielo__theme--dark .btn.disabled:focus,.scielo__theme--dark .btn:disabled:focus{background-color:rgba(255,255,255,.2);color:#c4c4c4}.scielo__theme--dark .btn.disabled.active:not(:disabled):not(.disabled),.scielo__theme--dark .btn:disabled.active:not(:disabled):not(.disabled){background-color:rgba(99,99,99,.32);color:#c4c4c4}.scielo__theme--dark .btn.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn:disabled:hover:not(:disabled):not(.disabled){border:1px solid rgba(255,255,255,.52);background:rgba(255,255,255,.52) radial-gradient(circle,transparent 1%,rgba(255,255,255,.52) 1%) center/15000%;color:#c4c4c4;text-decoration:none}.scielo__theme--dark .btn.disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn:disabled:active:not(:disabled):not(.disabled){border:1px solid rgba(255,255,255,.52);background-color:rgba(255,255,255,.92);background-size:100%;transition:background 0s;color:#c4c4c4}.scielo__theme--light .btn.disabled,.scielo__theme--light .btn:disabled{background-color:#f7f6f4;border-color:1px solid #ccc;color:rgba(0,0,0,.396)}.scielo__theme--light .btn.disabled:focus,.scielo__theme--light .btn:disabled:focus{background-color:#f7f6f4;color:rgba(0,0,0,.396)}.scielo__theme--light .btn.disabled.active:not(:disabled):not(.disabled),.scielo__theme--light .btn:disabled.active:not(:disabled):not(.disabled){background-color:#f8f7f6;color:rgba(0,0,0,.396)}.scielo__theme--light .btn.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn:disabled:hover:not(:disabled):not(.disabled){border:1px solid #d2d1cf;background:#d2d1cf radial-gradient(circle,transparent 1%,#d2d1cf 1%) center/15000%;color:rgba(0,0,0,.396);text-decoration:none}.scielo__theme--light .btn.disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn:disabled:active:not(:disabled):not(.disabled){border:1px solid #d2d1cf;background-color:#191918;background-size:100%;transition:background 0s;color:rgba(0,0,0,.396)}.btn-link{padding-left:1.5rem;padding-right:1.5rem;background-color:transparent;border:1px solid transparent;color:#3867ce;text-decoration:none}.btn-link:focus{box-shadow:0 0 0 .125rem rgba(56,103,206,.25);outline:0}.btn-link:focus:active{box-shadow:0 0 0 .25rem rgba(56,103,206,.25)}.btn-link:focus{background-color:transparent;border-color:transparent;color:#3867ce}.btn-link:hover:not(:disabled):not(.disabled){border:1px solid #fff;background:#fff radial-gradient(circle,transparent 1%,#fff 1%) center/15000%;color:#3867ce;text-decoration:none}.btn-link:active:not(:disabled):not(.disabled){border:1px solid #fff;background-color:rgba(56,103,206,.1);background-size:100%;transition:background 0s;color:#3867ce}.scielo__theme--dark .btn-link{background-color:transparent;border-color:transparent;color:#86acff}.scielo__theme--dark .btn-link:focus{color:#86acff;background-color:transparent;border-color:transparent}.scielo__theme--dark .btn-link:hover:not(:disabled):not(.disabled){border:1px solid #333;background:#333 radial-gradient(circle,transparent 1%,#333 1%) center/15000%;color:#fff;text-decoration:none}.scielo__theme--dark .btn-link:active:not(:disabled):not(.disabled){border:1px solid #333;background-color:rgba(239,238,236,.5);background-size:100%;transition:background 0s;color:#fff}.scielo__theme--light .btn-link{background-color:transparent;color:#3867ce}.scielo__theme--light .btn-link:focus{background-color:transparent;border-color:transparent;color:#3867ce}.scielo__theme--light .btn-link:hover:not(:disabled):not(.disabled){border:1px solid #fff;background:#fff radial-gradient(circle,transparent 1%,#fff 1%) center/15000%;color:#3867ce;text-decoration:none}.scielo__theme--light .btn-link:active:not(:disabled):not(.disabled){border:1px solid #fff;background-color:rgba(56,103,206,.1);background-size:100%;transition:background 0s;color:#3867ce}.btn-group-lg>.btn-link.btn,.btn-link.btn-lg{padding-left:1.875rem;padding-right:1.875rem}.btn-group-sm>.btn-link.btn,.btn-link.btn-sm{padding-left:1.125rem;padding-right:1.125rem}.btn-link.disabled,.btn-link:disabled{background-color:transparent;border:1px solid transparent;color:rgba(0,0,0,.396);opacity:1}.btn-link.disabled:focus,.btn-link:disabled:focus{background-color:transparent;border-color:transparent;color:rgba(0,0,0,.396)}.btn-link.disabled:hover:not(:disabled):not(.disabled),.btn-link:disabled:hover:not(:disabled):not(.disabled){border:1px solid #fff;background:#fff radial-gradient(circle,transparent 1%,#fff 1%) center/15000%;color:rgba(0,0,0,.396);text-decoration:none}.btn-link.disabled:active:not(:disabled):not(.disabled),.btn-link:disabled:active:not(:disabled):not(.disabled){border:1px solid #fff;background-color:rgba(56,103,206,.1);background-size:100%;transition:background 0s;color:rgba(0,0,0,.396)}.scielo__theme--dark .btn-link.disabled,.scielo__theme--dark .btn-link:disabled{background-color:transparent;border-color:transparent;color:rgba(255,255,255,.2)}.scielo__theme--dark .btn-link.disabled:focus,.scielo__theme--dark .btn-link:disabled:focus{color:rgba(255,255,255,.2);background-color:transparent;border-color:transparent}.scielo__theme--dark .btn-link.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-link:disabled:hover:not(:disabled):not(.disabled){border:1px solid #333;background:#333 radial-gradient(circle,transparent 1%,#333 1%) center/15000%;color:#fff;text-decoration:none}.scielo__theme--dark .btn-link.disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-link:disabled:active:not(:disabled):not(.disabled){border:1px solid #333;background-color:rgba(239,238,236,.5);background-size:100%;transition:background 0s;color:#fff}.scielo__theme--light .btn-link.disabled,.scielo__theme--light .btn-link:disabled{background-color:transparent;color:rgba(0,0,0,.396);opacity:1}.scielo__theme--light .btn-link.disabled:focus,.scielo__theme--light .btn-link:disabled:focus{background-color:transparent;border-color:transparent;color:rgba(0,0,0,.396)}.scielo__theme--light .btn-link.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-link:disabled:hover:not(:disabled):not(.disabled){border:1px solid #fff;background:#fff radial-gradient(circle,transparent 1%,#fff 1%) center/15000%;color:rgba(0,0,0,.396);text-decoration:none}.scielo__theme--light .btn-link.disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-link:disabled:active:not(:disabled):not(.disabled){border:1px solid #fff;background-color:rgba(56,103,206,.1);background-size:100%;transition:background 0s;color:rgba(0,0,0,.396)}.btn-link:hover{background:0 0!important;border-color:transparent!important;text-decoration:underline!important}.btn-outline-light,.btn-outline-primary{background-color:transparent;border:1px solid #3867ce;color:#3867ce}.btn-outline-light:focus,.btn-outline-primary:focus{box-shadow:0 0 0 .125rem rgba(56,103,206,.25);outline:0}.btn-outline-light:focus:active,.btn-outline-primary:focus:active{box-shadow:0 0 0 .25rem rgba(56,103,206,.25)}.btn-outline-light:focus,.btn-outline-primary:focus{background-color:transparent;color:#3867ce}.btn-outline-light:focus,.btn-outline-light:hover,.btn-outline-primary:focus,.btn-outline-primary:hover{border-color:#3867ce}.btn-outline-light:hover:not(:disabled):not(.disabled),.btn-outline-primary:hover:not(:disabled):not(.disabled){border:1px solid #3058af;background:#3058af radial-gradient(circle,transparent 1%,#3058af 1%) center/15000%;color:#fff;text-decoration:none}.btn-outline-light:active:not(:disabled):not(.disabled),.btn-outline-primary:active:not(:disabled):not(.disabled){border:1px solid #3058af;background-color:#ebf0fa;background-size:100%;transition:background 0s;color:#fff}.scielo__theme--dark .btn-outline-light,.scielo__theme--dark .btn-outline-primary{background-color:transparent;border-color:#86acff;color:#86acff}.scielo__theme--dark .btn-outline-light:focus,.scielo__theme--dark .btn-outline-primary:focus{background-color:transparent;color:#86acff}.scielo__theme--dark .btn-outline-light:focus,.scielo__theme--dark .btn-outline-light:hover,.scielo__theme--dark .btn-outline-primary:focus,.scielo__theme--dark .btn-outline-primary:hover{border-color:#86acff}.scielo__theme--dark .btn-outline-light:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-primary:hover:not(:disabled):not(.disabled){border:1px solid #b6cdff;background:#b6cdff radial-gradient(circle,transparent 1%,#b6cdff 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .btn-outline-light:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-primary:active:not(:disabled):not(.disabled){border:1px solid #b6cdff;background-color:#f3f7ff;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn-outline-light,.scielo__theme--light .btn-outline-primary{background-color:transparent;border:1px solid #3867ce;color:#3867ce}.scielo__theme--light .btn-outline-light:focus,.scielo__theme--light .btn-outline-primary:focus{background-color:transparent;color:#3867ce}.scielo__theme--light .btn-outline-light:focus,.scielo__theme--light .btn-outline-light:hover,.scielo__theme--light .btn-outline-primary:focus,.scielo__theme--light .btn-outline-primary:hover{border-color:#3867ce}.scielo__theme--light .btn-outline-light:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-primary:hover:not(:disabled):not(.disabled){border:1px solid #3058af;background:#3058af radial-gradient(circle,transparent 1%,#3058af 1%) center/15000%;color:#fff;text-decoration:none}.scielo__theme--light .btn-outline-light:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-primary:active:not(:disabled):not(.disabled){border:1px solid #3058af;background-color:#ebf0fa;background-size:100%;transition:background 0s;color:#fff}.btn-outline-dark,.btn-outline-secondary{background-color:transparent;border:1px solid 1px solid #ccc;color:#333}.btn-outline-dark:focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .125rem rgba(204,204,204,.25);outline:0}.btn-outline-dark:focus:active,.btn-outline-secondary:focus:active{box-shadow:0 0 0 .25rem rgba(204,204,204,.25)}.btn-outline-dark:focus,.btn-outline-secondary:focus{background-color:transparent;color:#333}.btn-outline-dark:focus,.btn-outline-dark:hover,.btn-outline-secondary:focus,.btn-outline-secondary:hover{border-color:1px solid #ccc}.btn-outline-dark:hover:not(:disabled):not(.disabled),.btn-outline-secondary:hover:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background:#d9d9d9 radial-gradient(circle,transparent 1%,#d9d9d9 1%) center/15000%;color:#fff;text-decoration:none}.btn-outline-dark:active:not(:disabled):not(.disabled),.btn-outline-secondary:active:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background-color:#fff;background-size:100%;transition:background 0s;color:#fff}.btn-outline-dark:hover:not(:disabled):not(.disabled),.btn-outline-secondary:hover:not(:disabled):not(.disabled){border:1px solid #ccc;background:hoverBgColor radial-gradient(circle,transparent 1%,hoverBgColor 1%) center/15000%;color:#333}.btn-outline-dark:active:not(:disabled):not(.disabled),.btn-outline-secondary:active:not(:disabled):not(.disabled){border:1px solid #ccc;background-color:gray;background-size:100%;transition:background 0s;color:#333}.btn-outline-dark:focus,.btn-outline-secondary:focus{border-color:#ccc}.btn-outline-dark.dropdown-toggle.show,.btn-outline-secondary.dropdown-toggle.show{border-color:#ccc}.scielo__theme--dark .btn-outline-dark,.scielo__theme--dark .btn-outline-secondary{background-color:transparent;border-color:1px solid rgba(255,255,255,.3);color:#c4c4c4}.scielo__theme--dark .btn-outline-dark:focus,.scielo__theme--dark .btn-outline-secondary:focus{background-color:transparent;color:#c4c4c4}.scielo__theme--dark .btn-outline-dark:focus,.scielo__theme--dark .btn-outline-dark:hover,.scielo__theme--dark .btn-outline-secondary:focus,.scielo__theme--dark .btn-outline-secondary:hover{border-color:1px solid rgba(255,255,255,.3)}.scielo__theme--dark .btn-outline-dark:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-secondary:hover:not(:disabled):not(.disabled){border:1px solid #dcdcdc;background:#dcdcdc radial-gradient(circle,transparent 1%,#dcdcdc 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .btn-outline-dark:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-secondary:active:not(:disabled):not(.disabled){border:1px solid #dcdcdc;background-color:#f9f9f9;background-size:100%;transition:background 0s;color:#333}.scielo__theme--dark .btn-outline-dark:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-secondary:hover:not(:disabled):not(.disabled){border:1px solid rgba(255,255,255,.3);background:hoverBgColor radial-gradient(circle,transparent 1%,hoverBgColor 1%) center/15000%;color:#333}.scielo__theme--dark .btn-outline-dark:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-secondary:active:not(:disabled):not(.disabled){border:1px solid rgba(255,255,255,.3);background-color:#f9f9f9;background-size:100%;transition:background 0s;color:#333}.scielo__theme--dark .btn-outline-dark:focus,.scielo__theme--dark .btn-outline-secondary:focus{border-color:rgba(255,255,255,.3)}.scielo__theme--dark .btn-outline-dark.dropdown-toggle.show,.scielo__theme--dark .btn-outline-secondary.dropdown-toggle.show{background:0 0;color:#c4c4c4}.scielo__theme--dark .btn-outline-dark.dropdown-toggle.show:focus,.scielo__theme--dark .btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .125rem rgba(204,204,204,.25)}.scielo__theme--light .btn-outline-dark,.scielo__theme--light .btn-outline-secondary{background-color:transparent;border:1px solid 1px solid #ccc;color:#333}.scielo__theme--light .btn-outline-dark:focus,.scielo__theme--light .btn-outline-secondary:focus{background-color:transparent;color:#333}.scielo__theme--light .btn-outline-dark:focus,.scielo__theme--light .btn-outline-dark:hover,.scielo__theme--light .btn-outline-secondary:focus,.scielo__theme--light .btn-outline-secondary:hover{border-color:1px solid #ccc}.scielo__theme--light .btn-outline-dark:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-secondary:hover:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background:#d9d9d9 radial-gradient(circle,transparent 1%,#d9d9d9 1%) center/15000%;color:#fff;text-decoration:none}.scielo__theme--light .btn-outline-dark:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-secondary:active:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background-color:#fff;background-size:100%;transition:background 0s;color:#fff}.scielo__theme--light .btn-outline-dark:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-secondary:hover:not(:disabled):not(.disabled){border:1px solid #ccc;background:hoverBgColor radial-gradient(circle,transparent 1%,hoverBgColor 1%) center/15000%;color:#333}.scielo__theme--light .btn-outline-dark:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-secondary:active:not(:disabled):not(.disabled){border:1px solid #ccc;background-color:gray;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn-outline-dark:focus,.scielo__theme--light .btn-outline-secondary:focus{border-color:#ccc}.btn-outline-info{background-color:transparent;border:1px solid #2195a9;color:#2299ad}.btn-outline-info:focus{box-shadow:0 0 0 .125rem rgba(33,149,169,.25);outline:0}.btn-outline-info:focus:active{box-shadow:0 0 0 .25rem rgba(33,149,169,.25)}.btn-outline-info:focus{background-color:transparent;color:#2299ad}.btn-outline-info:focus,.btn-outline-info:hover{border-color:#2195a9}.btn-outline-info:hover:not(:disabled):not(.disabled){border:1px solid #1c7f90;background:#1c7f90 radial-gradient(circle,transparent 1%,#1c7f90 1%) center/15000%;color:#fff;text-decoration:none}.btn-outline-info:active:not(:disabled):not(.disabled){border:1px solid #1c7f90;background-color:#e9f4f6;background-size:100%;transition:background 0s;color:#fff}.scielo__theme--dark .btn-outline-info{background-color:transparent;border-color:#2299ad;color:#2299ad}.scielo__theme--dark .btn-outline-info:focus{background-color:transparent;color:#2299ad}.scielo__theme--dark .btn-outline-info:focus,.scielo__theme--dark .btn-outline-info:hover{border-color:#2299ad}.scielo__theme--dark .btn-outline-info:hover:not(:disabled):not(.disabled){border:1px solid #7ac2ce;background:#7ac2ce radial-gradient(circle,transparent 1%,#7ac2ce 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .btn-outline-info:active:not(:disabled):not(.disabled){border:1px solid #7ac2ce;background-color:#e9f5f7;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn-outline-info{background-color:transparent;border:1px solid #2195a9;color:#2299ad}.scielo__theme--light .btn-outline-info:focus{background-color:transparent;color:#2299ad}.scielo__theme--light .btn-outline-info:focus,.scielo__theme--light .btn-outline-info:hover{border-color:#2195a9}.scielo__theme--light .btn-outline-info:hover:not(:disabled):not(.disabled){border:1px solid #1c7f90;background:#1c7f90 radial-gradient(circle,transparent 1%,#1c7f90 1%) center/15000%;color:#fff;text-decoration:none}.scielo__theme--light .btn-outline-info:active:not(:disabled):not(.disabled){border:1px solid #1c7f90;background-color:#e9f4f6;background-size:100%;transition:background 0s;color:#fff}.btn-outline-success{background-color:transparent;border:1px solid #2c9d45;color:#2c9d45}.btn-outline-success:focus{box-shadow:0 0 0 .125rem rgba(44,157,69,.25);outline:0}.btn-outline-success:focus:active{box-shadow:0 0 0 .25rem rgba(44,157,69,.25)}.btn-outline-success:focus{background-color:transparent;color:#2c9d45}.btn-outline-success:focus,.btn-outline-success:hover{border-color:#2c9d45}.btn-outline-success:hover:not(:disabled):not(.disabled){border:1px solid #25853b;background:#25853b radial-gradient(circle,transparent 1%,#25853b 1%) center/15000%;color:#fff;text-decoration:none}.btn-outline-success:active:not(:disabled):not(.disabled){border:1px solid #25853b;background-color:#eaf5ec;background-size:100%;transition:background 0s;color:#fff}.scielo__theme--dark .btn-outline-success{background-color:transparent;border-color:#2c9d45;color:#2c9d45}.scielo__theme--dark .btn-outline-success:focus{background-color:transparent;color:#2c9d45}.scielo__theme--dark .btn-outline-success:focus,.scielo__theme--dark .btn-outline-success:hover{border-color:#2c9d45}.scielo__theme--dark .btn-outline-success:hover:not(:disabled):not(.disabled){border:1px solid #80c48f;background:#80c48f radial-gradient(circle,transparent 1%,#80c48f 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .btn-outline-success:active:not(:disabled):not(.disabled){border:1px solid #80c48f;background-color:#eaf5ec;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn-outline-success{background-color:transparent;border:1px solid #2c9d45;color:#2c9d45}.scielo__theme--light .btn-outline-success:focus{background-color:transparent;color:#2c9d45}.scielo__theme--light .btn-outline-success:focus,.scielo__theme--light .btn-outline-success:hover{border-color:#2c9d45}.scielo__theme--light .btn-outline-success:hover:not(:disabled):not(.disabled){border:1px solid #25853b;background:#25853b radial-gradient(circle,transparent 1%,#25853b 1%) center/15000%;color:#fff;text-decoration:none}.scielo__theme--light .btn-outline-success:active:not(:disabled):not(.disabled){border:1px solid #25853b;background-color:#eaf5ec;background-size:100%;transition:background 0s;color:#fff}.btn-outline-danger{background-color:transparent;border:1px solid #c63800;color:#c63800}.btn-outline-danger:focus{box-shadow:0 0 0 .125rem rgba(198,56,0,.25);outline:0}.btn-outline-danger:focus:active{box-shadow:0 0 0 .25rem rgba(198,56,0,.25)}.btn-outline-danger:focus{background-color:transparent;color:#c63800}.btn-outline-danger:focus,.btn-outline-danger:hover{border-color:#c63800}.btn-outline-danger:hover:not(:disabled):not(.disabled){border:1px solid #a83000;background:#a83000 radial-gradient(circle,transparent 1%,#a83000 1%) center/15000%;color:#fff;text-decoration:none}.btn-outline-danger:active:not(:disabled):not(.disabled){border:1px solid #a83000;background-color:#f9ebe6;background-size:100%;transition:background 0s;color:#fff}.scielo__theme--dark .btn-outline-danger{background-color:transparent;border-color:#ff7e4a;color:#ff7e4a}.scielo__theme--dark .btn-outline-danger:focus{background-color:transparent;color:#ff7e4a}.scielo__theme--dark .btn-outline-danger:focus,.scielo__theme--dark .btn-outline-danger:hover{border-color:#ff7e4a}.scielo__theme--dark .btn-outline-danger:hover:not(:disabled):not(.disabled){border:1px solid #ffb292;background:#ffb292 radial-gradient(circle,transparent 1%,#ffb292 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .btn-outline-danger:active:not(:disabled):not(.disabled){border:1px solid #ffb292;background-color:#fff2ed;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn-outline-danger{background-color:transparent;border:1px solid #c63800;color:#c63800}.scielo__theme--light .btn-outline-danger:focus{background-color:transparent;color:#c63800}.scielo__theme--light .btn-outline-danger:focus,.scielo__theme--light .btn-outline-danger:hover{border-color:#c63800}.scielo__theme--light .btn-outline-danger:hover:not(:disabled):not(.disabled){border:1px solid #a83000;background:#a83000 radial-gradient(circle,transparent 1%,#a83000 1%) center/15000%;color:#fff;text-decoration:none}.scielo__theme--light .btn-outline-danger:active:not(:disabled):not(.disabled){border:1px solid #a83000;background-color:#f9ebe6;background-size:100%;transition:background 0s;color:#fff}.btn-outline-warning{background-color:transparent;border:1px solid #b67f00;color:#b67f00}.btn-outline-warning:focus{box-shadow:0 0 0 .125rem rgba(182,127,0,.25);outline:0}.btn-outline-warning:focus:active{box-shadow:0 0 0 .25rem rgba(182,127,0,.25)}.btn-outline-warning:focus{background-color:transparent;color:#b67f00}.btn-outline-warning:focus,.btn-outline-warning:hover{border-color:#b67f00}.btn-outline-warning:hover:not(:disabled):not(.disabled){border:1px solid #9b6c00;background:#9b6c00 radial-gradient(circle,transparent 1%,#9b6c00 1%) center/15000%;color:#fff;text-decoration:none}.btn-outline-warning:active:not(:disabled):not(.disabled){border:1px solid #9b6c00;background-color:#f8f2e6;background-size:100%;transition:background 0s;color:#fff}.scielo__theme--dark .btn-outline-warning{background-color:transparent;border-color:#b67f00;color:#b67f00}.scielo__theme--dark .btn-outline-warning:focus{background-color:transparent;color:#b67f00}.scielo__theme--dark .btn-outline-warning:focus,.scielo__theme--dark .btn-outline-warning:hover{border-color:#b67f00}.scielo__theme--dark .btn-outline-warning:hover:not(:disabled):not(.disabled){border:1px solid #d3b266;background:#d3b266 radial-gradient(circle,transparent 1%,#d3b266 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .btn-outline-warning:active:not(:disabled):not(.disabled){border:1px solid #d3b266;background-color:#f8f2e6;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn-outline-warning{background-color:transparent;border:1px solid #b67f00;color:#b67f00}.scielo__theme--light .btn-outline-warning:focus{background-color:transparent;color:#b67f00}.scielo__theme--light .btn-outline-warning:focus,.scielo__theme--light .btn-outline-warning:hover{border-color:#b67f00}.scielo__theme--light .btn-outline-warning:hover:not(:disabled):not(.disabled){border:1px solid #9b6c00;background:#9b6c00 radial-gradient(circle,transparent 1%,#9b6c00 1%) center/15000%;color:#fff;text-decoration:none}.scielo__theme--light .btn-outline-warning:active:not(:disabled):not(.disabled){border:1px solid #9b6c00;background-color:#f8f2e6;background-size:100%;transition:background 0s;color:#fff}.btn-outline-danger.disabled,.btn-outline-danger:disabled,.btn-outline-dark.disabled,.btn-outline-dark:disabled,.btn-outline-info.disabled,.btn-outline-info:disabled,.btn-outline-light.disabled,.btn-outline-light:disabled,.btn-outline-primary.disabled,.btn-outline-primary:disabled,.btn-outline-secondary.disabled,.btn-outline-secondary:disabled,.btn-outline-success.disabled,.btn-outline-success:disabled,.btn-outline-warning.disabled,.btn-outline-warning:disabled{background-color:transparent;border:1px solid #f7f6f4;color:rgba(0,0,0,.396);opacity:1}.btn-outline-danger.disabled:focus,.btn-outline-danger:disabled:focus,.btn-outline-dark.disabled:focus,.btn-outline-dark:disabled:focus,.btn-outline-info.disabled:focus,.btn-outline-info:disabled:focus,.btn-outline-light.disabled:focus,.btn-outline-light:disabled:focus,.btn-outline-primary.disabled:focus,.btn-outline-primary:disabled:focus,.btn-outline-secondary.disabled:focus,.btn-outline-secondary:disabled:focus,.btn-outline-success.disabled:focus,.btn-outline-success:disabled:focus,.btn-outline-warning.disabled:focus,.btn-outline-warning:disabled:focus{background-color:transparent;color:rgba(0,0,0,.396)}.btn-outline-danger.disabled:focus,.btn-outline-danger.disabled:hover,.btn-outline-danger:disabled:focus,.btn-outline-danger:disabled:hover,.btn-outline-dark.disabled:focus,.btn-outline-dark.disabled:hover,.btn-outline-dark:disabled:focus,.btn-outline-dark:disabled:hover,.btn-outline-info.disabled:focus,.btn-outline-info.disabled:hover,.btn-outline-info:disabled:focus,.btn-outline-info:disabled:hover,.btn-outline-light.disabled:focus,.btn-outline-light.disabled:hover,.btn-outline-light:disabled:focus,.btn-outline-light:disabled:hover,.btn-outline-primary.disabled:focus,.btn-outline-primary.disabled:hover,.btn-outline-primary:disabled:focus,.btn-outline-primary:disabled:hover,.btn-outline-secondary.disabled:focus,.btn-outline-secondary.disabled:hover,.btn-outline-secondary:disabled:focus,.btn-outline-secondary:disabled:hover,.btn-outline-success.disabled:focus,.btn-outline-success.disabled:hover,.btn-outline-success:disabled:focus,.btn-outline-success:disabled:hover,.btn-outline-warning.disabled:focus,.btn-outline-warning.disabled:hover,.btn-outline-warning:disabled:focus,.btn-outline-warning:disabled:hover{border-color:#f7f6f4}.btn-outline-danger.disabled:hover:not(:disabled):not(.disabled),.btn-outline-danger:disabled:hover:not(:disabled):not(.disabled),.btn-outline-dark.disabled:hover:not(:disabled):not(.disabled),.btn-outline-dark:disabled:hover:not(:disabled):not(.disabled),.btn-outline-info.disabled:hover:not(:disabled):not(.disabled),.btn-outline-info:disabled:hover:not(:disabled):not(.disabled),.btn-outline-light.disabled:hover:not(:disabled):not(.disabled),.btn-outline-light:disabled:hover:not(:disabled):not(.disabled),.btn-outline-primary.disabled:hover:not(:disabled):not(.disabled),.btn-outline-primary:disabled:hover:not(:disabled):not(.disabled),.btn-outline-secondary.disabled:hover:not(:disabled):not(.disabled),.btn-outline-secondary:disabled:hover:not(:disabled):not(.disabled),.btn-outline-success.disabled:hover:not(:disabled):not(.disabled),.btn-outline-success:disabled:hover:not(:disabled):not(.disabled),.btn-outline-warning.disabled:hover:not(:disabled):not(.disabled),.btn-outline-warning:disabled:hover:not(:disabled):not(.disabled){border:1px solid #3058af;background:#3058af radial-gradient(circle,transparent 1%,#3058af 1%) center/15000%;color:#fff;text-decoration:none}.btn-outline-danger.disabled:active:not(:disabled):not(.disabled),.btn-outline-danger:disabled:active:not(:disabled):not(.disabled),.btn-outline-dark.disabled:active:not(:disabled):not(.disabled),.btn-outline-dark:disabled:active:not(:disabled):not(.disabled),.btn-outline-info.disabled:active:not(:disabled):not(.disabled),.btn-outline-info:disabled:active:not(:disabled):not(.disabled),.btn-outline-light.disabled:active:not(:disabled):not(.disabled),.btn-outline-light:disabled:active:not(:disabled):not(.disabled),.btn-outline-primary.disabled:active:not(:disabled):not(.disabled),.btn-outline-primary:disabled:active:not(:disabled):not(.disabled),.btn-outline-secondary.disabled:active:not(:disabled):not(.disabled),.btn-outline-secondary:disabled:active:not(:disabled):not(.disabled),.btn-outline-success.disabled:active:not(:disabled):not(.disabled),.btn-outline-success:disabled:active:not(:disabled):not(.disabled),.btn-outline-warning.disabled:active:not(:disabled):not(.disabled),.btn-outline-warning:disabled:active:not(:disabled):not(.disabled){border:1px solid #3058af;background-color:#ebf0fa;background-size:100%;transition:background 0s;color:#fff}.scielo__theme--dark .btn-outline-danger.disabled,.scielo__theme--dark .btn-outline-danger:disabled,.scielo__theme--dark .btn-outline-dark.disabled,.scielo__theme--dark .btn-outline-dark:disabled,.scielo__theme--dark .btn-outline-info.disabled,.scielo__theme--dark .btn-outline-info:disabled,.scielo__theme--dark .btn-outline-light.disabled,.scielo__theme--dark .btn-outline-light:disabled,.scielo__theme--dark .btn-outline-primary.disabled,.scielo__theme--dark .btn-outline-primary:disabled,.scielo__theme--dark .btn-outline-secondary.disabled,.scielo__theme--dark .btn-outline-secondary:disabled,.scielo__theme--dark .btn-outline-success.disabled,.scielo__theme--dark .btn-outline-success:disabled,.scielo__theme--dark .btn-outline-warning.disabled,.scielo__theme--dark .btn-outline-warning:disabled{background-color:transparent;border-color:rgba(255,255,255,.2);color:#c4c4c4}.scielo__theme--dark .btn-outline-danger.disabled:focus,.scielo__theme--dark .btn-outline-danger:disabled:focus,.scielo__theme--dark .btn-outline-dark.disabled:focus,.scielo__theme--dark .btn-outline-dark:disabled:focus,.scielo__theme--dark .btn-outline-info.disabled:focus,.scielo__theme--dark .btn-outline-info:disabled:focus,.scielo__theme--dark .btn-outline-light.disabled:focus,.scielo__theme--dark .btn-outline-light:disabled:focus,.scielo__theme--dark .btn-outline-primary.disabled:focus,.scielo__theme--dark .btn-outline-primary:disabled:focus,.scielo__theme--dark .btn-outline-secondary.disabled:focus,.scielo__theme--dark .btn-outline-secondary:disabled:focus,.scielo__theme--dark .btn-outline-success.disabled:focus,.scielo__theme--dark .btn-outline-success:disabled:focus,.scielo__theme--dark .btn-outline-warning.disabled:focus,.scielo__theme--dark .btn-outline-warning:disabled:focus{background-color:transparent;color:#c4c4c4}.scielo__theme--dark .btn-outline-danger.disabled:focus,.scielo__theme--dark .btn-outline-danger.disabled:hover,.scielo__theme--dark .btn-outline-danger:disabled:focus,.scielo__theme--dark .btn-outline-danger:disabled:hover,.scielo__theme--dark .btn-outline-dark.disabled:focus,.scielo__theme--dark .btn-outline-dark.disabled:hover,.scielo__theme--dark .btn-outline-dark:disabled:focus,.scielo__theme--dark .btn-outline-dark:disabled:hover,.scielo__theme--dark .btn-outline-info.disabled:focus,.scielo__theme--dark .btn-outline-info.disabled:hover,.scielo__theme--dark .btn-outline-info:disabled:focus,.scielo__theme--dark .btn-outline-info:disabled:hover,.scielo__theme--dark .btn-outline-light.disabled:focus,.scielo__theme--dark .btn-outline-light.disabled:hover,.scielo__theme--dark .btn-outline-light:disabled:focus,.scielo__theme--dark .btn-outline-light:disabled:hover,.scielo__theme--dark .btn-outline-primary.disabled:focus,.scielo__theme--dark .btn-outline-primary.disabled:hover,.scielo__theme--dark .btn-outline-primary:disabled:focus,.scielo__theme--dark .btn-outline-primary:disabled:hover,.scielo__theme--dark .btn-outline-secondary.disabled:focus,.scielo__theme--dark .btn-outline-secondary.disabled:hover,.scielo__theme--dark .btn-outline-secondary:disabled:focus,.scielo__theme--dark .btn-outline-secondary:disabled:hover,.scielo__theme--dark .btn-outline-success.disabled:focus,.scielo__theme--dark .btn-outline-success.disabled:hover,.scielo__theme--dark .btn-outline-success:disabled:focus,.scielo__theme--dark .btn-outline-success:disabled:hover,.scielo__theme--dark .btn-outline-warning.disabled:focus,.scielo__theme--dark .btn-outline-warning.disabled:hover,.scielo__theme--dark .btn-outline-warning:disabled:focus,.scielo__theme--dark .btn-outline-warning:disabled:hover{border-color:rgba(255,255,255,.2)}.scielo__theme--dark .btn-outline-danger.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-danger:disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-dark.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-dark:disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-info.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-info:disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-light.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-light:disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-primary.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-primary:disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-secondary.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-secondary:disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-success.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-success:disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-warning.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-warning:disabled:hover:not(:disabled):not(.disabled){border:1px solid #b6cdff;background:#b6cdff radial-gradient(circle,transparent 1%,#b6cdff 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .btn-outline-danger.disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-danger:disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-dark.disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-dark:disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-info.disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-info:disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-light.disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-light:disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-primary.disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-primary:disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-secondary.disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-secondary:disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-success.disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-success:disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-warning.disabled:active:not(:disabled):not(.disabled),.scielo__theme--dark .btn-outline-warning:disabled:active:not(:disabled):not(.disabled){border:1px solid #b6cdff;background-color:#f3f7ff;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .btn-outline-danger.disabled,.scielo__theme--light .btn-outline-danger:disabled,.scielo__theme--light .btn-outline-dark.disabled,.scielo__theme--light .btn-outline-dark:disabled,.scielo__theme--light .btn-outline-info.disabled,.scielo__theme--light .btn-outline-info:disabled,.scielo__theme--light .btn-outline-light.disabled,.scielo__theme--light .btn-outline-light:disabled,.scielo__theme--light .btn-outline-primary.disabled,.scielo__theme--light .btn-outline-primary:disabled,.scielo__theme--light .btn-outline-secondary.disabled,.scielo__theme--light .btn-outline-secondary:disabled,.scielo__theme--light .btn-outline-success.disabled,.scielo__theme--light .btn-outline-success:disabled,.scielo__theme--light .btn-outline-warning.disabled,.scielo__theme--light .btn-outline-warning:disabled{background-color:transparent;border:1px solid #f7f6f4;color:rgba(0,0,0,.396);opacity:1}.scielo__theme--light .btn-outline-danger.disabled:focus,.scielo__theme--light .btn-outline-danger:disabled:focus,.scielo__theme--light .btn-outline-dark.disabled:focus,.scielo__theme--light .btn-outline-dark:disabled:focus,.scielo__theme--light .btn-outline-info.disabled:focus,.scielo__theme--light .btn-outline-info:disabled:focus,.scielo__theme--light .btn-outline-light.disabled:focus,.scielo__theme--light .btn-outline-light:disabled:focus,.scielo__theme--light .btn-outline-primary.disabled:focus,.scielo__theme--light .btn-outline-primary:disabled:focus,.scielo__theme--light .btn-outline-secondary.disabled:focus,.scielo__theme--light .btn-outline-secondary:disabled:focus,.scielo__theme--light .btn-outline-success.disabled:focus,.scielo__theme--light .btn-outline-success:disabled:focus,.scielo__theme--light .btn-outline-warning.disabled:focus,.scielo__theme--light .btn-outline-warning:disabled:focus{background-color:transparent;color:rgba(0,0,0,.396)}.scielo__theme--light .btn-outline-danger.disabled:focus,.scielo__theme--light .btn-outline-danger.disabled:hover,.scielo__theme--light .btn-outline-danger:disabled:focus,.scielo__theme--light .btn-outline-danger:disabled:hover,.scielo__theme--light .btn-outline-dark.disabled:focus,.scielo__theme--light .btn-outline-dark.disabled:hover,.scielo__theme--light .btn-outline-dark:disabled:focus,.scielo__theme--light .btn-outline-dark:disabled:hover,.scielo__theme--light .btn-outline-info.disabled:focus,.scielo__theme--light .btn-outline-info.disabled:hover,.scielo__theme--light .btn-outline-info:disabled:focus,.scielo__theme--light .btn-outline-info:disabled:hover,.scielo__theme--light .btn-outline-light.disabled:focus,.scielo__theme--light .btn-outline-light.disabled:hover,.scielo__theme--light .btn-outline-light:disabled:focus,.scielo__theme--light .btn-outline-light:disabled:hover,.scielo__theme--light .btn-outline-primary.disabled:focus,.scielo__theme--light .btn-outline-primary.disabled:hover,.scielo__theme--light .btn-outline-primary:disabled:focus,.scielo__theme--light .btn-outline-primary:disabled:hover,.scielo__theme--light .btn-outline-secondary.disabled:focus,.scielo__theme--light .btn-outline-secondary.disabled:hover,.scielo__theme--light .btn-outline-secondary:disabled:focus,.scielo__theme--light .btn-outline-secondary:disabled:hover,.scielo__theme--light .btn-outline-success.disabled:focus,.scielo__theme--light .btn-outline-success.disabled:hover,.scielo__theme--light .btn-outline-success:disabled:focus,.scielo__theme--light .btn-outline-success:disabled:hover,.scielo__theme--light .btn-outline-warning.disabled:focus,.scielo__theme--light .btn-outline-warning.disabled:hover,.scielo__theme--light .btn-outline-warning:disabled:focus,.scielo__theme--light .btn-outline-warning:disabled:hover{border-color:#f7f6f4}.scielo__theme--light .btn-outline-danger.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-danger:disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-dark.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-dark:disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-info.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-info:disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-light.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-light:disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-primary.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-primary:disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-secondary.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-secondary:disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-success.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-success:disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-warning.disabled:hover:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-warning:disabled:hover:not(:disabled):not(.disabled){border:1px solid #3058af;background:#3058af radial-gradient(circle,transparent 1%,#3058af 1%) center/15000%;color:#fff;text-decoration:none}.scielo__theme--light .btn-outline-danger.disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-danger:disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-dark.disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-dark:disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-info.disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-info:disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-light.disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-light:disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-primary.disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-primary:disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-secondary.disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-secondary:disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-success.disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-success:disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-warning.disabled:active:not(:disabled):not(.disabled),.scielo__theme--light .btn-outline-warning:disabled:active:not(:disabled):not(.disabled){border:1px solid #3058af;background-color:#ebf0fa;background-size:100%;transition:background 0s;color:#fff}.btn[class*=scielo__btn-with-icon--left]{padding-left:2rem}.btn[class*=scielo__btn-with-icon--left] [class^=material-icons]{position:absolute;top:50%;transform:translateY(-50%);width:1.25rem;height:1.25rem;font-size:1.25rem;line-height:1.25rem}.btn[class*=scielo__btn-with-icon--left] [class^=material-icons]:before{vertical-align:top}.btn[class*=scielo__btn-with-icon--left] [class^=material-icons]{left:.5rem}.btn[class*=scielo__btn-with-icon--right]{padding-right:2rem}.btn[class*=scielo__btn-with-icon--right] [class^=material-icons]{position:absolute;top:50%;transform:translateY(-50%);width:1.25rem;height:1.25rem;font-size:1.25rem;line-height:1.25rem}.btn[class*=scielo__btn-with-icon--right] [class^=material-icons]:before{vertical-align:top}.btn[class*=scielo__btn-with-icon--right] [class^=material-icons]{right:.5rem}.btn[class*=scielo__btn-with-icon--only]{padding:0;width:2.5rem}.btn[class*=scielo__btn-with-icon--only] [class^=material-icons]{position:absolute;top:50%;transform:translateY(-50%);width:1.25rem;height:1.25rem;font-size:1.25rem;line-height:1.25rem}.btn[class*=scielo__btn-with-icon--only] [class^=material-icons]:before{vertical-align:top}.btn[class*=scielo__btn-with-icon--only] [class^=material-icons]{top:50%;left:50%;transform:translate(-50%,-50%)}.btn.dropdown-toggle[class*=scielo__btn-with-icon--only]{width:3rem;display:flex;justify-content:center;align-items:center;padding-left:2rem;padding-right:1.5rem}.btn.dropdown-toggle[class*=scielo__btn-with-icon--only]:after{right:0;position:static;transform:none;margin:0}.btn.dropdown-toggle[class*=scielo__btn-with-icon--only] [class^=material-icons]{position:static;transform:none}.btn.dropdown-toggle:after{position:absolute;top:50%;transform:translateY(-50%);font-family:'Material Icons Outlined';content:"arrow_drop_down";color:inherit;border:0;line-height:1.5rem!important;text-align:center;right:1rem;width:1.25rem;height:1.25rem;font-size:1.25rem;line-height:1.25rem;transition:.3s all ease-out}.btn.dropdown-toggle[class*=scielo__btn-with-icon--left]{padding-right:1.5rem}.btn.dropdown-toggle[class*=scielo__btn-with-icon--left].btn-link{padding-left:2.625rem;padding-right:2.625rem}.btn.dropdown-toggle[class*=scielo__btn-with-icon--left]:after{right:.3rem}.btn-group-lg>.btn,.btn-group.btn-group-lg>.btn,.btn-lg{padding:.75rem 1.2rem;border-radius:.25rem;line-height:1.5rem;height:3rem;font-size:1.25rem}.btn-group-lg>.btn[class*=scielo__btn-with-icon--left],.btn-lg[class*=scielo__btn-with-icon--left]{padding-left:2.5rem}.btn-group-lg>.btn[class*=scielo__btn-with-icon--left] [class^=material-icons],.btn-lg[class*=scielo__btn-with-icon--left] [class^=material-icons]{position:absolute;top:50%;transform:translateY(-50%);width:1.5rem;height:1.5rem;font-size:1.5rem;line-height:1.5rem}.btn-group-lg>.btn[class*=scielo__btn-with-icon--left] [class^=material-icons]:before,.btn-lg[class*=scielo__btn-with-icon--left] [class^=material-icons]:before{vertical-align:top}.btn-group-lg>.btn[class*=scielo__btn-with-icon--left] [class^=material-icons],.btn-lg[class*=scielo__btn-with-icon--left] [class^=material-icons]{left:.625rem}.btn-group-lg>.btn[class*=scielo__btn-with-icon--right],.btn-lg[class*=scielo__btn-with-icon--right]{padding-right:2.5rem}.btn-group-lg>.btn[class*=scielo__btn-with-icon--right] [class^=material-icons],.btn-lg[class*=scielo__btn-with-icon--right] [class^=material-icons]{position:absolute;top:50%;transform:translateY(-50%);width:1.5rem;height:1.5rem;font-size:1.5rem;line-height:1.5rem}.btn-group-lg>.btn[class*=scielo__btn-with-icon--right] [class^=material-icons]:before,.btn-lg[class*=scielo__btn-with-icon--right] [class^=material-icons]:before{vertical-align:top}.btn-group-lg>.btn[class*=scielo__btn-with-icon--right] [class^=material-icons],.btn-lg[class*=scielo__btn-with-icon--right] [class^=material-icons]{right:.625rem}.btn-group-lg>.btn[class*=scielo__btn-with-icon--only],.btn-lg[class*=scielo__btn-with-icon--only]{padding:0;width:3rem}.btn-group-lg>.btn[class*=scielo__btn-with-icon--only] [class^=material-icons],.btn-lg[class*=scielo__btn-with-icon--only] [class^=material-icons]{position:absolute;top:50%;transform:translateY(-50%);width:1.5rem;height:1.5rem;font-size:1.5rem;line-height:1.5rem}.btn-group-lg>.btn[class*=scielo__btn-with-icon--only] [class^=material-icons]:before,.btn-lg[class*=scielo__btn-with-icon--only] [class^=material-icons]:before{vertical-align:top}.btn-group-lg>.btn[class*=scielo__btn-with-icon--only] [class^=material-icons],.btn-lg[class*=scielo__btn-with-icon--only] [class^=material-icons]{top:50%;left:50%;transform:translate(-50%,-50%)}.btn-group-lg>.dropdown-toggle.btn[class*=scielo__btn-with-icon--only],.btn-lg.dropdown-toggle[class*=scielo__btn-with-icon--only]{width:3rem;padding-left:2.5rem;padding-right:2.5rem;display:flex;justify-content:center;align-items:center}.btn-group-lg>.dropdown-toggle.btn:after,.btn-lg.dropdown-toggle:after{right:1.25rem;width:1.5rem;height:1.5rem;font-size:1.5rem;line-height:1.5rem}.btn-group-sm>.btn,.btn-group.btn-group-sm>.btn,.btn-sm{padding:.5rem .8rem;border-radius:.25rem;line-height:1rem;height:2rem}.dropdown>.btn{padding-right:2.5rem}.dropdown.show .btn{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem;border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.dropdown.show .btn:after{transform:rotate(180deg) translateY(50%)}.dropdown .dropdown-menu{background:#fff;border-color:#ccc}.scielo__theme--dark .dropdown .dropdown-menu{background:#333;border-color:rgba(255,255,255,.3)}.scielo__theme--light .dropdown .dropdown-menu{background:#fff;border-color:#ccc}.dropdown .dropdown-menu>a{color:#333}.dropdown .dropdown-menu>a:hover{background:#f7f6f4}.scielo__theme--dark .dropdown .dropdown-menu>a{color:#c4c4c4}.scielo__theme--dark .dropdown .dropdown-menu>a:hover{background:#414141}.scielo__theme--light .dropdown .dropdown-menu>a{color:#333}.scielo__theme--light .dropdown .dropdown-menu>a:hover{background:#f7f6f4}.copyLink{position:relative;cursor:pointer}.copyLink:after{font-family:'Material Icons Outlined';content:"check";position:absolute;background:#2c9d45;top:100%;left:0;bottom:0;text-align:center;width:100%;color:#fff;font-size:20px;display:block;padding-top:.5rem;text-align:center;transition:all .3s ease-out,text-indent .3s ease-out}.scielo__theme--dark .copyLink:after{background:#2c9d45;color:#333}.scielo__theme--light .copyLink:after{background:#2c9d45;color:#fff}.copyLink.copyFeedback:after{top:0;visibility:visible}.floatingBtnError{position:fixed;right:calc(0px + var(--bs-gutter-x,1.5rem));top:35%;transform:rotate(-90deg);display:none;transform-origin:right center;margin:0}@media (min-width:1024px){.floatingBtnError{display:block}}.fixed-top .dropdown-item{color:#3867ce}.btn-group>.btn{font-weight:400!important;font-size:1rem;letter-spacing:.1px!important;white-space:nowrap}.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0;margin-left:0}.btn-group>.btn:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0;margin-right:-1px}.btn-group>.btn:not(:first-child):not(.scielo__btn-with-icon--left):not(.scielo__btn-with-icon--only):not(.arrow-only){padding-left:1.5rem}.btn-group>.btn:not(:last-child):not(.scielo__btn-with-icon--right):not(.scielo__btn-with-icon--only){padding-right:1.5rem}.btn-group>.btn-group>.btn{border-radius:0}.btn-group>.btn-group>.btn.dropdown-toggle{padding-right:3rem!important}.btn-group>.btn-group:first-child>.btn.dropdown-toggle{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.btn-group>.btn-group:last-child>.btn.dropdown-toggle{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0;margin-left:0;padding-left:1.5rem}.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0;margin-right:0;padding-right:1.5rem}.btn-group.btn-group-sm>.btn:not(:first-child):not(.scielo__btn-with-icon--left):not(.scielo__btn-with-icon--only):not(.arrow-only){padding-left:1.125rem}.btn-group.btn-group-sm>.btn:not(:last-child):not(.scielo__btn-with-icon--right):not(.scielo__btn-with-icon--only){padding-right:1.125rem}.btn-group.btn-group-lg>.btn:not(:first-child):not(.scielo__btn-with-icon--left):not(.scielo__btn-with-icon--only):not(.arrow-only){padding-left:1.875rem}.btn-group.btn-group-lg>.btn:not(:last-child):not(.scielo__btn-with-icon--right):not(.scielo__btn-with-icon--only){padding-right:1.875rem}.btn-group-vertical>.btn{margin-bottom:0}.btn-group-vertical>.btn:first-child{border-top-left-radius:.1875rem;border-top-right-radius:.1875rem}.btn-group-vertical>.btn:last-child{border-bottom-left-radius:.1875rem;border-bottom-right-radius:.1875rem}.btn-group-vertical>.btn-group>.btn{padding-left:3rem!important;padding-right:3rem!important}.btn-group-vertical>.btn-group:first-child>.btn{border-top-left-radius:.1875rem;border-top-right-radius:.1875rem}.btn-group-vertical>.btn-group:last-child>.btn{border-bottom-left-radius:.1875rem;border-bottom-right-radius:.1875rem}.scielo__floatingMenuCtt{position:fixed;bottom:30px;width:auto;height:auto;margin:0}.scielo__floatingMenuCtt .material-icons-outlined{vertical-align:baseline}.scielo__floatingMenuCtt>a{padding-top:6px}.scielo__floatingMenu{transition:all .5s;box-sizing:border-box;z-index:1001;padding-left:0;white-space:nowrap;list-style:none;opacity:1;bottom:auto;opacity:1;margin:0;display:inline-block}.scielo__floatingMenu .fm-wrap{padding:0;margin:0}@media (min-width:576px){.scielo__floatingMenu .fm-wrap{padding:25px 25px 25px 0;margin:-25px -25px -25px 0}}.scielo__floatingMenu .fm-button-child,.scielo__floatingMenu .fm-button-main{display:inline-block;position:relative;padding:0;color:#fff;cursor:pointer;outline:0;background-color:#3867ce;border:none;border-radius:50%;box-shadow:0 0 4px rgba(0,0,0,.14),0 4px 8px rgba(0,0,0,.28);-webkit-user-drag:none}.scielo__theme--dark .scielo__floatingMenu .fm-button-child,.scielo__theme--dark .scielo__floatingMenu .fm-button-main{background:#86acff;color:#333}.scielo__theme--light .scielo__floatingMenu .fm-button-child,.scielo__theme--light .scielo__floatingMenu .fm-button-main{background-color:#3867ce;color:#fff}.scielo__floatingMenu .fm-button-main{width:56px;height:56px;z-index:20;padding-top:17px;padding-left:16px}.scielo__floatingMenu .fm-button-main .glyphFloatMenu{position:absolute;width:53px;height:56px;font-size:32px;line-height:56px;text-align:center}.scielo__floatingMenu .fm-button-main .material-icons-outlined-menu-close,.scielo__floatingMenu .fm-button-main .sci-ico-floatingMenuClose{opacity:0}.scielo__floatingMenu .fm-button-child{width:40px;height:40px;line-height:40px;text-align:center;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-o-transition:all .3s ease-out,text-indent .3s ease-out;-ms-transition:all .3s ease-out,text-indent .3s ease-out;-moz-transition:all .3s ease-out,text-indent .3s ease-out;-webkit-transition:all .3s ease-out,text-indent .3s ease-out;transition:all .3s ease-out,text-indent .3s ease-out;margin-top:1px;padding-top:6px}.scielo__floatingMenu .fm-button-child .glyphFloatMenu{font-size:24px}.scielo__floatingMenu .fm-button-child:hover{background-color:#3058af}.scielo__theme--dark .scielo__floatingMenu .fm-button-child:hover{background-color:#b6cdff;color:#333}.scielo__theme--light .scielo__floatingMenu .fm-button-child:hover{background-color:#3058af;color:#fff}.scielo__floatingMenu .fm-list{position:absolute;bottom:42px;width:56px;min-height:56px;margin:0}@media (min-width:576px){.scielo__floatingMenu .fm-list{margin-left:8px}}.scielo__floatingMenu .fm-list li{box-sizing:border-box;position:absolute;top:30px;left:8px;display:block;padding:9px 0 2px 0;margin:0;width:50px;height:auto}@media (min-width:576px){.scielo__floatingMenu .fm-list li{top:41px;left:6px}}@media (max-width:575.98px){.scielo__floatingMenu .fm-list li a:after{content:attr(data-mobile-tooltip);color:#fff;background:#333;position:absolute;margin-left:16px;display:inline-block;width:auto;height:auto;text-align:left;padding:5px;line-height:100%;border-radius:4px;font-size:.75rem;margin-top:3px}.scielo__theme--dark .scielo__floatingMenu .fm-list li a:after{background:#fff;color:#333}.scielo__theme--light .scielo__floatingMenu .fm-list li a:after{background:#333;color:#fff}.scielo__floatingMenu .fm-list li a:before{content:'';border-right:4px solid #333;border-left:4px solid transparent;border-top:4px solid transparent;border-bottom:4px solid transparent;margin-left:13px;margin-top:10px;position:absolute;margin-left:32px}.scielo__theme--dark .scielo__floatingMenu .fm-list li a:before{border-right:4px solid #fff}.scielo__theme--light .scielo__floatingMenu .fm-list li a:before{border-right:4px solid #333}}.scielo__floatingMenu:hover .fm-button-main{background-color:#fff;padding-top:17px;padding-left:16px}.scielo__floatingMenu:hover .material-icons-outlined-menu-default,.scielo__floatingMenu:hover .sci-ico-floatingMenuDefault{opacity:0;display:none}.scielo__floatingMenu:hover .material-icons-outlined-menu-close,.scielo__floatingMenu:hover .sci-ico-floatingMenuClose{opacity:1;color:#3867ce}.scielo__floatingMenu.fm-slidein .fm-list li{display:block;opacity:0;transition:all .5s}.scielo__floatingMenu.fm-slidein[data-fm-toogle=hover]:hover .fm-list li{opacity:1}.scielo__floatingMenu.fm-slidein[data-fm-toogle=hover]:hover .fm-list li:nth-child(1){-webkit-transform:translateX(50px);transform:translateX(50px)}@media (max-width:575.98px){.scielo__floatingMenu.fm-slidein[data-fm-toogle=hover]:hover .fm-list li:nth-child(1){-webkit-transform:translateY(-50px);transform:translateY(-50px)}}.scielo__floatingMenu.fm-slidein[data-fm-toogle=hover]:hover .fm-list li:nth-child(2){-webkit-transform:translateX(100px);transform:translateX(100px)}@media (max-width:575.98px){.scielo__floatingMenu.fm-slidein[data-fm-toogle=hover]:hover .fm-list li:nth-child(2){-webkit-transform:translateY(-100px);transform:translateY(-100px)}}.scielo__floatingMenu.fm-slidein[data-fm-toogle=hover]:hover .fm-list li:nth-child(3){-webkit-transform:translateX(150px);transform:translateX(150px)}@media (max-width:575.98px){.scielo__floatingMenu.fm-slidein[data-fm-toogle=hover]:hover .fm-list li:nth-child(3){-webkit-transform:translateY(-150px);transform:translateY(-150px)}}.scielo__floatingMenu.fm-slidein[data-fm-toogle=hover]:hover .fm-list li:nth-child(4){-webkit-transform:translateX(200px);transform:translateX(200px)}@media (max-width:575.98px){.scielo__floatingMenu.fm-slidein[data-fm-toogle=hover]:hover .fm-list li:nth-child(4){-webkit-transform:translateY(-200px);transform:translateY(-200px)}}.scielo__floatingMenu.fm-slidein[data-fm-toogle=hover]:hover .fm-list li:nth-child(5){-webkit-transform:translateX(250px);transform:translateX(250px)}@media (max-width:575.98px){.scielo__floatingMenu.fm-slidein[data-fm-toogle=hover]:hover .fm-list li:nth-child(5){-webkit-transform:translateY(-250px);transform:translateY(-250px)}}.scielo__floatingMenu.fm-slidein[data-fm-toogle=hover]:hover .fm-list li:nth-child(6){-webkit-transform:translateX(300px);transform:translateX(300px)}@media (max-width:575.98px){.scielo__floatingMenu.fm-slidein[data-fm-toogle=hover]:hover .fm-list li:nth-child(6){-webkit-transform:translateY(-300px);transform:translateY(-300px)}}.scielo__floatingMenu.fm-slidein[data-fm-toogle=hover]:hover .fm-list li:nth-child(7){-webkit-transform:translateX(350px);transform:translateX(350px)}@media (max-width:575.98px){.scielo__floatingMenu.fm-slidein[data-fm-toogle=hover]:hover .fm-list li:nth-child(7){-webkit-transform:translateY(-350px);transform:translateY(-350px)}}.scielo__floatingMenuItem{opacity:1;color:#fff;background-color:#3867ce;border-radius:50%;display:inline-block;width:40px;height:40px;line-height:40px;text-align:center;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-o-transition:all .3s ease-out,text-indent .3s ease-out;-ms-transition:all .3s ease-out,text-indent .3s ease-out;-moz-transition:all .3s ease-out,text-indent .3s ease-out;-webkit-transition:all .3s ease-out,text-indent .3s ease-out;transition:all .3s ease-out,text-indent .3s ease-out;box-shadow:0 0 4px rgba(0,0,0,.14),0 4px 8px rgba(0,0,0,.28);margin-right:4px}.scielo__theme--dark .scielo__floatingMenuItem{background:#86acff;color:#333}.scielo__theme--light .scielo__floatingMenuItem{background:#3867ce;color:#fff}.scielo__floatingMenuItem .glyphFloatMenu{font-size:24px}.scielo__floatingMenuItem:hover{background-color:#3058af;color:#fff}.scielo__theme--dark .scielo__floatingMenuItem:hover{background-color:#b6cdff;color:#333}.scielo__theme--light .scielo__floatingMenuItem:hover{background-color:#3058af;color:#fff}.scielo__floatingMenuCttJs{position:fixed;bottom:30px;width:auto;height:auto;margin:0}.scielo__floatingMenuCttJs .material-icons-outlined{vertical-align:baseline}.scielo__floatingMenuCttJs>a{padding-top:6px}.scielo__floatingMenuJs{transition:all .5s;box-sizing:border-box;z-index:1001;padding-left:0;white-space:nowrap;list-style:none;opacity:1;bottom:auto;opacity:1;margin:0;display:inline-block}.scielo__floatingMenuJs .fm-wrap{padding:0;margin:0}@media (min-width:576px){.scielo__floatingMenuJs .fm-wrap{padding:25px 25px 25px 0;margin:-25px -25px -25px 0}}.scielo__floatingMenuJs .fm-button-child,.scielo__floatingMenuJs .fm-button-close,.scielo__floatingMenuJs .fm-button-main{display:inline-block;position:relative;padding:0;color:#fff;cursor:pointer;outline:0;background-color:#3867ce;border:none;border-radius:50%;box-shadow:0 0 4px rgba(0,0,0,.14),0 4px 8px rgba(0,0,0,.28);-webkit-user-drag:none}.scielo__theme--dark .scielo__floatingMenuJs .fm-button-child,.scielo__theme--dark .scielo__floatingMenuJs .fm-button-close,.scielo__theme--dark .scielo__floatingMenuJs .fm-button-main{background:#86acff;color:#333}.scielo__theme--light .scielo__floatingMenuJs .fm-button-child,.scielo__theme--light .scielo__floatingMenuJs .fm-button-close,.scielo__theme--light .scielo__floatingMenuJs .fm-button-main{background-color:#3867ce;color:#fff}.scielo__floatingMenuJs .fm-button-close,.scielo__floatingMenuJs .fm-button-main{width:56px;height:56px;z-index:20;padding-top:17px;padding-left:16px}.scielo__floatingMenuJs .fm-button-close .glyphFloatMenu,.scielo__floatingMenuJs .fm-button-main .glyphFloatMenu{position:absolute;width:53px;height:56px;font-size:32px;line-height:56px;text-align:center}.scielo__floatingMenuJs .fm-button-close{background:#fff;color:#3867ce}.scielo__floatingMenuJs .fm-button-child{width:40px;height:40px;line-height:40px;text-align:center;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-o-transition:all .3s ease-out,text-indent .3s ease-out;-ms-transition:all .3s ease-out,text-indent .3s ease-out;-moz-transition:all .3s ease-out,text-indent .3s ease-out;-webkit-transition:all .3s ease-out,text-indent .3s ease-out;transition:all .3s ease-out,text-indent .3s ease-out;margin-top:1px;padding-top:6px}.scielo__floatingMenuJs .fm-button-child .glyphFloatMenu{font-size:24px}.scielo__floatingMenuJs .fm-button-child:hover{background-color:#3058af}.scielo__theme--dark .scielo__floatingMenuJs .fm-button-child:hover{background-color:#b6cdff;color:#333}.scielo__theme--light .scielo__floatingMenuJs .fm-button-child:hover{background-color:#3058af;color:#fff}.scielo__floatingMenuJs .fm-list{position:absolute;bottom:42px;width:56px;min-height:56px;margin:0}@media (min-width:576px){.scielo__floatingMenuJs .fm-list{margin-left:8px}}.scielo__floatingMenuJs .fm-list li{box-sizing:border-box;position:absolute;top:30px;left:8px;padding:9px 0 2px 0;margin:0;width:50px;height:auto;list-style:none}@media (min-width:576px){.scielo__floatingMenuJs .fm-list li{top:41px;left:6px}}@media (max-width:575.98px){.scielo__floatingMenuJs .fm-list li a{display:none}.scielo__floatingMenuJs .fm-list li a:after{content:attr(data-mobile-tooltip);color:#fff;background:#333;position:absolute;margin-left:16px;display:inline-block;width:auto;height:auto;text-align:left;padding:5px;line-height:100%;border-radius:4px;font-size:.75rem;margin-top:3px}.scielo__theme--dark .scielo__floatingMenuJs .fm-list li a:after{background:#fff;color:#333}.scielo__theme--light .scielo__floatingMenuJs .fm-list li a:after{background:#333;color:#fff}.scielo__floatingMenuJs .fm-list li a:before{content:'';border-right:4px solid #333;border-left:4px solid transparent;border-top:4px solid transparent;border-bottom:4px solid transparent;margin-left:13px;margin-top:10px;position:absolute;margin-left:32px}.scielo__theme--dark .scielo__floatingMenuJs .fm-list li a:before{border-right:4px solid #fff}.scielo__theme--light .scielo__floatingMenuJs .fm-list li a:before{border-right:4px solid #333}}.scielo__floatingMenuCttJs2{position:fixed;bottom:30px;width:auto;height:auto;margin:0}.scielo__floatingMenuCttJs2 .material-icons-outlined{vertical-align:baseline}.scielo__floatingMenuCttJs2>a{padding-top:6px}.scielo__floatingMenuJs2{transition:all .5s;box-sizing:border-box;z-index:1001;padding-left:0;white-space:nowrap;list-style:none;opacity:1;bottom:auto;opacity:1;margin:0;display:inline-block}.scielo__floatingMenuJs2 .fm-wrap{padding:0;margin:0}@media (min-width:576px){.scielo__floatingMenuJs2 .fm-wrap{padding:25px 25px 25px 0;margin:-25px -25px -25px 0}}.scielo__floatingMenuJs2 .fm-button-child,.scielo__floatingMenuJs2 .fm-button-close,.scielo__floatingMenuJs2 .fm-button-main{display:inline-block;position:relative;padding:0;color:#fff;cursor:pointer;outline:0;background-color:#3867ce;border:none;border-radius:50%;box-shadow:0 0 4px rgba(0,0,0,.14),0 4px 8px rgba(0,0,0,.28);-webkit-user-drag:none}.scielo__theme--dark .scielo__floatingMenuJs2 .fm-button-child,.scielo__theme--dark .scielo__floatingMenuJs2 .fm-button-close,.scielo__theme--dark .scielo__floatingMenuJs2 .fm-button-main{background:#86acff;color:#333}.scielo__theme--light .scielo__floatingMenuJs2 .fm-button-child,.scielo__theme--light .scielo__floatingMenuJs2 .fm-button-close,.scielo__theme--light .scielo__floatingMenuJs2 .fm-button-main{background-color:#3867ce;color:#fff}.scielo__floatingMenuJs2 .fm-button-close,.scielo__floatingMenuJs2 .fm-button-main{width:56px;height:56px;z-index:20;padding-top:17px;padding-left:16px}.scielo__floatingMenuJs2 .fm-button-close .glyphFloatMenu,.scielo__floatingMenuJs2 .fm-button-main .glyphFloatMenu{position:absolute;width:53px;height:56px;font-size:32px;line-height:56px;text-align:center}.scielo__floatingMenuJs2 .fm-button-close{background:#fff;color:#3867ce;display:none;z-index:999}.scielo__floatingMenuJs2 .fm-button-child{width:40px;height:40px;line-height:40px;text-align:center;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-o-transition:all .3s ease-out,text-indent .3s ease-out;-ms-transition:all .3s ease-out,text-indent .3s ease-out;-moz-transition:all .3s ease-out,text-indent .3s ease-out;-webkit-transition:all .3s ease-out,text-indent .3s ease-out;transition:all .3s ease-out,text-indent .3s ease-out;margin-top:1px;padding-top:6px}.scielo__floatingMenuJs2 .fm-button-child .glyphFloatMenu{font-size:24px}.scielo__floatingMenuJs2 .fm-button-child:hover{background-color:#3058af}.scielo__theme--dark .scielo__floatingMenuJs2 .fm-button-child:hover{background-color:#b6cdff;color:#333}.scielo__theme--light .scielo__floatingMenuJs2 .fm-button-child:hover{background-color:#3058af;color:#fff}.scielo__floatingMenuJs2 .fm-list-desktop,.scielo__floatingMenuJs2 .fm-list-mobile{position:absolute;bottom:42px;width:56px;min-height:56px;margin:0}.scielo__floatingMenuJs2 .fm-list-desktop li,.scielo__floatingMenuJs2 .fm-list-mobile li{position:absolute;box-sizing:border-box;padding:9px 0 2px 0;margin:0;width:50px;height:auto;list-style:none}.scielo__floatingMenuJs2 .fm-list-desktop li a,.scielo__floatingMenuJs2 .fm-list-mobile li a{display:none}.fm-list-mobile{padding:8px;margin-bottom:7px!important;margin-left:2px!important}.fm-list-mobile li{top:39px;left:6px}.fm-list-mobile li a:after{content:attr(data-mobile-tooltip);color:#fff;background:#333;position:absolute;margin-left:16px;display:inline-block;width:auto;height:auto;text-align:left;padding:5px;line-height:100%;border-radius:4px;font-size:.75rem;margin-top:3px}.scielo__theme--dark .fm-list-mobile li a:after{background:#fff;color:#333}.scielo__theme--light .fm-list-mobile li a:after{background:#333;color:#fff}.fm-list-mobile li a:before{content:'';border-right:4px solid #333;border-left:4px solid transparent;border-top:4px solid transparent;border-bottom:4px solid transparent;margin-left:13px;margin-top:10px;position:absolute;margin-left:32px}.scielo__theme--dark .fm-list-mobile li a:before{border-right:4px solid #fff}.scielo__theme--light .fm-list-mobile li a:before{border-right:4px solid #333}.fm-list-desktop{margin-left:15px!important}.fm-list-desktop li{display:inline;top:38px;left:6px;position:absolute;box-sizing:border-box;padding:2px 2px!important;margin:0;width:40px!important;height:auto;list-style:none;margin-top:10px!important;outline:0 solid red;left:0!important}.fm-list-desktop li a::after{content:'';display:none}.fm-list-desktop li a::before{content:'';display:none}.scielo__floatingMenuCttJs3{position:fixed;bottom:30px;z-index:5!important;width:auto;height:auto;margin:0}.scielo__floatingMenuCttJs3 .material-icons-outlined{vertical-align:baseline}.scielo__floatingMenuCttJs3>a{padding-top:6px}.scielo__floatingMenuJs3{transition:all .5s;box-sizing:border-box;z-index:1001;padding-left:0;white-space:nowrap;list-style:none;opacity:1;bottom:auto;opacity:1;margin:0;display:inline-block}.scielo__floatingMenuJs3 .fm-wrap{padding:0;margin:0}@media (min-width:576px){.scielo__floatingMenuJs3 .fm-wrap{padding:25px 25px 25px 0;margin:-25px -25px -25px 0}}.scielo__floatingMenuJs3 .fm-button-child,.scielo__floatingMenuJs3 .fm-button-close,.scielo__floatingMenuJs3 .fm-button-main{display:inline-block;position:relative;padding:0;color:#fff;cursor:pointer;outline:0;background-color:#3867ce;border:none;border-radius:50%;box-shadow:0 0 4px rgba(0,0,0,.14),0 4px 8px rgba(0,0,0,.28);-webkit-user-drag:none}.scielo__theme--dark .scielo__floatingMenuJs3 .fm-button-child,.scielo__theme--dark .scielo__floatingMenuJs3 .fm-button-close,.scielo__theme--dark .scielo__floatingMenuJs3 .fm-button-main{background:#86acff;color:#333}.scielo__theme--light .scielo__floatingMenuJs3 .fm-button-child,.scielo__theme--light .scielo__floatingMenuJs3 .fm-button-close,.scielo__theme--light .scielo__floatingMenuJs3 .fm-button-main{background-color:#3867ce;color:#fff}.scielo__floatingMenuJs3 .fm-button-close,.scielo__floatingMenuJs3 .fm-button-main{width:56px;height:56px;z-index:20;padding-top:17px;padding-left:16px}.scielo__floatingMenuJs3 .fm-button-close .glyphFloatMenu,.scielo__floatingMenuJs3 .fm-button-main .glyphFloatMenu{position:absolute;width:53px;height:56px;font-size:32px;line-height:56px;text-align:center}.scielo__floatingMenuJs3 .fm-button-close{background:#fff;color:#3867ce;display:none;z-index:999}.scielo__floatingMenuJs3 .fm-button-child{width:40px;height:40px;line-height:40px;text-align:center;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;-moz-animation-duration:.3s;-ms-animation-duration:.3s;-o-animation-duration:.3s;animation-duration:.3s;-o-transition:all .3s ease-out,text-indent .3s ease-out;-ms-transition:all .3s ease-out,text-indent .3s ease-out;-moz-transition:all .3s ease-out,text-indent .3s ease-out;-webkit-transition:all .3s ease-out,text-indent .3s ease-out;transition:all .3s ease-out,text-indent .3s ease-out;margin-top:1px;padding-top:6px}.scielo__floatingMenuJs3 .fm-button-child .glyphFloatMenu{font-size:24px}.scielo__floatingMenuJs3 .fm-button-child:hover{background-color:#3058af}.scielo__theme--dark .scielo__floatingMenuJs3 .fm-button-child:hover{background-color:#b6cdff;color:#333}.scielo__theme--light .scielo__floatingMenuJs3 .fm-button-child:hover{background-color:#3058af;color:#fff}.scielo__floatingMenuJs3 .fm-list-desktop,.scielo__floatingMenuJs3 .fm-list-mobile{position:absolute;bottom:42px;width:56px;min-height:56px;margin:0}.scielo__floatingMenuJs3 .fm-list-desktop li,.scielo__floatingMenuJs3 .fm-list-mobile li{position:absolute;box-sizing:border-box;padding:9px 0 2px 0;margin:0;width:50px;height:auto;list-style:none}.scielo__floatingMenuJs3 .fm-list-desktop li a,.scielo__floatingMenuJs3 .fm-list-mobile li a{display:none}.fm-list-mobile{padding:8px;margin-bottom:7px!important;margin-left:2px!important}.fm-list-mobile li{top:39px;left:6px}.fm-list-mobile li a:after{content:attr(data-mobile-tooltip);color:#fff;background:#333;position:absolute;margin-left:16px;display:inline-block;width:auto;height:auto;text-align:left;padding:5px;line-height:100%;border-radius:4px;font-size:.75rem;margin-top:3px}.scielo__theme--dark .fm-list-mobile li a:after{background:#fff;color:#333}.scielo__theme--light .fm-list-mobile li a:after{background:#333;color:#fff}.fm-list-mobile li a:before{content:'';border-right:4px solid #333;border-left:4px solid transparent;border-top:4px solid transparent;border-bottom:4px solid transparent;margin-left:13px;margin-top:10px;position:absolute;margin-left:32px}.scielo__theme--dark .fm-list-mobile li a:before{border-right:4px solid #fff}.scielo__theme--light .fm-list-mobile li a:before{border-right:4px solid #333}.fm-list-desktop{margin-left:15px!important}.fm-list-desktop li{display:inline;top:38px;left:6px;position:absolute;box-sizing:border-box;padding:2px 2px!important;margin:0;width:40px!important;height:auto;list-style:none;margin-top:10px!important;outline:0 solid red;left:0!important}.fm-list-desktop li a::after{content:'';display:none}.fm-list-desktop li a::before{content:'';display:none}@media (hover:none){.scielo__floatingMenuItem{display:none!important}.fm-list-mobile{display:block!important}}/*! nouislider - 14.1.1 - 12/15/2019 */.noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-ms-touch-action:none;touch-action:none;-ms-user-select:none;-moz-user-select:none;user-select:none;-moz-box-sizing:border-box;box-sizing:border-box}.noUi-target{position:relative}.noUi-base,.noUi-connects{width:100%;height:100%;position:relative;z-index:1}.noUi-connects{overflow:hidden;z-index:0}.noUi-connect,.noUi-origin{will-change:transform;position:absolute;z-index:1;top:0;right:0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;-webkit-transform-style:preserve-3d;transform-origin:0 0;transform-style:flat}.noUi-connect{height:100%;width:100%}.noUi-origin{height:10%;width:10%}.noUi-txt-dir-rtl.noUi-horizontal .noUi-origin{left:0;right:auto}.noUi-vertical .noUi-origin{width:0}.noUi-horizontal .noUi-origin{height:0}.noUi-handle{-webkit-backface-visibility:hidden;backface-visibility:hidden;position:absolute}.noUi-touch-area{height:100%;width:100%}.noUi-state-tap .noUi-connect,.noUi-state-tap .noUi-origin{-webkit-transition:transform .3s;transition:transform .3s}.noUi-state-drag *{cursor:inherit!important}.noUi-horizontal{height:18px}.noUi-horizontal .noUi-handle{width:34px;height:28px;right:-17px;top:-6px}.noUi-vertical{width:18px}.noUi-vertical .noUi-handle{width:28px;height:34px;right:-6px;top:-17px}.noUi-txt-dir-rtl.noUi-horizontal .noUi-handle{left:-17px;right:auto}.noUi-target{background:#fafafa;border-radius:4px;border:1px solid #d3d3d3;box-shadow:inset 0 1px 1px #f0f0f0,0 3px 6px -5px #bbb}.noUi-connects{border-radius:3px}.noUi-connect{background:#3fb8af}.noUi-draggable{cursor:ew-resize}.noUi-vertical .noUi-draggable{cursor:ns-resize}.noUi-handle{border:1px solid #d9d9d9;border-radius:3px;background:#fff;cursor:default;box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ebebeb,0 3px 6px -3px #bbb}.noUi-active{box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ddd,0 3px 6px -3px #bbb}.noUi-handle:after,.noUi-handle:before{content:"";display:block;position:absolute;height:14px;width:1px;background:#e8e7e6;left:14px;top:6px}.noUi-handle:after{left:17px}.noUi-vertical .noUi-handle:after,.noUi-vertical .noUi-handle:before{width:14px;height:1px;left:6px;top:14px}.noUi-vertical .noUi-handle:after{top:17px}[disabled] .noUi-connect{background:#b8b8b8}[disabled] .noUi-handle,[disabled].noUi-handle,[disabled].noUi-target{cursor:not-allowed}.noUi-pips,.noUi-pips *{-moz-box-sizing:border-box;box-sizing:border-box}.noUi-pips{position:absolute;color:#999}.noUi-value{position:absolute;white-space:nowrap;text-align:center}.noUi-value-sub{color:#ccc;font-size:10px}.noUi-marker{position:absolute;background:#ccc}.noUi-marker-sub{background:#aaa}.noUi-marker-large{background:#aaa}.noUi-pips-horizontal{padding:10px 0;height:80px;top:100%;left:0;width:100%}.noUi-value-horizontal{-webkit-transform:translate(-50%,50%);transform:translate(-50%,50%)}.noUi-rtl .noUi-value-horizontal{-webkit-transform:translate(50%,50%);transform:translate(50%,50%)}.noUi-marker-horizontal.noUi-marker{margin-left:-1px;width:2px;height:5px}.noUi-marker-horizontal.noUi-marker-sub{height:10px}.noUi-marker-horizontal.noUi-marker-large{height:15px}.noUi-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.noUi-value-vertical{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);padding-left:25px}.noUi-rtl .noUi-value-vertical{-webkit-transform:translate(0,50%);transform:translate(0,50%)}.noUi-marker-vertical.noUi-marker{width:5px;height:2px;margin-top:-1px}.noUi-marker-vertical.noUi-marker-sub{width:10px}.noUi-marker-vertical.noUi-marker-large{width:15px}.noUi-tooltip{display:block;position:absolute;border:1px solid #d9d9d9;border-radius:3px;background:#fff;color:#000;padding:5px;text-align:center;white-space:nowrap}.noUi-horizontal .noUi-tooltip{-webkit-transform:translate(-50%,0);transform:translate(-50%,0);left:50%;bottom:120%}.noUi-vertical .noUi-tooltip{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);top:50%;right:120%}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(56,103,206,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(56,103,206,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none;background-color:#3867ce}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{transition:none}}.scielo__theme--dark .form-range::-webkit-slider-thumb{background-color:#86acff}.scielo__theme--light .form-range::-webkit-slider-thumb{background-color:#3867ce}.form-range::-webkit-slider-thumb:active{background-color:#3867ce}.scielo__theme--dark .form-range::-webkit-slider-thumb:active{background-color:#86acff}.scielo__theme--light .form-range::-webkit-slider-thumb:active{background-color:#3867ce}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;border-color:transparent;border-radius:1rem;background-color:#ccc}.scielo__theme--dark .form-range::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.3)}.scielo__theme--light .form-range::-webkit-slider-runnable-track{background-color:#ccc}.form-range::-moz-range-thumb{width:1rem;height:1rem;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none;background-color:#3867ce}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{transition:none}}.scielo__theme--dark .form-range::-moz-range-thumb{background-color:#86acff}.scielo__theme--light .form-range::-moz-range-thumb{background-color:#3867ce}.form-range::-moz-range-thumb:active{background-color:#3867ce}.scielo__theme--dark .form-range::-moz-range-thumb:active{background-color:#86acff}.scielo__theme--light .form-range::-moz-range-thumb:active{background-color:#3867ce}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:rgba(0,0,0,.3);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#ccc}.scielo__theme--dark .form-range:disabled::-webkit-slider-thumb{background-color:#717171}.scielo__theme--light .form-range:disabled::-webkit-slider-thumb{background-color:#ccc}.form-range:disabled::-moz-range-thumb{background-color:#ccc}.scielo__theme--dark .form-range:disabled::-moz-range-thumb{background-color:#717171}.scielo__theme--light .form-range:disabled::-moz-range-thumb{background-color:#ccc}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:rgba(0,0,0,.7);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;text-decoration:none;background-color:#f7f6f4}.scielo__theme--dark .list-group-item-action:focus,.scielo__theme--dark .list-group-item-action:hover{background-color:#414141}.scielo__theme--light .list-group-item-action:focus,.scielo__theme--light .list-group-item-action:hover{background-color:#f7f6f4}.list-group-item-action:active{color:#393939;background-color:#efeeec}.list-group-item{position:relative;display:block;padding:.5rem 1rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:rgba(0,0,0,.6);pointer-events:none;background-color:#fff}.list-group-item:hover{background-color:#f7f6f4;text-decoration:none}.scielo__theme--dark .list-group-item:hover{background-color:#414141}.scielo__theme--light .list-group-item:hover{background-color:#f7f6f4}.list-group-item.active{z-index:2;color:#fff;background-color:#3867ce;border-color:#3867ce}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#223e7c;background-color:#d7e1f5}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#223e7c;background-color:#c2cbdd}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#223e7c;border-color:#223e7c}.list-group-item-secondary{color:#666;background-color:#fff}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#666;background-color:#e6e6e6}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#666;border-color:#666}.list-group-item-success{color:#1a5e29;background-color:#d5ebda}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#1a5e29;background-color:#c0d4c4}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#1a5e29;border-color:#1a5e29}.list-group-item-info{color:#145965;background-color:#d3eaee}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#145965;background-color:#bed3d6}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#145965;border-color:#145965}.list-group-item-warning{color:#6d4c00;background-color:#f0e5cc}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#6d4c00;background-color:#d8ceb8}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#6d4c00;border-color:#6d4c00}.list-group-item-danger{color:#720;background-color:#f4d7cc}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#720;background-color:#dcc2b8}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#720;border-color:#720}.list-group-item-light{color:#636262;background-color:#fdfdfd}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636262;background-color:#e4e4e4}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636262;border-color:#636262}.list-group-item-dark{color:#222;background-color:#d7d7d7}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#222;background-color:#c2c2c2}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#222;border-color:#222}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;background-clip:padding-box;border:1px solid rgba(0,0,0,.4);appearance:none;background-color:#fff;color:#393939;border-color:#ccc;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.scielo__theme--light .form-control{background-color:#fff;color:#333;border-color:#ccc}.scielo__theme--dark .form-control{background-color:#333;color:#c4c4c4;border-color:rgba(255,255,255,.3)}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{outline:0;background-color:#fff;color:#393939;border-color:rgba(56,103,206,.6);box-shadow:0 0 0 .25rem rgba(56,103,206,.25)}.scielo__theme--light .form-control:focus{background-color:#fff;color:#333;border-color:rgba(56,103,206,.6)}.scielo__theme--dark .form-control:focus{background-color:#333;color:#c4c4c4;border-color:rgba(134,172,255,.6)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::placeholder{color:rgba(0,0,0,.6);opacity:1}.scielo__theme--dark .form-control::placeholder{color:#adadad}.scielo__theme--light .form-control::placeholder{color:#6c6b6b}.form-control:disabled,.form-control[readonly]{opacity:1;pointer-events:auto;cursor:not-allowed;background-color:#efeeec;border-color:rgba(0,0,0,.396);color:rgba(0,0,0,.396)}.scielo__theme--dark .form-control:disabled,.scielo__theme--dark .form-control[readonly]{background-color:#414141;border-color:rgba(255,255,255,.2);color:rgba(255,255,255,.2)}.scielo__theme--light .form-control:disabled,.scielo__theme--light .form-control[readonly]{background-color:#efeeec;border-color:rgba(0,0,0,.396);color:rgba(0,0,0,.396)}.form-control:disabled::placeholder,.form-control[readonly]::placeholder{color:rgba(0,0,0,.396)}.scielo__theme--dark .form-control:disabled::placeholder,.scielo__theme--dark .form-control[readonly]::placeholder{color:rgba(255,255,255,.2)}.scielo__theme--light .form-control:disabled::placeholder,.scielo__theme--light .form-control[readonly]::placeholder{color:rgba(0,0,0,.396)}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#393939;background-color:#efeeec;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;height:48px;background-color:#efeeec;color:#333;border-color:#ccc}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.scielo__theme--light .form-control::file-selector-button{background-color:#efeeec;color:#333;border-color:#ccc}.scielo__theme--dark .form-control::file-selector-button{background-color:#414141;color:#c4c4c4;border-color:rgba(255,255,255,.3)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e3e2e0}.scielo__theme--dark .form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#3b3b3b}.scielo__theme--light .form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e3e2e0}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#393939;background-color:#efeeec;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:all .8s}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#d9d9d9}.scielo__theme--dark .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dcdcdc;color:#333}.scielo__theme--light .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#d9d9d9;color:#333}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0;color:#6c6b6b;outline:0}.scielo__theme--dark .form-control-plaintext{color:#adadad}.scielo__theme--light .form-control-plaintext{color:#6c6b6b}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.12 .5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:5rem;height:5rem}.scielo__search-articles textarea.form-control{min-height:calc(1.5em + .75rem + 2px);height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 1rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid rgba(0,0,0,.4);border-radius:.25rem;appearance:none;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23414141' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-color:#fff;color:#393939;border-color:#ccc}.scielo__theme--light .form-select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23414141' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-color:#fff;color:#333;border-color:#ccc}.scielo__theme--dark .form-select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23C4C4C4' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-color:#333;color:#c4c4c4;border-color:rgba(255,255,255,.3)}.form-select:focus{outline:0;box-shadow:0 0 0 .25rem rgba(56,103,206,.25);border-color:rgba(56,103,206,.6)}.scielo__theme--dark .form-select:focus{border-color:rgba(134,172,255,.6)}.scielo__theme--light .form-select:focus{border-color:rgba(56,103,206,.6)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{pointer-events:auto;cursor:not-allowed;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280, 0, 0, 0.396%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-color:#efeeec;border-color:rgba(0,0,0,.396);color:rgba(0,0,0,.396)}.scielo__theme--dark .form-select:disabled{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%28255, 255, 255, 0.2%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-color:#414141;border-color:rgba(255,255,255,.2);color:rgba(255,255,255,.2)}.scielo__theme--light .form-select:disabled{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280, 0, 0, 0.396%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-color:#efeeec;border-color:rgba(0,0,0,.396);color:rgba(0,0,0,.396)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #393939}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-repeat:no-repeat;background-position:center;background-size:contain;appearance:none;color-adjust:exact;transition:background-color .15s ease-in-out,background-position .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;border-color:#ccc;background-color:#fff}@media (prefers-reduced-motion:reduce){.form-check-input{transition:none}}.scielo__theme--dark .form-check-input{border-color:rgba(255,255,255,.3);background-color:#333}.scielo__theme--light .form-check-input{border-color:#ccc;background-color:#fff}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{outline:0;box-shadow:0 0 0 .25rem rgba(56,103,206,.25);border-color:#ccc}.scielo__theme--dark .form-check-input:focus{border-color:rgba(255,255,255,.3)}.scielo__theme--light .form-check-input:focus{border-color:#ccc}.form-check-input:checked{background-color:#3867ce;border-color:#3867ce}.scielo__theme--dark .form-check-input:checked{background-color:#86acff;border-color:#86acff}.scielo__theme--light .form-check-input:checked{background-color:#3867ce;border-color:#3867ce}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.scielo__theme--dark .form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23333' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.scielo__theme--light .form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.scielo__theme--dark .form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23333'/%3e%3c/svg%3e")}.scielo__theme--light .form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#3867ce;border-color:#3867ce;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.scielo__theme--dark .form-check-input[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23333' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.scielo__theme--light .form-check-input[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ccc'/%3e%3c/svg%3e");background-color:#fff;border-color:#ccc}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.scielo__theme--dark .form-switch .form-check-input{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.3%29'/%3e%3c/svg%3e");background-color:#333;border-color:rgba(255,255,255,.3)}.scielo__theme--light .form-switch .form-check-input{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ccc'/%3e%3c/svg%3e");background-color:#fff;border-color:#ccc}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ccc'/%3e%3c/svg%3e")}.scielo__theme--dark .form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.3%29'/%3e%3c/svg%3e")}.scielo__theme--light .form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ccc'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-color:#3867ce;border-color:#3867ce;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.scielo__theme--dark .form-switch .form-check-input:checked{background-color:#86acff;border-color:#86acff}.scielo__theme--light .form-switch .form-check-input:checked{background-color:#3867ce;border-color:#3867ce}.scielo__theme--dark .form-switch .form-check-input:checked{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23333'/%3e%3c/svg%3e")}.scielo__theme--light .form-switch .form-check-input:checked{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.scielo__form-file{position:relative;height:3rem;overflow:hidden}.scielo__form-file input{-webkit-appearance:none;appearance:none;position:absolute;transform:translateY(-500%);top:0;width:auto}.scielo__form-file:after{content:b3__ico--char(attach_file);position:absolute;top:50%;right:.75rem;transform:translateY(-50%);font-family:b3-icons;color:#fff;font-size:1.5rem;pointer-events:none}.scielo__theme--light .scielo__form-file:after{color:#fff}.scielo__theme--dark .scielo__form-file:after{color:#eee}.scielo__form-file label{height:3rem;left:0;width:100%;top:0;transform:translateY(0);padding:0 3rem 0 .75rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;border-bottom:1px solid rgba(56,103,206,.25);line-height:3rem;pointer-events:all}.scielo__form-file.has-placeholder:not(.small)>label,.scielo__form-file.has-value:not(.small)>label,.scielo__form-file.is-focused:not(.small)>label{font-weight:400;font-size:1rem;line-height:1.2em;line-height:3rem;top:0;color:#333}.scielo__theme--dark .scielo__form-file.has-placeholder:not(.small)>label,.scielo__theme--dark .scielo__form-file.has-value:not(.small)>label,.scielo__theme--dark .scielo__form-file.is-focused:not(.small)>label{color:#c4c4c4}.scielo__theme--light .scielo__form-file.has-placeholder:not(.small)>label,.scielo__theme--light .scielo__form-file.has-value:not(.small)>label,.scielo__theme--light .scielo__form-file.is-focused:not(.small)>label{color:#333}.input-group{border-radius:3px;flex-flow:row nowrap;height:3rem}.input-group.is-search{border-radius:3rem}.input-group-text{border-radius:3px;font-weight:400;font-size:1rem;line-height:1.2em;padding-top:0;padding-bottom:0;color:#333;background-color:#efeeec;border-color:#ccc;color:#333}.scielo__theme--dark .input-group-text{color:#c4c4c4}.scielo__theme--light .input-group-text{color:#333}.scielo__theme--dark .input-group-text{background-color:#414141;border-color:rgba(255,255,255,.3);color:#c4c4c4}.scielo__theme--light .input-group-text{background-color:#efeeec;border-color:#ccc;color:#333}.input-group-text span[class^=b3__ico--]{font-size:1.5rem}.input-group-text .scielo__form-checkbox~label,.input-group-text .scielo__form-radio~label{margin-left:0;margin-right:0}.input-group .scielo__form-control input,.input-group .scielo__form-control label,.input-group .scielo__form-control select,.input-group .scielo__form-control textarea,.input-group .scielo__form-file input,.input-group .scielo__form-file label,.input-group .scielo__form-file select,.input-group .scielo__form-file textarea,.input-group .scielo__form-select input,.input-group .scielo__form-select label,.input-group .scielo__form-select select,.input-group .scielo__form-select textarea{border-bottom:none}.input-group .scielo__form-control:first-child,.input-group .scielo__form-file:first-child,.input-group .scielo__form-select:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.input-group .scielo__form-control:last-child,.input-group .scielo__form-file:last-child,.input-group .scielo__form-select:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.input-group .scielo__form-control,.input-group .scielo__form-file,.input-group .scielo__form-select{flex:1 1 auto}.input-group .btn{margin-bottom:0;padding:.75rem 1.2rem;border-radius:.25rem;line-height:1.5rem;height:3rem;padding-left:1.5rem;padding-right:1.5rem}.input-group .btn.dropdown-toggle:not(.dropdown-toggle-split){padding-right:2.5rem}.input-group .btn.dropdown-toggle:after{right:.9375rem;width:1.25rem;height:1.25rem;font-size:1.25rem;line-height:1.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.12 .5rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:1.75rem}.picker{font-size:16px;text-align:left;line-height:1.2;color:#000;position:absolute;z-index:10000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;outline:0}.picker__input{cursor:default}.picker__input.picker__input--active{border-color:#0089ec}.picker__holder{width:100%;overflow-y:auto;-webkit-overflow-scrolling:touch}/*! + * Default mobile-first, responsive styling for pickadate.js + * Demo: http://amsul.github.io/pickadate.js + */.picker__frame,.picker__holder{top:0;bottom:0;left:0;right:0;-ms-transform:translateY(100%);transform:translateY(100%)}.picker__holder{position:fixed;transition:background .15s ease-out,transform 0s .15s;-webkit-backface-visibility:hidden}.picker__frame{position:absolute;margin:0 auto;min-width:256px;max-width:666px;width:100%;-moz-opacity:0;opacity:0;transition:all .15s ease-out}@media (min-height:33.875em){.picker__frame{overflow:visible;top:auto;bottom:-100%;max-height:80%}}@media (min-height:40.125em){.picker__frame{margin-bottom:7.5%}}.picker__wrap{display:table;width:100%;height:100%}@media (min-height:33.875em){.picker__wrap{display:block}}.picker__box{background:#fff;display:table-cell;vertical-align:middle}@media (min-height:26.5em){.picker__box{font-size:1.25em}}@media (min-height:33.875em){.picker__box{display:block;font-size:1.33em;border:1px solid #777;border-top-color:#898989;border-bottom-width:0;border-radius:5px 5px 0 0;box-shadow:0 12px 36px 16px rgba(0,0,0,.24)}}@media (min-height:40.125em){.picker__box{font-size:1.5em;border-bottom-width:1px;border-radius:5px}}.picker--opened .picker__holder{-ms-transform:translateY(0);transform:translateY(0);background:0 0;zoom:1;background:rgba(0,0,0,.32);transition:background .15s ease-out}.picker--opened .picker__frame{-ms-transform:translateY(0);transform:translateY(0);-moz-opacity:1;opacity:1}@media (min-height:33.875em){.picker--opened .picker__frame{top:auto;bottom:0}}.picker__box{padding:0 1em}.picker__header{text-align:center;position:relative;margin-top:.75em}.picker__month,.picker__year{font-weight:500;display:inline-block;margin-left:.25em;margin-right:.25em}.picker__year{color:#999;font-size:.8em;font-style:italic}.picker__select--month,.picker__select--year{border:1px solid #b7b7b7;height:2em;padding:.5em;margin-left:.25em;margin-right:.25em}@media (min-width:24.5em){.picker__select--month,.picker__select--year{margin-top:-.5em}}.picker__select--month{width:35%}.picker__select--year{width:22.5%}.picker__select--month:focus,.picker__select--year:focus{border-color:#0089ec}.picker__nav--next,.picker__nav--prev{position:absolute;padding:.5em 1.25em;width:1em;height:1em;box-sizing:content-box;top:-.25em}@media (min-width:24.5em){.picker__nav--next,.picker__nav--prev{top:-.33em}}.picker__nav--prev{left:-1em;padding-right:1.25em}@media (min-width:24.5em){.picker__nav--prev{padding-right:1.5em}}.picker__nav--next{right:-1em;padding-left:1.25em}@media (min-width:24.5em){.picker__nav--next{padding-left:1.5em}}.picker__nav--next:before,.picker__nav--prev:before{content:" ";border-top:.5em solid transparent;border-bottom:.5em solid transparent;border-right:.75em solid #000;width:0;height:0;display:block;margin:0 auto}.picker__nav--next:before{border-right:0;border-left:.75em solid #000}.picker__nav--next:hover,.picker__nav--prev:hover{cursor:pointer;color:#000;background:#b1dcfb}.picker__nav--disabled,.picker__nav--disabled:before,.picker__nav--disabled:before:hover,.picker__nav--disabled:hover{cursor:default;background:0 0;border-right-color:#f5f5f5;border-left-color:#f5f5f5}.picker__table{text-align:center;border-collapse:collapse;border-spacing:0;table-layout:fixed;font-size:inherit;width:100%;margin-top:.75em;margin-bottom:.5em}@media (min-height:33.875em){.picker__table{margin-bottom:.75em}}.picker__table td{margin:0;padding:0}.picker__weekday{width:14.285714286%;font-size:.75em;padding-bottom:.25em;color:#999;font-weight:500}@media (min-height:33.875em){.picker__weekday{padding-bottom:.5em}}.picker__day{padding:.3125em 0;font-weight:200;border:1px solid transparent}.picker__day--today{position:relative}.picker__day--today:before{content:" ";position:absolute;top:2px;right:2px;width:0;height:0;border-top:.5em solid #0059bc;border-left:.5em solid transparent}.picker__day--disabled:before{border-top-color:#aaa}.picker__day--outfocus{color:#ddd}.picker__day--infocus:hover,.picker__day--outfocus:hover{cursor:pointer;color:#000;background:#b1dcfb}.picker__day--highlighted{border-color:#0089ec}.picker--focused .picker__day--highlighted,.picker__day--highlighted:hover{cursor:pointer;color:#000;background:#b1dcfb}.picker--focused .picker__day--selected,.picker__day--selected,.picker__day--selected:hover{background:#0089ec;color:#fff}.picker--focused .picker__day--disabled,.picker__day--disabled,.picker__day--disabled:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default}.picker__day--highlighted.picker__day--disabled,.picker__day--highlighted.picker__day--disabled:hover{background:#bbb}.picker__footer{text-align:center}.picker__button--clear,.picker__button--close,.picker__button--today{border:1px solid #fff;background:#fff;font-size:.8em;padding:.66em 0;font-weight:700;width:33%;display:inline-block;vertical-align:bottom}.picker__button--clear:hover,.picker__button--close:hover,.picker__button--today:hover{cursor:pointer;color:#000;background:#b1dcfb;border-bottom-color:#b1dcfb}.picker__button--clear:focus,.picker__button--close:focus,.picker__button--today:focus{background:#b1dcfb;border-color:#0089ec;outline:0}.picker__button--clear:before,.picker__button--close:before,.picker__button--today:before{position:relative;display:inline-block;height:0}.picker__button--clear:before,.picker__button--today:before{content:" ";margin-right:.45em}.picker__button--today:before{top:-.05em;width:0;border-top:.66em solid #0059bc;border-left:.66em solid transparent}.picker__button--clear:before{top:-.25em;width:.66em;border-top:3px solid #e20}.picker__button--close:before{content:"\D7";top:-.1em;vertical-align:top;font-size:1.1em;margin-right:.35em;color:#777}.picker__button--today[disabled],.picker__button--today[disabled]:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default}.picker__button--today[disabled]:before{border-top-color:#aaa}.picker--opened .picker__holder{background:rgba(0,0,0,.8)}.picker__box{padding:.625rem 1.0625rem;border:0;box-shadow:none;border-radius:6px}.picker__nav--next,.picker__nav--prev{color:#fff}.picker__nav--next:before,.picker__nav--prev:before{font-family:b3-icons;position:absolute;border:0;font-size:1.5rem}.picker__nav--next:hover,.picker__nav--prev:hover{background:0 0}.picker__nav--next:hover:before,.picker__nav--prev:hover:before{color:rgba(56,103,206,.25)}.picker__nav--prev:before{content:b3__ico--char(keyboard_arrow_left)}.picker__nav--next:before{content:b3__ico--char(keyboard_arrow_right)}.picker__weekday{width:auto;color:#333;font-weight:400;font-size:1rem;line-height:1.2em}.picker__header{margin-top:0;padding-top:.3125rem}.picker__header,.picker__year{font-size:1.03125rem;letter-spacing:0}.picker__year{color:#333;font-style:normal}.picker__day,.picker__day--infocus,.picker__day--outfocus,.picker__day--today{padding:0;margin:0 auto;border-radius:99px;width:1.875rem;height:1.875rem;text-align:center;line-height:1.75rem;font-size:.84375rem;color:#3867ce;font-weight:400;background:0 0;border:2px solid transparent}.picker__day--today:before{display:none}.picker__day--infocus:hover,.picker__day--outfocus:hover{color:#3867ce;background:rgba(0,176,230,.08);border-color:rgba(0,176,230,0)}.picker__day--outfocus{color:rgba(0,0,0,.396)}.picker--focused .picker__day--highlighted,.picker__day--highlighted:hover{color:#333;border-color:rgba(56,103,206,.25);background:0 0}.picker__button--clear,.picker__button--close,.picker__button--today{padding:0;text-transform:uppercase;border:0;font-weight:400!important;font-size:1rem;letter-spacing:.1px!important;white-space:nowrap}.picker__button--clear:before,.picker__button--close:before,.picker__button--today:before{display:none}.picker__button--clear:hover,.picker__button--close:hover,.picker__button--today:hover{background:0 0;border:none;font-weight:400!important;font-size:1rem;letter-spacing:.1px!important;white-space:nowrap}.picker__button--clear{color:#00314c}.picker__button--clear:hover{color:#333}.picker__button--close{color:#c63800}.picker__button--close:hover{color:#ff7e4a}.picker__button--today{color:#3867ce}.picker__button--today:hover{color:rgba(56,103,206,.25)}.scielo__menu{position:relative;display:inline-block;width:40px;height:20px;margin:5px 0;margin-left:8px;z-index:100;outline:0;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;animation-duration:.2s;-o-transition:all .2s ease-out,text-indent .2s ease-out;-ms-transition:all .2s ease-out,text-indent .2s ease-out;-moz-transition:all .2s ease-out,text-indent .2s ease-out;-webkit-transition:all .2s ease-out,text-indent .2s ease-out;transition:all .2s ease-out,text-indent .2s ease-out}.scielo__menu:active,.scielo__menu:focus{outline:0}.scielo__menu .material-icons-outlined{color:#333}.scielo__theme--dark .scielo__menu .material-icons-outlined{color:#c4c4c4}.scielo__theme--light .scielo__menu .material-icons-outlined{color:#333}.scielo__menu.opened{margin-left:270px}.scielo__mainMenu{position:absolute;top:-1000px;z-index:99;width:300px;background:#fff;border:1px solid #ccc;border-top:0;border-radius:4px;border-top-left-radius:0;border-top-right-radius:0;padding:35px 20px 0 20px;padding:0;box-shadow:0 0 7px rgba(0,0,0,.1);font-size:.85em}.scielo__theme--dark .scielo__mainMenu{background:#333;border-color:rgba(255,255,255,.3)}.scielo__theme--light .scielo__mainMenu{background:#fff;border-color:#ccc}.scielo__mainMenu .logo-svg{background:url(../img/logo-scielo-no-label.svg);background-position:center center;background-repeat:no-repeat;display:block;width:100px;height:100px}.scielo__theme--dark .scielo__mainMenu .logo-svg{background-image:url(../img/logo-scielo-no-label-negative.svg)}.scielo__theme--light .scielo__mainMenu .logo-svg{background-image:url(../img/logo-scielo-no-label.svg)}.scielo__mainMenu ul{margin:0;padding:0}.scielo__mainMenu li{list-style:none;border-bottom:1px dotted #6c6b6b;padding-bottom:7px}.scielo__theme--dark .scielo__mainMenu li{border-color:rgba(255,255,255,.3)}.scielo__theme--light .scielo__mainMenu li{border-color:#ccc}.scielo__mainMenu li:last-child{border-bottom:0}.scielo__mainMenu li a,.scielo__mainMenu li strong{display:block;color:#00314c;text-decoration:none}.scielo__theme--dark .scielo__mainMenu li a,.scielo__theme--dark .scielo__mainMenu li strong{color:#eee}.scielo__theme--light .scielo__mainMenu li a,.scielo__theme--light .scielo__mainMenu li strong{color:#00314c}.scielo__mainMenu li a:hover,.scielo__mainMenu li strong:hover{color:#3867ce}.scielo__theme--dark .scielo__mainMenu li a:hover,.scielo__theme--dark .scielo__mainMenu li strong:hover{color:#86acff}.scielo__theme--light .scielo__mainMenu li a:hover,.scielo__theme--light .scielo__mainMenu li strong:hover{color:#3867ce}.scielo__mainMenu li a{padding:.4rem 1rem}.scielo__mainMenu li a:hover{background-color:#f7f6f4}.scielo__mainMenu li li{background:0 0;padding-bottom:0;border-bottom:0}.scielo-ico-menu{display:inline-block}.scielo-ico-menu-opened{display:none}.scielo__accessibleMenu{position:absolute;z-index:9;top:20px}.scielo__accessibleMenu summary{cursor:pointer;font-size:1.2rem;background:#fff;color:#333;padding:2px 4px;border-radius:5px;display:flex;align-items:center;gap:10px;width:110px;min-height:32px;justify-content:center;transition:background .3s ease-in-out;border:1px solid #ccc}@media (max-width:767.98px){.scielo__accessibleMenu summary{width:70px}.scielo__accessibleMenu summary span:not(.menu-icon){display:none}}.scielo__accessibleMenu summary span{font-size:1rem}.scielo__accessibleMenu summary .menu-icon{display:inline-block;width:16px;height:2px;background:#333;position:relative;transition:transform .3s ease-in-out}.scielo__accessibleMenu summary .menu-icon::after,.scielo__accessibleMenu summary .menu-icon::before{content:"";width:16px;height:2px;background:#333;position:absolute;left:0;transition:transform .3s ease-in-out}.scielo__accessibleMenu summary .menu-icon::before{top:-6px}.scielo__accessibleMenu summary .menu-icon::after{top:6px}@media (max-width:767.98px){.scielo__accessibleMenu[open]{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:1000;overflow:hidden}.scielo__accessibleMenu[open] summary{position:fixed;top:0;left:0;width:100%;border-radius:0;padding:12px 0}}@media (max-width:767.98px) and (max-width:767.98px){.scielo__accessibleMenu[open] summary span:not(.menu-icon){display:inline-block}}@media (max-width:767.98px){.scielo__accessibleMenu[open] nav{position:absolute;top:47px;left:0;width:100%;height:calc(100vh - 47px);overflow-y:auto;padding:1rem;border-radius:0}}.scielo__accessibleMenu[open] summary{background-color:#f7f6f4}.scielo__accessibleMenu[open] .menu-icon{background:0 0}.scielo__accessibleMenu[open] .menu-icon::before{transform:rotate(45deg);top:0}.scielo__accessibleMenu[open] .menu-icon::after{transform:rotate(-45deg);top:0}.scielo__accessibleMenu[open] nav{opacity:1;max-height:750px}.scielo__accessibleMenu nav{background:#fff;padding:.5rem 0;margin-top:2px;width:280px;border-radius:5px;border:1px solid #ccc;opacity:0;max-height:0;overflow:hidden;transition:opacity .3s ease-in-out,max-height .3s ease-in-out;box-shadow:0 0 7px rgba(0,0,0,.1)}.scielo__accessibleMenu nav ul{list-style:none;padding:0;margin:0}.scielo__accessibleMenu nav ul li{margin:5px 0}.scielo__accessibleMenu nav ul li.logo{text-align:center;padding-top:1rem}.scielo__accessibleMenu nav ul li a{text-decoration:none;padding:.25rem 1rem;display:block;color:#00314c}.scielo__accessibleMenu nav ul li a:focus-visible,.scielo__accessibleMenu nav ul li a:hover{background-color:#f7f6f4;color:#3867ce}.scielo__accessibleMenu nav ul li a:focus-visible strong,.scielo__accessibleMenu nav ul li a:hover strong{color:#3867ce}.scielo__accessibleMenu nav ul li a strong{color:#00314c}ul.scielo__menu-contexto,ul.scielo__menu-contexto ul{list-style:none}ul.scielo__menu-contexto ul{margin-bottom:1rem}ul.scielo__menu-contexto .nav-link{padding:0;color:#6c6b6b}.sticky-top{top:80px}.bd-example .h4,.bd-example .h5,.bd-example h4,.bd-example h5{margin-top:3rem;scroll-margin-top:5.625rem}.bd-example hr{margin-top:3rem}.bd-example ul{margin-bottom:3rem}.scielo__menu-responsivo{position:relative;display:inline-block;width:40px;height:20px;margin:5px 0;margin-left:8px;z-index:100;outline:0;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;-moz-animation-duration:.2s;-ms-animation-duration:.2s;-o-animation-duration:.2s;animation-duration:.2s;-o-transition:all .2s ease-out,text-indent .2s ease-out;-ms-transition:all .2s ease-out,text-indent .2s ease-out;-moz-transition:all .2s ease-out,text-indent .2s ease-out;-webkit-transition:all .2s ease-out,text-indent .2s ease-out;transition:all .2s ease-out,text-indent .2s ease-out}.scielo__menu-responsivo:active,.scielo__menu-responsivo:focus{outline:0}.scielo__menu-responsivo .material-icons-outlined{color:#333}.scielo__theme--dark .scielo__menu-responsivo .material-icons-outlined{color:#c4c4c4}.scielo__theme--light .scielo__menu-responsivo .material-icons-outlined{color:#333}.scielo__menu-responsivo.opened{margin-left:270px}.scielo__mainMenu-responsivo,.touch-side-swipe{position:absolute;top:-1000px;z-index:99;width:300px;background:#fff;border:1px solid #ccc;border-top:0;border-radius:4px;border-top-left-radius:0;border-top-right-radius:0;padding:2rem 20px 0 20px;box-shadow:0 0 7px rgba(0,0,0,.1)}.scielo__theme--dark .scielo__mainMenu-responsivo,.scielo__theme--dark .touch-side-swipe{background:#333;border-color:rgba(255,255,255,.3)}.scielo__theme--light .scielo__mainMenu-responsivo,.scielo__theme--light .touch-side-swipe{background:#fff;border-color:#ccc}.scielo__mainMenu-responsivo .logo-svg,.touch-side-swipe .logo-svg{background:url(../img/logo-scielo-no-label.svg);background-position:center center;background-repeat:no-repeat;display:block;width:100px;height:100px}.scielo__theme--dark .scielo__mainMenu-responsivo .logo-svg,.scielo__theme--dark .touch-side-swipe .logo-svg{background-image:url(../img/logo-scielo-no-label-negative.svg)}.scielo__theme--light .scielo__mainMenu-responsivo .logo-svg,.scielo__theme--light .touch-side-swipe .logo-svg{background-image:url(../img/logo-scielo-no-label.svg)}.scielo__mainMenu-responsivo ul,.touch-side-swipe ul{margin:0;padding:0}.scielo__mainMenu-responsivo li,.touch-side-swipe li{list-style:none;border-bottom:1px dotted #6c6b6b;padding-bottom:7px}.scielo__theme--dark .scielo__mainMenu-responsivo li,.scielo__theme--dark .touch-side-swipe li{border-color:rgba(255,255,255,.3)}.scielo__theme--light .scielo__mainMenu-responsivo li,.scielo__theme--light .touch-side-swipe li{border-color:#ccc}.scielo__mainMenu-responsivo li:last-child,.touch-side-swipe li:last-child{border-bottom:0}.scielo__mainMenu-responsivo li a,.scielo__mainMenu-responsivo li strong,.touch-side-swipe li a,.touch-side-swipe li strong{display:block;color:#00314c;text-decoration:none}.scielo__theme--dark .scielo__mainMenu-responsivo li a,.scielo__theme--dark .scielo__mainMenu-responsivo li strong,.scielo__theme--dark .touch-side-swipe li a,.scielo__theme--dark .touch-side-swipe li strong{color:#eee}.scielo__theme--light .scielo__mainMenu-responsivo li a,.scielo__theme--light .scielo__mainMenu-responsivo li strong,.scielo__theme--light .touch-side-swipe li a,.scielo__theme--light .touch-side-swipe li strong{color:#00314c}.scielo__mainMenu-responsivo li a:hover,.scielo__mainMenu-responsivo li strong:hover,.touch-side-swipe li a:hover,.touch-side-swipe li strong:hover{color:#3867ce}.scielo__theme--dark .scielo__mainMenu-responsivo li a:hover,.scielo__theme--dark .scielo__mainMenu-responsivo li strong:hover,.scielo__theme--dark .touch-side-swipe li a:hover,.scielo__theme--dark .touch-side-swipe li strong:hover{color:#86acff}.scielo__theme--light .scielo__mainMenu-responsivo li a:hover,.scielo__theme--light .scielo__mainMenu-responsivo li strong:hover,.scielo__theme--light .touch-side-swipe li a:hover,.scielo__theme--light .touch-side-swipe li strong:hover{color:#3867ce}.scielo__mainMenu-responsivo li a,.touch-side-swipe li a{padding:.4rem 1rem}.scielo__mainMenu-responsivo li a:hover,.touch-side-swipe li a:hover{background-color:#f7f6f4}.scielo__mainMenu-responsivo li li,.touch-side-swipe li li{background:0 0;padding-bottom:0;border-bottom:0}.scielo-ico-menu{display:inline-block}.scielo-ico-menu-opened{display:none}.touch-side-swipe{display:none;height:100%;width:100%;top:0;left:0}.tss .touch-side-swipe{display:block;overflow-y:overlay}.tss{z-index:9999;position:fixed;top:0;left:0;height:100%;will-change:transform;transition-property:transform;transition-timing-function:ease}.tss-wrap{height:100%;width:100%;position:absolute;top:0;left:0}.tss-label{z-index:99999;position:absolute;top:5px;right:-44px;width:44px;height:44px;display:block;cursor:pointer}.tss-label_pic{position:relative;display:inline-block;vertical-align:middle;font-style:normal;text-align:left;text-indent:-9999px;direction:ltr;box-sizing:border-box;transition:transform .2s ease}.tss-label_pic:after,.tss-label_pic:before{content:'';pointer-events:none;transition:transform .2s ease}.tss--close .tss-label_pic{color:#000;width:30px;height:4px;box-shadow:inset 0 0 0 32px,0 -8px,0 8px;margin:15px 7px}.tss--close .tss-label_pic:after{position:absolute;transform:translateY(4px);color:#fff;width:30px;height:3px;box-shadow:inset 0 0 0 32px,0 -8px,0 8px;top:0;left:0}.tss--open .tss-label_pic{color:#fff;padding:0;width:40px;height:40px;margin:2px;transform:rotate(45deg)}.tss--open .tss-label_pic:before{width:40px;height:2px}.tss--open .tss-label_pic:after{width:2px;height:40px}.tss--open .tss-label_pic:after,.tss--open .tss-label_pic:before{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);box-shadow:inset 0 0 0 32px}.tss-bg{background:#000;position:fixed;width:100%;height:100%;top:0;left:0;opacity:0;will-change:opacity;transition-property:opacity;transition-timing-function:ease}.touch-side-swipe{background:#fff}header{background:#fff}.page-item{background:0 0;border-color:rgba(0,0,0,.3)}.page-item.active .page-link{background:0 0;border-color:#3867ce;background-color:#3867ce;color:#fff;font-weight:400}.scielo__theme--dark .page-item.active .page-link{background-color:#86acff;border-color:#86acff;color:#eee}.scielo__theme--light .page-item.active .page-link{border-color:#3867ce;background-color:#3867ce;color:#fff}.page-item.disabled .page-link{background:0 0;color:rgba(0,0,0,.396);border-color:rgba(0,0,0,.396);cursor:not-allowed}.scielo__theme--dark .page-item.disabled .page-link{color:rgba(255,255,255,.2);border-color:rgba(255,255,255,.2)}.scielo__theme--light .page-item.disabled .page-link{color:rgba(0,0,0,.396);border-color:rgba(0,0,0,.396)}.page-item .material-icons,.page-item .material-icons-outlined{font-size:1rem;line-height:1.2em}.page-link{background:0 0;font-weight:400;font-size:1rem;line-height:1.2em;height:2rem;text-align:center;border-color:#ccc;transition:all .2s;color:#3867ce;font-weight:400}.scielo__theme--dark .page-link{color:#86acff;border-color:rgba(255,255,255,.3);font-weight:400}.scielo__theme--light .page-link{color:#3867ce;border-color:#ccc;font-weight:400}.page-link:hover{background:#f7f6f4;color:#3867ce;border-color:#ccc}.scielo__theme--dark .page-link:hover{background:#414141;color:#86acff;border-color:rgba(255,255,255,.3)}.scielo__theme--light .page-link:hover{background:#f7f6f4;color:#3867ce;border-color:#ccc}.scielo__ico:before{content:'';position:absolute;font-size:1.5rem;line-height:1.5rem}.scielo__ico--first_page:before{font-family:'Material Icons Outlined';content:"first_page";color:inherit}.scielo__ico--last_page:before{font-family:'Material Icons Outlined';content:"last_page";color:inherit}.scielo__ico--navigate_before:before{font-family:'Material Icons Outlined';content:"navigate_before";color:inherit}.scielo__ico--navigate_next:before{font-family:'Material Icons Outlined';content:"navigate_next";color:inherit}.breadcrumb{background:#efeeec;padding:1.125rem;border-radius:.25rem}.scielo__theme--dark .breadcrumb{background:#414141}.scielo__theme--light .breadcrumb{background:#efeeec}.breadcrumb li a{font-weight:400!important}.breadcrumb li.breadcrumb-item+.breadcrumb-item:before{color:rgba(0,0,0,.396)}.scielo__theme--dark .breadcrumb li.breadcrumb-item+.breadcrumb-item:before{color:rgba(255,255,255,.2)}.scielo__theme--light .breadcrumb li.breadcrumb-item+.breadcrumb-item:before{color:rgba(0,0,0,.396)}.breadcrumb li.active{color:#6c6b6b}.scielo__theme--dark .breadcrumb li.active{color:#adadad}.scielo__theme--light .breadcrumb li.active{color:#6c6b6b}.dropdown-divider{border-color:#ccc}.scielo__theme--dark .dropdown-divider{border-color:rgba(255,255,255,.3)}.scielo__theme--light .dropdown-divider{border-color:#ccc}.dropdown-menu{background:#fff;border-color:#ccc}.scielo__theme--dark .dropdown-menu{background:#333;border-color:rgba(255,255,255,.3)}.scielo__theme--light .dropdown-menu{background:#fff;border-color:#ccc}.dropdown-item{white-space:normal;color:#333}.dropdown-item:hover{color:#333;background:#f7f6f4}.scielo__theme--dark .dropdown-item{white-space:normal;color:#c4c4c4}.scielo__theme--dark .dropdown-item:hover{color:#c4c4c4;background:#414141}.scielo__theme--light .dropdown-item{white-space:normal;color:#333}.scielo__theme--light .dropdown-item:hover{color:#333;background:#f7f6f4}footer{border-top:0!important;margin:0;padding-top:.75rem;padding-bottom:3rem}footer section{border-top:1px dashed #ccc}.scielo__theme--dark footer section{border-color:rgba(255,255,255,.3)}.scielo__theme--light footer section{border-color:#ccc}footer section:first-child{border-top:0}footer .col{padding:15px 0}footer p{margin:0}footer .address-scielo{background-color:#f7f6f4}.scielo__theme--dark footer .address-scielo{background-color:#393939}.scielo__theme--light footer .address-scielo{background-color:#f7f6f4}footer .address-scielo .col{border:0}@media (max-width:575.98px){footer .address-scielo .col{padding-left:8px;padding-right:8px}footer .address-scielo .col:first-child{padding-bottom:0}footer .address-scielo .col:last-child{padding-top:0}}footer .partners{padding:16px 0}footer .partners a{margin:10px}@media (max-width:575.98px){footer .partners img{margin:8px 0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#333;text-align:left;background-color:transparent;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.scielo__theme--dark .accordion-button{color:#c4c4c4}.scielo__theme--light .accordion-button{color:#333}.accordion-button:not(.collapsed){color:#333;background-color:transparent;box-shadow:none;border-bottom:3px solid #3867ce}.scielo__theme--dark .accordion-button:not(.collapsed){color:#c4c4c4;background-color:transparent;border-bottom:3px solid #86acff}.scielo__theme--light .accordion-button:not(.collapsed){color:#333;background-color:transparent;border-bottom:3px solid #3867ce}.accordion-button:not(.collapsed)::after{background-image:none;transform:rotate(90deg);color:#3867ce}.scielo__theme--dark .accordion-button:not(.collapsed)::after{color:#86acff}.scielo__theme--light .accordion-button:not(.collapsed)::after{color:#3867ce}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;font-family:'Material Icons Outlined';content:"arrow_forward_ios";background-image:none;background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out;text-align:center;line-height:1.25rem}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#3867ce;outline:0;box-shadow:none}.accordion-header{margin-bottom:0}.accordion-item{margin-bottom:-1px;background-color:transparent;border:1px solid #ccc}.scielo__theme--dark .accordion-item{border:1px solid rgba(255,255,255,.3)}.scielo__theme--light .accordion-item{border:1px solid #ccc}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:last-of-type{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem;background:#f7f6f4;color:#333}.scielo__theme--dark .accordion-body{color:#c4c4c4;background:#414141}.scielo__theme--light .accordion-body{color:#333;background:#f7f6f4}.accordion-flush{border:1px solid #ccc;border-radius:.25rem}.scielo__theme--dark .accordion-flush{border:1px solid rgba(255,255,255,.3)}.scielo__theme--light .accordion-flush{border:1px solid #ccc}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.alert{padding:.75rem 3.75rem .75rem 1.5rem;border-radius:.1875rem;border:2px solid #86acff;background:#fff;color:#00314c}.scielo__theme--dark .alert{background:#333;color:#eee}.scielo__theme--light .alert{background:#fff;color:#00314c}.alert hr{border-top-color:#efeeec}.scielo__theme--dark .alert hr{border-top-color:#414141}.scielo__theme--light .alert hr{border-top-color:#efeeec}.alert-danger,.alert-info,.alert-success,.alert-warning{padding-left:3.75rem;position:relative}.alert-danger:before,.alert-info:before,.alert-success:before,.alert-warning:before{content:'';position:absolute;top:.75rem;left:1.5rem;font-family:'Material Icons Outlined';font-size:1.5rem;line-height:1.5rem}.alert-primary{color:#fff;background:#3867ce;border-color:#3867ce}.alert-primary .alert-heading,.alert-primary .alert-link{color:#fff!important}.alert-primary a{color:#fff;text-decoration:underline}.scielo__theme--dark .alert-primary{color:#333;background:#86acff;border-color:#86acff}.scielo__theme--dark .alert-primary .alert-heading,.scielo__theme--dark .alert-primary .alert-link{color:#333!important}.scielo__theme--light .alert-primary{color:#fff;background:#3867ce;border-color:#3867ce}.scielo__theme--light .alert-primary .alert-heading,.scielo__theme--light .alert-primary .alert-link{color:#fff!important}.alert-secondary{color:#fff;background:#fff;border-color:#fff;color:#333;background:#fff;border-color:rgba(0,0,0,.3)}.alert-secondary .alert-heading,.alert-secondary .alert-link{color:#fff!important}.alert-secondary a{color:#fff;text-decoration:underline}.scielo__theme--dark .alert-secondary{color:#333;background:#c4c4c4;border-color:#c4c4c4}.scielo__theme--dark .alert-secondary .alert-heading,.scielo__theme--dark .alert-secondary .alert-link{color:#333!important}.scielo__theme--light .alert-secondary{color:#fff;background:#fff;border-color:#fff}.scielo__theme--light .alert-secondary .alert-heading,.scielo__theme--light .alert-secondary .alert-link{color:#fff!important}.alert-secondary .alert-heading,.alert-secondary .alert-link{color:#333!important}.scielo__theme--dark .alert-secondary{color:#c4c4c4;background:0 0;border-color:#c4c4c4}.scielo__theme--dark .alert-secondary .alert-heading,.scielo__theme--dark .alert-secondary .alert-link{color:#c4c4c4!important}.scielo__theme--light .alert-secondary{color:#333;background:#fff;border-color:rgba(0,0,0,.3)}.scielo__theme--light .alert-secondary .alert-heading,.scielo__theme--light .alert-secondary .alert-link{color:#333!important}.alert-info{color:#fff;background:#2195a9;border-color:#2195a9}.alert-info:before{content:"info";color:inherit}.alert-info .alert-heading,.alert-info .alert-link{color:#fff!important}.alert-info a{color:#fff;text-decoration:underline}.scielo__theme--dark .alert-info{color:#333;background:#2299ad;border-color:#2299ad}.scielo__theme--dark .alert-info .alert-heading,.scielo__theme--dark .alert-info .alert-link{color:#333!important}.scielo__theme--light .alert-info{color:#fff;background:#2195a9;border-color:#2195a9}.scielo__theme--light .alert-info .alert-heading,.scielo__theme--light .alert-info .alert-link{color:#fff!important}.alert-dark{color:#fff;background:#3867ce;border-color:#3867ce}.alert-dark .alert-heading,.alert-dark .alert-link{color:#fff!important}.alert-dark a{color:#fff;text-decoration:underline}.scielo__theme--dark .alert-dark{color:#333;background:#86acff;border-color:#86acff}.scielo__theme--dark .alert-dark .alert-heading,.scielo__theme--dark .alert-dark .alert-link{color:#333!important}.scielo__theme--light .alert-dark{color:#fff;background:#3867ce;border-color:#3867ce}.scielo__theme--light .alert-dark .alert-heading,.scielo__theme--light .alert-dark .alert-link{color:#fff!important}.alert-success{color:#fff;background:#2c9d45;border-color:#2c9d45}.alert-success:before{content:"check_circle";color:inherit}.alert-success .alert-heading,.alert-success .alert-link{color:#fff!important}.alert-success a{color:#fff;text-decoration:underline}.scielo__theme--dark .alert-success{color:#333;background:#2c9d45;border-color:#2c9d45}.scielo__theme--dark .alert-success .alert-heading,.scielo__theme--dark .alert-success .alert-link{color:#333!important}.scielo__theme--light .alert-success{color:#fff;background:#2c9d45;border-color:#2c9d45}.scielo__theme--light .alert-success .alert-heading,.scielo__theme--light .alert-success .alert-link{color:#fff!important}.alert-danger{color:#fff;background:#c63800;border-color:#c63800}.alert-danger:before{content:"report_problem";color:inherit}.alert-danger .alert-heading,.alert-danger .alert-link{color:#fff!important}.alert-danger a{color:#fff;text-decoration:underline}.scielo__theme--dark .alert-danger{color:#333;background:#ff7e4a;border-color:#ff7e4a}.scielo__theme--dark .alert-danger .alert-heading,.scielo__theme--dark .alert-danger .alert-link{color:#333!important}.scielo__theme--light .alert-danger{color:#fff;background:#c63800;border-color:#c63800}.scielo__theme--light .alert-danger .alert-heading,.scielo__theme--light .alert-danger .alert-link{color:#fff!important}.alert-warning{color:#fff;background:#b67f00;border-color:#b67f00}.alert-warning:before{content:"report_problem";color:inherit}.alert-warning .alert-heading,.alert-warning .alert-link{color:#fff!important}.alert-warning a{color:#fff;text-decoration:underline}.scielo__theme--dark .alert-warning{color:#333;background:#b67f00;border-color:#b67f00}.scielo__theme--dark .alert-warning .alert-heading,.scielo__theme--dark .alert-warning .alert-link{color:#333!important}.scielo__theme--light .alert-warning{color:#fff;background:#b67f00;border-color:#b67f00}.scielo__theme--light .alert-warning .alert-heading,.scielo__theme--light .alert-warning .alert-link{color:#fff!important}.alert-link{color:#3867ce!important}.scielo__theme--dark .alert-link{color:#86acff!important}.scielo__theme--light .alert-link{color:#3867ce!important}.alert-dismissible{padding-right:3.75rem}.alert-dismissible .close{padding:.5625rem .75rem;font-size:1.5rem;line-height:1.5rem;color:inherit;top:0;right:0;opacity:.5;position:absolute;right:0;border:0;background:0 0}.alert-dismissible .close:before{font-family:'Material Icons Outlined';content:"close";color:inherit}.alert-dismissible .close:hover{opacity:1}.alert.text-center{border-radius:0}.alert.text-center:before{position:static;display:block}@media (min-width:992px){.alert.text-center:before{display:inline-block;vertical-align:bottom}}.card{position:relative;display:flex;flex-direction:column;min-width:0;height:auto;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid #ccc;border-radius:.25rem}.card:has(.card-footer){padding-bottom:4rem}.scielo__theme--dark .card{border:1px solid rgba(255,255,255,.3);background-color:#333}.scielo__theme--light .card{border:1px solid #ccc;background-color:#fff}.journalContent .card{min-height:220px}.card .list-group-item{background-color:#fff;border-color:#ccc}.scielo__theme--dark .card .list-group-item{border-color:rgba(255,255,255,.3);background-color:#333}.scielo__theme--light .card .list-group-item{border-color:#ccc;background-color:#fff}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem;color:#333}.scielo__theme--dark .card-body{color:#c4c4c4}.scielo__theme--light .card-body{color:#333}.card-body .btn{position:absolute;bottom:16px}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0;font-weight:700;text-transform:uppercase;color:#6c6b6b;font-size:.75rem}.scielo__theme--dark .card-subtitle{color:#adadad}.scielo__theme--light .card-subtitle{color:#6c6b6b}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:1rem;position:absolute;left:0;bottom:0;right:0;background-color:transparent;border:0}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%;height:9.3rem;object-fit:cover}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.5rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card .stretched-link:hover .text-primary{text-decoration:underline;color:#2d52a5!important}.card .stretched-link:hover .btn-secondary{background:#d9d9d9 radial-gradient(circle,transparent 1%,#d9d9d9 1%) center/15000%}.card .stretched-link:hover .card-img-top{transition:all .8s;filter:brightness(.83)}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.5rem;outline:0}.scielo__theme--dark .modal-content{border:1px solid rgba(255,255,255,.3);background-color:#333}.scielo__theme--light .modal-content{border:1px solid #ccc;background-color:#fff}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:flex-start;justify-content:space-between;padding:1rem 1rem;border-top-left-radius:calc(.5rem - 1px);border-top-right-radius:calc(.5rem - 1px);border-bottom:1px solid #ccc}.scielo__theme--dark .modal-header{border-bottom:1px solid rgba(255,255,255,.3)}.scielo__theme--light .modal-header{border-bottom:1px solid #ccc}.modal-header .btn-close{padding:.5rem .5rem;margin:-2px -.5rem -.5rem auto;background-image:none;font-weight:700;font-size:1.3125rem;line-height:1.25em;letter-spacing:0;text-align:center;position:relative}.modal-header .btn-close:before{font-family:'Material Icons Outlined';content:"close";color:#333;line-height:1.8;position:absolute;top:0;left:0;text-align:center;width:100%}.scielo__theme--dark .modal-header .btn-close:before{color:#c4c4c4}.scielo__theme--light .modal-header .btn-close:before{color:#333}.modal-title{margin-bottom:0;line-height:1.5}.modal-title [class*=" material-icons"],.modal-title [class^=material-icons]{vertical-align:bottom}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-bottom-right-radius:calc(.5rem - 1px);border-bottom-left-radius:calc(.5rem - 1px);border-top:1px solid #ccc}.scielo__theme--dark .modal-footer{border-top:1px solid rgba(255,255,255,.3)}.scielo__theme--light .modal-footer{border-top:1px solid #ccc}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.table{--scielo-table-bg:transparent;--scielo-table-striped-color:#393939;--scielo-table-striped-bg:rgba(0, 0, 0, 0.05);--scielo-table-active-color:#393939;--scielo-table-active-bg:rgba(0, 0, 0, 0.1);--scielo-table-hover-color:#393939;--scielo-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#333;vertical-align:top;border-color:#ccc}.scielo__theme--dark .table{color:#c4c4c4;border-color:rgba(255,255,255,.3)}.scielo__theme--light .table{color:#333;border-color:#ccc}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--scielo-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--scielo-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>thead th{border-bottom:2px solid #ccc}.scielo__theme--dark .table>thead th{border-bottom:2px solid rgba(255,255,255,.3)}.scielo__theme--light .table>thead th{border-bottom:2px solid #ccc}.table>:not(:last-child)>:last-child>*{border-bottom-color:#ccc}.scielo__theme--dark .table>:not(:last-child)>:last-child>*{border-bottom-color:rgba(255,255,255,.3)}.scielo__theme--light .table>:not(:last-child)>:last-child>*{border-bottom-color:#ccc}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--scielo-table-accent-bg:var(--scielo-table-striped-bg);color:#333}.scielo__theme--dark .table-striped>tbody>tr:nth-of-type(odd){color:#c4c4c4}.scielo__theme--light .table-striped>tbody>tr:nth-of-type(odd){color:#333}.table-active{--scielo-table-accent-bg:var(--scielo-table-active-bg);color:#333}.scielo__theme--dark .table-active{color:#c4c4c4}.scielo__theme--light .table-active{color:#333}.table-hover>tbody>tr:hover{--scielo-table-accent-bg:var(--scielo-table-hover-bg);color:#333}.scielo__theme--dark .table-hover>tbody>tr:hover{color:#c4c4c4}.scielo__theme--light .table-hover>tbody>tr:hover{color:#333}.table-primary{--scielo-table-bg:rgba(56, 103, 206, 0.7);--scielo-table-striped-bg:rgba(51, 94, 188, 0.715);--scielo-table-striped-color:#fff;--scielo-table-active-bg:rgba(46, 85, 171, 0.73);--scielo-table-active-color:#fff;--scielo-table-hover-bg:rgba(49, 90, 179, 0.7225);--scielo-table-hover-color:#fff;color:#000}.table-secondary{--scielo-table-bg:rgba(255, 255, 255, 0.5);--scielo-table-striped-bg:rgba(220, 220, 220, 0.525);--scielo-table-striped-color:#000;--scielo-table-active-bg:rgba(191, 191, 191, 0.55);--scielo-table-active-color:#000;--scielo-table-hover-bg:rgba(205, 205, 205, 0.5375);--scielo-table-hover-color:#000;color:#000}.table-success{--scielo-table-bg:rgba(44, 157, 69, 0.7);--scielo-table-striped-bg:rgba(40, 143, 63, 0.715);--scielo-table-striped-color:#000;--scielo-table-active-bg:rgba(36, 130, 57, 0.73);--scielo-table-active-color:#fff;--scielo-table-hover-bg:rgba(38, 136, 60, 0.7225);--scielo-table-hover-color:#000;color:#000}.table-info{--scielo-table-bg:rgba(33, 149, 169, 0.7);--scielo-table-striped-bg:rgba(30, 136, 154, 0.715);--scielo-table-striped-color:#000;--scielo-table-active-bg:rgba(27, 124, 140, 0.73);--scielo-table-active-color:#fff;--scielo-table-hover-bg:rgba(29, 130, 147, 0.7225);--scielo-table-hover-color:#fff;color:#000}.table-warning{--scielo-table-bg:rgba(182, 127, 0, 0.7);--scielo-table-striped-bg:rgba(166, 116, 0, 0.715);--scielo-table-striped-color:#000;--scielo-table-active-bg:rgba(151, 105, 0, 0.73);--scielo-table-active-color:#fff;--scielo-table-hover-bg:rgba(158, 110, 0, 0.7225);--scielo-table-hover-color:#000;color:#000}.table-danger{--scielo-table-bg:rgba(198, 56, 0, 0.7);--scielo-table-striped-bg:rgba(180, 51, 0, 0.715);--scielo-table-striped-color:#fff;--scielo-table-active-bg:rgba(164, 46, 0, 0.73);--scielo-table-active-color:#fff;--scielo-table-hover-bg:rgba(172, 49, 0, 0.7225);--scielo-table-hover-color:#fff;color:#000}.table-light{--scielo-table-bg:#F7F6F4;--scielo-table-striped-bg:#ebeae8;--scielo-table-striped-color:#000;--scielo-table-active-bg:#dedddc;--scielo-table-active-color:#000;--scielo-table-hover-bg:#e4e4e2;--scielo-table-hover-color:#000;color:#000}.table-dark{--scielo-table-bg:#393939;--scielo-table-striped-bg:#434343;--scielo-table-striped-color:#fff;--scielo-table-active-bg:#4d4d4d;--scielo-table-active-color:#fff;--scielo-table-hover-bg:#484848;--scielo-table-hover-color:#fff;color:#fff}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.table table{min-width:100%}.nav:not(.flex-column).nav-tabs{border:none;background:0 0;margin-bottom:.75rem;border-bottom:1px solid #ccc}.scielo__theme--dark .nav:not(.flex-column).nav-tabs{border-color:rgba(255,255,255,.3)}.scielo__theme--light .nav:not(.flex-column).nav-tabs{border-color:#ccc}@media screen and (max-width:575px){.nav:not(.flex-column).nav-tabs{display:block;white-space:nowrap;overflow-x:auto;overflow-y:hidden}.nav:not(.flex-column).nav-tabs>li{float:none;display:inline-block}}.nav:not(.flex-column).nav-tabs .nav-link{font-weight:400!important;font-size:1rem;letter-spacing:.1px!important;white-space:nowrap;line-height:1.875rem;color:#333;border-radius:0;border-top-left-radius:.1875rem;border-top-right-radius:.1875rem;border-width:0;padding:.5625rem 1.5rem;position:relative;transition:.2s all}.nav:not(.flex-column).nav-tabs .nav-link:before{content:'';position:absolute;bottom:0;left:50%;transform:translateX(-50%);width:0;border-bottom:3px solid rgba(56,103,206,.25);transition:.2s all}.scielo__theme--dark .nav:not(.flex-column).nav-tabs .nav-link{color:#c4c4c4}.scielo__theme--light .nav:not(.flex-column).nav-tabs .nav-link{color:#333}.nav:not(.flex-column).nav-tabs .nav-link.active{border:none;background:0 0;color:#00314c}.scielo__theme--dark .nav:not(.flex-column).nav-tabs .nav-link.active{color:#eee}.scielo__theme--light .nav:not(.flex-column).nav-tabs .nav-link.active{color:#00314c}.nav:not(.flex-column).nav-tabs .nav-link.active:before{left:50%;width:100%;border-color:#3867ce}.scielo__theme--dark .nav:not(.flex-column).nav-tabs .nav-link.active:before{border-color:#86acff}.scielo__theme--light .nav:not(.flex-column).nav-tabs .nav-link.active:before{border-color:#3867ce}.nav:not(.flex-column).nav-tabs .nav-link.disabled{color:rgba(0,0,0,.396);cursor:not-allowed}.scielo__theme--dark .nav:not(.flex-column).nav-tabs .nav-link.disabled{color:rgba(255,255,255,.2)}.scielo__theme--light .nav:not(.flex-column).nav-tabs .nav-link.disabled{color:rgba(0,0,0,.396)}.nav:not(.flex-column).nav-tabs .nav-link.dropdown-toggle{position:relative;padding-right:2.25rem!important}.nav:not(.flex-column).nav-tabs .nav-link.dropdown-toggle:after{position:absolute;top:50%;transform:translateY(-50%);font-family:'Material Icons Outlined';content:"arrow_drop_down";color:inherit;border:0;line-height:1.5rem!important;text-align:center;right:1rem;width:1.25rem;height:1.25rem;font-size:1.25rem;line-height:1.25rem;border:none!important;margin-top:0!important;width:1.5rem!important;height:1.5rem!important;transform:translateY(-50%)}.nav:not(.flex-column).nav-tabs .nav-link:not(.disabled):focus,.nav:not(.flex-column).nav-tabs .nav-link:not(.disabled):hover{background:#f7f6f4;color:#00314c}.scielo__theme--dark .nav:not(.flex-column).nav-tabs .nav-link:not(.disabled):focus,.scielo__theme--dark .nav:not(.flex-column).nav-tabs .nav-link:not(.disabled):hover{background:#414141;color:#eee}.scielo__theme--light .nav:not(.flex-column).nav-tabs .nav-link:not(.disabled):focus,.scielo__theme--light .nav:not(.flex-column).nav-tabs .nav-link:not(.disabled):hover{background:#f7f6f4;color:#00314c}.nav:not(.flex-column).nav-tabs .dropdown-menu{background:#fff;border:1px solid #ccc;border-radius:3px}.nav:not(.flex-column).nav-tabs .dropdown-menu>a{position:relative;font-weight:700;font-size:1;line-height:1.2em;letter-spacing:0;padding:.75rem 1.5rem .75rem;line-height:1.5rem;transition:all .5s;border-radius:.1875rem;background:0 0;color:#fff;font-weight:400;font-size:1rem;line-height:1.2em;color:#333!important}.scielo__theme--dark .nav:not(.flex-column).nav-tabs .dropdown-menu>a{color:#eee}.scielo__theme--light .nav:not(.flex-column).nav-tabs .dropdown-menu>a{color:#fff}.nav:not(.flex-column).nav-tabs .dropdown-menu>a:hover:hover{background:#f7f6f4;color:#333}.scielo__theme--dark .nav:not(.flex-column).nav-tabs .dropdown-menu>a:hover:hover{background:#414141;color:#c4c4c4}.scielo__theme--light .nav:not(.flex-column).nav-tabs .dropdown-menu>a:hover:hover{background:#f7f6f4;color:#333}.scielo__theme--dark .nav:not(.flex-column).nav-tabs .dropdown-menu>a{color:#c4c4c4!important}.scielo__theme--light .nav:not(.flex-column).nav-tabs .dropdown-menu>a{color:#333!important}.scielo__theme--dark .nav:not(.flex-column).nav-tabs .dropdown-menu{background:#333;border:1px solid rgba(255,255,255,.3)}.scielo__theme--light .nav:not(.flex-column).nav-tabs .dropdown-menu{background:#fff;border:1px solid #ccc}.nav:not(.flex-column).nav-tabs .dropdown-menu .dropdown-divider{border-color:#ccc}.scielo__theme--dark .nav:not(.flex-column).nav-tabs .dropdown-menu .dropdown-divider{border-color:rgba(255,255,255,.3)}.scielo__theme--light .nav:not(.flex-column).nav-tabs .dropdown-menu .dropdown-divider{border-color:#ccc}.nav.nav-pills .nav-link{font-weight:400!important;font-size:1rem;letter-spacing:.1px!important;white-space:nowrap;line-height:1.875rem;color:#333;border-radius:.1875rem;border-width:0;padding:.5625rem 1.5rem;position:relative;transition:.2s all}.scielo__theme--dark .nav.nav-pills .nav-link{color:#c4c4c4}.scielo__theme--light .nav.nav-pills .nav-link{color:#333}.nav.nav-pills .nav-link.active{border:none;background:#3867ce;color:#fff}.scielo__theme--dark .nav.nav-pills .nav-link.active{background:#86acff;color:#333}.scielo__theme--light .nav.nav-pills .nav-link.active{background:#3867ce;color:#fff}.nav.nav-pills .nav-link.disabled{color:rgba(0,0,0,.396);cursor:not-allowed}.scielo__theme--dark .nav.nav-pills .nav-link.disabled{color:rgba(255,255,255,.2)}.scielo__theme--light .nav.nav-pills .nav-link.disabled{color:rgba(0,0,0,.396)}.nav.nav-pills .nav-link:not(.disabled):focus:not(.active),.nav.nav-pills .nav-link:not(.disabled):hover:not(.active){background:#f7f6f4;color:#00314c}.scielo__theme--dark .nav.nav-pills .nav-link:not(.disabled):focus:not(.active),.scielo__theme--dark .nav.nav-pills .nav-link:not(.disabled):hover:not(.active){background:#414141;color:#eee}.scielo__theme--light .nav.nav-pills .nav-link:not(.disabled):focus:not(.active),.scielo__theme--light .nav.nav-pills .nav-link:not(.disabled):hover:not(.active){background:#f7f6f4;color:#00314c}.nav.flex-column.nav-pills .nav-link{font-weight:400!important;font-size:1rem;letter-spacing:.1px!important;white-space:nowrap;background:0 0;line-height:1.875rem;color:#333;border-radius:.1875rem;border-left:3px solid transparent;border-top-left-radius:0;border-bottom-left-radius:0;padding:.5625rem 1.5rem}.scielo__theme--dark .nav.flex-column.nav-pills .nav-link{color:#c4c4c4}.scielo__theme--light .nav.flex-column.nav-pills .nav-link{color:#333}.nav.flex-column.nav-pills .nav-link.active{background:0 0;border-color:#3867ce;color:#00314c}.scielo__theme--dark .nav.flex-column.nav-pills .nav-link.active{border-color:#86acff;color:#eee}.scielo__theme--light .nav.flex-column.nav-pills .nav-link.active{border-color:#3867ce;color:#00314c}.nav.flex-column.nav-pills .nav-link.disabled{color:rgba(0,0,0,.396);cursor:not-allowed}.scielo__theme--dark .nav.flex-column.nav-pills .nav-link.disabled{color:rgba(255,255,255,.2)}.scielo__theme--light .nav.flex-column.nav-pills .nav-link.disabled{color:rgba(0,0,0,.396)}.nav.flex-column.nav-pills .nav-link:not(.disabled):focus,.nav.flex-column.nav-pills .nav-link:not(.disabled):hover{background:#f7f6f4;color:#00314c}.scielo__theme--dark .nav.flex-column.nav-pills .nav-link:not(.disabled):focus,.scielo__theme--dark .nav.flex-column.nav-pills .nav-link:not(.disabled):hover{background:#414141;color:#eee}.scielo__theme--light .nav.flex-column.nav-pills .nav-link:not(.disabled):focus,.scielo__theme--light .nav.flex-column.nav-pills .nav-link:not(.disabled):hover{background:#f7f6f4;color:#00314c}.tab-pane{padding:.75rem 0}.slick-slider{position:relative;display:block;box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.slick-list{position:relative;overflow:hidden;display:block;margin:0;padding:0}.slick-list:focus{outline:0}.slick-list.dragging{cursor:pointer;cursor:hand}.slick-slider .slick-list,.slick-slider .slick-track{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slick-track{position:relative;left:0;top:0;display:flex}.slick-track:after,.slick-track:before{content:"";display:table}.slick-track:after{clear:both}.slick-loading .slick-track{visibility:hidden}.slick-slide{float:left;min-height:1px;margin:0 10px;display:none}[dir=rtl] .slick-slide{float:right}.slick-slide img{display:block}.slick-slide.slick-loading img{display:none}.slick-slide.dragging img{pointer-events:none}.slick-initialized .slick-slide{display:block}.slick-loading .slick-slide{visibility:hidden}.slick-vertical .slick-slide{display:block;height:auto;border:1px solid transparent}.slick-arrow.slick-hidden{display:none}.slick-next,.slick-prev{position:relative;display:inline-block;padding:.625rem 1rem;border-radius:.25rem;line-height:1.25rem;height:2.5rem;font-weight:400!important;font-size:1rem;letter-spacing:.1px!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;background-position:center;transition:all .8s;margin:0 0 1rem;background-color:#fff;border:1px solid #ccc;color:#333;position:absolute;display:block;height:40px;width:30px;line-height:0;font-size:0;cursor:pointer;top:50%;-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%);padding:0}.slick-next:focus,.slick-prev:focus{box-shadow:0 0 0 .125rem rgba(56,103,206,.25);outline:0}.slick-next:focus:active,.slick-prev:focus:active{box-shadow:0 0 0 .25rem rgba(56,103,206,.25)}.slick-next:focus,.slick-prev:focus{box-shadow:0 0 0 .125rem rgba(204,204,204,.25);outline:0}.slick-next:focus-visible,.slick-prev:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.slick-next:active,.slick-prev:active{box-shadow:0 0 0 .25rem rgba(204,204,204,.25)}.slick-next:focus,.slick-prev:focus{background-color:#fff;color:#333}.slick-next:focus-visible,.slick-prev:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.slick-next.active:not(:disabled):not(.disabled),.slick-prev.active:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background-color:#d9d9d9;color:#333}.show>.slick-next.dropdown-toggle,.show>.slick-prev.dropdown-toggle{background-color:#d9d9d9;color:#333}.slick-next:hover:not(:disabled):not(.disabled),.slick-prev:hover:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background:#d9d9d9 radial-gradient(circle,transparent 1%,#d9d9d9 1%) center/15000%;color:#333;text-decoration:none}.slick-next:active:not(:disabled):not(.disabled),.slick-prev:active:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background-color:#1a1a1a;background-size:100%;transition:background 0s;color:#333}.slick-next:hover:not(:disabled):not(.disabled),.slick-prev:hover:not(:disabled):not(.disabled){border:1px solid #ccc;background:hoverBgColor radial-gradient(circle,transparent 1%,hoverBgColor 1%) center/15000%;color:#333}.slick-next:active:not(:disabled):not(.disabled),.slick-prev:active:not(:disabled):not(.disabled){border:1px solid #ccc;background-color:gray;background-size:100%;transition:background 0s;color:#333}.slick-next:focus,.slick-prev:focus{border-color:#ccc}.scielo__theme--dark .slick-next,.scielo__theme--dark .slick-prev{background-color:#c4c4c4;border:1px solid rgba(255,255,255,.3);color:#333}.scielo__theme--dark .slick-next:focus,.scielo__theme--dark .slick-prev:focus{background-color:#c4c4c4;color:#333}.scielo__theme--dark .slick-next.active:not(:disabled):not(.disabled),.scielo__theme--dark .slick-prev.active:not(:disabled):not(.disabled){background-color:#a7a7a7;color:#333}.scielo__theme--dark .slick-next:hover:not(:disabled):not(.disabled),.scielo__theme--dark .slick-prev:hover:not(:disabled):not(.disabled){border:1px solid #dcdcdc;background:#dcdcdc radial-gradient(circle,transparent 1%,#dcdcdc 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .slick-next:active:not(:disabled):not(.disabled),.scielo__theme--dark .slick-prev:active:not(:disabled):not(.disabled){border:1px solid #dcdcdc;background-color:#f9f9f9;background-size:100%;transition:background 0s;color:#333}.scielo__theme--dark .slick-next:hover:not(:disabled):not(.disabled),.scielo__theme--dark .slick-prev:hover:not(:disabled):not(.disabled){border:1px solid rgba(255,255,255,.3);background:hoverBgColor radial-gradient(circle,transparent 1%,hoverBgColor 1%) center/15000%;color:#333}.scielo__theme--dark .slick-next:active:not(:disabled):not(.disabled),.scielo__theme--dark .slick-prev:active:not(:disabled):not(.disabled){border:1px solid rgba(255,255,255,.3);background-color:#f9f9f9;background-size:100%;transition:background 0s;color:#333}.scielo__theme--dark .slick-next:focus,.scielo__theme--dark .slick-prev:focus{border-color:rgba(255,255,255,.3)}.scielo__theme--light .slick-next,.scielo__theme--light .slick-prev{background-color:#fff;border-color:1px solid #ccc;color:#333}.scielo__theme--light .slick-next:focus,.scielo__theme--light .slick-prev:focus{background-color:#fff;color:#333}.scielo__theme--light .slick-next.active:not(:disabled):not(.disabled),.scielo__theme--light .slick-prev.active:not(:disabled):not(.disabled){background-color:#fff;color:#333}.scielo__theme--light .slick-next:hover:not(:disabled):not(.disabled),.scielo__theme--light .slick-prev:hover:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background:#d9d9d9 radial-gradient(circle,transparent 1%,#d9d9d9 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--light .slick-next:active:not(:disabled):not(.disabled),.scielo__theme--light .slick-prev:active:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background-color:#1a1a1a;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .slick-next:hover:not(:disabled):not(.disabled),.scielo__theme--light .slick-prev:hover:not(:disabled):not(.disabled){border:1px solid #ccc;background:hoverBgColor radial-gradient(circle,transparent 1%,hoverBgColor 1%) center/15000%;color:#333}.scielo__theme--light .slick-next:active:not(:disabled):not(.disabled),.scielo__theme--light .slick-prev:active:not(:disabled):not(.disabled){border:1px solid #ccc;background-color:gray;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .slick-next:focus,.scielo__theme--light .slick-prev:focus{border-color:#ccc}.slick-next:focus,.slick-next:hover,.slick-prev:focus,.slick-prev:hover{outline:0}.slick-next:focus:before,.slick-next:hover:before,.slick-prev:focus:before,.slick-prev:hover:before{opacity:1}.slick-next.slick-disabled:before,.slick-prev.slick-disabled:before{opacity:.25}.slick-next:before,.slick-prev:before{font-family:"Material Icons Outlined";font-size:20px;line-height:1;opacity:.75;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-prev{left:-25px}@media (max-width:575.98px){.slick-prev{left:0;z-index:1}}[dir=rtl] .slick-prev{left:auto;right:-25px}.slick-prev:before{content:"navigate_before"}[dir=rtl] .slick-prev:before{content:"navigate_next"}.slick-next{right:-25px}@media (max-width:575.98px){.slick-next{right:0;z-index:1}}[dir=rtl] .slick-next{left:-25px;right:auto}.slick-next:before{content:"navigate_next"}[dir=rtl] .slick-next:before{content:"navigate_before"}.slick-dotted.slick-slider{margin-bottom:30px}.slick-dots{position:absolute;bottom:-32px;list-style:none;display:block;text-align:center;padding:0;margin:0;width:100%}@media (max-width:575.98px){.slick-dots{display:flex}}.slick-dots li{position:relative;display:inline-block;height:16px;width:16px;margin:0 5px;padding:0;cursor:pointer}@media (max-width:575.98px){.slick-dots li{flex:1;height:4px}}.slick-dots li button{background:0 0;border:2px solid #6c6b6b;border-radius:100px;display:block;height:16px;width:16px;outline:0;line-height:0;font-size:0;color:transparent;padding:0;cursor:pointer}@media (max-width:575.98px){.slick-dots li button{background:rgba(108,107,107,.2);border:0;width:100%;height:4px;border-radius:0}}.scielo__theme--dark .slick-dots li button{background:rgba(173,173,173,.2)}.scielo__theme--light .slick-dots li button{background:rgba(108,107,107,.2)}.slick-dots li button:focus,.slick-dots li button:hover{outline:0}.slick-dots li button:focus:before,.slick-dots li button:hover:before{opacity:1}.slick-dots li.slick-active button{background:#6c6b6b}.scielo__theme--dark .slick-dots li.slick-active button{background:#adadad}.scielo__theme--light .slick-dots li.slick-active button{background:#6c6b6b}.scielo__language{text-align:right}@media (min-width:576px){.scielo__language{position:static;display:inline-block;float:right}}.scielo__levelMenu{background:#f7f6f4;padding:1.125rem}.scielo__theme--dark .scielo__levelMenu{background:#393939}.scielo__theme--light .scielo__levelMenu{background:#f7f6f4}.scielo__levelMenu>.container{margin:0!important}.scielo__levelMenu>.container [class^=col]{text-align:center;border-right:1px dashed #ccc;line-height:3.75rem}.scielo__theme--dark .scielo__levelMenu>.container [class^=col]{border-color:rgba(255,255,255,.3)}.scielo__theme--light .scielo__levelMenu>.container [class^=col]{border-color:#ccc}.scielo__levelMenu>.container [class^=col]:last-of-type{border:0}@media (max-width:575.98px){.scielo__levelMenu>.container [class^=col]{border:0}.scielo__levelMenu>.container [class^=col]:first-of-type{border-right:1px dashed #ccc}.scielo__theme--dark .scielo__levelMenu>.container [class^=col]:first-of-type{border-color:rgba(255,255,255,.3)}.scielo__theme--light .scielo__levelMenu>.container [class^=col]:first-of-type{border-color:#ccc}.scielo__levelMenu>.container [class^=col]:last-of-type{margin-top:1rem}}.scielo__levelMenu a{text-decoration:none;font-weight:700}.journal .levelMenu{margin-top:1.5rem}@media (max-width:575.98px){.journal .levelMenu{margin-top:145px}}section.scielo__search-articles{background:#f7f6f4;padding:1.125rem}.scielo__theme--dark section.scielo__search-articles{background:#393939}.scielo__theme--light section.scielo__search-articles{background:#f7f6f4}@media (max-width:991.98px){section.scielo__search-articles .input-group{flex-flow:column;height:auto;background:0 0}section.scielo__search-articles .input-group .form-control,section.scielo__search-articles .input-group .form-select{width:100%;margin:0 0 .5rem!important;border-radius:.25rem!important}section.scielo__search-articles .input-group .form-control:last-child,section.scielo__search-articles .input-group .form-select:last-child{margin:0}}section.scielo__search-articles .input-group .input-group-append .form-select{min-width:180px}section.scielo__search-articles .input-group .input-group-preppend .form-select{min-width:120px}.scielo__contribGroup{color:#403d39;margin:15px 10%;font-size:1.1em;text-align:center;opacity:1}.scielo__contribGroup a.btn-fechar{display:inline-block;border-radius:100%;cursor:pointer;width:30px;height:30px;font-size:86%;padding:5px 0;text-align:center;margin-top:10px;font-family:'Material Icons Outlined';content:"close"}.scielo__contribGroup a.btn-fechar:hover{background:#3867ce;color:#fff}.scielo__contribGroup .sci-ico-emailOutlined{font-size:20px;vertical-align:baseline}.scielo__contribGroup .dropdown{display:inline-block;padding:0}.scielo__contribGroup .dropdown .dropdown-toggle{background:0 0;border:1px solid transparent;padding:.625rem;height:auto;outline:0;margin-bottom:0;color:#3867ce}.scielo__contribGroup .dropdown .dropdown-toggle:hover{border:1px solid transparent;color:#254895;background:0 0!important}.scielo__theme--dark .scielo__contribGroup .dropdown .dropdown-toggle{border:1px solid transparent;color:#86acff}.scielo__theme--dark .scielo__contribGroup .dropdown .dropdown-toggle:hover{border:1px solid transparent;color:#d3e0ff}.scielo__theme--light .scielo__contribGroup .dropdown .dropdown-toggle{border:1px solid transparent;color:#3867ce}.scielo__theme--light .scielo__contribGroup .dropdown .dropdown-toggle:hover{border:1px solid transparent;color:#254895}.scielo__contribGroup .dropdown .dropdown-toggle:focus{box-shadow:none;background:0 0;border:1px solid #ccc}.scielo__theme--dark .scielo__contribGroup .dropdown .dropdown-toggle:focus{box-shadow:none;background:0 0;border:1px solid rgba(255,255,255,.3)}.scielo__theme--light .scielo__contribGroup .dropdown .dropdown-toggle:focus{box-shadow:none;background:0 0;border:1px solid #ccc}@media (max-width:575.98px){.scielo__contribGroup .dropdown .dropdown-toggle{max-width:300px!important;white-space:inherit;height:auto}}.scielo__contribGroup .dropdown .dropdown-toggle:after{display:none}.scielo__contribGroup .dropdown .dropdown-menu{padding:10px 20px;text-align:left;border-radius:4px}.scielo__contribGroup .dropdown .dropdown-menu.show{color:#333;padding-left:.75rem}.scielo__theme--dark .scielo__contribGroup .dropdown .dropdown-menu.show{color:#c4c4c4}.scielo__theme--light .scielo__contribGroup .dropdown .dropdown-menu.show{color:#333}.scielo__contribGroup .dropdown .dropdown-menu strong{display:inline-block;margin:20px 0 8px 0;font-size:11px;color:#00314c;text-transform:uppercase}.scielo__contribGroup .dropdown a{cursor:pointer}.scielo__contribGroup .dropdown a span{display:inline-block;padding:5px 0}.scielo__contribGroup .dropdown.open{background:#3867ce;border-radius:4px}.scielo__contribGroup .dropdown.open a{color:#fff}.scielo__contribGroup .outlineFadeLink{background-color:#fff;border:1px solid #ccc;color:#333;margin:0 0 0 .625rem}.scielo__contribGroup .outlineFadeLink:focus{box-shadow:0 0 0 .125rem rgba(204,204,204,.25);outline:0}.scielo__contribGroup .outlineFadeLink:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.scielo__contribGroup .outlineFadeLink:active{box-shadow:0 0 0 .25rem rgba(204,204,204,.25)}.scielo__contribGroup .outlineFadeLink:focus{background-color:#fff;color:#333}.scielo__contribGroup .outlineFadeLink:focus-visible{outline:3px solid #3867ce;outline-offset:2px}.scielo__contribGroup .outlineFadeLink.active:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background-color:#d9d9d9;color:#333}.show>.scielo__contribGroup .outlineFadeLink.dropdown-toggle{background-color:#d9d9d9;color:#333}.scielo__contribGroup .outlineFadeLink:hover:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background:#d9d9d9 radial-gradient(circle,transparent 1%,#d9d9d9 1%) center/15000%;color:#333;text-decoration:none}.scielo__contribGroup .outlineFadeLink:active:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background-color:#1a1a1a;background-size:100%;transition:background 0s;color:#333}.scielo__contribGroup .outlineFadeLink:hover:not(:disabled):not(.disabled){border:1px solid #ccc;background:hoverBgColor radial-gradient(circle,transparent 1%,hoverBgColor 1%) center/15000%;color:#333}.scielo__contribGroup .outlineFadeLink:active:not(:disabled):not(.disabled){border:1px solid #ccc;background-color:gray;background-size:100%;transition:background 0s;color:#333}.scielo__contribGroup .outlineFadeLink:focus{border-color:#ccc}.scielo__theme--dark .scielo__contribGroup .outlineFadeLink{background-color:#c4c4c4;border:1px solid rgba(255,255,255,.3);color:#333}.scielo__theme--dark .scielo__contribGroup .outlineFadeLink:focus{background-color:#c4c4c4;color:#333}.scielo__theme--dark .scielo__contribGroup .outlineFadeLink.active:not(:disabled):not(.disabled){background-color:#a7a7a7;color:#333}.scielo__theme--dark .scielo__contribGroup .outlineFadeLink:hover:not(:disabled):not(.disabled){border:1px solid #dcdcdc;background:#dcdcdc radial-gradient(circle,transparent 1%,#dcdcdc 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--dark .scielo__contribGroup .outlineFadeLink:active:not(:disabled):not(.disabled){border:1px solid #dcdcdc;background-color:#f9f9f9;background-size:100%;transition:background 0s;color:#333}.scielo__theme--dark .scielo__contribGroup .outlineFadeLink:hover:not(:disabled):not(.disabled){border:1px solid rgba(255,255,255,.3);background:hoverBgColor radial-gradient(circle,transparent 1%,hoverBgColor 1%) center/15000%;color:#333}.scielo__theme--dark .scielo__contribGroup .outlineFadeLink:active:not(:disabled):not(.disabled){border:1px solid rgba(255,255,255,.3);background-color:#f9f9f9;background-size:100%;transition:background 0s;color:#333}.scielo__theme--dark .scielo__contribGroup .outlineFadeLink:focus{border-color:rgba(255,255,255,.3)}.scielo__theme--light .scielo__contribGroup .outlineFadeLink{background-color:#fff;border-color:1px solid #ccc;color:#333}.scielo__theme--light .scielo__contribGroup .outlineFadeLink:focus{background-color:#fff;color:#333}.scielo__theme--light .scielo__contribGroup .outlineFadeLink.active:not(:disabled):not(.disabled){background-color:#fff;color:#333}.scielo__theme--light .scielo__contribGroup .outlineFadeLink:hover:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background:#d9d9d9 radial-gradient(circle,transparent 1%,#d9d9d9 1%) center/15000%;color:#333;text-decoration:none}.scielo__theme--light .scielo__contribGroup .outlineFadeLink:active:not(:disabled):not(.disabled){border:1px solid #d9d9d9;background-color:#1a1a1a;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .scielo__contribGroup .outlineFadeLink:hover:not(:disabled):not(.disabled){border:1px solid #ccc;background:hoverBgColor radial-gradient(circle,transparent 1%,hoverBgColor 1%) center/15000%;color:#333}.scielo__theme--light .scielo__contribGroup .outlineFadeLink:active:not(:disabled):not(.disabled){border:1px solid #ccc;background-color:gray;background-size:100%;transition:background 0s;color:#333}.scielo__theme--light .scielo__contribGroup .outlineFadeLink:focus{border-color:#ccc}@media (max-width:575.98px){.scielo__contribGroup .outlineFadeLink{margin:.5rem 0}}.btnContribLinks{display:inline-block;margin-top:4px;background-image:url(../img/logo-orcid.svg);background-repeat:no-repeat;background-size:1.5em auto;background-position:.5em center;padding:.5em .5em .5em 2.5em;border-radius:4px;border:1px solid #3867ce}.scielo__theme--dark .btnContribLinks{border:1px solid #86acff}.scielo__theme--light .btnContribLinks{border:1px solid #3867ce}.ModalDefault .btnContribLinks{padding:.5em .5em .5em 2.5em!important}.btnContribLinks:hover{border-color:#254895}.scielo__theme--dark .btnContribLinks:hover{border-color:#d3e0ff}.scielo__theme--light .btnContribLinks:hover{border-color:#254895}.linkGroup{position:relative;font-size:.85em}.linkGroup a.selected{position:relative}.linkGroup a.selected:after{content:'';display:block;position:absolute;bottom:-16px;left:4px;width:16px;height:7px;background:url(../img/articleContent-arrow.png) bottom center no-repeat;z-index:999}.btn-open{display:inline-block;margin:0 .625rem;transition:all .4s}@media (max-width:575.98px){.btn-open{display:block;margin:.25rem auto}}.badge{border-radius:1.5rem;font-size:.625rem;line-height:1.375rem;padding:0 .4375rem;height:1.625rem;min-width:1.625rem;letter-spacing:.5px;display:inline-block;vertical-align:text-top;border:2px solid #fff;text-align:center;text-transform:uppercase;color:#fff;background:#fff;color:#333}.scielo__theme--dark .badge{border-color:#333}.scielo__theme--light .badge{border-color:#fff}.scielo__theme--dark .badge{background-color:#c4c4c4;color:#eee}.scielo__theme--light .badge{background-color:#fff;color:#333}.badge-light,.badge-primary{background:#3867ce;color:#fff}.scielo__theme--dark .badge-light,.scielo__theme--dark .badge-primary{background-color:#86acff;color:#eee}.scielo__theme--light .badge-light,.scielo__theme--light .badge-primary{background-color:#3867ce;color:#fff}.badge-secondary{background:#fff;color:#333}.scielo__theme--dark .badge-secondary{background-color:#c4c4c4;color:#eee}.scielo__theme--light .badge-secondary{background-color:#fff;color:#333}.badge-info{background:#2195a9;color:#fff}.scielo__theme--dark .badge-info{background-color:#2299ad;color:#eee}.scielo__theme--light .badge-info{background-color:#2195a9;color:#fff}.badge-dark{background:#fff;color:#333}.scielo__theme--dark .badge-dark{background-color:#c4c4c4;color:#eee}.scielo__theme--light .badge-dark{background-color:#fff;color:#333}.badge-success{background:#2c9d45;color:#fff}.scielo__theme--dark .badge-success{background-color:#2c9d45;color:#eee}.scielo__theme--light .badge-success{background-color:#2c9d45;color:#fff}.badge-danger{background:#c63800;color:#fff}.scielo__theme--dark .badge-danger{background-color:#ff7e4a;color:#eee}.scielo__theme--light .badge-danger{background-color:#c63800;color:#fff}.badge-warning{background:#b67f00;color:#fff}.scielo__theme--dark .badge-warning{background-color:#b67f00;color:#eee}.scielo__theme--light .badge-warning{background-color:#b67f00;color:#fff}.display-1 .badge,.display-2 .badge,.display-3 .badge,.display-4 .badge,.h1 .badge,.h1 .badge .h2 .badge,.h2 .badge,.h3 .badge,.h4 .badge,.h5 .badge,.h6 .badge,.lead,h1 .badge,h2 .badge,h3 .badge,h4 .badge,h5 .badge,h6 .badge{margin-left:-.6em}.btn+.badge{vertical-align:text-bottom;margin:0 0 1.5rem -1.3125rem;position:relative;z-index:2}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}.progress{height:.1875rem;border-radius:.25rem;font-weight:700;font-size:.75rem;line-height:1.2em;letter-spacing:.06px;color:rgba(0,0,0,.1);overflow:visible;height:1.75rem;position:relative;background-color:#efeeec}.scielo__theme--dark .progress{background-color:#414141}.scielo__theme--light .progress{background-color:#efeeec}.progress-bar{position:relative;height:1.75rem;border-radius:.25rem;color:#fff}.progress-bar~.progress-bar{border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-.4375rem}.scielo__theme--dark .progress-bar{background-color:#86acff!important}.scielo__theme--light .progress-bar{background-color:#3867ce!important}.scielo__theme--dark .progress-bar.bg-primary{background-color:#86acff!important}.scielo__theme--light .progress-bar.bg-primary{background-color:#3867ce!important}.scielo__theme--dark .progress-bar.bg-info{background-color:#2299ad!important}.scielo__theme--light .progress-bar.bg-info{background-color:#2195a9!important}.scielo__theme--dark .progress-bar.bg-success{background-color:#2c9d45!important}.scielo__theme--light .progress-bar.bg-success{background-color:#2c9d45!important}.scielo__theme--dark .progress-bar.bg-warning{background-color:#b67f00!important}.scielo__theme--light .progress-bar.bg-warning{background-color:#b67f00!important}.scielo__theme--dark .progress-bar.bg-danger{background-color:#ff7e4a!important}.scielo__theme--light .progress-bar.bg-danger{background-color:#c63800!important}.img-thumbnail{display:inline-block;background:0 0;border:none;border-radius:.1875rem;padding:0;overflow:hidden}.tooltip-inner{font-size:.75rem;border-radius:.1875rem;padding:.375rem .75rem;background:#333;color:#fff}.scielo__theme--dark .tooltip-inner{background:#fff;color:#333}.scielo__theme--light .tooltip-inner{background:#333;color:#fff}.tooltip.show{opacity:1}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{border-top-color:#333}.scielo__theme--dark .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.scielo__theme--dark .bs-tooltip-top .tooltip-arrow::before{border-top-color:#fff}.scielo__theme--light .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.scielo__theme--light .bs-tooltip-top .tooltip-arrow::before{border-top-color:#333}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{border-right-color:#333}.scielo__theme--dark .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.scielo__theme--dark .bs-tooltip-end .tooltip-arrow::before{border-right-color:#fff}.scielo__theme--light .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.scielo__theme--light .bs-tooltip-end .tooltip-arrow::before{border-right-color:#333}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{border-bottom-color:#333}.scielo__theme--dark .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.scielo__theme--dark .bs-tooltip-bottom .tooltip-arrow::before{border-bottom-color:#fff}.scielo__theme--light .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.scielo__theme--light .bs-tooltip-bottom .tooltip-arrow::before{border-bottom-color:#333}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{border-left-color:#333}.scielo__theme--dark .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.scielo__theme--dark .bs-tooltip-start .tooltip-arrow::before{border-left-color:#fff}.scielo__theme--light .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.scielo__theme--light .bs-tooltip-start .tooltip-arrow::before{border-left-color:#333}.scielo__loading-block{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:6.25rem;height:6.25rem;opacity:0;transition:opacity .5s linear;transition-delay:.5s;z-index:1050}.scielo__loading-backdrop{transition:opacity .5s linear;opacity:0;position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:1040}.scielo__loading-backdrop--dark{background:#da202c}.scielo__loading-backdrop--light{background:#fff}.scielo__loading-visible .scielo__loading-backdrop,.scielo__loading-visible .scielo__loading-block{opacity:1}.scielo__loading-hide .scielo__loading-backdrop{transition-delay:.7s}.scielo__loading-hide .scielo__loading-block{transition-delay:0}.scielo__loading-inline{position:relative;display:inline-block;width:1.25rem;height:1.25rem}.scielo__loading-inline:before{content:'';box-sizing:border-box;position:absolute;top:50%;left:50%;border-radius:50%;border:2px solid rgba(0,176,230,.2);border-top-color:#fff;animation:spinner .8s linear infinite;width:1.25rem;height:1.25rem;margin-top:-.625rem;margin-left:-.625rem}.scielo__theme--dark .scielo__loading-inline:before{border-color:rgba(0,176,230,.6);border-top-color:#eee}.scielo__theme--light .scielo__loading-inline:before{border-color:rgba(0,176,230,.2);border-top-color:#fff}[class*=b3__btn-with-icon] .scielo__loading-inline:before{border-color:#414141;border-top-color:#fff}.scielo__theme--dark [class*=b3__btn-with-icon] .scielo__loading-inline:before{border-color:#414141;border-top-color:#fff}[class*=b3__btn-with-icon--left] .scielo__loading-inline:before{padding-left:2rem}[class*=b3__btn-with-icon--left] .scielo__loading-inline:before [class^=material-icons]{position:absolute;top:50%;transform:translateY(-50%);width:1.25rem;height:1.25rem;font-size:1.25rem;line-height:1.25rem}[class*=b3__btn-with-icon--left] .scielo__loading-inline:before [class^=material-icons]:before{vertical-align:top}[class*=b3__btn-with-icon--left] .scielo__loading-inline:before [class^=material-icons]{left:.5rem}[class*=b3__btn-with-icon--right] .scielo__loading-inline:before{padding-right:2rem}[class*=b3__btn-with-icon--right] .scielo__loading-inline:before [class^=material-icons]{position:absolute;top:50%;transform:translateY(-50%);width:1.25rem;height:1.25rem;font-size:1.25rem;line-height:1.25rem}[class*=b3__btn-with-icon--right] .scielo__loading-inline:before [class^=material-icons]:before{vertical-align:top}[class*=b3__btn-with-icon--right] .scielo__loading-inline:before [class^=material-icons]{right:.5rem}.btn-group-lg>.btn .scielo__loading-inline,.btn-lg .scielo__loading-inline{width:1.5rem;height:1.5rem}.btn-group-lg>.btn .scielo__loading-inline:before,.btn-lg .scielo__loading-inline:before{width:1.5rem;height:1.5rem;margin-top:-.75rem;margin-left:-.75rem}@keyframes spinner{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:top;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1.2em;height:1.2em;border-width:.13em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1.2em;height:1.2em}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}[class*=" sci-ico-"],[class^=sci-ico-]{display:inline-block;font-size:24px;height:24px;line-height:1}.article-title [class*=" sci-ico-"],.article-title [class^=sci-ico-]{float:none}.article [class*=" sci-ico-"],.article [class^=sci-ico-]{vertical-align:text-bottom;margin-right:3px}.modal-body [class*=" sci-ico-"],.modal-body [class^=sci-ico-]{margin-right:0}[class*=" sci-ico-"]:before,[class^=sci-ico-]:before{font-family:'Material Icons Outlined';color:inherit}.sci-ico-top:before{content:"vertical_align_top"}.sci-ico-home:before{content:"home"}.sci-ico-zoom:before{content:"zoom_in"}.sci-ico-translation:before{content:"translate"}.sci-ico-socialEmail:before,.sci-ico-socialFacebook:before,.sci-ico-socialGooglePlus:before,.sci-ico-socialOther:before,.sci-ico-socialTwitter:before,.sci-ico-socialTwitterSingle:before{content:"share"}.sci-ico-similar:before{content:"playlist_add"}.sci-ico-newWindow:before{content:"open_in_new"}.sci-ico-metrics:before{content:"show_chart"}.sci-ico-citation:before,.sci-ico-link:before{content:"link"}.sci-ico-home:before{content:"home"}.sci-ico-floatingMenuDefault:before{content:"more_horiz"}.sci-ico-floatingMenuClose:before{content:"close"}.sci-ico-download:before,.sci-ico-fileCSV:before,.sci-ico-fileEPUB:before,.sci-ico-filePDF:before,.sci-ico-fileXML:before{content:"file_download"}.sci-ico-fileTable:before{content:"table_chart"}.sci-ico-fileFormula:before{content:"functions"}.sci-ico-figures:before,.sci-ico-fileFigure:before{content:"image"}.sci-ico-email:before,.sci-ico-emailOutlined:before{content:"email"}.sci-ico-arrowUp:before{content:"keyboard_arrow_up"}.sci-ico-arrowRight:before{content:"keyboard_arrow_right"}.sci-ico-arrowLeft:before{content:"keyboard_arrow_left"}.sci-ico-arrowDown:before{content:"keyboard_arrow_down"}.sci-ico-socialRSS:before{content:"rss_feed"}.sci-ico-pin:before{content:"location_on"}.sci-ico-copy:before{content:"content_copy"}.sci-ico-authorInstruction:before{content:"help_outline"}.sci-ico-about:before{content:"info"}.sci-ico-check:before{content:"check"}.sci-ico-top:before{content:"vertical_align_top"}.sci-ico-cc,.sci-ico-cc-by,.sci-ico-cc-nc,.sci-ico-cc-nd,.sci-ico-cc-sa,.sci-ico-cr,.sci-ico-public-domain{display:none}.scielo__sidenav__bottom-menu{display:none}@media screen and (min-width:768px){.scielo__sidenav__bottom-menu{display:block;position:fixed;transition:.5s all;left:0;bottom:0;width:16.875rem}.scielo__theme--dark .scielo__sidenav__bottom-menu{background:#414141}.scielo__sidenav__bottom-menu ul{width:16.875rem}.scielo__sidenav__bottom-menu .scielo__ico--double_arrow_left:before{transition:.25s all}}@media screen and (min-width:768px){.scielo__sidenav__header{display:grid;grid-template-columns:16.875rem auto;transition:.5s all}}.scielo__sidenav__header .scielo__sidenav__toggle{position:absolute;right:16px;top:50%;transform:translateY(-50%);padding-left:1rem;padding-right:1rem}.scielo__sidenav__header-brand,.scielo__sidenav__header-site{position:relative;padding:.75rem 1rem}.scielo__sidenav__header-brand{line-height:2.25rem;padding-left:1.3125rem}.scielo__sidenav__header-brand .scielo__logo--small{vertical-align:middle}@media screen and (min-width:768px){.scielo__sidenav__header-brand{position:fixed;top:0;z-index:2;transition:.5s all;grid-column:1;width:16.875rem;line-height:3rem}}@media screen and (min-width:768px){.scielo__sidenav__header-site{transition:.5s all;grid-column:2;display:grid;grid-template-columns:35% auto;grid-template-rows:3rem;border-bottom:1px solid #efeeec;padding-left:1.5rem;padding-right:1.5rem}}@media screen and (min-width:992px){.scielo__sidenav__header-site{grid-template-columns:45% auto;padding-left:2rem;padding-right:2rem}}@media screen and (min-width:1200px){.scielo__sidenav__header-site{padding-left:2.5rem;padding-right:2.5rem}}.scielo__sidenav__header-functions{display:grid;grid-template-columns:80% 20%;grid-template-areas:"a b" "c c"}.scielo__sidenav__header-functions .btn{margin-bottom:0}.scielo__sidenav__header-functions .btn+.badge{margin-bottom:.2rem;margin-left:-1.8rem;pointer-events:none}.scielo__sidenav__header-functions .input-group.is-search input{max-width:10.625rem}@media screen and (min-width:768px){.scielo__sidenav__header-functions .input-group.is-search input{max-width:100%}}@media screen and (min-width:768px){.scielo__sidenav__header-functions{grid-column:2;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));grid-gap:.75rem;grid-template-areas:"c b a"}}.scielo__sidenav__header-functions__item{grid-area:a;white-space:nowrap}.scielo__sidenav__header-functions__item--small{grid-area:b;text-align:right;white-space:nowrap}.scielo__sidenav__header-functions__item--large{grid-area:c;white-space:nowrap}.scielo__sidenav__header-title{font-size:1.125rem;color:#c4c4c4;border-bottom:1px solid #414141;padding-bottom:.75rem;margin-bottom:1.5rem;margin-left:-1rem;margin-right:-1rem;padding-left:1rem;padding-right:1rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media screen and (min-width:768px){.scielo__sidenav__header-title{grid-column:1;margin:0;padding:0;color:#333;font-weight:700;font-size:1.3125rem;line-height:1.25em;letter-spacing:0;font-weight:400;line-height:3rem;border-bottom:none}}@media screen and (min-width:768px){.scielo__sidenav__menu{position:fixed;left:0;top:4.5rem;bottom:3rem;transition:.5s all;overflow-y:auto;overflow-x:hidden;width:16.875rem}.scielo__sidenav__menu ul{width:16.875rem}.scielo__sidenav__menu-item{transition:.25s all;transition-delay:.5s;opacity:1;display:inline-block}}@media screen and (max-width:767px){.scielo__theme--dark .scielo__sidenav{border-bottom:1px solid #393939}}@media screen and (min-width:768px){.scielo__theme--dark .scielo__sidenav__bottom-menu,.scielo__theme--dark .scielo__sidenav__menu{border-right:1px solid #393939}}@media screen and (min-width:768px){.scielo__theme--dark .scielo__sidenav__header-brand,.scielo__theme--dark .scielo__sidenav__header-site{border-bottom:1px solid #393939}}@media screen and (max-width:767px){.scielo__theme--dark .scielo__sidenav__header-title{background:#333;color:#c4c4c4;border-bottom:1px solid #414141;margin-top:-.8rem;padding-top:.8rem}}@media screen and (max-width:767px){.scielo__sidenav+.container{padding-top:5.25rem}}@media screen and (min-width:768px){.scielo__sidenav+.container{transition:.5s all;padding-left:18.375rem;padding-right:1.5rem;max-width:100%!important}}@media screen and (min-width:992px){.scielo__sidenav+.container{padding-left:18.875rem;padding-right:2rem}}@media screen and (min-width:1200px){.scielo__sidenav+.container{padding-left:19.375rem;padding-right:2.5rem}}@media screen and (max-width:767px){.scielo__sidenav{position:fixed;top:0;width:100%;height:3.75rem;overflow:hidden;transition:.5s;z-index:9}.scielo__sidenav--opened{height:100vh;overflow:auto}.scielo__sidenav--opened .scielo__sidenav__toggle-text--closed{display:none}.scielo__sidenav--opened .scielo__sidenav__header .scielo__sidenav__toggle{padding:0;width:2rem}.scielo__sidenav--opened .scielo__sidenav__header .scielo__sidenav__toggle [class^=material-icons]{position:absolute;top:50%;transform:translateY(-50%);width:1.25rem;height:1.25rem;font-size:1.25rem;line-height:1.25rem}.scielo__sidenav--opened .scielo__sidenav__header .scielo__sidenav__toggle [class^=material-icons]:before{vertical-align:top}.scielo__sidenav--opened .scielo__sidenav__header .scielo__sidenav__toggle [class^=material-icons]{top:50%;left:50%;transform:translate(-50%,-50%)}}@media screen and (min-width:768px){.scielo__sidenav--minimized .scielo__sidenav__bottom-menu,.scielo__sidenav--minimized .scielo__sidenav__header-brand,.scielo__sidenav--minimized .scielo__sidenav__menu{overflow-x:hidden;width:4.5rem}.scielo__sidenav--minimized .scielo__sidenav__header{grid-template-columns:4.5rem auto}.scielo__sidenav--minimized .scielo__sidenav__bottom-menu .scielo__ico--double_arrow_left:before{transform:rotate(180deg)}.scielo__sidenav--minimized .scielo__sidenav__menu-item{opacity:0}}@media screen and (min-width:768px) and (min-width:768px){.scielo__sidenav--minimized+.container{padding-left:6rem}}@media screen and (min-width:768px) and (min-width:992px){.scielo__sidenav--minimized+.container{padding-left:6.5rem}}@media screen and (min-width:768px) and (min-width:1200px){.scielo__sidenav--minimized+.container{padding-left:7rem}}.scielo__text-color--light{color:#333!important}.scielo__text-color--dark{color:#c4c4c4!important}.scielo__text-color__emphasis--light{color:#00314c!important}.scielo__text-color__emphasis--dark{color:#eee!important}.scielo__text-color__subtle--light{color:#6c6b6b!important}.scielo__text-color__subtle--dark{color:#adadad!important}.scielo__text-color__menu--light{color:#fff!important}.scielo__text-color__menu--dark{color:#eee!important}.scielo__text-color__interaction--light{color:#3867ce!important}.scielo__text-color__interaction--dark{color:#86acff!important}.scielo__text-color__positive--light{color:#2c9d45!important}.scielo__text-color__positive--dark{color:#2c9d45!important}.scielo__text-color__negative--light{color:#c63800!important}.scielo__text-color__negative--dark{color:#ff7e4a!important}.scielo__bg__gray--1{background-color:#f7f6f4!important}.scielo__bg__gray--2{background-color:#efeeec!important}.scielo__bg__white--1{background-color:#393939!important}.scielo__bg__white--2{background-color:#414141!important}.scielo__border-top{border-top:2px solid #fff!important}.scielo__theme--dark .scielo__border-top{border-top-color:#eee!important}.scielo__theme--light .scielo__border-top{border-top-color:#fff!important}.scielo__border-bottom{border-bottom:2px solid #fff!important}.scielo__theme--dark .scielo__border-bottom{border-bottom-color:#eee!important}.scielo__theme--light .scielo__border-bottom{border-bottom-color:#fff!important}.scielo__padding-top{padding-top:1.5rem}.scielo__padding-top--small{padding-top:.75rem}.scielo__padding-top--large{padding-top:3rem}.scielo__padding-top--none{padding-top:0}.scielo__padding-bottom{padding-bottom:1.5rem}.scielo__padding-bottom--small{padding-bottom:.75rem}.scielo__padding-bottom--large{padding-bottom:3rem}.scielo__padding-bottom--none{padding-bottom:0}.scielo__padding-top-bottom{padding-top:1.5rem;padding-bottom:1.5rem}.scielo__padding-top-bottom--small{padding-top:.75rem;padding-bottom:.75rem}.scielo__padding-top-bottom--large{padding-top:3rem;padding-bottom:3rem}.scielo__padding-top-bottom--none{padding-top:0;padding-bottom:0}.scielo__padding-left{padding-left:1.5rem}.scielo__padding-left--small{padding-left:.75rem}.scielo__padding-left--large{padding-left:3rem}.scielo__padding-left--none{padding-left:0}.scielo__padding-right{padding-right:1.5rem}.scielo__padding-right--small{padding-right:.75rem}.scielo__padding-right--large{padding-right:3rem}.scielo__padding-right--none{padding-right:0}.scielo__padding-left-right{padding-left:1.5rem;padding-right:1.5rem}.scielo__padding-left-right--small{padding-left:.75rem;padding-right:.75rem}.scielo__padding-left-right--large{padding-left:3rem;padding-right:3rem}.scielo__padding-left-right--none{padding-left:0;padding-right:0}.scielo__margin-top{margin-top:1.5rem!important}.scielo__margin-top--small{margin-top:.75rem!important}.scielo__margin-top--large{margin-top:3rem!important}.scielo__margin-top--none{margin-top:0}.scielo__margin-bottom{margin-bottom:1.5rem!important}.scielo__margin-bottom--small{margin-bottom:.75rem!important}.scielo__margin-bottom--large{margin-bottom:3rem!important}.scielo__margin-bottom--none{margin-bottom:0}.scielo__margin-top-bottom{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.scielo__margin-top-bottom--small{margin-top:.75rem!important;margin-bottom:.75rem!important}.scielo__margin-top-bottom--large{margin-top:3rem!important;margin-bottom:3rem!important}.scielo__margin-top-bottom--none{margin-top:0!important;margin-bottom:0!important}.scielo__margin-left{margin-left:1.5rem!important}.scielo__margin-left--small{margin-left:.75rem!important}.scielo__margin-left--large{margin-left:3rem!important}.scielo__margin-left--none{margin-left:0!important}.scielo__margin-right{margin-right:1.5rem!important}.scielo__margin-right--small{margin-right:.75rem!important}.scielo__margin-right--large{margin-right:3rem!important}.scielo__margin-right--none{margin-right:0!important}.scielo__margin-left-right{margin-left:1.5rem!important;margin-right:1.5rem!important}.scielo__margin-left-right--small{margin-left:.75rem!important;margin-right:.75rem!important}.scielo__margin-left-right--large{margin-left:3rem!important;margin-right:3rem!important}.scielo__margin-left-right--none{margin-left:0!important;margin-right:0!important}@media print{.badge,.breadcrumb,.navbar.sticky-top,.scielo__levelMenu,.scielo__logo-scielo--small,.scielo__logo-scielo-caption,.scielo__logo-scielo-collection,.scielo__search-articles{-webkit-print-color-adjust:exact!important}#flDebugToolbarHandle{display:none!important}body.journal{padding:0!important}.fixed-top{position:static!important}.collection-news,.journalContent,.table-journal-list tr{break-inside:avoid!important}.scielo__shadow-2{box-shadow:none!important;border-bottom:1px solid #ddd}.bd-example .row .col-sm-9{flex:0 0 auto;width:100%}} +/*# sourceMappingURL=bootstrap.css.map */ \ No newline at end of file diff --git a/markup_doc/static/jats/jats-preview.css b/markup_doc/static/jats/jats-preview.css new file mode 100644 index 0000000..b65ee5c --- /dev/null +++ b/markup_doc/static/jats/jats-preview.css @@ -0,0 +1,216 @@ +/* Stylesheet for NLM/NCBI Journal Publishing 3.0 Preview HTML + January 2009 + + ~~~~~~~~~~~~~~ + National Center for Biotechnology Information (NCBI) + National Library of Medicine (NLM) + ~~~~~~~~~~~~~~ + +This work is in the public domain and may be reproduced, published or +otherwise used without the permission of the National Library of Medicine (NLM). + +We request only that the NLM is cited as the source of the work. + +Although all reasonable efforts have been taken to ensure the accuracy and +reliability of the software and data, the NLM and the U.S. Government do +not and cannot warrant the performance or results that may be obtained by +using this software or data. The NLM and the U.S. Government disclaim all +warranties, express or implied, including warranties of performance, +merchantability or fitness for any particular purpose. + +*/ + + +/* --------------- Page setup ------------------------ */ + +/* page and text defaults */ + +body { margin-left: 8%; + margin-right: 8%; + background-color: #f8f8f8 } + + +div > *:first-child { margin-top:0em } + +div { margin-top: 0.5em } + +div.front, div.footer { } + +.back, .body { font-family: serif } + +div.metadata { font-family: sans-serif } +div.centered { text-align: center } + +div.table { display: table } +div.metadata.table { width: 100% } +div.row { display: table-row } +div.cell { display: table-cell; padding-left: 0.25em; padding-right: 0.25em } + +div.metadata div.cell { + vertical-align: top } + +div.two-column div.cell { + width: 50% } + +div.one-column div.cell.spanning { width: 100% } + +div.metadata-group { margin-top: 0.5em; + font-size: 75% } + +div.metadata-group > p, div.metadata-group > div { margin-top: 0.5em } + +div.metadata-area * { margin: 0em } + +div.metadata-chunk { margin-left: 1em } + +div.branding { text-align: center } + +div.document-title-notes { + text-align: center; + width: 60%; + margin-left: auto; + margin-right: auto + } + +div.footnote { font-size: 90% } + +/* rules */ +hr.part-rule { + border: thin solid black; + width: 50%; + margin-top: 1em; + margin-bottom: 1em; + } + +hr.section-rule { + border: thin dotted black; + width: 50%; + margin-top: 1em; + margin-bottom: 1em; + } + +/* superior numbers that are cross-references */ +.xref { + color: red; + } + +/* generated text */ +.generated { color: gray; } + +.warning, tex-math { + font-size:80%; font-family: sans-serif } + +.warning { + color: red } + +.tex-math { color: green } + +.data { + color: black; + } + +.formula { + font-family: sans-serif; + font-size: 90% } + +/* --------------- Titling levels -------------------- */ + + +h1, h2, h3, h4, h5, h6 { + display: block; + margin-top: 0em; + margin-bottom: 0.5em; + font-family: helvetica, sans-serif; + font-weight: bold; + color: midnightblue; + } +/* titling level 1: document title */ +.document-title { + text-align: center; + } + +/* callout titles appear in a left column (table cell) + opposite what they head */ +.callout-title { text-align: right; + margin-top: 0.5em; + margin-right: 1em; + font-size: 140% } + + + +div.section, div.back-section { + margin-top: 1em; margin-bottom: 0.5em } + +div.panel { background-color: white; + font-size: 90%; + border: thin solid black; + padding-left: 0.5em; padding-right: 0.5em; + padding-top: 0.5em; padding-bottom: 0.5em; + margin-top: 0.5em; margin-bottom: 0.5em } + +div.blockquote { font-size: 90%; + margin-left: 1em; margin-right: 1em; + margin-top: 0.5em; margin-bottom: 0.5em } + +div.caption { + margin-top: 0.5em; margin-bottom: 0.5em } + +div.speech { + margin-left: 1em; margin-right: 1em; + margin-top: 0.5em; margin-bottom: 0.5em } + +div.verse-group { + margin-left: 1em; + margin-top: 0.5em; margin-bottom: 0.5em } + +div.verse-group div.verse-group { + margin-left: 1em; + margin-top: 0em; margin-bottom: 0em } + +div.note { margin-top: 0em; margin-left: 1em; + font-size: 85% } + +.ref-label { margin-top: 0em; vertical-align: top } + +.ref-content { margin-top: 0em; padding-left: 0.25em } + +h5.label { margin-top: 0em; margin-bottom: 0em } + +p { margin-top: 0.5em; margin-bottom: 0em } + +p.first { margin-top: 0em } + +p.verse-line, p.citation { margin-top: 0em; margin-bottom: 0em; margin-left: 2em; text-indent: -2em } + +p.address-line { margin-top: 0em; margin-bottom: 0em; margin-left: 2em } + +ul, ol { margin-top: 0.5em } + +li { margin-top: 0.5em; margin-bottom: 0em } +li > p { margin-top: 0.2em; margin-bottom: 0em } + +div.def-list { border-spacing: 0.25em } + +div.def-list div.cell { vertical-align: top; + border-bottom: thin solid black; + padding-bottom: 0.5em } + +div.def-list div.def-list-head { + text-align: left } + +/* text decoration */ +.label { font-weight: bold; font-family: sans-serif; font-size: 80% } + +.monospace { + font-family: monospace; + } + +.overline{ + text-decoration: overline; + } + +a { text-decoration: none } +a:hover { text-decoration: underline } + +/* ---------------- End ------------------------------ */ + diff --git a/markup_doc/static/js/scielo-bundle-min.js b/markup_doc/static/js/scielo-bundle-min.js new file mode 100644 index 0000000..655d26c --- /dev/null +++ b/markup_doc/static/js/scielo-bundle-min.js @@ -0,0 +1,2 @@ +!function(t,e){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=t.document?e(t,!0):function(t){if(t.document)return e(t);throw new Error("jQuery requires a window with a document")}:e(t)}("undefined"!=typeof window?window:this,function(_,N){"use strict";function v(t){return"function"==typeof t&&"number"!=typeof t.nodeType&&"function"!=typeof t.item}function m(t){return null!=t&&t===t.window}var e=[],I=Object.getPrototypeOf,a=e.slice,H=e.flat?function(t){return e.flat.call(t)}:function(t){return e.concat.apply([],t)},F=e.push,R=e.indexOf,q={},Y=q.toString,W=q.hasOwnProperty,B=W.toString,z=B.call(Object),g={},k=_.document,U={type:!0,src:!0,nonce:!0,noModule:!0};function G(t,e,i){var n,o,s=(i=i||k).createElement("script");if(s.text=t,e)for(n in U)(o=e[n]||e.getAttribute&&e.getAttribute(n))&&s.setAttribute(n,o);i.head.appendChild(s).parentNode.removeChild(s)}function f(t){return null==t?t+"":"object"==typeof t||"function"==typeof t?q[Y.call(t)]||"object":typeof t}var t="3.6.3",x=function(t,e){return new x.fn.init(t,e)};function V(t){var e=!!t&&"length"in t&&t.length,i=f(t);return!v(t)&&!m(t)&&("array"===i||0===e||"number"==typeof e&&0<e&&e-1 in t)}x.fn=x.prototype={jquery:t,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){t=x.merge(this.constructor(),t);return t.prevObject=this,t},each:function(t){return x.each(this,t)},map:function(i){return this.pushStack(x.map(this,function(t,e){return i.call(t,e,t)}))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,function(t,e){return(e+1)%2}))},odd:function(){return this.pushStack(x.grep(this,function(t,e){return e%2}))},eq:function(t){var e=this.length,t=+t+(t<0?e:0);return this.pushStack(0<=t&&t<e?[this[t]]:[])},end:function(){return this.prevObject||this.constructor()},push:F,sort:e.sort,splice:e.splice},x.extend=x.fn.extend=function(){var t,e,i,n,o,s=arguments[0]||{},r=1,a=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[r]||{},r++),"object"==typeof s||v(s)||(s={}),r===a&&(s=this,r--);r<a;r++)if(null!=(t=arguments[r]))for(e in t)i=t[e],"__proto__"!==e&&s!==i&&(l&&i&&(x.isPlainObject(i)||(n=Array.isArray(i)))?(o=s[e],o=n&&!Array.isArray(o)?[]:n||x.isPlainObject(o)?o:{},n=!1,s[e]=x.extend(l,o,i)):void 0!==i&&(s[e]=i));return s},x.extend({expando:"jQuery"+(t+Math.random()).replace(/\D/g,""),isReady:!0,error:function(t){throw new Error(t)},noop:function(){},isPlainObject:function(t){return!(!t||"[object Object]"!==Y.call(t)||(t=I(t))&&("function"!=typeof(t=W.call(t,"constructor")&&t.constructor)||B.call(t)!==z))},isEmptyObject:function(t){for(var e in t)return!1;return!0},globalEval:function(t,e,i){G(t,{nonce:e&&e.nonce},i)},each:function(t,e){var i,n=0;if(V(t))for(i=t.length;n<i&&!1!==e.call(t[n],n,t[n]);n++);else for(n in t)if(!1===e.call(t[n],n,t[n]))break;return t},makeArray:function(t,e){e=e||[];return null!=t&&(V(Object(t))?x.merge(e,"string"==typeof t?[t]:t):F.call(e,t)),e},inArray:function(t,e,i){return null==e?-1:R.call(e,t,i)},merge:function(t,e){for(var i=+e.length,n=0,o=t.length;n<i;n++)t[o++]=e[n];return t.length=o,t},grep:function(t,e,i){for(var n=[],o=0,s=t.length,r=!i;o<s;o++)!e(t[o],o)!=r&&n.push(t[o]);return n},map:function(t,e,i){var n,o,s=0,r=[];if(V(t))for(n=t.length;s<n;s++)null!=(o=e(t[s],s,i))&&r.push(o);else for(s in t)null!=(o=e(t[s],s,i))&&r.push(o);return H(r)},guid:1,support:g}),"function"==typeof Symbol&&(x.fn[Symbol.iterator]=e[Symbol.iterator]),x.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(t,e){q["[object "+e+"]"]=e.toLowerCase()});function n(t,e,i){for(var n=[],o=void 0!==i;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(i))break;n.push(t)}return n}function X(t,e){for(var i=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&i.push(t);return i}var t=function(N){function u(t,e){return t="0x"+t.slice(1)-65536,e||(t<0?String.fromCharCode(65536+t):String.fromCharCode(t>>10|55296,1023&t|56320))}function I(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t}function H(){k()}var t,h,w,s,F,p,R,q,_,l,c,k,x,i,T,f,n,o,m,S="sizzle"+ +new Date,d=N.document,C=0,Y=0,W=O(),B=O(),z=O(),g=O(),U=function(t,e){return t===e&&(c=!0),0},G={}.hasOwnProperty,e=[],V=e.pop,X=e.push,E=e.push,Z=e.slice,v=function(t,e){for(var i=0,n=t.length;i<n;i++)if(t[i]===e)return i;return-1},Q="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",r="[\\x20\\t\\r\\n\\f]",a="(?:\\\\[\\da-fA-F]{1,6}"+r+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",J="\\["+r+"*("+a+")(?:"+r+"*([*^$|!~]?=)"+r+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+a+"))|)"+r+"*\\]",K=":("+a+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+J+")*)|.*)\\)|)",tt=new RegExp(r+"+","g"),y=new RegExp("^"+r+"+|((?:^|[^\\\\])(?:\\\\.)*)"+r+"+$","g"),et=new RegExp("^"+r+"*,"+r+"*"),it=new RegExp("^"+r+"*([>+~]|"+r+")"+r+"*"),nt=new RegExp(r+"|>"),ot=new RegExp(K),st=new RegExp("^"+a+"$"),b={ID:new RegExp("^#("+a+")"),CLASS:new RegExp("^\\.("+a+")"),TAG:new RegExp("^("+a+"|[*])"),ATTR:new RegExp("^"+J),PSEUDO:new RegExp("^"+K),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+r+"*(even|odd|(([+-]|)(\\d*)n|)"+r+"*(?:([+-]|)"+r+"*(\\d+)|))"+r+"*\\)|)","i"),bool:new RegExp("^(?:"+Q+")$","i"),needsContext:new RegExp("^"+r+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+r+"*((?:-\\d)?\\d*)"+r+"*\\)|)(?=[^-]|$)","i")},rt=/HTML$/i,at=/^(?:input|select|textarea|button)$/i,lt=/^h\d$/i,D=/^[^{]+\{\s*\[native \w/,ct=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,dt=/[+~]/,A=new RegExp("\\\\[\\da-fA-F]{1,6}"+r+"?|\\\\([^\\r\\n\\f])","g"),ut=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ht=vt(function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{E.apply(e=Z.call(d.childNodes),d.childNodes),e[d.childNodes.length].nodeType}catch(t){E={apply:e.length?function(t,e){X.apply(t,Z.call(e))}:function(t,e){for(var i=t.length,n=0;t[i++]=e[n++];);t.length=i-1}}}function L(e,t,i,n){var o,s,r,a,l,c,d=t&&t.ownerDocument,u=t?t.nodeType:9;if(i=i||[],"string"!=typeof e||!e||1!==u&&9!==u&&11!==u)return i;if(!n&&(k(t),t=t||x,T)){if(11!==u&&(a=ct.exec(e)))if(o=a[1]){if(9===u){if(!(c=t.getElementById(o)))return i;if(c.id===o)return i.push(c),i}else if(d&&(c=d.getElementById(o))&&m(t,c)&&c.id===o)return i.push(c),i}else{if(a[2])return E.apply(i,t.getElementsByTagName(e)),i;if((o=a[3])&&h.getElementsByClassName&&t.getElementsByClassName)return E.apply(i,t.getElementsByClassName(o)),i}if(h.qsa&&!g[e+" "]&&(!f||!f.test(e))&&(1!==u||"object"!==t.nodeName.toLowerCase())){if(c=e,d=t,1===u&&(nt.test(e)||it.test(e))){for((d=dt.test(e)&>(t.parentNode)||t)===t&&h.scope||((r=t.getAttribute("id"))?r=r.replace(ut,I):t.setAttribute("id",r=S)),s=(l=p(e)).length;s--;)l[s]=(r?"#"+r:":scope")+" "+P(l[s]);c=l.join(",")}try{if(h.cssSupportsSelector&&!CSS.supports("selector(:is("+c+"))"))throw new Error;return E.apply(i,d.querySelectorAll(c)),i}catch(t){g(e,!0)}finally{r===S&&t.removeAttribute("id")}}}return q(e.replace(y,"$1"),t,i,n)}function O(){var i=[];function n(t,e){return i.push(t+" ")>w.cacheLength&&delete n[i.shift()],n[t+" "]=e}return n}function $(t){return t[S]=!0,t}function M(t){var e=x.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e)}}function pt(t,e){for(var i=t.split("|"),n=i.length;n--;)w.attrHandle[i[n]]=e}function ft(t,e){var i=e&&t,n=i&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(n)return n;if(i)for(;i=i.nextSibling;)if(i===e)return-1;return t?1:-1}function mt(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ht(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function j(r){return $(function(s){return s=+s,$(function(t,e){for(var i,n=r([],t.length,s),o=n.length;o--;)t[i=n[o]]&&(t[i]=!(e[i]=t[i]))})})}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(t in h=L.support={},F=L.isXML=function(t){var e=t&&t.namespaceURI,t=t&&(t.ownerDocument||t).documentElement;return!rt.test(e||t&&t.nodeName||"HTML")},k=L.setDocument=function(t){var t=t?t.ownerDocument||t:d;return t!=x&&9===t.nodeType&&t.documentElement&&(i=(x=t).documentElement,T=!F(x),d!=x&&(t=x.defaultView)&&t.top!==t&&(t.addEventListener?t.addEventListener("unload",H,!1):t.attachEvent&&t.attachEvent("onunload",H)),h.scope=M(function(t){return i.appendChild(t).appendChild(x.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length}),h.cssSupportsSelector=M(function(){return CSS.supports("selector(*)")&&x.querySelectorAll(":is(:jqfake)")&&!CSS.supports("selector(:is(*,:jqfake))")}),h.attributes=M(function(t){return t.className="i",!t.getAttribute("className")}),h.getElementsByTagName=M(function(t){return t.appendChild(x.createComment("")),!t.getElementsByTagName("*").length}),h.getElementsByClassName=D.test(x.getElementsByClassName),h.getById=M(function(t){return i.appendChild(t).id=S,!x.getElementsByName||!x.getElementsByName(S).length}),h.getById?(w.filter.ID=function(t){var e=t.replace(A,u);return function(t){return t.getAttribute("id")===e}},w.find.ID=function(t,e){if(void 0!==e.getElementById&&T)return(e=e.getElementById(t))?[e]:[]}):(w.filter.ID=function(t){var e=t.replace(A,u);return function(t){t=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return t&&t.value===e}},w.find.ID=function(t,e){if(void 0!==e.getElementById&&T){var i,n,o,s=e.getElementById(t);if(s){if((i=s.getAttributeNode("id"))&&i.value===t)return[s];for(o=e.getElementsByName(t),n=0;s=o[n++];)if((i=s.getAttributeNode("id"))&&i.value===t)return[s]}return[]}}),w.find.TAG=h.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):h.qsa?e.querySelectorAll(t):void 0}:function(t,e){var i,n=[],o=0,s=e.getElementsByTagName(t);if("*"!==t)return s;for(;i=s[o++];)1===i.nodeType&&n.push(i);return n},w.find.CLASS=h.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&T)return e.getElementsByClassName(t)},n=[],f=[],(h.qsa=D.test(x.querySelectorAll))&&(M(function(t){var e;i.appendChild(t).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",t.querySelectorAll("[msallowcapture^='']").length&&f.push("[*^$]="+r+"*(?:''|\"\")"),t.querySelectorAll("[selected]").length||f.push("\\["+r+"*(?:value|"+Q+")"),t.querySelectorAll("[id~="+S+"-]").length||f.push("~="),(e=x.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||f.push("\\["+r+"*name"+r+"*="+r+"*(?:''|\"\")"),t.querySelectorAll(":checked").length||f.push(":checked"),t.querySelectorAll("a#"+S+"+*").length||f.push(".#.+[+~]"),t.querySelectorAll("\\\f"),f.push("[\\r\\n\\f]")}),M(function(t){t.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var e=x.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&f.push("name"+r+"*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&f.push(":enabled",":disabled"),i.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&f.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),f.push(",.*:")})),(h.matchesSelector=D.test(o=i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.oMatchesSelector||i.msMatchesSelector))&&M(function(t){h.disconnectedMatch=o.call(t,"*"),o.call(t,"[s!='']:x"),n.push("!=",K)}),h.cssSupportsSelector||f.push(":has"),f=f.length&&new RegExp(f.join("|")),n=n.length&&new RegExp(n.join("|")),t=D.test(i.compareDocumentPosition),m=t||D.test(i.contains)?function(t,e){var i=9===t.nodeType&&t.documentElement||t,e=e&&e.parentNode;return t===e||!(!e||1!==e.nodeType||!(i.contains?i.contains(e):t.compareDocumentPosition&&16&t.compareDocumentPosition(e)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},U=t?function(t,e){var i;return t===e?(c=!0,0):(i=!t.compareDocumentPosition-!e.compareDocumentPosition)||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!h.sortDetached&&e.compareDocumentPosition(t)===i?t==x||t.ownerDocument==d&&m(d,t)?-1:e==x||e.ownerDocument==d&&m(d,e)?1:l?v(l,t)-v(l,e):0:4&i?-1:1)}:function(t,e){if(t===e)return c=!0,0;var i,n=0,o=t.parentNode,s=e.parentNode,r=[t],a=[e];if(!o||!s)return t==x?-1:e==x?1:o?-1:s?1:l?v(l,t)-v(l,e):0;if(o===s)return ft(t,e);for(i=t;i=i.parentNode;)r.unshift(i);for(i=e;i=i.parentNode;)a.unshift(i);for(;r[n]===a[n];)n++;return n?ft(r[n],a[n]):r[n]==d?-1:a[n]==d?1:0}),x},L.matches=function(t,e){return L(t,null,null,e)},L.matchesSelector=function(t,e){if(k(t),h.matchesSelector&&T&&!g[e+" "]&&(!n||!n.test(e))&&(!f||!f.test(e)))try{var i=o.call(t,e);if(i||h.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){g(e,!0)}return 0<L(e,x,null,[t]).length},L.contains=function(t,e){return(t.ownerDocument||t)!=x&&k(t),m(t,e)},L.attr=function(t,e){(t.ownerDocument||t)!=x&&k(t);var i=w.attrHandle[e.toLowerCase()],i=i&&G.call(w.attrHandle,e.toLowerCase())?i(t,e,!T):void 0;return void 0!==i?i:h.attributes||!T?t.getAttribute(e):(i=t.getAttributeNode(e))&&i.specified?i.value:null},L.escape=function(t){return(t+"").replace(ut,I)},L.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},L.uniqueSort=function(t){var e,i=[],n=0,o=0;if(c=!h.detectDuplicates,l=!h.sortStable&&t.slice(0),t.sort(U),c){for(;e=t[o++];)e===t[o]&&(n=i.push(o));for(;n--;)t.splice(i[n],1)}return l=null,t},s=L.getText=function(t){var e,i="",n=0,o=t.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)i+=s(t)}else if(3===o||4===o)return t.nodeValue}else for(;e=t[n++];)i+=s(e);return i},(w=L.selectors={cacheLength:50,createPseudo:$,match:b,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(A,u),t[3]=(t[3]||t[4]||t[5]||"").replace(A,u),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||L.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&L.error(t[0]),t},PSEUDO:function(t){var e,i=!t[6]&&t[2];return b.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":i&&ot.test(i)&&(e=(e=p(i,!0))&&i.indexOf(")",i.length-e)-i.length)&&(t[0]=t[0].slice(0,e),t[2]=i.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(A,u).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=W[t+" "];return e||(e=new RegExp("(^|"+r+")"+t+"("+r+"|$)"))&&W(t,function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")})},ATTR:function(e,i,n){return function(t){t=L.attr(t,e);return null==t?"!="===i:!i||(t+="","="===i?t===n:"!="===i?t!==n:"^="===i?n&&0===t.indexOf(n):"*="===i?n&&-1<t.indexOf(n):"$="===i?n&&t.slice(-n.length)===n:"~="===i?-1<(" "+t.replace(tt," ")+" ").indexOf(n):"|="===i&&(t===n||t.slice(0,n.length+1)===n+"-"))}},CHILD:function(f,t,e,m,g){var y="nth"!==f.slice(0,3),v="last"!==f.slice(-4),b="of-type"===t;return 1===m&&0===g?function(t){return!!t.parentNode}:function(t,e,i){var n,o,s,r,a,l,c=y!=v?"nextSibling":"previousSibling",d=t.parentNode,u=b&&t.nodeName.toLowerCase(),h=!i&&!b,p=!1;if(d){if(y){for(;c;){for(r=t;r=r[c];)if(b?r.nodeName.toLowerCase()===u:1===r.nodeType)return!1;l=c="only"===f&&!l&&"nextSibling"}return!0}if(l=[v?d.firstChild:d.lastChild],v&&h){for(p=(a=(n=(o=(s=(r=d)[S]||(r[S]={}))[r.uniqueID]||(s[r.uniqueID]={}))[f]||[])[0]===C&&n[1])&&n[2],r=a&&d.childNodes[a];r=++a&&r&&r[c]||(p=a=0,l.pop());)if(1===r.nodeType&&++p&&r===t){o[f]=[C,a,p];break}}else if(!1===(p=h?a=(n=(o=(s=(r=t)[S]||(r[S]={}))[r.uniqueID]||(s[r.uniqueID]={}))[f]||[])[0]===C&&n[1]:p))for(;(r=++a&&r&&r[c]||(p=a=0,l.pop()))&&((b?r.nodeName.toLowerCase()!==u:1!==r.nodeType)||!++p||(h&&((o=(s=r[S]||(r[S]={}))[r.uniqueID]||(s[r.uniqueID]={}))[f]=[C,p]),r!==t)););return(p-=g)===m||p%m==0&&0<=p/m}}},PSEUDO:function(t,s){var e,r=w.pseudos[t]||w.setFilters[t.toLowerCase()]||L.error("unsupported pseudo: "+t);return r[S]?r(s):1<r.length?(e=[t,t,"",s],w.setFilters.hasOwnProperty(t.toLowerCase())?$(function(t,e){for(var i,n=r(t,s),o=n.length;o--;)t[i=v(t,n[o])]=!(e[i]=n[o])}):function(t){return r(t,0,e)}):r}},pseudos:{not:$(function(t){var n=[],o=[],a=R(t.replace(y,"$1"));return a[S]?$(function(t,e,i,n){for(var o,s=a(t,null,n,[]),r=t.length;r--;)(o=s[r])&&(t[r]=!(e[r]=o))}):function(t,e,i){return n[0]=t,a(n,null,i,o),n[0]=null,!o.pop()}}),has:$(function(e){return function(t){return 0<L(e,t).length}}),contains:$(function(e){return e=e.replace(A,u),function(t){return-1<(t.textContent||s(t)).indexOf(e)}}),lang:$(function(i){return st.test(i||"")||L.error("unsupported lang: "+i),i=i.replace(A,u).toLowerCase(),function(t){var e;do{if(e=T?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(e=e.toLowerCase())===i||0===e.indexOf(i+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var e=N.location&&N.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===i},focus:function(t){return t===x.activeElement&&(!x.hasFocus||x.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:mt(!1),disabled:mt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!w.pseudos.empty(t)},header:function(t){return lt.test(t.nodeName)},input:function(t){return at.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(t=t.getAttribute("type"))||"text"===t.toLowerCase())},first:j(function(){return[0]}),last:j(function(t,e){return[e-1]}),eq:j(function(t,e,i){return[i<0?i+e:i]}),even:j(function(t,e){for(var i=0;i<e;i+=2)t.push(i);return t}),odd:j(function(t,e){for(var i=1;i<e;i+=2)t.push(i);return t}),lt:j(function(t,e,i){for(var n=i<0?i+e:e<i?e:i;0<=--n;)t.push(n);return t}),gt:j(function(t,e,i){for(var n=i<0?i+e:i;++n<e;)t.push(n);return t})}}).pseudos.nth=w.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})w.pseudos[t]=function(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}(t);for(t in{submit:!0,reset:!0})w.pseudos[t]=function(i){return function(t){var e=t.nodeName.toLowerCase();return("input"===e||"button"===e)&&t.type===i}}(t);function yt(){}function P(t){for(var e=0,i=t.length,n="";e<i;e++)n+=t[e].value;return n}function vt(r,t,e){var a=t.dir,l=t.next,c=l||a,d=e&&"parentNode"===c,u=Y++;return t.first?function(t,e,i){for(;t=t[a];)if(1===t.nodeType||d)return r(t,e,i);return!1}:function(t,e,i){var n,o,s=[C,u];if(i){for(;t=t[a];)if((1===t.nodeType||d)&&r(t,e,i))return!0}else for(;t=t[a];)if(1===t.nodeType||d)if(o=(o=t[S]||(t[S]={}))[t.uniqueID]||(o[t.uniqueID]={}),l&&l===t.nodeName.toLowerCase())t=t[a]||t;else{if((n=o[c])&&n[0]===C&&n[1]===u)return s[2]=n[2];if((o[c]=s)[2]=r(t,e,i))return!0}return!1}}function bt(o){return 1<o.length?function(t,e,i){for(var n=o.length;n--;)if(!o[n](t,e,i))return!1;return!0}:o[0]}function wt(t,e,i,n,o){for(var s,r=[],a=0,l=t.length,c=null!=e;a<l;a++)!(s=t[a])||i&&!i(s,n,o)||(r.push(s),c&&e.push(a));return r}function _t(p,f,m,g,y,t){return g&&!g[S]&&(g=_t(g)),y&&!y[S]&&(y=_t(y,t)),$(function(t,e,i,n){var o,s,r,a=[],l=[],c=e.length,d=t||function(t,e,i){for(var n=0,o=e.length;n<o;n++)L(t,e[n],i);return i}(f||"*",i.nodeType?[i]:i,[]),u=!p||!t&&f?d:wt(d,a,p,i,n),h=m?y||(t?p:c||g)?[]:e:u;if(m&&m(u,h,i,n),g)for(o=wt(h,l),g(o,[],i,n),s=o.length;s--;)(r=o[s])&&(h[l[s]]=!(u[l[s]]=r));if(t){if(y||p){if(y){for(o=[],s=h.length;s--;)(r=h[s])&&o.push(u[s]=r);y(null,h=[],o,n)}for(s=h.length;s--;)(r=h[s])&&-1<(o=y?v(t,r):a[s])&&(t[o]=!(e[o]=r))}}else h=wt(h===e?h.splice(c,h.length):h),y?y(null,e,h,n):E.apply(e,h)})}function kt(g,y){function t(t,e,i,n,o){var s,r,a,l=0,c="0",d=t&&[],u=[],h=_,p=t||b&&w.find.TAG("*",o),f=C+=null==h?1:Math.random()||.1,m=p.length;for(o&&(_=e==x||e||o);c!==m&&null!=(s=p[c]);c++){if(b&&s){for(r=0,e||s.ownerDocument==x||(k(s),i=!T);a=g[r++];)if(a(s,e||x,i)){n.push(s);break}o&&(C=f)}v&&((s=!a&&s)&&l--,t)&&d.push(s)}if(l+=c,v&&c!==l){for(r=0;a=y[r++];)a(d,u,e,i);if(t){if(0<l)for(;c--;)d[c]||u[c]||(u[c]=V.call(n));u=wt(u)}E.apply(n,u),o&&!t&&0<u.length&&1<l+y.length&&L.uniqueSort(n)}return o&&(C=f,_=h),d}var v=0<y.length,b=0<g.length;return v?$(t):t}return yt.prototype=w.filters=w.pseudos,w.setFilters=new yt,p=L.tokenize=function(t,e){var i,n,o,s,r,a,l,c=B[t+" "];if(c)return e?0:c.slice(0);for(r=t,a=[],l=w.preFilter;r;){for(s in i&&!(n=et.exec(r))||(n&&(r=r.slice(n[0].length)||r),a.push(o=[])),i=!1,(n=it.exec(r))&&(i=n.shift(),o.push({value:i,type:n[0].replace(y," ")}),r=r.slice(i.length)),w.filter)!(n=b[s].exec(r))||l[s]&&!(n=l[s](n))||(i=n.shift(),o.push({value:i,type:s,matches:n}),r=r.slice(i.length));if(!i)break}return e?r.length:r?L.error(t):B(t,a).slice(0)},R=L.compile=function(t,e){var i,n=[],o=[],s=z[t+" "];if(!s){for(i=(e=e||p(t)).length;i--;)((s=function t(e){for(var n,i,o,s=e.length,r=w.relative[e[0].type],a=r||w.relative[" "],l=r?1:0,c=vt(function(t){return t===n},a,!0),d=vt(function(t){return-1<v(n,t)},a,!0),u=[function(t,e,i){return t=!r&&(i||e!==_)||((n=e).nodeType?c:d)(t,e,i),n=null,t}];l<s;l++)if(i=w.relative[e[l].type])u=[vt(bt(u),i)];else{if((i=w.filter[e[l].type].apply(null,e[l].matches))[S]){for(o=++l;o<s&&!w.relative[e[o].type];o++);return _t(1<l&&bt(u),1<l&&P(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(y,"$1"),i,l<o&&t(e.slice(l,o)),o<s&&t(e=e.slice(o)),o<s&&P(e))}u.push(i)}return bt(u)}(e[i]))[S]?n:o).push(s);(s=z(t,kt(o,n))).selector=t}return s},q=L.select=function(t,e,i,n){var o,s,r,a,l,c="function"==typeof t&&t,d=!n&&p(t=c.selector||t);if(i=i||[],1===d.length){if(2<(s=d[0]=d[0].slice(0)).length&&"ID"===(r=s[0]).type&&9===e.nodeType&&T&&w.relative[s[1].type]){if(!(e=(w.find.ID(r.matches[0].replace(A,u),e)||[])[0]))return i;c&&(e=e.parentNode),t=t.slice(s.shift().value.length)}for(o=b.needsContext.test(t)?0:s.length;o--&&(r=s[o],!w.relative[a=r.type]);)if((l=w.find[a])&&(n=l(r.matches[0].replace(A,u),dt.test(s[0].type)&>(e.parentNode)||e))){if(s.splice(o,1),t=n.length&&P(s))break;return E.apply(i,n),i}}return(c||R(t,d))(n,e,!T,i,!e||dt.test(t)&>(e.parentNode)||e),i},h.sortStable=S.split("").sort(U).join("")===S,h.detectDuplicates=!!c,k(),h.sortDetached=M(function(t){return 1&t.compareDocumentPosition(x.createElement("fieldset"))}),M(function(t){return t.innerHTML="<a href='#'></a>","#"===t.firstChild.getAttribute("href")})||pt("type|href|height|width",function(t,e,i){if(!i)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)}),h.attributes&&M(function(t){return t.innerHTML="<input/>",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")})||pt("value",function(t,e,i){if(!i&&"input"===t.nodeName.toLowerCase())return t.defaultValue}),M(function(t){return null==t.getAttribute("disabled")})||pt(Q,function(t,e,i){if(!i)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null}),L}(_),Z=(x.find=t,x.expr=t.selectors,x.expr[":"]=x.expr.pseudos,x.uniqueSort=x.unique=t.uniqueSort,x.text=t.getText,x.isXMLDoc=t.isXML,x.contains=t.contains,x.escapeSelector=t.escape,x.expr.match.needsContext);function l(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var Q=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function J(t,i,n){return v(i)?x.grep(t,function(t,e){return!!i.call(t,e,t)!==n}):i.nodeType?x.grep(t,function(t){return t===i!==n}):"string"!=typeof i?x.grep(t,function(t){return-1<R.call(i,t)!==n}):x.filter(i,t,n)}x.filter=function(t,e,i){var n=e[0];return i&&(t=":not("+t+")"),1===e.length&&1===n.nodeType?x.find.matchesSelector(n,t)?[n]:[]:x.find.matches(t,x.grep(e,function(t){return 1===t.nodeType}))},x.fn.extend({find:function(t){var e,i,n=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter(function(){for(e=0;e<n;e++)if(x.contains(o[e],this))return!0}));for(i=this.pushStack([]),e=0;e<n;e++)x.find(t,o[e],i);return 1<n?x.uniqueSort(i):i},filter:function(t){return this.pushStack(J(this,t||[],!1))},not:function(t){return this.pushStack(J(this,t||[],!0))},is:function(t){return!!J(this,"string"==typeof t&&Z.test(t)?x(t):t||[],!1).length}});var K,tt=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,et=((x.fn.init=function(t,e,i){if(t){if(i=i||K,"string"!=typeof t)return t.nodeType?(this[0]=t,this.length=1,this):v(t)?void 0!==i.ready?i.ready(t):t(x):x.makeArray(t,this);if(!(n="<"===t[0]&&">"===t[t.length-1]&&3<=t.length?[null,t,null]:tt.exec(t))||!n[1]&&e)return(!e||e.jquery?e||i:this.constructor(e)).find(t);if(n[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(n[1],e&&e.nodeType?e.ownerDocument||e:k,!0)),Q.test(n[1])&&x.isPlainObject(e))for(var n in e)v(this[n])?this[n](e[n]):this.attr(n,e[n])}else(i=k.getElementById(n[2]))&&(this[0]=i,this.length=1)}return this}).prototype=x.fn,K=x(k),/^(?:parents|prev(?:Until|All))/),it={children:!0,contents:!0,next:!0,prev:!0};function nt(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),i=e.length;return this.filter(function(){for(var t=0;t<i;t++)if(x.contains(this,e[t]))return!0})},closest:function(t,e){var i,n=0,o=this.length,s=[],r="string"!=typeof t&&x(t);if(!Z.test(t))for(;n<o;n++)for(i=this[n];i&&i!==e;i=i.parentNode)if(i.nodeType<11&&(r?-1<r.index(i):1===i.nodeType&&x.find.matchesSelector(i,t))){s.push(i);break}return this.pushStack(1<s.length?x.uniqueSort(s):s)},index:function(t){return t?"string"==typeof t?R.call(x(t),this[0]):R.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){t=t.parentNode;return t&&11!==t.nodeType?t:null},parents:function(t){return n(t,"parentNode")},parentsUntil:function(t,e,i){return n(t,"parentNode",i)},next:function(t){return nt(t,"nextSibling")},prev:function(t){return nt(t,"previousSibling")},nextAll:function(t){return n(t,"nextSibling")},prevAll:function(t){return n(t,"previousSibling")},nextUntil:function(t,e,i){return n(t,"nextSibling",i)},prevUntil:function(t,e,i){return n(t,"previousSibling",i)},siblings:function(t){return X((t.parentNode||{}).firstChild,t)},children:function(t){return X(t.firstChild)},contents:function(t){return null!=t.contentDocument&&I(t.contentDocument)?t.contentDocument:(l(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},function(n,o){x.fn[n]=function(t,e){var i=x.map(this,o,t);return(e="Until"!==n.slice(-5)?t:e)&&"string"==typeof e&&(i=x.filter(e,i)),1<this.length&&(it[n]||x.uniqueSort(i),et.test(n))&&i.reverse(),this.pushStack(i)}});var T=/[^\x20\t\r\n\f]+/g;function d(t){return t}function ot(t){throw t}function st(t,e,i,n){var o;try{t&&v(o=t.promise)?o.call(t).done(e).fail(i):t&&v(o=t.then)?o.call(t,e,i):e.apply(void 0,[t].slice(n))}catch(t){i.apply(void 0,[t])}}x.Callbacks=function(n){var t,i;n="string"==typeof n?(t=n,i={},x.each(t.match(T)||[],function(t,e){i[e]=!0}),i):x.extend({},n);function o(){for(a=a||n.once,r=s=!0;c.length;d=-1)for(e=c.shift();++d<l.length;)!1===l[d].apply(e[0],e[1])&&n.stopOnFalse&&(d=l.length,e=!1);n.memory||(e=!1),s=!1,a&&(l=e?[]:"")}var s,e,r,a,l=[],c=[],d=-1,u={add:function(){return l&&(e&&!s&&(d=l.length-1,c.push(e)),function i(t){x.each(t,function(t,e){v(e)?n.unique&&u.has(e)||l.push(e):e&&e.length&&"string"!==f(e)&&i(e)})}(arguments),e)&&!s&&o(),this},remove:function(){return x.each(arguments,function(t,e){for(var i;-1<(i=x.inArray(e,l,i));)l.splice(i,1),i<=d&&d--}),this},has:function(t){return t?-1<x.inArray(t,l):0<l.length},empty:function(){return l=l&&[],this},disable:function(){return a=c=[],l=e="",this},disabled:function(){return!l},lock:function(){return a=c=[],e||s||(l=e=""),this},locked:function(){return!!a},fireWith:function(t,e){return a||(e=[t,(e=e||[]).slice?e.slice():e],c.push(e),s)||o(),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!r}};return u},x.extend({Deferred:function(t){var s=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],o="pending",r={state:function(){return o},always:function(){return a.done(arguments).fail(arguments),this},catch:function(t){return r.then(null,t)},pipe:function(){var o=arguments;return x.Deferred(function(n){x.each(s,function(t,e){var i=v(o[e[4]])&&o[e[4]];a[e[1]](function(){var t=i&&i.apply(this,arguments);t&&v(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[e[0]+"With"](this,i?[t]:arguments)})}),o=null}).promise()},then:function(e,i,n){var l=0;function c(o,s,r,a){return function(){function t(){var t,e;if(!(o<l)){if((t=r.apply(i,n))===s.promise())throw new TypeError("Thenable self-resolution");e=t&&("object"==typeof t||"function"==typeof t)&&t.then,v(e)?a?e.call(t,c(l,s,d,a),c(l,s,ot,a)):(l++,e.call(t,c(l,s,d,a),c(l,s,ot,a),c(l,s,d,s.notifyWith))):(r!==d&&(i=void 0,n=[t]),(a||s.resolveWith)(i,n))}}var i=this,n=arguments,e=a?t:function(){try{t()}catch(t){x.Deferred.exceptionHook&&x.Deferred.exceptionHook(t,e.stackTrace),l<=o+1&&(r!==ot&&(i=void 0,n=[t]),s.rejectWith(i,n))}};o?e():(x.Deferred.getStackHook&&(e.stackTrace=x.Deferred.getStackHook()),_.setTimeout(e))}}return x.Deferred(function(t){s[0][3].add(c(0,t,v(n)?n:d,t.notifyWith)),s[1][3].add(c(0,t,v(e)?e:d)),s[2][3].add(c(0,t,v(i)?i:ot))}).promise()},promise:function(t){return null!=t?x.extend(t,r):r}},a={};return x.each(s,function(t,e){var i=e[2],n=e[5];r[e[1]]=i.add,n&&i.add(function(){o=n},s[3-t][2].disable,s[3-t][3].disable,s[0][2].lock,s[0][3].lock),i.add(e[3].fire),a[e[0]]=function(){return a[e[0]+"With"](this===a?void 0:this,arguments),this},a[e[0]+"With"]=i.fireWith}),r.promise(a),t&&t.call(a,a),a},when:function(t){function e(e){return function(t){o[e]=this,s[e]=1<arguments.length?a.call(arguments):t,--i||r.resolveWith(o,s)}}var i=arguments.length,n=i,o=Array(n),s=a.call(arguments),r=x.Deferred();if(i<=1&&(st(t,r.done(e(n)).resolve,r.reject,!i),"pending"===r.state()||v(s[n]&&s[n].then)))return r.then();for(;n--;)st(s[n],e(n),r.reject);return r.promise()}});var rt=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/,at=(x.Deferred.exceptionHook=function(t,e){_.console&&_.console.warn&&t&&rt.test(t.name)&&_.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){_.setTimeout(function(){throw t})},x.Deferred());function lt(){k.removeEventListener("DOMContentLoaded",lt),_.removeEventListener("load",lt),x.ready()}x.fn.ready=function(t){return at.then(t).catch(function(t){x.readyException(t)}),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0)!==t&&0<--x.readyWait||at.resolveWith(k,[x])}}),x.ready.then=at.then,"complete"===k.readyState||"loading"!==k.readyState&&!k.documentElement.doScroll?_.setTimeout(x.ready):(k.addEventListener("DOMContentLoaded",lt),_.addEventListener("load",lt));function u(t,e,i,n,o,s,r){var a=0,l=t.length,c=null==i;if("object"===f(i))for(a in o=!0,i)u(t,e,a,i[a],!0,s,r);else if(void 0!==n&&(o=!0,v(n)||(r=!0),e=c?r?(e.call(t,n),null):(c=e,function(t,e,i){return c.call(x(t),i)}):e))for(;a<l;a++)e(t[a],i,r?n:n.call(t[a],a,e(t[a],i)));return o?t:c?e.call(t):l?e(t[0],i):s}var ct=/^-ms-/,dt=/-([a-z])/g;function ut(t,e){return e.toUpperCase()}function b(t){return t.replace(ct,"ms-").replace(dt,ut)}function y(t){return 1===t.nodeType||9===t.nodeType||!+t.nodeType}function ht(){this.expando=x.expando+ht.uid++}ht.uid=1,ht.prototype={cache:function(t){var e=t[this.expando];return e||(e={},y(t)&&(t.nodeType?t[this.expando]=e:Object.defineProperty(t,this.expando,{value:e,configurable:!0}))),e},set:function(t,e,i){var n,o=this.cache(t);if("string"==typeof e)o[b(e)]=i;else for(n in e)o[b(n)]=e[n];return o},get:function(t,e){return void 0===e?this.cache(t):t[this.expando]&&t[this.expando][b(e)]},access:function(t,e,i){return void 0===e||e&&"string"==typeof e&&void 0===i?this.get(t,e):(this.set(t,e,i),void 0!==i?i:e)},remove:function(t,e){var i,n=t[this.expando];if(void 0!==n){if(void 0!==e){i=(e=Array.isArray(e)?e.map(b):(e=b(e))in n?[e]:e.match(T)||[]).length;for(;i--;)delete n[e[i]]}void 0!==e&&!x.isEmptyObject(n)||(t.nodeType?t[this.expando]=void 0:delete t[this.expando])}},hasData:function(t){t=t[this.expando];return void 0!==t&&!x.isEmptyObject(t)}};var w=new ht,c=new ht,pt=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,ft=/[A-Z]/g;function mt(t,e,i){var n,o;if(void 0===i&&1===t.nodeType)if(n="data-"+e.replace(ft,"-$&").toLowerCase(),"string"==typeof(i=t.getAttribute(n))){try{i="true"===(o=i)||"false"!==o&&("null"===o?null:o===+o+""?+o:pt.test(o)?JSON.parse(o):o)}catch(t){}c.set(t,e,i)}else i=void 0;return i}x.extend({hasData:function(t){return c.hasData(t)||w.hasData(t)},data:function(t,e,i){return c.access(t,e,i)},removeData:function(t,e){c.remove(t,e)},_data:function(t,e,i){return w.access(t,e,i)},_removeData:function(t,e){w.remove(t,e)}}),x.fn.extend({data:function(i,t){var e,n,o,s=this[0],r=s&&s.attributes;if(void 0!==i)return"object"==typeof i?this.each(function(){c.set(this,i)}):u(this,function(t){var e;if(s&&void 0===t)return void 0!==(e=c.get(s,i))||void 0!==(e=mt(s,i))?e:void 0;this.each(function(){c.set(this,i,t)})},null,t,1<arguments.length,null,!0);if(this.length&&(o=c.get(s),1===s.nodeType)&&!w.get(s,"hasDataAttrs")){for(e=r.length;e--;)r[e]&&0===(n=r[e].name).indexOf("data-")&&(n=b(n.slice(5)),mt(s,n,o[n]));w.set(s,"hasDataAttrs",!0)}return o},removeData:function(t){return this.each(function(){c.remove(this,t)})}}),x.extend({queue:function(t,e,i){var n;if(t)return n=w.get(t,e=(e||"fx")+"queue"),i&&(!n||Array.isArray(i)?n=w.access(t,e,x.makeArray(i)):n.push(i)),n||[]},dequeue:function(t,e){e=e||"fx";var i=x.queue(t,e),n=i.length,o=i.shift(),s=x._queueHooks(t,e);"inprogress"===o&&(o=i.shift(),n--),o&&("fx"===e&&i.unshift("inprogress"),delete s.stop,o.call(t,function(){x.dequeue(t,e)},s)),!n&&s&&s.empty.fire()},_queueHooks:function(t,e){var i=e+"queueHooks";return w.get(t,i)||w.access(t,i,{empty:x.Callbacks("once memory").add(function(){w.remove(t,[e+"queue",i])})})}}),x.fn.extend({queue:function(e,i){var t=2;return"string"!=typeof e&&(i=e,e="fx",t--),arguments.length<t?x.queue(this[0],e):void 0===i?this:this.each(function(){var t=x.queue(this,e,i);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(t){return this.each(function(){x.dequeue(this,t)})},clearQueue:function(t){return this.queue(t||"fx",[])},promise:function(t,e){function i(){--o||s.resolveWith(r,[r])}var n,o=1,s=x.Deferred(),r=this,a=this.length;for("string"!=typeof t&&(e=t,t=void 0),t=t||"fx";a--;)(n=w.get(r[a],t+"queueHooks"))&&n.empty&&(o++,n.empty.add(i));return i(),s.promise(e)}});function gt(t,e){return"none"===(t=e||t).style.display||""===t.style.display&&C(t)&&"none"===x.css(t,"display")}var t=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,yt=new RegExp("^(?:([+-])=|)("+t+")([a-z%]*)$","i"),h=["Top","Right","Bottom","Left"],S=k.documentElement,C=function(t){return x.contains(t.ownerDocument,t)},vt={composed:!0};S.getRootNode&&(C=function(t){return x.contains(t.ownerDocument,t)||t.getRootNode(vt)===t.ownerDocument});function bt(t,e,i,n){var o,s,r=20,a=n?function(){return n.cur()}:function(){return x.css(t,e,"")},l=a(),c=i&&i[3]||(x.cssNumber[e]?"":"px"),d=t.nodeType&&(x.cssNumber[e]||"px"!==c&&+l)&&yt.exec(x.css(t,e));if(d&&d[3]!==c){for(c=c||d[3],d=+(l/=2)||1;r--;)x.style(t,e,d+c),(1-s)*(1-(s=a()/l||.5))<=0&&(r=0),d/=s;x.style(t,e,(d*=2)+c),i=i||[]}return i&&(d=+d||+l||0,o=i[1]?d+(i[1]+1)*i[2]:+i[2],n)&&(n.unit=c,n.start=d,n.end=o),o}var wt={};function E(t,e){for(var i,n,o,s,r,a=[],l=0,c=t.length;l<c;l++)(n=t[l]).style&&(i=n.style.display,e?("none"===i&&(a[l]=w.get(n,"display")||null,a[l]||(n.style.display="")),""===n.style.display&>(n)&&(a[l]=(r=s=void 0,s=(o=n).ownerDocument,o=o.nodeName,(r=wt[o])||(s=s.body.appendChild(s.createElement(o)),r=x.css(s,"display"),s.parentNode.removeChild(s),wt[o]=r="none"===r?"block":r),r))):"none"!==i&&(a[l]="none",w.set(n,"display",i)));for(l=0;l<c;l++)null!=a[l]&&(t[l].style.display=a[l]);return t}x.fn.extend({show:function(){return E(this,!0)},hide:function(){return E(this)},toggle:function(t){return"boolean"==typeof t?t?this.show():this.hide():this.each(function(){gt(this)?x(this).show():x(this).hide()})}});var _t=/^(?:checkbox|radio)$/i,kt=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,xt=/^$|^module$|\/(?:java|ecma)script/i,D=($=k.createDocumentFragment().appendChild(k.createElement("div")),(s=k.createElement("input")).setAttribute("type","radio"),s.setAttribute("checked","checked"),s.setAttribute("name","t"),$.appendChild(s),g.checkClone=$.cloneNode(!0).cloneNode(!0).lastChild.checked,$.innerHTML="<textarea>x</textarea>",g.noCloneChecked=!!$.cloneNode(!0).lastChild.defaultValue,$.innerHTML="<option></option>",g.option=!!$.lastChild,{thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]});function A(t,e){var i=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[];return void 0===e||e&&l(t,e)?x.merge([t],i):i}function Tt(t,e){for(var i=0,n=t.length;i<n;i++)w.set(t[i],"globalEval",!e||w.get(e[i],"globalEval"))}D.tbody=D.tfoot=D.colgroup=D.caption=D.thead,D.th=D.td,g.option||(D.optgroup=D.option=[1,"<select multiple='multiple'>","</select>"]);var St=/<|&#?\w+;/;function Ct(t,e,i,n,o){for(var s,r,a,l,c,d=e.createDocumentFragment(),u=[],h=0,p=t.length;h<p;h++)if((s=t[h])||0===s)if("object"===f(s))x.merge(u,s.nodeType?[s]:s);else if(St.test(s)){for(r=r||d.appendChild(e.createElement("div")),a=(kt.exec(s)||["",""])[1].toLowerCase(),a=D[a]||D._default,r.innerHTML=a[1]+x.htmlPrefilter(s)+a[2],c=a[0];c--;)r=r.lastChild;x.merge(u,r.childNodes),(r=d.firstChild).textContent=""}else u.push(e.createTextNode(s));for(d.textContent="",h=0;s=u[h++];)if(n&&-1<x.inArray(s,n))o&&o.push(s);else if(l=C(s),r=A(d.appendChild(s),"script"),l&&Tt(r),i)for(c=0;s=r[c++];)xt.test(s.type||"")&&i.push(s);return d}var Et=/^([^.]*)(?:\.(.+)|)/;function i(){return!0}function p(){return!1}function Dt(t,e){return t===function(){try{return k.activeElement}catch(t){}}()==("focus"===e)}function At(t,e,i,n,o,s){var r,a;if("object"==typeof e){for(a in"string"!=typeof i&&(n=n||i,i=void 0),e)At(t,a,i,n,e[a],s);return t}if(null==n&&null==o?(o=i,n=i=void 0):null==o&&("string"==typeof i?(o=n,n=void 0):(o=n,n=i,i=void 0)),!1===o)o=p;else if(!o)return t;return 1===s&&(r=o,(o=function(t){return x().off(t),r.apply(this,arguments)}).guid=r.guid||(r.guid=x.guid++)),t.each(function(){x.event.add(this,e,o,n,i)})}function Lt(t,o,s){s?(w.set(t,o,!1),x.event.add(t,o,{namespace:!1,handler:function(t){var e,i,n=w.get(this,o);if(1&t.isTrigger&&this[o]){if(n.length)(x.event.special[o]||{}).delegateType&&t.stopPropagation();else if(n=a.call(arguments),w.set(this,o,n),e=s(this,o),this[o](),n!==(i=w.get(this,o))||e?w.set(this,o,!1):i={},n!==i)return t.stopImmediatePropagation(),t.preventDefault(),i&&i.value}else n.length&&(w.set(this,o,{value:x.event.trigger(x.extend(n[0],x.Event.prototype),n.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===w.get(t,o)&&x.event.add(t,o,i)}x.event={global:{},add:function(e,t,i,n,o){var s,r,a,l,c,d,u,h,p,f=w.get(e);if(y(e))for(i.handler&&(i=(s=i).handler,o=s.selector),o&&x.find.matchesSelector(S,o),i.guid||(i.guid=x.guid++),a=(a=f.events)||(f.events=Object.create(null)),r=(r=f.handle)||(f.handle=function(t){return void 0!==x&&x.event.triggered!==t.type?x.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(T)||[""]).length;l--;)u=p=(h=Et.exec(t[l])||[])[1],h=(h[2]||"").split(".").sort(),u&&(c=x.event.special[u]||{},u=(o?c.delegateType:c.bindType)||u,c=x.event.special[u]||{},p=x.extend({type:u,origType:p,data:n,handler:i,guid:i.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:h.join(".")},s),(d=a[u])||((d=a[u]=[]).delegateCount=0,c.setup&&!1!==c.setup.call(e,n,h,r))||e.addEventListener&&e.addEventListener(u,r),c.add&&(c.add.call(e,p),p.handler.guid||(p.handler.guid=i.guid)),o?d.splice(d.delegateCount++,0,p):d.push(p),x.event.global[u]=!0)},remove:function(t,e,i,n,o){var s,r,a,l,c,d,u,h,p,f,m,g=w.hasData(t)&&w.get(t);if(g&&(l=g.events)){for(c=(e=(e||"").match(T)||[""]).length;c--;)if(p=m=(a=Et.exec(e[c])||[])[1],f=(a[2]||"").split(".").sort(),p){for(u=x.event.special[p]||{},h=l[p=(n?u.delegateType:u.bindType)||p]||[],a=a[2]&&new RegExp("(^|\\.)"+f.join("\\.(?:.*\\.|)")+"(\\.|$)"),r=s=h.length;s--;)d=h[s],!o&&m!==d.origType||i&&i.guid!==d.guid||a&&!a.test(d.namespace)||n&&n!==d.selector&&("**"!==n||!d.selector)||(h.splice(s,1),d.selector&&h.delegateCount--,u.remove&&u.remove.call(t,d));r&&!h.length&&(u.teardown&&!1!==u.teardown.call(t,f,g.handle)||x.removeEvent(t,p,g.handle),delete l[p])}else for(p in l)x.event.remove(t,p+e[c],i,n,!0);x.isEmptyObject(l)&&w.remove(t,"handle events")}},dispatch:function(t){var e,i,n,o,s,r=new Array(arguments.length),a=x.event.fix(t),t=(w.get(this,"events")||Object.create(null))[a.type]||[],l=x.event.special[a.type]||{};for(r[0]=a,e=1;e<arguments.length;e++)r[e]=arguments[e];if(a.delegateTarget=this,!l.preDispatch||!1!==l.preDispatch.call(this,a)){for(s=x.event.handlers.call(this,a,t),e=0;(n=s[e++])&&!a.isPropagationStopped();)for(a.currentTarget=n.elem,i=0;(o=n.handlers[i++])&&!a.isImmediatePropagationStopped();)a.rnamespace&&!1!==o.namespace&&!a.rnamespace.test(o.namespace)||(a.handleObj=o,a.data=o.data,void 0!==(o=((x.event.special[o.origType]||{}).handle||o.handler).apply(n.elem,r))&&!1===(a.result=o)&&(a.preventDefault(),a.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,a),a.result}},handlers:function(t,e){var i,n,o,s,r,a=[],l=e.delegateCount,c=t.target;if(l&&c.nodeType&&!("click"===t.type&&1<=t.button))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==t.type||!0!==c.disabled)){for(s=[],r={},i=0;i<l;i++)void 0===r[o=(n=e[i]).selector+" "]&&(r[o]=n.needsContext?-1<x(o,this).index(c):x.find(o,this,null,[c]).length),r[o]&&s.push(n);s.length&&a.push({elem:c,handlers:s})}return c=this,l<e.length&&a.push({elem:c,handlers:e.slice(l)}),a},addProp:function(e,t){Object.defineProperty(x.Event.prototype,e,{enumerable:!0,configurable:!0,get:v(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(t){return t[x.expando]?t:new x.Event(t)},special:{load:{noBubble:!0},click:{setup:function(t){t=this||t;return _t.test(t.type)&&t.click&&l(t,"input")&&Lt(t,"click",i),!1},trigger:function(t){t=this||t;return _t.test(t.type)&&t.click&&l(t,"input")&&Lt(t,"click"),!0},_default:function(t){t=t.target;return _t.test(t.type)&&t.click&&l(t,"input")&&w.get(t,"click")||l(t,"a")}},beforeunload:{postDispatch:function(t){void 0!==t.result&&t.originalEvent&&(t.originalEvent.returnValue=t.result)}}}},x.removeEvent=function(t,e,i){t.removeEventListener&&t.removeEventListener(e,i)},x.Event=function(t,e){if(!(this instanceof x.Event))return new x.Event(t,e);t&&t.type?(this.originalEvent=t,this.type=t.type,this.isDefaultPrevented=t.defaultPrevented||void 0===t.defaultPrevented&&!1===t.returnValue?i:p,this.target=t.target&&3===t.target.nodeType?t.target.parentNode:t.target,this.currentTarget=t.currentTarget,this.relatedTarget=t.relatedTarget):this.type=t,e&&x.extend(this,e),this.timeStamp=t&&t.timeStamp||Date.now(),this[x.expando]=!0},x.Event.prototype={constructor:x.Event,isDefaultPrevented:p,isPropagationStopped:p,isImmediatePropagationStopped:p,isSimulated:!1,preventDefault:function(){var t=this.originalEvent;this.isDefaultPrevented=i,t&&!this.isSimulated&&t.preventDefault()},stopPropagation:function(){var t=this.originalEvent;this.isPropagationStopped=i,t&&!this.isSimulated&&t.stopPropagation()},stopImmediatePropagation:function(){var t=this.originalEvent;this.isImmediatePropagationStopped=i,t&&!this.isSimulated&&t.stopImmediatePropagation(),this.stopPropagation()}},x.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},x.event.addProp),x.each({focus:"focusin",blur:"focusout"},function(e,t){x.event.special[e]={setup:function(){return Lt(this,e,Dt),!1},trigger:function(){return Lt(this,e),!0},_default:function(t){return w.get(t.target,e)},delegateType:t}}),x.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(t,o){x.event.special[t]={delegateType:o,bindType:o,handle:function(t){var e,i=t.relatedTarget,n=t.handleObj;return i&&(i===this||x.contains(this,i))||(t.type=n.origType,e=n.handler.apply(this,arguments),t.type=o),e}}}),x.fn.extend({on:function(t,e,i,n){return At(this,t,e,i,n)},one:function(t,e,i,n){return At(this,t,e,i,n,1)},off:function(t,e,i){var n,o;if(t&&t.preventDefault&&t.handleObj)n=t.handleObj,x(t.delegateTarget).off(n.namespace?n.origType+"."+n.namespace:n.origType,n.selector,n.handler);else{if("object"!=typeof t)return!1!==e&&"function"!=typeof e||(i=e,e=void 0),!1===i&&(i=p),this.each(function(){x.event.remove(this,t,i,e)});for(o in t)this.off(o,e,t[o])}return this}});var Ot=/<script|<style|<link/i,$t=/checked\s*(?:[^=]|=\s*.checked.)/i,Mt=/^\s*<!\[CDATA\[|\]\]>\s*$/g;function jt(t,e){return l(t,"table")&&l(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Nt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function It(t,e){var i,n,o,s;if(1===e.nodeType){if(w.hasData(t)&&(s=w.get(t).events))for(o in w.remove(e,"handle events"),s)for(i=0,n=s[o].length;i<n;i++)x.event.add(e,o,s[o][i]);c.hasData(t)&&(t=c.access(t),t=x.extend({},t),c.set(e,t))}}function L(i,n,o,s){n=H(n);var t,e,r,a,l,c,d=0,u=i.length,h=u-1,p=n[0],f=v(p);if(f||1<u&&"string"==typeof p&&!g.checkClone&&$t.test(p))return i.each(function(t){var e=i.eq(t);f&&(n[0]=p.call(this,t,e.html())),L(e,n,o,s)});if(u&&(e=(t=Ct(n,i[0].ownerDocument,!1,i,s)).firstChild,1===t.childNodes.length&&(t=e),e||s)){for(a=(r=x.map(A(t,"script"),Pt)).length;d<u;d++)l=t,d!==h&&(l=x.clone(l,!0,!0),a)&&x.merge(r,A(l,"script")),o.call(i[d],l,d);if(a)for(c=r[r.length-1].ownerDocument,x.map(r,Nt),d=0;d<a;d++)l=r[d],xt.test(l.type||"")&&!w.access(l,"globalEval")&&x.contains(c,l)&&(l.src&&"module"!==(l.type||"").toLowerCase()?x._evalUrl&&!l.noModule&&x._evalUrl(l.src,{nonce:l.nonce||l.getAttribute("nonce")},c):G(l.textContent.replace(Mt,""),l,c))}return i}function Ht(t,e,i){for(var n,o=e?x.filter(e,t):t,s=0;null!=(n=o[s]);s++)i||1!==n.nodeType||x.cleanData(A(n)),n.parentNode&&(i&&C(n)&&Tt(A(n,"script")),n.parentNode.removeChild(n));return t}x.extend({htmlPrefilter:function(t){return t},clone:function(t,e,i){var n,o,s,r,a,l,c,d=t.cloneNode(!0),u=C(t);if(!(g.noCloneChecked||1!==t.nodeType&&11!==t.nodeType||x.isXMLDoc(t)))for(r=A(d),n=0,o=(s=A(t)).length;n<o;n++)a=s[n],l=r[n],c=void 0,"input"===(c=l.nodeName.toLowerCase())&&_t.test(a.type)?l.checked=a.checked:"input"!==c&&"textarea"!==c||(l.defaultValue=a.defaultValue);if(e)if(i)for(s=s||A(t),r=r||A(d),n=0,o=s.length;n<o;n++)It(s[n],r[n]);else It(t,d);return 0<(r=A(d,"script")).length&&Tt(r,!u&&A(t,"script")),d},cleanData:function(t){for(var e,i,n,o=x.event.special,s=0;void 0!==(i=t[s]);s++)if(y(i)){if(e=i[w.expando]){if(e.events)for(n in e.events)o[n]?x.event.remove(i,n):x.removeEvent(i,n,e.handle);i[w.expando]=void 0}i[c.expando]&&(i[c.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Ht(this,t,!0)},remove:function(t){return Ht(this,t)},text:function(t){return u(this,function(t){return void 0===t?x.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)})},null,t,arguments.length)},append:function(){return L(this,arguments,function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||jt(this,t).appendChild(t)})},prepend:function(){return L(this,arguments,function(t){var e;1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(e=jt(this,t)).insertBefore(t,e.firstChild)})},before:function(){return L(this,arguments,function(t){this.parentNode&&this.parentNode.insertBefore(t,this)})},after:function(){return L(this,arguments,function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)})},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(A(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map(function(){return x.clone(this,t,e)})},html:function(t){return u(this,function(t){var e=this[0]||{},i=0,n=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ot.test(t)&&!D[(kt.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;i<n;i++)1===(e=this[i]||{}).nodeType&&(x.cleanData(A(e,!1)),e.innerHTML=t);e=0}catch(t){}}e&&this.empty().append(t)},null,t,arguments.length)},replaceWith:function(){var i=[];return L(this,arguments,function(t){var e=this.parentNode;x.inArray(this,i)<0&&(x.cleanData(A(this)),e)&&e.replaceChild(t,this)},i)}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(t,r){x.fn[t]=function(t){for(var e,i=[],n=x(t),o=n.length-1,s=0;s<=o;s++)e=s===o?this:this.clone(!0),x(n[s])[r](e),F.apply(i,e.get());return this.pushStack(i)}});function Ft(t){var e=t.ownerDocument.defaultView;return(e=e&&e.opener?e:_).getComputedStyle(t)}function Rt(t,e,i){var n,o={};for(n in e)o[n]=t.style[n],t.style[n]=e[n];for(n in i=i.call(t),e)t.style[n]=o[n];return i}var qt,Yt,Wt,Bt,zt,Ut,Gt,o,Vt=new RegExp("^("+t+")(?!px)[a-z%]+$","i"),Xt=/^--/,Zt=new RegExp(h.join("|"),"i"),s="[\\x20\\t\\r\\n\\f]",Qt=new RegExp("^"+s+"+|((?:^|[^\\\\])(?:\\\\.)*)"+s+"+$","g");function Jt(){var t;o&&(Gt.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",o.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",S.appendChild(Gt).appendChild(o),t=_.getComputedStyle(o),qt="1%"!==t.top,Ut=12===Kt(t.marginLeft),o.style.right="60%",Bt=36===Kt(t.right),Yt=36===Kt(t.width),o.style.position="absolute",Wt=12===Kt(o.offsetWidth/3),S.removeChild(Gt),o=null)}function Kt(t){return Math.round(parseFloat(t))}function te(t,e,i){var n,o=Xt.test(e),s=t.style;return(i=i||Ft(t))&&(n=i.getPropertyValue(e)||i[e],""!==(n=o?n&&(n.replace(Qt,"$1")||void 0):n)||C(t)||(n=x.style(t,e)),!g.pixelBoxStyles())&&Vt.test(n)&&Zt.test(e)&&(o=s.width,t=s.minWidth,e=s.maxWidth,s.minWidth=s.maxWidth=s.width=n,n=i.width,s.width=o,s.minWidth=t,s.maxWidth=e),void 0!==n?n+"":n}function ee(t,e){return{get:function(){if(!t())return(this.get=e).apply(this,arguments);delete this.get}}}Gt=k.createElement("div"),(o=k.createElement("div")).style&&(o.style.backgroundClip="content-box",o.cloneNode(!0).style.backgroundClip="",g.clearCloneStyle="content-box"===o.style.backgroundClip,x.extend(g,{boxSizingReliable:function(){return Jt(),Yt},pixelBoxStyles:function(){return Jt(),Bt},pixelPosition:function(){return Jt(),qt},reliableMarginLeft:function(){return Jt(),Ut},scrollboxSize:function(){return Jt(),Wt},reliableTrDimensions:function(){var t,e,i;return null==zt&&(t=k.createElement("table"),e=k.createElement("tr"),i=k.createElement("div"),t.style.cssText="position:absolute;left:-11111px;border-collapse:separate",e.style.cssText="border:1px solid",e.style.height="1px",i.style.height="9px",i.style.display="block",S.appendChild(t).appendChild(e).appendChild(i),i=_.getComputedStyle(e),zt=parseInt(i.height,10)+parseInt(i.borderTopWidth,10)+parseInt(i.borderBottomWidth,10)===e.offsetHeight,S.removeChild(t)),zt}}));var ie=["Webkit","Moz","ms"],ne=k.createElement("div").style,oe={};function se(t){var e=x.cssProps[t]||oe[t];return e||(t in ne?t:oe[t]=function(t){for(var e=t[0].toUpperCase()+t.slice(1),i=ie.length;i--;)if((t=ie[i]+e)in ne)return t}(t)||t)}var re=/^(none|table(?!-c[ea]).+)/,ae={position:"absolute",visibility:"hidden",display:"block"},le={letterSpacing:"0",fontWeight:"400"};function ce(t,e,i){var n=yt.exec(e);return n?Math.max(0,n[2]-(i||0))+(n[3]||"px"):e}function de(t,e,i,n,o,s){var r="width"===e?1:0,a=0,l=0;if(i===(n?"border":"content"))return 0;for(;r<4;r+=2)"margin"===i&&(l+=x.css(t,i+h[r],!0,o)),n?("content"===i&&(l-=x.css(t,"padding"+h[r],!0,o)),"margin"!==i&&(l-=x.css(t,"border"+h[r]+"Width",!0,o))):(l+=x.css(t,"padding"+h[r],!0,o),"padding"!==i?l+=x.css(t,"border"+h[r]+"Width",!0,o):a+=x.css(t,"border"+h[r]+"Width",!0,o));return!n&&0<=s&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-s-l-a-.5))||0),l}function ue(t,e,i){var n=Ft(t),o=(!g.boxSizingReliable()||i)&&"border-box"===x.css(t,"boxSizing",!1,n),s=o,r=te(t,e,n),a="offset"+e[0].toUpperCase()+e.slice(1);if(Vt.test(r)){if(!i)return r;r="auto"}return(!g.boxSizingReliable()&&o||!g.reliableTrDimensions()&&l(t,"tr")||"auto"===r||!parseFloat(r)&&"inline"===x.css(t,"display",!1,n))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,n),s=a in t)&&(r=t[a]),(r=parseFloat(r)||0)+de(t,e,i||(o?"border":"content"),s,n,r)+"px"}function r(t,e,i,n,o){return new r.prototype.init(t,e,i,n,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e)return""===(e=te(t,"opacity"))?"1":e}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,i,n){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,s,r,a=b(e),l=Xt.test(e),c=t.style;if(l||(e=se(a)),r=x.cssHooks[e]||x.cssHooks[a],void 0===i)return r&&"get"in r&&void 0!==(o=r.get(t,!1,n))?o:c[e];"string"===(s=typeof i)&&(o=yt.exec(i))&&o[1]&&(i=bt(t,e,o),s="number"),null==i||i!=i||("number"!==s||l||(i+=o&&o[3]||(x.cssNumber[a]?"":"px")),g.clearCloneStyle||""!==i||0!==e.indexOf("background")||(c[e]="inherit"),r&&"set"in r&&void 0===(i=r.set(t,i,n)))||(l?c.setProperty(e,i):c[e]=i)}},css:function(t,e,i,n){var o,s=b(e);return Xt.test(e)||(e=se(s)),"normal"===(o=void 0===(o=(s=x.cssHooks[e]||x.cssHooks[s])&&"get"in s?s.get(t,!0,i):o)?te(t,e,n):o)&&e in le&&(o=le[e]),(""===i||i)&&(s=parseFloat(o),!0===i||isFinite(s))?s||0:o}}),x.each(["height","width"],function(t,r){x.cssHooks[r]={get:function(t,e,i){if(e)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ue(t,r,i):Rt(t,ae,function(){return ue(t,r,i)})},set:function(t,e,i){var n=Ft(t),o=!g.scrollboxSize()&&"absolute"===n.position,s=(o||i)&&"border-box"===x.css(t,"boxSizing",!1,n),i=i?de(t,r,i,s,n):0;return s&&o&&(i-=Math.ceil(t["offset"+r[0].toUpperCase()+r.slice(1)]-parseFloat(n[r])-de(t,r,"border",!1,n)-.5)),i&&(s=yt.exec(e))&&"px"!==(s[3]||"px")&&(t.style[r]=e,e=x.css(t,r)),ce(0,e,i)}}}),x.cssHooks.marginLeft=ee(g.reliableMarginLeft,function(t,e){if(e)return(parseFloat(te(t,"marginLeft"))||t.getBoundingClientRect().left-Rt(t,{marginLeft:0},function(){return t.getBoundingClientRect().left}))+"px"}),x.each({margin:"",padding:"",border:"Width"},function(o,s){x.cssHooks[o+s]={expand:function(t){for(var e=0,i={},n="string"==typeof t?t.split(" "):[t];e<4;e++)i[o+h[e]+s]=n[e]||n[e-2]||n[0];return i}},"margin"!==o&&(x.cssHooks[o+s].set=ce)}),x.fn.extend({css:function(t,e){return u(this,function(t,e,i){var n,o,s={},r=0;if(Array.isArray(e)){for(n=Ft(t),o=e.length;r<o;r++)s[e[r]]=x.css(t,e[r],!1,n);return s}return void 0!==i?x.style(t,e,i):x.css(t,e)},t,e,1<arguments.length)}}),((x.Tween=r).prototype={constructor:r,init:function(t,e,i,n,o,s){this.elem=t,this.prop=i,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=n,this.unit=s||(x.cssNumber[i]?"":"px")},cur:function(){var t=r.propHooks[this.prop];return(t&&t.get?t:r.propHooks._default).get(this)},run:function(t){var e,i=r.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),(i&&i.set?i:r.propHooks._default).set(this),this}}).init.prototype=r.prototype,(r.propHooks={_default:{get:function(t){return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(t=x.css(t.elem,t.prop,""))&&"auto"!==t?t:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[se(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}}).scrollTop=r.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=r.prototype.init,x.fx.step={};var O,he,$,pe=/^(?:toggle|show|hide)$/,fe=/queueHooks$/;function me(){he&&(!1===k.hidden&&_.requestAnimationFrame?_.requestAnimationFrame(me):_.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return _.setTimeout(function(){O=void 0}),O=Date.now()}function ye(t,e){var i,n=0,o={height:t};for(e=e?1:0;n<4;n+=2-e)o["margin"+(i=h[n])]=o["padding"+i]=t;return e&&(o.opacity=o.width=t),o}function ve(t,e,i){for(var n,o=(M.tweeners[e]||[]).concat(M.tweeners["*"]),s=0,r=o.length;s<r;s++)if(n=o[s].call(i,e,t))return n}function M(o,t,e){var i,s,n,r,a,l,c,d=0,u=M.prefilters.length,h=x.Deferred().always(function(){delete p.elem}),p=function(){if(!s){for(var t=O||ge(),t=Math.max(0,f.startTime+f.duration-t),e=1-(t/f.duration||0),i=0,n=f.tweens.length;i<n;i++)f.tweens[i].run(e);if(h.notifyWith(o,[f,e,t]),e<1&&n)return t;n||h.notifyWith(o,[f,1,0]),h.resolveWith(o,[f])}return!1},f=h.promise({elem:o,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{},easing:x.easing._default},e),originalProperties:t,originalOptions:e,startTime:O||ge(),duration:e.duration,tweens:[],createTween:function(t,e){e=x.Tween(o,f.opts,t,e,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(e),e},stop:function(t){var e=0,i=t?f.tweens.length:0;if(!s){for(s=!0;e<i;e++)f.tweens[e].run(1);t?(h.notifyWith(o,[f,1,0]),h.resolveWith(o,[f,t])):h.rejectWith(o,[f,t])}return this}}),m=f.props,g=m,y=f.opts.specialEasing;for(n in g)if(a=y[r=b(n)],l=g[n],Array.isArray(l)&&(a=l[1],l=g[n]=l[0]),n!==r&&(g[r]=l,delete g[n]),(c=x.cssHooks[r])&&"expand"in c)for(n in l=c.expand(l),delete g[r],l)n in g||(g[n]=l[n],y[n]=a);else y[r]=a;for(;d<u;d++)if(i=M.prefilters[d].call(f,o,m,f.opts))return v(i.stop)&&(x._queueHooks(f.elem,f.opts.queue).stop=i.stop.bind(i)),i;return x.map(m,ve,f),v(f.opts.start)&&f.opts.start.call(o,f),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always),x.fx.timer(x.extend(p,{elem:o,anim:f,queue:f.opts.queue})),f}x.Animation=x.extend(M,{tweeners:{"*":[function(t,e){var i=this.createTween(t,e);return bt(i.elem,t,yt.exec(e),i),i}]},tweener:function(t,e){for(var i,n=0,o=(t=v(t)?(e=t,["*"]):t.match(T)).length;n<o;n++)i=t[n],M.tweeners[i]=M.tweeners[i]||[],M.tweeners[i].unshift(e)},prefilters:[function(t,e,i){var n,o,s,r,a,l,c,d="width"in e||"height"in e,u=this,h={},p=t.style,f=t.nodeType&>(t),m=w.get(t,"fxshow");for(n in i.queue||(null==(r=x._queueHooks(t,"fx")).unqueued&&(r.unqueued=0,a=r.empty.fire,r.empty.fire=function(){r.unqueued||a()}),r.unqueued++,u.always(function(){u.always(function(){r.unqueued--,x.queue(t,"fx").length||r.empty.fire()})})),e)if(o=e[n],pe.test(o)){if(delete e[n],s=s||"toggle"===o,o===(f?"hide":"show")){if("show"!==o||!m||void 0===m[n])continue;f=!0}h[n]=m&&m[n]||x.style(t,n)}if((l=!x.isEmptyObject(e))||!x.isEmptyObject(h))for(n in d&&1===t.nodeType&&(i.overflow=[p.overflow,p.overflowX,p.overflowY],null==(c=m&&m.display)&&(c=w.get(t,"display")),"none"===(d=x.css(t,"display"))&&(c?d=c:(E([t],!0),c=t.style.display||c,d=x.css(t,"display"),E([t]))),"inline"===d||"inline-block"===d&&null!=c)&&"none"===x.css(t,"float")&&(l||(u.done(function(){p.display=c}),null==c&&(d=p.display,c="none"===d?"":d)),p.display="inline-block"),i.overflow&&(p.overflow="hidden",u.always(function(){p.overflow=i.overflow[0],p.overflowX=i.overflow[1],p.overflowY=i.overflow[2]})),l=!1,h)l||(m?"hidden"in m&&(f=m.hidden):m=w.access(t,"fxshow",{display:c}),s&&(m.hidden=!f),f&&E([t],!0),u.done(function(){for(n in f||E([t]),w.remove(t,"fxshow"),h)x.style(t,n,h[n])})),l=ve(f?m[n]:0,n,u),n in m||(m[n]=l.start,f&&(l.end=l.start,l.start=0))}],prefilter:function(t,e){e?M.prefilters.unshift(t):M.prefilters.push(t)}}),x.speed=function(t,e,i){var n=t&&"object"==typeof t?x.extend({},t):{complete:i||!i&&e||v(t)&&t,duration:t,easing:i&&e||e&&!v(e)&&e};return x.fx.off?n.duration=0:"number"!=typeof n.duration&&(n.duration in x.fx.speeds?n.duration=x.fx.speeds[n.duration]:n.duration=x.fx.speeds._default),null!=n.queue&&!0!==n.queue||(n.queue="fx"),n.old=n.complete,n.complete=function(){v(n.old)&&n.old.call(this),n.queue&&x.dequeue(this,n.queue)},n},x.fn.extend({fadeTo:function(t,e,i,n){return this.filter(gt).css("opacity",0).show().end().animate({opacity:e},t,i,n)},animate:function(e,t,i,n){function o(){var t=M(this,x.extend({},e),r);(s||w.get(this,"finish"))&&t.stop(!0)}var s=x.isEmptyObject(e),r=x.speed(t,i,n);return o.finish=o,s||!1===r.queue?this.each(o):this.queue(r.queue,o)},stop:function(o,t,s){function r(t){var e=t.stop;delete t.stop,e(s)}return"string"!=typeof o&&(s=t,t=o,o=void 0),t&&this.queue(o||"fx",[]),this.each(function(){var t=!0,e=null!=o&&o+"queueHooks",i=x.timers,n=w.get(this);if(e)n[e]&&n[e].stop&&r(n[e]);else for(e in n)n[e]&&n[e].stop&&fe.test(e)&&r(n[e]);for(e=i.length;e--;)i[e].elem!==this||null!=o&&i[e].queue!==o||(i[e].anim.stop(s),t=!1,i.splice(e,1));!t&&s||x.dequeue(this,o)})},finish:function(r){return!1!==r&&(r=r||"fx"),this.each(function(){var t,e=w.get(this),i=e[r+"queue"],n=e[r+"queueHooks"],o=x.timers,s=i?i.length:0;for(e.finish=!0,x.queue(this,r,[]),n&&n.stop&&n.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===r&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<s;t++)i[t]&&i[t].finish&&i[t].finish.call(this);delete e.finish})}}),x.each(["toggle","show","hide"],function(t,n){var o=x.fn[n];x.fn[n]=function(t,e,i){return null==t||"boolean"==typeof t?o.apply(this,arguments):this.animate(ye(n,!0),t,e,i)}}),x.each({slideDown:ye("show"),slideUp:ye("hide"),slideToggle:ye("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(t,n){x.fn[t]=function(t,e,i){return this.animate(n,t,e,i)}}),x.timers=[],x.fx.tick=function(){var t,e=0,i=x.timers;for(O=Date.now();e<i.length;e++)(t=i[e])()||i[e]!==t||i.splice(e--,1);i.length||x.fx.stop(),O=void 0},x.fx.timer=function(t){x.timers.push(t),x.fx.start()},x.fx.interval=13,x.fx.start=function(){he||(he=!0,me())},x.fx.stop=function(){he=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fn.delay=function(n,t){return n=x.fx&&x.fx.speeds[n]||n,this.queue(t=t||"fx",function(t,e){var i=_.setTimeout(t,n);e.stop=function(){_.clearTimeout(i)}})},$=k.createElement("input"),t=k.createElement("select").appendChild(k.createElement("option")),$.type="checkbox",g.checkOn=""!==$.value,g.optSelected=t.selected,($=k.createElement("input")).value="t",$.type="radio",g.radioValue="t"===$.value;var be,we=x.expr.attrHandle,_e=(x.fn.extend({attr:function(t,e){return u(this,x.attr,t,e,1<arguments.length)},removeAttr:function(t){return this.each(function(){x.removeAttr(this,t)})}}),x.extend({attr:function(t,e,i){var n,o,s=t.nodeType;if(3!==s&&8!==s&&2!==s)return void 0===t.getAttribute?x.prop(t,e,i):(1===s&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?be:void 0)),void 0!==i?null===i?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(n=o.set(t,i,e))?n:(t.setAttribute(e,i+""),i):!(o&&"get"in o&&null!==(n=o.get(t,e)))&&null==(n=x.find.attr(t,e))?void 0:n)},attrHooks:{type:{set:function(t,e){var i;if(!g.radioValue&&"radio"===e&&l(t,"input"))return i=t.value,t.setAttribute("type",e),i&&(t.value=i),e}}},removeAttr:function(t,e){var i,n=0,o=e&&e.match(T);if(o&&1===t.nodeType)for(;i=o[n++];)t.removeAttribute(i)}}),be={set:function(t,e,i){return!1===e?x.removeAttr(t,i):t.setAttribute(i,i),i}},x.each(x.expr.match.bool.source.match(/\w+/g),function(t,e){var r=we[e]||x.find.attr;we[e]=function(t,e,i){var n,o,s=e.toLowerCase();return i||(o=we[s],we[s]=n,n=null!=r(t,e,i)?s:null,we[s]=o),n}}),/^(?:input|select|textarea|button)$/i),ke=/^(?:a|area)$/i;function j(t){return(t.match(T)||[]).join(" ")}function P(t){return t.getAttribute&&t.getAttribute("class")||""}function xe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(T)||[]}x.fn.extend({prop:function(t,e){return u(this,x.prop,t,e,1<arguments.length)},removeProp:function(t){return this.each(function(){delete this[x.propFix[t]||t]})}}),x.extend({prop:function(t,e,i){var n,o,s=t.nodeType;if(3!==s&&8!==s&&2!==s)return 1===s&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==i?o&&"set"in o&&void 0!==(n=o.set(t,i,e))?n:t[e]=i:o&&"get"in o&&null!==(n=o.get(t,e))?n:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||ke.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),g.optSelected||(x.propHooks.selected={get:function(t){t=t.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(t){t=t.parentNode;t&&(t.selectedIndex,t.parentNode)&&t.parentNode.selectedIndex}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.fn.extend({addClass:function(e){var t,i,n,o,s,r;return v(e)?this.each(function(t){x(this).addClass(e.call(this,t,P(this)))}):(t=xe(e)).length?this.each(function(){if(n=P(this),i=1===this.nodeType&&" "+j(n)+" "){for(s=0;s<t.length;s++)o=t[s],i.indexOf(" "+o+" ")<0&&(i+=o+" ");r=j(i),n!==r&&this.setAttribute("class",r)}}):this},removeClass:function(e){var t,i,n,o,s,r;return v(e)?this.each(function(t){x(this).removeClass(e.call(this,t,P(this)))}):arguments.length?(t=xe(e)).length?this.each(function(){if(n=P(this),i=1===this.nodeType&&" "+j(n)+" "){for(s=0;s<t.length;s++)for(o=t[s];-1<i.indexOf(" "+o+" ");)i=i.replace(" "+o+" "," ");r=j(i),n!==r&&this.setAttribute("class",r)}}):this:this.attr("class","")},toggleClass:function(e,i){var t,n,o,s,r=typeof e,a="string"==r||Array.isArray(e);return v(e)?this.each(function(t){x(this).toggleClass(e.call(this,t,P(this),i),i)}):"boolean"==typeof i&&a?i?this.addClass(e):this.removeClass(e):(t=xe(e),this.each(function(){if(a)for(s=x(this),o=0;o<t.length;o++)n=t[o],s.hasClass(n)?s.removeClass(n):s.addClass(n);else void 0!==e&&"boolean"!=r||((n=P(this))&&w.set(this,"__className__",n),this.setAttribute&&this.setAttribute("class",!n&&!1!==e&&w.get(this,"__className__")||""))}))},hasClass:function(t){for(var e,i=0,n=" "+t+" ";e=this[i++];)if(1===e.nodeType&&-1<(" "+j(P(e))+" ").indexOf(n))return!0;return!1}});function Te(t){t.stopPropagation()}var Se=/\r/g,Ce=(x.fn.extend({val:function(e){var i,t,n,o=this[0];return arguments.length?(n=v(e),this.each(function(t){1!==this.nodeType||(null==(t=n?e.call(this,t,x(this).val()):e)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=x.map(t,function(t){return null==t?"":t+""})),(i=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in i&&void 0!==i.set(this,t,"value"))||(this.value=t)})):o?(i=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in i&&void 0!==(t=i.get(o,"value"))?t:"string"==typeof(t=o.value)?t.replace(Se,""):null==t?"":t:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:j(x.text(t))}},select:{get:function(t){for(var e,i=t.options,n=t.selectedIndex,o="select-one"===t.type,s=o?null:[],r=o?n+1:i.length,a=n<0?r:o?n:0;a<r;a++)if(((e=i[a]).selected||a===n)&&!e.disabled&&(!e.parentNode.disabled||!l(e.parentNode,"optgroup"))){if(e=x(e).val(),o)return e;s.push(e)}return s},set:function(t,e){for(var i,n,o=t.options,s=x.makeArray(e),r=o.length;r--;)((n=o[r]).selected=-1<x.inArray(x.valHooks.option.get(n),s))&&(i=!0);return i||(t.selectedIndex=-1),s}}}}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=-1<x.inArray(x(t).val(),e)}},g.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}),g.focusin="onfocusin"in _,/^(?:focusinfocus|focusoutblur)$/),Ee=(x.extend(x.event,{trigger:function(t,e,i,n){var o,s,r,a,l,c,d,u=[i||k],h=W.call(t,"type")?t.type:t,p=W.call(t,"namespace")?t.namespace.split("."):[],f=d=s=i=i||k;if(3!==i.nodeType&&8!==i.nodeType&&!Ce.test(h+x.event.triggered)&&(-1<h.indexOf(".")&&(h=(p=h.split(".")).shift(),p.sort()),a=h.indexOf(":")<0&&"on"+h,(t=t[x.expando]?t:new x.Event(h,"object"==typeof t&&t)).isTrigger=n?2:3,t.namespace=p.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),e=null==e?[t]:x.makeArray(e,[t]),c=x.event.special[h]||{},n||!c.trigger||!1!==c.trigger.apply(i,e))){if(!n&&!c.noBubble&&!m(i)){for(r=c.delegateType||h,Ce.test(r+h)||(f=f.parentNode);f;f=f.parentNode)u.push(f),s=f;s===(i.ownerDocument||k)&&u.push(s.defaultView||s.parentWindow||_)}for(o=0;(f=u[o++])&&!t.isPropagationStopped();)d=f,t.type=1<o?r:c.bindType||h,(l=(w.get(f,"events")||Object.create(null))[t.type]&&w.get(f,"handle"))&&l.apply(f,e),(l=a&&f[a])&&l.apply&&y(f)&&(t.result=l.apply(f,e),!1===t.result)&&t.preventDefault();return t.type=h,n||t.isDefaultPrevented()||c._default&&!1!==c._default.apply(u.pop(),e)||!y(i)||a&&v(i[h])&&!m(i)&&((s=i[a])&&(i[a]=null),x.event.triggered=h,t.isPropagationStopped()&&d.addEventListener(h,Te),i[h](),t.isPropagationStopped()&&d.removeEventListener(h,Te),x.event.triggered=void 0,s)&&(i[a]=s),t.result}},simulate:function(t,e,i){i=x.extend(new x.Event,i,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each(function(){x.event.trigger(t,e,this)})},triggerHandler:function(t,e){var i=this[0];if(i)return x.event.trigger(t,e,i,!0)}}),g.focusin||x.each({focus:"focusin",blur:"focusout"},function(i,n){function o(t){x.event.simulate(n,t.target,x.event.fix(t))}x.event.special[n]={setup:function(){var t=this.ownerDocument||this.document||this,e=w.access(t,n);e||t.addEventListener(i,o,!0),w.access(t,n,(e||0)+1)},teardown:function(){var t=this.ownerDocument||this.document||this,e=w.access(t,n)-1;e?w.access(t,n,e):(t.removeEventListener(i,o,!0),w.remove(t,n))}}}),_.location),De={guid:Date.now()},Ae=/\?/,Le=(x.parseXML=function(t){var e,i;if(!t||"string"!=typeof t)return null;try{e=(new _.DOMParser).parseFromString(t,"text/xml")}catch(t){}return i=e&&e.getElementsByTagName("parsererror")[0],e&&!i||x.error("Invalid XML: "+(i?x.map(i.childNodes,function(t){return t.textContent}).join("\n"):t)),e},/\[\]$/),Oe=/\r?\n/g,$e=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;x.param=function(t,e){function i(t,e){e=v(e)?e():e,o[o.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==e?"":e)}var n,o=[];if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,function(){i(this.name,this.value)});else for(n in t)!function i(n,t,o,s){if(Array.isArray(t))x.each(t,function(t,e){o||Le.test(n)?s(n,e):i(n+"["+("object"==typeof e&&null!=e?t:"")+"]",e,o,s)});else if(o||"object"!==f(t))s(n,t);else for(var e in t)i(n+"["+e+"]",t[e],o,s)}(n,t[n],e,i);return o.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this}).filter(function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!$e.test(t)&&(this.checked||!_t.test(t))}).map(function(t,e){var i=x(this).val();return null==i?null:Array.isArray(i)?x.map(i,function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}}):{name:e.name,value:i.replace(Oe,"\r\n")}}).get()}});var je=/%20/g,Pe=/#.*$/,Ne=/([?&])_=[^&]*/,Ie=/^(.*?):[ \t]*([^\r\n]*)$/gm,He=/^(?:GET|HEAD)$/,Fe=/^\/\//,Re={},qe={},Ye="*/".concat("*"),We=k.createElement("a");function Be(s){return function(t,e){"string"!=typeof t&&(e=t,t="*");var i,n=0,o=t.toLowerCase().match(T)||[];if(v(e))for(;i=o[n++];)"+"===i[0]?(i=i.slice(1)||"*",(s[i]=s[i]||[]).unshift(e)):(s[i]=s[i]||[]).push(e)}}function ze(e,n,o,s){var r={},a=e===qe;function l(t){var i;return r[t]=!0,x.each(e[t]||[],function(t,e){e=e(n,o,s);return"string"!=typeof e||a||r[e]?a?!(i=e):void 0:(n.dataTypes.unshift(e),l(e),!1)}),i}return l(n.dataTypes[0])||!r["*"]&&l("*")}function Ue(t,e){var i,n,o=x.ajaxSettings.flatOptions||{};for(i in e)void 0!==e[i]&&((o[i]?t:n=n||{})[i]=e[i]);return n&&x.extend(!0,t,n),t}We.href=Ee.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ee.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Ee.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Ue(Ue(t,x.ajaxSettings),e):Ue(x.ajaxSettings,t)},ajaxPrefilter:Be(Re),ajaxTransport:Be(qe),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0);var l,c,d,i,u,h,p,n,f=x.ajaxSetup({},e=e||{}),m=f.context||f,g=f.context&&(m.nodeType||m.jquery)?x(m):x.event,y=x.Deferred(),v=x.Callbacks("once memory"),b=f.statusCode||{},o={},s={},r="canceled",w={readyState:0,getResponseHeader:function(t){var e;if(h){if(!i)for(i={};e=Ie.exec(d);)i[e[1].toLowerCase()+" "]=(i[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=i[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return h?d:null},setRequestHeader:function(t,e){return null==h&&(t=s[t.toLowerCase()]=s[t.toLowerCase()]||t,o[t]=e),this},overrideMimeType:function(t){return null==h&&(f.mimeType=t),this},statusCode:function(t){if(t)if(h)w.always(t[w.status]);else for(var e in t)b[e]=[b[e],t[e]];return this},abort:function(t){t=t||r;return l&&l.abort(t),a(0,t),this}};if(y.promise(w),f.url=((t||f.url||Ee.href)+"").replace(Fe,Ee.protocol+"//"),f.type=e.method||e.type||f.method||f.type,f.dataTypes=(f.dataType||"*").toLowerCase().match(T)||[""],null==f.crossDomain){t=k.createElement("a");try{t.href=f.url,t.href=t.href,f.crossDomain=We.protocol+"//"+We.host!=t.protocol+"//"+t.host}catch(t){f.crossDomain=!0}}if(f.data&&f.processData&&"string"!=typeof f.data&&(f.data=x.param(f.data,f.traditional)),ze(Re,f,e,w),!h){for(n in(p=x.event&&f.global)&&0==x.active++&&x.event.trigger("ajaxStart"),f.type=f.type.toUpperCase(),f.hasContent=!He.test(f.type),c=f.url.replace(Pe,""),f.hasContent?f.data&&f.processData&&0===(f.contentType||"").indexOf("application/x-www-form-urlencoded")&&(f.data=f.data.replace(je,"+")):(t=f.url.slice(c.length),f.data&&(f.processData||"string"==typeof f.data)&&(c+=(Ae.test(c)?"&":"?")+f.data,delete f.data),!1===f.cache&&(c=c.replace(Ne,"$1"),t=(Ae.test(c)?"&":"?")+"_="+De.guid+++t),f.url=c+t),f.ifModified&&(x.lastModified[c]&&w.setRequestHeader("If-Modified-Since",x.lastModified[c]),x.etag[c])&&w.setRequestHeader("If-None-Match",x.etag[c]),(f.data&&f.hasContent&&!1!==f.contentType||e.contentType)&&w.setRequestHeader("Content-Type",f.contentType),w.setRequestHeader("Accept",f.dataTypes[0]&&f.accepts[f.dataTypes[0]]?f.accepts[f.dataTypes[0]]+("*"!==f.dataTypes[0]?", "+Ye+"; q=0.01":""):f.accepts["*"]),f.headers)w.setRequestHeader(n,f.headers[n]);if(f.beforeSend&&(!1===f.beforeSend.call(m,w,f)||h))return w.abort();if(r="abort",v.add(f.complete),w.done(f.success),w.fail(f.error),l=ze(qe,f,e,w)){if(w.readyState=1,p&&g.trigger("ajaxSend",[w,f]),h)return w;f.async&&0<f.timeout&&(u=_.setTimeout(function(){w.abort("timeout")},f.timeout));try{h=!1,l.send(o,a)}catch(t){if(h)throw t;a(-1,t)}}else a(-1,"No Transport")}return w;function a(t,e,i,n){var o,s,r,a=e;h||(h=!0,u&&_.clearTimeout(u),l=void 0,d=n||"",w.readyState=0<t?4:0,n=200<=t&&t<300||304===t,i&&(r=function(t,e,i){for(var n,o,s,r,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===n&&(n=t.mimeType||e.getResponseHeader("Content-Type"));if(n)for(o in a)if(a[o]&&a[o].test(n)){l.unshift(o);break}if(l[0]in i)s=l[0];else{for(o in i){if(!l[0]||t.converters[o+" "+l[0]]){s=o;break}r=r||o}s=s||r}if(s)return s!==l[0]&&l.unshift(s),i[s]}(f,w,i)),!n&&-1<x.inArray("script",f.dataTypes)&&x.inArray("json",f.dataTypes)<0&&(f.converters["text script"]=function(){}),r=function(t,e,i,n){var o,s,r,a,l,c={},d=t.dataTypes.slice();if(d[1])for(r in t.converters)c[r.toLowerCase()]=t.converters[r];for(s=d.shift();s;)if(t.responseFields[s]&&(i[t.responseFields[s]]=e),!l&&n&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=s,s=d.shift())if("*"===s)s=l;else if("*"!==l&&l!==s){if(!(r=c[l+" "+s]||c["* "+s]))for(o in c)if((a=o.split(" "))[1]===s&&(r=c[l+" "+a[0]]||c["* "+a[0]])){!0===r?r=c[o]:!0!==c[o]&&(s=a[0],d.unshift(a[1]));break}if(!0!==r)if(r&&t.throws)e=r(e);else try{e=r(e)}catch(t){return{state:"parsererror",error:r?t:"No conversion from "+l+" to "+s}}}return{state:"success",data:e}}(f,r,w,n),n?(f.ifModified&&((i=w.getResponseHeader("Last-Modified"))&&(x.lastModified[c]=i),i=w.getResponseHeader("etag"))&&(x.etag[c]=i),204===t||"HEAD"===f.type?a="nocontent":304===t?a="notmodified":(a=r.state,o=r.data,n=!(s=r.error))):(s=a,!t&&a||(a="error",t<0&&(t=0))),w.status=t,w.statusText=(e||a)+"",n?y.resolveWith(m,[o,a,w]):y.rejectWith(m,[w,a,s]),w.statusCode(b),b=void 0,p&&g.trigger(n?"ajaxSuccess":"ajaxError",[w,f,n?o:s]),v.fireWith(m,[w,a]),p&&(g.trigger("ajaxComplete",[w,f]),--x.active||x.event.trigger("ajaxStop")))}},getJSON:function(t,e,i){return x.get(t,e,i,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],function(t,o){x[o]=function(t,e,i,n){return v(e)&&(n=n||i,i=e,e=void 0),x.ajax(x.extend({url:t,type:o,dataType:n,data:e,success:i},x.isPlainObject(t)&&t))}}),x.ajaxPrefilter(function(t){for(var e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")}),x._evalUrl=function(t,e,i){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,i)}})},x.fn.extend({wrapAll:function(t){return this[0]&&(v(t)&&(t=t.call(this[0])),t=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t}).append(this)),this},wrapInner:function(i){return v(i)?this.each(function(t){x(this).wrapInner(i.call(this,t))}):this.each(function(){var t=x(this),e=t.contents();e.length?e.wrapAll(i):t.append(i)})},wrap:function(e){var i=v(e);return this.each(function(t){x(this).wrapAll(i?e.call(this,t):e)})},unwrap:function(t){return this.parent(t).not("body").each(function(){x(this).replaceWith(this.childNodes)}),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new _.XMLHttpRequest}catch(t){}};var Ge={0:200,1223:204},Ve=x.ajaxSettings.xhr(),Xe=(g.cors=!!Ve&&"withCredentials"in Ve,g.ajax=Ve=!!Ve,x.ajaxTransport(function(o){var s,r;if(g.cors||Ve&&!o.crossDomain)return{send:function(t,e){var i,n=o.xhr();if(n.open(o.type,o.url,o.async,o.username,o.password),o.xhrFields)for(i in o.xhrFields)n[i]=o.xhrFields[i];for(i in o.mimeType&&n.overrideMimeType&&n.overrideMimeType(o.mimeType),o.crossDomain||t["X-Requested-With"]||(t["X-Requested-With"]="XMLHttpRequest"),t)n.setRequestHeader(i,t[i]);s=function(t){return function(){s&&(s=r=n.onload=n.onerror=n.onabort=n.ontimeout=n.onreadystatechange=null,"abort"===t?n.abort():"error"===t?"number"!=typeof n.status?e(0,"error"):e(n.status,n.statusText):e(Ge[n.status]||n.status,n.statusText,"text"!==(n.responseType||"text")||"string"!=typeof n.responseText?{binary:n.response}:{text:n.responseText},n.getAllResponseHeaders()))}},n.onload=s(),r=n.onerror=n.ontimeout=s("error"),void 0!==n.onabort?n.onabort=r:n.onreadystatechange=function(){4===n.readyState&&_.setTimeout(function(){s&&r()})},s=s("abort");try{n.send(o.hasContent&&o.data||null)}catch(t){if(s)throw t}},abort:function(){s&&s()}}}),x.ajaxPrefilter(function(t){t.crossDomain&&(t.contents.script=!1)}),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")}),x.ajaxTransport("script",function(i){var n,o;if(i.crossDomain||i.scriptAttrs)return{send:function(t,e){n=x("<script>").attr(i.scriptAttrs||{}).prop({charset:i.scriptCharset,src:i.url}).on("load error",o=function(t){n.remove(),o=null,t&&e("error"===t.type?404:200,t.type)}),k.head.appendChild(n[0])},abort:function(){o&&o()}}}),[]),Ze=/(=)\?(?=&|$)|\?\?/,Qe=(x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var t=Xe.pop()||x.expando+"_"+De.guid++;return this[t]=!0,t}}),x.ajaxPrefilter("json jsonp",function(t,e,i){var n,o,s,r=!1!==t.jsonp&&(Ze.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ze.test(t.data)&&"data");if(r||"jsonp"===t.dataTypes[0])return n=t.jsonpCallback=v(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,r?t[r]=t[r].replace(Ze,"$1"+n):!1!==t.jsonp&&(t.url+=(Ae.test(t.url)?"&":"?")+t.jsonp+"="+n),t.converters["script json"]=function(){return s||x.error(n+" was not called"),s[0]},t.dataTypes[0]="json",o=_[n],_[n]=function(){s=arguments},i.always(function(){void 0===o?x(_).removeProp(n):_[n]=o,t[n]&&(t.jsonpCallback=e.jsonpCallback,Xe.push(n)),s&&v(o)&&o(s[0]),s=o=void 0}),"script"}),g.createHTMLDocument=((s=k.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===s.childNodes.length),x.parseHTML=function(t,e,i){var n;return"string"!=typeof t?[]:("boolean"==typeof e&&(i=e,e=!1),e||(g.createHTMLDocument?((n=(e=k.implementation.createHTMLDocument("")).createElement("base")).href=k.location.href,e.head.appendChild(n)):e=k),n=!i&&[],(i=Q.exec(t))?[e.createElement(i[1])]:(i=Ct([t],e,n),n&&n.length&&x(n).remove(),x.merge([],i.childNodes)))},x.fn.load=function(t,e,i){var n,o,s,r=this,a=t.indexOf(" ");return-1<a&&(n=j(t.slice(a)),t=t.slice(0,a)),v(e)?(i=e,e=void 0):e&&"object"==typeof e&&(o="POST"),0<r.length&&x.ajax({url:t,type:o||"GET",dataType:"html",data:e}).done(function(t){s=arguments,r.html(n?x("<div>").append(x.parseHTML(t)).find(n):t)}).always(i&&function(t,e){r.each(function(){i.apply(this,s||[t.responseText,e,t])})}),this},x.expr.pseudos.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length},x.offset={setOffset:function(t,e,i){var n,o,s,r,a=x.css(t,"position"),l=x(t),c={};"static"===a&&(t.style.position="relative"),s=l.offset(),n=x.css(t,"top"),r=x.css(t,"left"),a=("absolute"===a||"fixed"===a)&&-1<(n+r).indexOf("auto")?(o=(a=l.position()).top,a.left):(o=parseFloat(n)||0,parseFloat(r)||0),null!=(e=v(e)?e.call(t,i,x.extend({},s)):e).top&&(c.top=e.top-s.top+o),null!=e.left&&(c.left=e.left-s.left+a),"using"in e?e.using.call(t,c):l.css(c)}},x.fn.extend({offset:function(e){var t,i;return arguments.length?void 0===e?this:this.each(function(t){x.offset.setOffset(this,e,t)}):(i=this[0])?i.getClientRects().length?(t=i.getBoundingClientRect(),i=i.ownerDocument.defaultView,{top:t.top+i.pageYOffset,left:t.left+i.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var t,e,i,n=this[0],o={top:0,left:0};if("fixed"===x.css(n,"position"))e=n.getBoundingClientRect();else{for(e=this.offset(),i=n.ownerDocument,t=n.offsetParent||i.documentElement;t&&(t===i.body||t===i.documentElement)&&"static"===x.css(t,"position");)t=t.parentNode;t&&t!==n&&1===t.nodeType&&((o=x(t).offset()).top+=x.css(t,"borderTopWidth",!0),o.left+=x.css(t,"borderLeftWidth",!0))}return{top:e.top-o.top-x.css(n,"marginTop",!0),left:e.left-o.left-x.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent;t&&"static"===x.css(t,"position");)t=t.offsetParent;return t||S})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,o){var s="pageYOffset"===o;x.fn[e]=function(t){return u(this,function(t,e,i){var n;if(m(t)?n=t:9===t.nodeType&&(n=t.defaultView),void 0===i)return n?n[o]:t[e];n?n.scrollTo(s?n.pageXOffset:i,s?i:n.pageYOffset):t[e]=i},e,t,arguments.length)}}),x.each(["top","left"],function(t,i){x.cssHooks[i]=ee(g.pixelPosition,function(t,e){if(e)return e=te(t,i),Vt.test(e)?x(t).position()[i]+"px":e})}),x.each({Height:"height",Width:"width"},function(r,a){x.each({padding:"inner"+r,content:a,"":"outer"+r},function(n,s){x.fn[s]=function(t,e){var i=arguments.length&&(n||"boolean"!=typeof t),o=n||(!0===t||!0===e?"margin":"border");return u(this,function(t,e,i){var n;return m(t)?0===s.indexOf("outer")?t["inner"+r]:t.document.documentElement["client"+r]:9===t.nodeType?(n=t.documentElement,Math.max(t.body["scroll"+r],n["scroll"+r],t.body["offset"+r],n["offset"+r],n["client"+r])):void 0===i?x.css(t,e,o):x.style(t,e,i,o)},a,i?t:void 0,i)}})}),x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(t,e){x.fn[e]=function(t){return this.on(e,t)}}),x.fn.extend({bind:function(t,e,i){return this.on(t,null,e,i)},unbind:function(t,e){return this.off(t,null,e)},delegate:function(t,e,i,n){return this.on(e,t,i,n)},undelegate:function(t,e,i){return 1===arguments.length?this.off(t,"**"):this.off(e,t||"**",i)},hover:function(t,e){return this.mouseenter(t).mouseleave(e||t)}}),x.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(t,i){x.fn[i]=function(t,e){return 0<arguments.length?this.on(i,null,t,e):this.trigger(i)}}),/^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g),Je=(x.proxy=function(t,e){var i,n;if("string"==typeof e&&(n=t[e],e=t,t=n),v(t))return i=a.call(arguments,2),(n=function(){return t.apply(e||this,i.concat(a.call(arguments)))}).guid=t.guid=t.guid||x.guid++,n},x.holdReady=function(t){t?x.readyWait++:x.ready(!0)},x.isArray=Array.isArray,x.parseJSON=JSON.parse,x.nodeName=l,x.isFunction=v,x.isWindow=m,x.camelCase=b,x.type=f,x.now=Date.now,x.isNumeric=function(t){var e=x.type(t);return("number"===e||"string"===e)&&!isNaN(t-parseFloat(t))},x.trim=function(t){return null==t?"":(t+"").replace(Qe,"$1")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}),_.jQuery),Ke=_.$;return x.noConflict=function(t){return _.$===x&&(_.$=Ke),t&&_.jQuery===x&&(_.jQuery=Je),x},void 0===N&&(_.jQuery=_.$=x),x}),!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,function(){"use strict";const N="transitionend",I=t=>{for(;t+=Math.floor(1e6*Math.random()),document.getElementById(t););return t},H=e=>{let i=e.getAttribute("data-bs-target");if(!i||"#"===i){let t=e.getAttribute("href");if(!t||!t.includes("#")&&!t.startsWith("."))return null;t.includes("#")&&!t.startsWith("#")&&(t="#"+t.split("#")[1]),i=t&&"#"!==t?t.trim():null}return i},F=t=>{t=H(t);return t&&document.querySelector(t)?t:null},o=t=>{t=H(t);return t?document.querySelector(t):null},d=t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);var t=Number.parseFloat(e),n=Number.parseFloat(i);return t||n?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0},R=t=>{t.dispatchEvent(new Event(N))},r=t=>(t[0]||t).nodeType,u=(e,t)=>{let i=!1;t+=5;e.addEventListener(N,function t(){i=!0,e.removeEventListener(N,t)}),setTimeout(()=>{i||R(e)},t)},i=(n,o,s)=>{Object.keys(s).forEach(t=>{var e=s[t],i=o[t],i=i&&r(i)?"element":null==(i=i)?""+i:{}.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(e).test(i))throw new TypeError(n.toUpperCase()+": "+`Option "${t}" provided type "${i}" `+`but expected type "${e}".`)})},q=t=>{var e;return!!t&&!!(t.style&&t.parentNode&&t.parentNode.style)&&(e=getComputedStyle(t),t=getComputedStyle(t.parentNode),"none"!==e.display)&&"none"!==t.display&&"hidden"!==e.visibility},Y=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),W=t=>{var e;return document.documentElement.attachShadow?"function"==typeof t.getRootNode?(e=t.getRootNode())instanceof ShadowRoot?e:null:t instanceof ShadowRoot?t:t.parentNode?W(t.parentNode):null:null},B=()=>function(){},z=t=>t.offsetHeight,U=()=>{var t=window["jQuery"];return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},e=()=>"rtl"===document.documentElement.dir;var t=(i,n)=>{var t;t=()=>{const t=U();if(t){const e=t.fn[i];t.fn[i]=n.jQueryInterface,t.fn[i].Constructor=n,t.fn[i].noConflict=()=>(t.fn[i]=e,n.jQueryInterface)}},"loading"===document.readyState?document.addEventListener("DOMContentLoaded",t):t()};const n=new Map;var G=function(t,e,i){n.has(t)||n.set(t,new Map);t=n.get(t);t.has(e)||0===t.size?t.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(t.keys())[0]}.`)},a=function(t,e){return n.has(t)&&n.get(t).get(e)||null},V=function(t,e){var i;n.has(t)&&((i=n.get(t)).delete(e),0===i.size)&&n.delete(t)};const X=/[^.]*(?=\..*)\.|.*/,Z=/\..*/,Q=/::\d+$/,J={};let K=1;const tt={mouseenter:"mouseover",mouseleave:"mouseout"},et=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 it(t,e){return e&&e+"::"+K++||t.uidEvent||K++}function nt(t){var e=it(t);return t.uidEvent=e,J[e]=J[e]||{},J[e]}function ot(i,n,o=null){var s=Object.keys(i);for(let t=0,e=s.length;t<e;t++){var r=i[s[t]];if(r.originalHandler===n&&r.delegationSelector===o)return r}return null}function st(t,e,i){var n="string"==typeof e,i=n?i:e;let o=t.replace(Z,"");e=tt[o],e&&(o=e),e=et.has(o);return[n,i,o=e?o:t]}function rt(t,e,i,n,o){var s,r,a,l,c,d,u,h,p,f;"string"==typeof e&&t&&(i||(i=n,n=null),[s,r,a]=st(e,i,n),(c=ot(l=(l=nt(t))[a]||(l[a]={}),r,s?i:null))?c.oneOff=c.oneOff&&o:(c=it(r,e.replace(X,"")),(e=s?(h=t,p=i,f=n,function i(n){var o=h.querySelectorAll(p);for(let e=n["target"];e&&e!==this;e=e.parentNode)for(let t=o.length;t--;)if(o[t]===e)return n.delegateTarget=e,i.oneOff&&m.off(h,n.type,f),f.apply(e,[n]);return null}):(d=t,u=i,function t(e){return e.delegateTarget=d,t.oneOff&&m.off(d,e.type,u),u.apply(d,[e])})).delegationSelector=s?i:null,e.originalHandler=r,e.oneOff=o,l[e.uidEvent=c]=e,t.addEventListener(a,e,s)))}function at(t,e,i,n,o){n=ot(e[i],n,o);n&&(t.removeEventListener(i,n,Boolean(o)),delete e[i][n.uidEvent])}const m={on(t,e,i,n){rt(t,e,i,n,!1)},one(t,e,i,n){rt(t,e,i,n,!0)},off(r,a,t,e){if("string"==typeof a&&r){const[i,n,o]=st(a,t,e),s=o!==a,l=nt(r);e=a.startsWith(".");if(void 0!==n)return l&&l[o]?void at(r,l,o,n,i?t:null):void 0;e&&Object.keys(l).forEach(t=>{{var e=r,i=l,n=t,o=a.slice(1);const s=i[n]||{};Object.keys(s).forEach(t=>{t.includes(o)&&(t=s[t],at(e,i,n,t.originalHandler,t.delegationSelector))})}});const c=l[o]||{};Object.keys(c).forEach(t=>{var e=t.replace(Q,"");s&&!a.includes(e)||(e=c[t],at(r,l,o,e.originalHandler,e.delegationSelector))})}},trigger(t,e,i){if("string"!=typeof e||!t)return null;var n=U(),o=e.replace(Z,""),s=e!==o,r=et.has(o);let a,l=!0,c=!0,d=!1,u=null;return s&&n&&(a=n.Event(e,i),n(t).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),d=a.isDefaultPrevented()),r?(u=document.createEvent("HTMLEvents")).initEvent(o,l,!0):u=new CustomEvent(e,{bubbles:l,cancelable:!0}),void 0!==i&&Object.keys(i).forEach(t=>{Object.defineProperty(u,t,{get(){return i[t]}})}),d&&u.preventDefault(),c&&t.dispatchEvent(u),u.defaultPrevented&&void 0!==a&&a.preventDefault(),u}};class s{constructor(t){(t="string"==typeof t?document.querySelector(t):t)&&(this._element=t,G(this._element,this.constructor.DATA_KEY,this))}dispose(){V(this._element,this.constructor.DATA_KEY),this._element=null}static getInstance(t){return a(t,this.DATA_KEY)}static get VERSION(){return"5.0.0-beta3"}}const lt="bs.alert";lt;class ct extends s{static get DATA_KEY(){return lt}close(t){var t=t?this._getRootElement(t):this._element,e=this._triggerCloseEvent(t);null===e||e.defaultPrevented||this._removeElement(t)}_getRootElement(t){return o(t)||t.closest(".alert")}_triggerCloseEvent(t){return m.trigger(t,"close.bs.alert")}_removeElement(t){var e;t.classList.remove("show"),t.classList.contains("fade")?(e=d(t),m.one(t,"transitionend",()=>this._destroyElement(t)),u(t,e)):this._destroyElement(t)}_destroyElement(t){t.parentNode&&t.parentNode.removeChild(t),m.trigger(t,"closed.bs.alert")}static jQueryInterface(e){return this.each(function(){let t=a(this,lt);t=t||new ct(this),"close"===e&&t[e](this)})}static handleDismiss(e){return function(t){t&&t.preventDefault(),e.close(this)}}}m.on(document,"click.bs.alert.data-api",'[data-bs-dismiss="alert"]',ct.handleDismiss(new ct)),t("alert",ct);const dt="bs.button";dt;const ut='[data-bs-toggle="button"]';class ht extends s{static get DATA_KEY(){return dt}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(e){return this.each(function(){let t=a(this,dt);t=t||new ht(this),"toggle"===e&&t[e]()})}}function pt(t){return"true"===t||"false"!==t&&(t===Number(t).toString()?Number(t):""===t||"null"===t?null:t)}function ft(t){return t.replace(/[A-Z]/g,t=>"-"+t.toLowerCase())}m.on(document,"click.bs.button.data-api",ut,t=>{t.preventDefault();t=t.target.closest(ut);let e=a(t,dt);(e=e||new ht(t)).toggle()}),t("button",ht);const l={setDataAttribute(t,e,i){t.setAttribute("data-bs-"+ft(e),i)},removeDataAttribute(t,e){t.removeAttribute("data-bs-"+ft(e))},getDataAttributes(i){if(!i)return{};const n={};return Object.keys(i.dataset).filter(t=>t.startsWith("bs")).forEach(t=>{let e=t.replace(/^bs/,"");e=e.charAt(0).toLowerCase()+e.slice(1,e.length),n[e]=pt(i.dataset[t])}),n},getDataAttribute(t,e){return pt(t.getAttribute("data-bs-"+ft(e)))},offset(t){t=t.getBoundingClientRect();return{top:t.top+document.body.scrollTop,left:t.left+document.body.scrollLeft}},position(t){return{top:t.offsetTop,left:t.offsetLeft}}},h={find(t,e=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(e,t))},findOne(t,e=document.documentElement){return Element.prototype.querySelector.call(e,t)},children(t,e){return[].concat(...t.children).filter(t=>t.matches(e))},parents(t,e){var i=[];let n=t.parentNode;for(;n&&n.nodeType===Node.ELEMENT_NODE&&3!==n.nodeType;)n.matches(e)&&i.push(n),n=n.parentNode;return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]}},mt="carousel",gt="bs.carousel",c="."+gt;const yt={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},vt={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},p="next",bt="prev",wt="left",f="right",_t=(c,"slid"+c);c,c,c,c,c,c,c,c,c;c,c;const g="active",kt=".active.carousel-item";class y extends s{constructor(t,e){super(t),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._indicatorsElement=h.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||0<navigator.maxTouchPoints,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return yt}static get DATA_KEY(){return gt}next(){this._isSliding||this._slide(p)}nextWhenVisible(){!document.hidden&&q(this._element)&&this.next()}prev(){this._isSliding||this._slide(bt)}pause(t){t||(this._isPaused=!0),h.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(R(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(t){this._activeElement=h.findOne(kt,this._element);var e=this._getItemIndex(this._activeElement);t>this._items.length-1||t<0||(this._isSliding?m.one(this._element,_t,()=>this.to(t)):e===t?(this.pause(),this.cycle()):(e=e<t?p:bt,this._slide(e,this._items[t])))}dispose(){m.off(this._element,c),this._items=null,this._config=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null,super.dispose()}_getConfig(t){return t={...yt,...t},i(mt,t,vt),t}_handleSwipe(){var t=Math.abs(this.touchDeltaX);t<=40||(t=t/this.touchDeltaX,this.touchDeltaX=0,t&&this._slide(0<t?f:wt))}_addEventListeners(){this._config.keyboard&&m.on(this._element,"keydown.bs.carousel",t=>this._keydown(t)),"hover"===this._config.pause&&(m.on(this._element,"mouseenter.bs.carousel",t=>this.pause(t)),m.on(this._element,"mouseleave.bs.carousel",t=>this.cycle(t))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const e=t=>{!this._pointerEvent||"pen"!==t.pointerType&&"touch"!==t.pointerType?this._pointerEvent||(this.touchStartX=t.touches[0].clientX):this.touchStartX=t.clientX},i=t=>{this.touchDeltaX=t.touches&&1<t.touches.length?0:t.touches[0].clientX-this.touchStartX},n=t=>{!this._pointerEvent||"pen"!==t.pointerType&&"touch"!==t.pointerType||(this.touchDeltaX=t.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(t=>this.cycle(t),500+this._config.interval))};h.find(".carousel-item img",this._element).forEach(t=>{m.on(t,"dragstart.bs.carousel",t=>t.preventDefault())}),this._pointerEvent?(m.on(this._element,"pointerdown.bs.carousel",t=>e(t)),m.on(this._element,"pointerup.bs.carousel",t=>n(t)),this._element.classList.add("pointer-event")):(m.on(this._element,"touchstart.bs.carousel",t=>e(t)),m.on(this._element,"touchmove.bs.carousel",t=>i(t)),m.on(this._element,"touchend.bs.carousel",t=>n(t)))}_keydown(t){/input|textarea/i.test(t.target.tagName)||("ArrowLeft"===t.key?(t.preventDefault(),this._slide(wt)):"ArrowRight"===t.key&&(t.preventDefault(),this._slide(f)))}_getItemIndex(t){return this._items=t&&t.parentNode?h.find(".carousel-item",t.parentNode):[],this._items.indexOf(t)}_getItemByOrder(t,e){var i=t===p,t=t===bt,n=this._getItemIndex(e),o=this._items.length-1;return(t&&0===n||i&&n===o)&&!this._config.wrap?e:-1==(i=(n+(t?-1:1))%this._items.length)?this._items[this._items.length-1]:this._items[i]}_triggerSlideEvent(t,e){var i=this._getItemIndex(t),n=this._getItemIndex(h.findOne(kt,this._element));return m.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:n,to:i})}_setActiveIndicatorElement(e){if(this._indicatorsElement){var t=h.findOne(".active",this._indicatorsElement),i=(t.classList.remove(g),t.removeAttribute("aria-current"),h.find("[data-bs-target]",this._indicatorsElement));for(let t=0;t<i.length;t++)if(Number.parseInt(i[t].getAttribute("data-bs-slide-to"),10)===this._getItemIndex(e)){i[t].classList.add(g),i[t].setAttribute("aria-current","true");break}}}_updateInterval(){var t=this._activeElement||h.findOne(kt,this._element);t&&((t=Number.parseInt(t.getAttribute("data-bs-interval"),10))?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=t):this._config.interval=this._config.defaultInterval||this._config.interval)}_slide(t,e){t=this._directionToOrder(t);const i=h.findOne(kt,this._element),n=this._getItemIndex(i),o=e||this._getItemByOrder(t,i),s=this._getItemIndex(o);var e=Boolean(this._interval),r=t===p;const a=r?"carousel-item-start":"carousel-item-end",l=r?"carousel-item-next":"carousel-item-prev",c=this._orderToDirection(t);o&&o.classList.contains(g)?this._isSliding=!1:this._triggerSlideEvent(o,c).defaultPrevented||i&&o&&(this._isSliding=!0,e&&this.pause(),this._setActiveIndicatorElement(o),this._activeElement=o,this._element.classList.contains("slide")?(o.classList.add(l),z(o),i.classList.add(a),o.classList.add(a),r=d(i),m.one(i,"transitionend",()=>{o.classList.remove(a,l),o.classList.add(g),i.classList.remove(g,l,a),this._isSliding=!1,setTimeout(()=>{m.trigger(this._element,_t,{relatedTarget:o,direction:c,from:n,to:s})},0)}),u(i,r)):(i.classList.remove(g),o.classList.add(g),this._isSliding=!1,m.trigger(this._element,_t,{relatedTarget:o,direction:c,from:n,to:s})),e)&&this.cycle()}_directionToOrder(t){return[f,wt].includes(t)?e()?t===f?bt:p:t===f?p:bt:t}_orderToDirection(t){return[p,bt].includes(t)?e()?t===p?wt:f:t===p?f:wt:t}static carouselInterface(t,e){let i=a(t,gt),n={...yt,...l.getDataAttributes(t)};"object"==typeof e&&(n={...n,...e});var o="string"==typeof e?e:n.slide;if(i=i||new y(t,n),"number"==typeof e)i.to(e);else if("string"==typeof o){if(void 0===i[o])throw new TypeError(`No method named "${o}"`);i[o]()}else n.interval&&n.ride&&(i.pause(),i.cycle())}static jQueryInterface(t){return this.each(function(){y.carouselInterface(this,t)})}static dataApiClickHandler(t){var e,i,n=o(this);n&&n.classList.contains("carousel")&&(e={...l.getDataAttributes(n),...l.getDataAttributes(this)},(i=this.getAttribute("data-bs-slide-to"))&&(e.interval=!1),y.carouselInterface(n,e),i&&a(n,gt).to(i),t.preventDefault())}}m.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",y.dataApiClickHandler),m.on(window,"load.bs.carousel.data-api",()=>{var i=h.find('[data-bs-ride="carousel"]');for(let t=0,e=i.length;t<e;t++)y.carouselInterface(i[t],a(i[t],gt))}),t(mt,y);const xt="collapse",Tt="bs.collapse";Tt;const St={toggle:!0,parent:""},Ct={toggle:"boolean",parent:"(string|element)"};const v="show",Et="collapse",Dt="collapsing",At="collapsed",Lt='[data-bs-toggle="collapse"]';class Ot extends s{constructor(t,e){super(t),this._isTransitioning=!1,this._config=this._getConfig(e),this._triggerArray=h.find(Lt+`[href="#${this._element.id}"],`+Lt+`[data-bs-target="#${this._element.id}"]`);var i=h.find(Lt);for(let t=0,e=i.length;t<e;t++){var n=i[t],o=F(n),s=h.find(o).filter(t=>t===this._element);null!==o&&s.length&&(this._selector=o,this._triggerArray.push(n))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}static get Default(){return St}static get DATA_KEY(){return Tt}toggle(){this._element.classList.contains(v)?this.hide():this.show()}show(){if(!this._isTransitioning&&!this._element.classList.contains(v)){let t,e;this._parent&&0===(t=h.find(".show, .collapsing",this._parent).filter(t=>"string"==typeof this._config.parent?t.getAttribute("data-bs-parent")===this._config.parent:t.classList.contains(Et))).length&&(t=null);const o=h.findOne(this._selector);if(t){var i=t.find(t=>o!==t);if((e=i?a(i,Tt):null)&&e._isTransitioning)return}i=m.trigger(this._element,"show.bs.collapse");if(!i.defaultPrevented){t&&t.forEach(t=>{o!==t&&Ot.collapseInterface(t,"hide"),e||G(t,Tt,null)});const s=this._getDimension();this._element.classList.remove(Et),this._element.classList.add(Dt),this._element.style[s]=0,this._triggerArray.length&&this._triggerArray.forEach(t=>{t.classList.remove(At),t.setAttribute("aria-expanded",!0)}),this.setTransitioning(!0);var i="scroll"+(s[0].toUpperCase()+s.slice(1)),n=d(this._element);m.one(this._element,"transitionend",()=>{this._element.classList.remove(Dt),this._element.classList.add(Et,v),this._element.style[s]="",this.setTransitioning(!1),m.trigger(this._element,"shown.bs.collapse")}),u(this._element,n),this._element.style[s]=this._element[i]+"px"}}}hide(){if(!this._isTransitioning&&this._element.classList.contains(v)){var t=m.trigger(this._element,"hide.bs.collapse");if(!t.defaultPrevented){var t=this._getDimension(),e=(this._element.style[t]=this._element.getBoundingClientRect()[t]+"px",z(this._element),this._element.classList.add(Dt),this._element.classList.remove(Et,v),this._triggerArray.length);if(0<e)for(let t=0;t<e;t++){var i=this._triggerArray[t],n=o(i);n&&!n.classList.contains(v)&&(i.classList.add(At),i.setAttribute("aria-expanded",!1))}this.setTransitioning(!0);this._element.style[t]="";t=d(this._element);m.one(this._element,"transitionend",()=>{this.setTransitioning(!1),this._element.classList.remove(Dt),this._element.classList.add(Et),m.trigger(this._element,"hidden.bs.collapse")}),u(this._element,t)}}}setTransitioning(t){this._isTransitioning=t}dispose(){super.dispose(),this._config=null,this._parent=null,this._triggerArray=null,this._isTransitioning=null}_getConfig(t){return(t={...St,...t}).toggle=Boolean(t.toggle),i(xt,t,Ct),t}_getDimension(){return this._element.classList.contains("width")?"width":"height"}_getParent(){let t=this._config["parent"];r(t)?void 0===t.jquery&&void 0===t[0]||(t=t[0]):t=h.findOne(t);var e=Lt+`[data-bs-parent="${t}"]`;return h.find(e,t).forEach(t=>{var e=o(t);this._addAriaAndCollapsedClass(e,[t])}),t}_addAriaAndCollapsedClass(t,e){if(t&&e.length){const i=t.classList.contains(v);e.forEach(t=>{i?t.classList.remove(At):t.classList.add(At),t.setAttribute("aria-expanded",i)})}}static collapseInterface(t,e){let i=a(t,Tt);var n={...St,...l.getDataAttributes(t),..."object"==typeof e&&e?e:{}};if(!i&&n.toggle&&"string"==typeof e&&/show|hide/.test(e)&&(n.toggle=!1),i=i||new Ot(t,n),"string"==typeof e){if(void 0===i[e])throw new TypeError(`No method named "${e}"`);i[e]()}}static jQueryInterface(t){return this.each(function(){Ot.collapseInterface(this,t)})}}m.on(document,"click.bs.collapse.data-api",Lt,function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const n=l.getDataAttributes(this);t=F(this);h.find(t).forEach(t=>{var e=a(t,Tt);let i;i=e?(null===e._parent&&"string"==typeof n.parent&&(e._config.parent=n.parent,e._parent=e._getParent()),"toggle"):n,Ot.collapseInterface(t,i)})}),t(xt,Ot);var E="top",D="bottom",A="right",L="left",$t="auto",Mt=[E,D,A,L],jt="start",Pt="end",Nt="clippingParents",It="viewport",Ht="popper",Ft="reference",Rt=Mt.reduce(function(t,e){return t.concat([e+"-"+jt,e+"-"+Pt])},[]),qt=[].concat(Mt,[$t]).reduce(function(t,e){return t.concat([e,e+"-"+jt,e+"-"+Pt])},[]),Yt="beforeRead",Wt="afterRead",Bt="beforeMain",zt="afterMain",Ut="beforeWrite",Gt="afterWrite",Vt=[Yt,"read",Wt,Bt,"main",zt,Ut,"write",Gt];function b(t){return t?(t.nodeName||"").toLowerCase():null}function w(t){var e;return null==t?window:"[object Window]"!==t.toString()?(e=t.ownerDocument)&&e.defaultView||window:t}function Xt(t){return t instanceof w(t).Element||t instanceof Element}function _(t){return t instanceof w(t).HTMLElement||t instanceof HTMLElement}function Zt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof w(t).ShadowRoot||t instanceof ShadowRoot)}var Qt={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var o=t.state;Object.keys(o.elements).forEach(function(t){var e=o.styles[t]||{},i=o.attributes[t]||{},n=o.elements[t];_(n)&&b(n)&&(Object.assign(n.style,e),Object.keys(i).forEach(function(t){var e=i[t];!1===e?n.removeAttribute(t):n.setAttribute(t,!0===e?"":e)}))})},effect:function(t){var n=t.state,o={popper:{position:n.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(n.elements.popper.style,o.popper),n.styles=o,n.elements.arrow&&Object.assign(n.elements.arrow.style,o.arrow),function(){Object.keys(n.elements).forEach(function(t){var e=n.elements[t],i=n.attributes[t]||{},t=Object.keys((n.styles.hasOwnProperty(t)?n.styles:o)[t]).reduce(function(t,e){return t[e]="",t},{});_(e)&&b(e)&&(Object.assign(e.style,t),Object.keys(i).forEach(function(t){e.removeAttribute(t)}))})}},requires:["computeStyles"]};function O(t){return t.split("-")[0]}function Jt(t){t=t.getBoundingClientRect();return{width:t.width,height:t.height,top:t.top,right:t.right,bottom:t.bottom,left:t.left,x:t.left,y:t.top}}function Kt(t){var e=Jt(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function te(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&Zt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0}while(n=n.parentNode||n.host)}return!1}function k(t){return w(t).getComputedStyle(t)}function x(t){return((Xt(t)?t.ownerDocument:t.document)||window.document).documentElement}function ee(t){return"html"===b(t)?t:t.assignedSlot||t.parentNode||(Zt(t)?t.host:null)||x(t)}function ie(t){return _(t)&&"fixed"!==k(t).position?t.offsetParent:null}function ne(t){for(var e,i=w(t),n=ie(t);n&&(e=n,0<=["table","td","th"].indexOf(b(e)))&&"static"===k(n).position;)n=ie(n);return(!n||"html"!==b(n)&&("body"!==b(n)||"static"!==k(n).position))&&(n||function(t){for(var e=-1!==navigator.userAgent.toLowerCase().indexOf("firefox"),i=ee(t);_(i)&&["html","body"].indexOf(b(i))<0;){var n=k(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t))||i}function oe(t){return 0<=["top","bottom"].indexOf(t)?"x":"y"}var T=Math.max,se=Math.min,re=Math.round;function ae(t,e,i){return T(t,se(e,i))}function le(){return{top:0,right:0,bottom:0,left:0}}function ce(t){return Object.assign({},le(),t)}function de(i,t){return t.reduce(function(t,e){return t[e]=i,t},{})}var ue={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i,n,o,s=t.state,r=t.name,t=t.options,a=s.elements.arrow,l=s.modifiersData.popperOffsets,c=oe(d=O(s.placement)),d=0<=[L,A].indexOf(d)?"height":"width";a&&l&&(t=t.padding,i=s,i=ce("number"!=typeof(t="function"==typeof t?t(Object.assign({},i.rects,{placement:i.placement})):t)?t:de(t,Mt)),t=Kt(a),o="y"===c?E:L,n="y"===c?D:A,e=s.rects.reference[d]+s.rects.reference[c]-l[c]-s.rects.popper[d],l=l[c]-s.rects.reference[c],a=(a=ne(a))?"y"===c?a.clientHeight||0:a.clientWidth||0:0,o=i[o],i=a-t[d]-i[n],o=ae(o,n=a/2-t[d]/2+(e/2-l/2),i),s.modifiersData[r]=((a={})[c]=o,a.centerOffset=o-n,a))},effect:function(t){var e=t.state;null!=(t=void 0===(t=t.options.element)?"[data-popper-arrow]":t)&&("string"!=typeof t||(t=e.elements.popper.querySelector(t)))&&te(e.elements.popper,t)&&(e.elements.arrow=t)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},he={top:"auto",right:"auto",bottom:"auto",left:"auto"};function pe(t){var e,i,n,o=t.popper,s=t.popperRect,r=t.placement,a=t.offsets,l=t.position,c=t.gpuAcceleration,d=t.adaptive,t=t.roundOffsets,u=!0===t?(u=(h=a).x,h=a.y,p=window.devicePixelRatio||1,{x:re(re(u*p)/p)||0,y:re(re(h*p)/p)||0}):"function"==typeof t?t(a):a,h=u.x,p=void 0===h?0:h,t=u.y,t=void 0===t?0:t,f=a.hasOwnProperty("x"),a=a.hasOwnProperty("y"),m=L,g=E,y=window,o=(d&&(n="clientHeight",i="clientWidth",(e=ne(o))===w(o)&&"static"!==k(e=x(o)).position&&(n="scrollHeight",i="scrollWidth"),r===E&&(g=D,t=(t-(e[n]-s.height))*(c?1:-1)),r===L)&&(m=A,p=(p-(e[i]-s.width))*(c?1:-1)),Object.assign({position:l},d&&he));return c?Object.assign({},o,((n={})[g]=a?"0":"",n[m]=f?"0":"",n.transform=(y.devicePixelRatio||1)<2?"translate("+p+"px, "+t+"px)":"translate3d("+p+"px, "+t+"px, 0)",n)):Object.assign({},o,((r={})[g]=a?t+"px":"",r[m]=f?p+"px":"",r.transform="",r))}var fe={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,t=t.options,i=void 0===(i=t.gpuAcceleration)||i,n=void 0===(n=t.adaptive)||n,t=void 0===(t=t.roundOffsets)||t,i={placement:O(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:i};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,pe(Object.assign({},i,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:n,roundOffsets:t})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,pe(Object.assign({},i,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:t})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}},me={passive:!0};var ge={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=(t=t.options).scroll,o=void 0===n||n,s=void 0===(n=t.resize)||n,r=w(e.elements.popper),a=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&a.forEach(function(t){t.addEventListener("scroll",i.update,me)}),s&&r.addEventListener("resize",i.update,me),function(){o&&a.forEach(function(t){t.removeEventListener("scroll",i.update,me)}),s&&r.removeEventListener("resize",i.update,me)}},data:{}},ye={left:"right",right:"left",bottom:"top",top:"bottom"};function ve(t){return t.replace(/left|right|bottom|top/g,function(t){return ye[t]})}var be={start:"end",end:"start"};function we(t){return t.replace(/start|end/g,function(t){return be[t]})}function _e(t){t=w(t);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function ke(t){return Jt(x(t)).left+_e(t).scrollLeft}function xe(t){var t=k(t),e=t.overflow,i=t.overflowX,t=t.overflowY;return/auto|scroll|overlay|hidden/.test(e+t+i)}function Te(t,e){void 0===e&&(e=[]);var i=function t(e){return 0<=["html","body","#document"].indexOf(b(e))?e.ownerDocument.body:_(e)&&xe(e)?e:t(ee(e))}(t),t=i===(null==(t=t.ownerDocument)?void 0:t.body),n=w(i),n=t?[n].concat(n.visualViewport||[],xe(i)?i:[]):i,i=e.concat(n);return t?i:i.concat(Te(ee(n)))}function Se(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Ce(t,e){return e===It?Se((n=w(i=t),o=x(i),n=n.visualViewport,s=o.clientWidth,o=o.clientHeight,a=r=0,n&&(s=n.width,o=n.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(r=n.offsetLeft,a=n.offsetTop)),{width:s,height:o,x:r+ke(i),y:a})):_(e)?((s=Jt(n=e)).top=s.top+n.clientTop,s.left=s.left+n.clientLeft,s.bottom=s.top+n.clientHeight,s.right=s.left+n.clientWidth,s.width=n.clientWidth,s.height=n.clientHeight,s.x=s.left,s.y=s.top,s):Se((o=x(t),r=x(o),i=_e(o),a=null==(a=o.ownerDocument)?void 0:a.body,e=T(r.scrollWidth,r.clientWidth,a?a.scrollWidth:0,a?a.clientWidth:0),t=T(r.scrollHeight,r.clientHeight,a?a.scrollHeight:0,a?a.clientHeight:0),o=-i.scrollLeft+ke(o),i=-i.scrollTop,"rtl"===k(a||r).direction&&(o+=T(r.clientWidth,a?a.clientWidth:0)-e),{width:e,height:t,x:o,y:i}));var i,n,o,s,r,a}function Ee(i,t,e){var n,o="clippingParents"===t?(s=Te(ee(o=i)),Xt(n=0<=["absolute","fixed"].indexOf(k(o).position)&&_(o)?ne(o):o)?s.filter(function(t){return Xt(t)&&te(t,n)&&"body"!==b(t)}):[]):[].concat(t),s=[].concat(o,[e]),t=s[0],e=s.reduce(function(t,e){e=Ce(i,e);return t.top=T(e.top,t.top),t.right=se(e.right,t.right),t.bottom=se(e.bottom,t.bottom),t.left=T(e.left,t.left),t},Ce(i,t));return e.width=e.right-e.left,e.height=e.bottom-e.top,e.x=e.left,e.y=e.top,e}function De(t){return t.split("-")[1]}function Ae(t){var e,i=t.reference,n=t.element,t=t.placement,o=t?O(t):null,t=t?De(t):null,s=i.x+i.width/2-n.width/2,r=i.y+i.height/2-n.height/2;switch(o){case E:e={x:s,y:i.y-n.height};break;case D:e={x:s,y:i.y+i.height};break;case A:e={x:i.x+i.width,y:r};break;case L:e={x:i.x-n.width,y:r};break;default:e={x:i.x,y:i.y}}var a=o?oe(o):null;if(null!=a){var l="y"===a?"height":"width";switch(t){case jt:e[a]=e[a]-(i[l]/2-n[l]/2);break;case Pt:e[a]=e[a]+(i[l]/2-n[l]/2)}}return e}function Le(t,e){var n,e=e=void 0===e?{}:e,i=e.placement,i=void 0===i?t.placement:i,o=e.boundary,o=void 0===o?Nt:o,s=e.rootBoundary,s=void 0===s?It:s,r=e.elementContext,r=void 0===r?Ht:r,a=e.altBoundary,a=void 0!==a&&a,e=e.padding,e=void 0===e?0:e,e=ce("number"!=typeof e?e:de(e,Mt)),l=t.elements.reference,c=t.rects.popper,a=t.elements[a?r===Ht?Ft:Ht:r],a=Ee(Xt(a)?a:a.contextElement||x(t.elements.popper),o,s),o=Jt(l),s=Ae({reference:o,element:c,strategy:"absolute",placement:i}),l=Se(Object.assign({},c,s)),c=r===Ht?l:o,d={top:a.top-c.top+e.top,bottom:c.bottom-a.bottom+e.bottom,left:a.left-c.left+e.left,right:c.right-a.right+e.right},s=t.modifiersData.offset;return r===Ht&&s&&(n=s[i],Object.keys(d).forEach(function(t){var e=0<=[A,D].indexOf(t)?1:-1,i=0<=[E,D].indexOf(t)?"y":"x";d[t]+=n[i]*e})),d}var Oe={name:"flip",enabled:!0,phase:"main",fn:function(t){var u=t.state,e=t.options,t=t.name;if(!u.modifiersData[t]._skip){for(var i=e.mainAxis,n=void 0===i||i,i=e.altAxis,o=void 0===i||i,i=e.fallbackPlacements,h=e.padding,p=e.boundary,f=e.rootBoundary,s=e.altBoundary,r=e.flipVariations,m=void 0===r||r,g=e.allowedAutoPlacements,r=u.options.placement,e=O(r),i=i||(e===r||!m?[ve(r)]:O(i=r)===$t?[]:(e=ve(i),[we(i),e,we(e)])),a=[r].concat(i).reduce(function(t,e){return t.concat(O(e)===$t?(i=u,n=(t=t=void 0===(t={placement:e,boundary:p,rootBoundary:f,padding:h,flipVariations:m,allowedAutoPlacements:g})?{}:t).placement,o=t.boundary,s=t.rootBoundary,r=t.padding,a=t.flipVariations,l=void 0===(t=t.allowedAutoPlacements)?qt:t,c=De(n),t=c?a?Rt:Rt.filter(function(t){return De(t)===c}):Mt,d=(n=0===(n=t.filter(function(t){return 0<=l.indexOf(t)})).length?t:n).reduce(function(t,e){return t[e]=Le(i,{placement:e,boundary:o,rootBoundary:s,padding:r})[O(e)],t},{}),Object.keys(d).sort(function(t,e){return d[t]-d[e]})):e);var i,n,o,s,r,a,l,c,d},[]),l=u.rects.reference,c=u.rects.popper,d=new Map,y=!0,v=a[0],b=0;b<a.length;b++){var w=a[b],_=O(w),k=De(w)===jt,x=0<=[E,D].indexOf(_),T=x?"width":"height",S=Le(u,{placement:w,boundary:p,rootBoundary:f,altBoundary:s,padding:h}),x=x?k?A:L:k?D:E,k=(l[T]>c[T]&&(x=ve(x)),ve(x)),T=[];if(n&&T.push(S[_]<=0),o&&T.push(S[x]<=0,S[k]<=0),T.every(function(t){return t})){v=w,y=!1;break}d.set(w,T)}if(y)for(var C=m?3:1;0<C;C--)if("break"===function(e){var t=a.find(function(t){t=d.get(t);if(t)return t.slice(0,e).every(function(t){return t})});if(t)return v=t,"break"}(C))break;u.placement!==v&&(u.modifiersData[t]._skip=!0,u.placement=v,u.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function $e(t,e,i){return{top:t.top-e.height-(i=void 0===i?{x:0,y:0}:i).y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Me(e){return[E,A,D,L].some(function(t){return 0<=e[t]})}var je={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,t=t.name,i=e.rects.reference,n=e.rects.popper,o=e.modifiersData.preventOverflow,s=Le(e,{elementContext:"reference"}),r=Le(e,{altBoundary:!0}),s=$e(s,i),i=$e(r,n,o),r=Me(s),n=Me(i);e.modifiersData[t]={referenceClippingOffsets:s,popperEscapeOffsets:i,isReferenceHidden:r,hasPopperEscaped:n},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":r,"data-popper-escaped":n})}};var Pe={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var r=t.state,e=t.options,t=t.name,a=void 0===(e=e.offset)?[0,0]:e,e=qt.reduce(function(t,e){var i,n,o,s;return t[e]=(e=e,i=r.rects,n=a,o=O(e),s=0<=[L,E].indexOf(o)?-1:1,e=(i="function"==typeof n?n(Object.assign({},i,{placement:e})):n)[0]||0,n=(i[1]||0)*s,0<=[L,A].indexOf(o)?{x:n,y:e}:{x:e,y:n}),t},{}),i=(n=e[r.placement]).x,n=n.y;null!=r.modifiersData.popperOffsets&&(r.modifiersData.popperOffsets.x+=i,r.modifiersData.popperOffsets.y+=n),r.modifiersData[t]=e}};var Ne={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,t=t.name;e.modifiersData[t]=Ae({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}};var Ie={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e,i,n,o,s,r,a,l,c,d=t.state,u=t.options,t=t.name,h=void 0===(h=u.mainAxis)||h,p=void 0!==(p=u.altAxis)&&p,f=u.boundary,m=u.rootBoundary,g=u.altBoundary,y=u.padding,v=void 0===(v=u.tether)||v,u=void 0===(u=u.tetherOffset)?0:u,f=Le(d,{boundary:f,rootBoundary:m,padding:y,altBoundary:g}),m=O(d.placement),g=!(y=De(d.placement)),b="x"===(m=oe(m))?"y":"x",w=d.modifiersData.popperOffsets,_=d.rects.reference,k=d.rects.popper,u="function"==typeof u?u(Object.assign({},d.rects,{placement:d.placement})):u,x={x:0,y:0};w&&((h||p)&&(s="y"===m?"height":"width",e=w[m],i=w[m]+f[c="y"===m?E:L],n=w[m]-f[a="y"===m?D:A],r=v?-k[s]/2:0,o=(y===jt?_:k)[s],y=y===jt?-k[s]:-_[s],k=d.elements.arrow,k=v&&k?Kt(k):{width:0,height:0},c=(l=d.modifiersData["arrow#persistent"]?d.modifiersData["arrow#persistent"].padding:le())[c],l=l[a],a=ae(0,_[s],k[s]),k=g?_[s]/2-r-a-c-u:o-a-c-u,o=g?-_[s]/2+r+a+l+u:y+a+l+u,g=(c=d.elements.arrow&&ne(d.elements.arrow))?"y"===m?c.clientTop||0:c.clientLeft||0:0,_=d.modifiersData.offset?d.modifiersData.offset[d.placement][m]:0,s=w[m]+k-_-g,r=w[m]+o-_,h&&(y=ae(v?se(i,s):i,e,v?T(n,r):n),w[m]=y,x[m]=y-e),p)&&(l=(a=w[b])+f["x"===m?E:L],u=a-f["x"===m?D:A],c=ae(v?se(l,s):l,a,v?T(u,r):u),w[b]=c,x[b]=c-a),d.modifiersData[t]=x)},requiresIfExists:["offset"]};function He(t,e,i){void 0===i&&(i=!1);var n=x(e),t=Jt(t),o=_(e),s={scrollLeft:0,scrollTop:0},r={x:0,y:0};return!o&&i||("body"===b(e)&&!xe(n)||(s=(o=e)!==w(o)&&_(o)?{scrollLeft:o.scrollLeft,scrollTop:o.scrollTop}:_e(o)),_(e)?((r=Jt(e)).x+=e.clientLeft,r.y+=e.clientTop):n&&(r.x=ke(n))),{x:t.left+s.scrollLeft-r.x,y:t.top+s.scrollTop-r.y,width:t.width,height:t.height}}function Fe(t){var i=new Map,n=new Set,o=[];return t.forEach(function(t){i.set(t.name,t)}),t.forEach(function(t){n.has(t.name)||!function e(t){n.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach(function(t){n.has(t)||(t=i.get(t))&&e(t)}),o.push(t)}(t)}),o}var Re={placement:"bottom",modifiers:[],strategy:"absolute"};function qe(){for(var t=arguments.length,e=new Array(t),i=0;i<t;i++)e[i]=arguments[i];return!e.some(function(t){return!(t&&"function"==typeof t.getBoundingClientRect)})}function Ye(t){var t=t=void 0===t?{}:t,e=t.defaultModifiers,u=void 0===e?[]:e,e=t.defaultOptions,h=void 0===e?Re:e;return function(n,o,e){void 0===e&&(e=h);var i,s,r={placement:"bottom",orderedModifiers:[],options:Object.assign({},Re,h),modifiersData:{},elements:{reference:n,popper:o},attributes:{},styles:{}},a=[],l=!1,c={state:r,setOptions:function(t){d(),r.options=Object.assign({},h,r.options,t),r.scrollParents={reference:Xt(n)?Te(n):n.contextElement?Te(n.contextElement):[],popper:Te(o)};t=[].concat(u,r.options.modifiers),e=t.reduce(function(t,e){var i=t[e.name];return t[e.name]=i?Object.assign({},i,e,{options:Object.assign({},i.options,e.options),data:Object.assign({},i.data,e.data)}):e,t},{}),t=Object.keys(e).map(function(t){return e[t]}),i=Fe(t);var i,e,t=Vt.reduce(function(t,e){return t.concat(i.filter(function(t){return t.phase===e}))},[]);return r.orderedModifiers=t.filter(function(t){return t.enabled}),r.orderedModifiers.forEach(function(t){var e=t.name,i=t.options,t=t.effect;"function"==typeof t&&(t=t({state:r,name:e,instance:c,options:void 0===i?{}:i}),a.push(t||function(){}))}),c.update()},forceUpdate:function(){if(!l){var t=r.elements,e=t.reference,t=t.popper;if(qe(e,t)){r.rects={reference:He(e,ne(t),"fixed"===r.options.strategy),popper:Kt(t)},r.reset=!1,r.placement=r.options.placement,r.orderedModifiers.forEach(function(t){return r.modifiersData[t.name]=Object.assign({},t.data)});for(var i,n,o,s=0;s<r.orderedModifiers.length;s++)!0===r.reset?(r.reset=!1,s=-1):(i=(o=r.orderedModifiers[s]).fn,n=o.options,o=o.name,"function"==typeof i&&(r=i({state:r,options:void 0===n?{}:n,name:o,instance:c})||r))}}},update:(i=function(){return new Promise(function(t){c.forceUpdate(),t(r)})},function(){return s=s||new Promise(function(t){Promise.resolve().then(function(){s=void 0,t(i())})})}),destroy:function(){d(),l=!0}};return qe(n,o)&&c.setOptions(e).then(function(t){!l&&e.onFirstUpdate&&e.onFirstUpdate(t)}),c;function d(){a.forEach(function(t){return t()}),a=[]}}}var We=Ye({defaultModifiers:[ge,Ne,fe,Qt,Pe,Oe,Ie,ue,je]}),Be=Object.freeze({__proto__:null,popperGenerator:Ye,detectOverflow:Le,createPopperBase:Ye(),createPopper:We,createPopperLite:Ye({defaultModifiers:[ge,Ne,fe,Qt]}),top:E,bottom:D,right:A,left:L,auto:$t,basePlacements:Mt,start:jt,end:Pt,clippingParents:Nt,viewport:It,popper:Ht,reference:Ft,variationPlacements:Rt,placements:qt,beforeRead:Yt,read:"read",afterRead:Wt,beforeMain:Bt,main:"main",afterMain:zt,beforeWrite:Ut,write:"write",afterWrite:Gt,modifierPhases:Vt,applyStyles:Qt,arrow:ue,computeStyles:fe,eventListeners:ge,flip:Oe,hide:je,offset:Pe,popperOffsets:Ne,preventOverflow:Ie});const ze="dropdown",Ue="bs.dropdown",S="."+Ue;Yt=".data-api";const Ge="Escape",Ve="ArrowUp",Xe="ArrowDown",Ze=new RegExp(Ve+`|${Xe}|`+Ge),Qe="hide"+S,Je="hidden"+S;S,S,S;Wt="click"+S+Yt,Bt="keydown"+S+Yt;S;const Ke="disabled",C="show",ti='[data-bs-toggle="dropdown"]',ei=".dropdown-menu",ii=e()?"top-end":"top-start",ni=e()?"top-start":"top-end",oi=e()?"bottom-end":"bottom-start",si=e()?"bottom-start":"bottom-end",ri=e()?"left-start":"right-start",ai=e()?"right-start":"left-start",li={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null},ci={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)"};class $ extends s{constructor(t,e){super(t),this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}static get Default(){return li}static get DefaultType(){return ci}static get DATA_KEY(){return Ue}toggle(){var t;this._element.disabled||this._element.classList.contains(Ke)||(t=this._element.classList.contains(C),$.clearMenus(),t)||this.show()}show(){if(!(this._element.disabled||this._element.classList.contains(Ke)||this._menu.classList.contains(C))){var e=$.getParentFromElement(this._element),t={relatedTarget:this._element},i=m.trigger(this._element,"show.bs.dropdown",t);if(!i.defaultPrevented){if(this._inNavbar)l.setDataAttribute(this._menu,"popper","none");else{if(void 0===Be)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=e:r(this._config.reference)?(t=this._config.reference,void 0!==this._config.reference.jquery&&(t=this._config.reference[0])):"object"==typeof this._config.reference&&(t=this._config.reference);var i=this._getPopperConfig(),n=i.modifiers.find(t=>"applyStyles"===t.name&&!1===t.enabled);this._popper=We(t,this._menu,i),n&&l.setDataAttribute(this._menu,"popper","static")}"ontouchstart"in document.documentElement&&!e.closest(".navbar-nav")&&[].concat(...document.body.children).forEach(t=>m.on(t,"mouseover",null,B())),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.toggle(C),this._element.classList.toggle(C),m.trigger(this._element,"shown.bs.dropdown",t)}}}hide(){var t;this._element.disabled||this._element.classList.contains(Ke)||!this._menu.classList.contains(C)||(t={relatedTarget:this._element},m.trigger(this._element,Qe,t).defaultPrevented)||(this._popper&&this._popper.destroy(),this._menu.classList.toggle(C),this._element.classList.toggle(C),l.removeDataAttribute(this._menu,"popper"),m.trigger(this._element,Je,t))}dispose(){m.off(this._element,S),this._menu=null,this._popper&&(this._popper.destroy(),this._popper=null),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_addEventListeners(){m.on(this._element,"click.bs.dropdown",t=>{t.preventDefault(),this.toggle()})}_getConfig(t){if(t={...this.constructor.Default,...l.getDataAttributes(this._element),...t},i(ze,t,this.constructor.DefaultType),"object"!=typeof t.reference||r(t.reference)||"function"==typeof t.reference.getBoundingClientRect)return t;throw new TypeError(ze.toUpperCase()+': Option "reference" provided type "object" without a required "getBoundingClientRect" method.')}_getMenuElement(){return h.next(this._element,ei)[0]}_getPlacement(){var t,e=this._element.parentNode;return e.classList.contains("dropend")?ri:e.classList.contains("dropstart")?ai:(t="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim(),e.classList.contains("dropup")?t?ni:ii:t?si:oi)}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const e=this._config["offset"];return"string"==typeof e?e.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof e?t=>e(t,this._element):e}_getPopperConfig(){var t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}static dropdownInterface(t,e){let i=a(t,Ue);var n="object"==typeof e?e:null;if(i=i||new $(t,n),"string"==typeof e){if(void 0===i[e])throw new TypeError(`No method named "${e}"`);i[e]()}}static jQueryInterface(t){return this.each(function(){$.dropdownInterface(this,t)})}static clearMenus(i){if(i){if(2===i.button||"keyup"===i.type&&"Tab"!==i.key)return;if(/input|select|textarea|form/i.test(i.target.tagName))return}var n=h.find(ti);for(let t=0,e=n.length;t<e;t++){var o=a(n[t],Ue),s={relatedTarget:n[t]};if(i&&"click"===i.type&&(s.clickEvent=i),o){var r=o._menu;if(n[t].classList.contains(C)){if(i){if([o._element].some(t=>i.composedPath().includes(t)))continue;if("keyup"===i.type&&"Tab"===i.key&&r.contains(i.target))continue}m.trigger(n[t],Qe,s).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>m.off(t,"mouseover",null,B())),n[t].setAttribute("aria-expanded","false"),o._popper&&o._popper.destroy(),r.classList.remove(C),n[t].classList.remove(C),l.removeDataAttribute(r,"popper"),m.trigger(n[t],Je,s))}}}}static getParentFromElement(t){return o(t)||t.parentNode}static dataApiKeydownHandler(e){if((/input|textarea/i.test(e.target.tagName)?!("Space"===e.key||e.key!==Ge&&(e.key!==Xe&&e.key!==Ve||e.target.closest(ei))):Ze.test(e.key))&&(e.preventDefault(),e.stopPropagation(),!this.disabled)&&!this.classList.contains(Ke)){var t=$.getParentFromElement(this),i=this.classList.contains(C);if(e.key===Ge)(this.matches(ti)?this:h.prev(this,ti)[0]).focus(),$.clearMenus();else if(i||e.key!==Ve&&e.key!==Xe)if(i&&"Space"!==e.key){i=h.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",t).filter(q);if(i.length){let t=i.indexOf(e.target);e.key===Ve&&0<t&&t--,e.key===Xe&&t<i.length-1&&t++,i[t=-1===t?0:t].focus()}}else $.clearMenus();else(this.matches(ti)?this:h.prev(this,ti)[0]).click()}}}m.on(document,Bt,ti,$.dataApiKeydownHandler),m.on(document,Bt,ei,$.dataApiKeydownHandler),m.on(document,Wt,$.clearMenus),m.on(document,"keyup.bs.dropdown.data-api",$.clearMenus),m.on(document,Wt,ti,function(t){t.preventDefault(),$.dropdownInterface(this)}),t(ze,$);const di="bs.modal",M="."+di;const ui={backdrop:!0,keyboard:!0,focus:!0},hi={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"},pi=(M,M,"hidden"+M),fi="show"+M,mi=(M,"focusin"+M),gi="resize"+M,yi="click.dismiss"+M,vi="keydown.dismiss"+M,bi=(M,"mousedown.dismiss"+M);M;const wi="modal-open",_i="show",ki="modal-static";const xi=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Ti=".sticky-top";class Si extends s{constructor(t,e){super(t),this._config=this._getConfig(e),this._dialog=h.findOne(".modal-dialog",this._element),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0}static get Default(){return ui}static get DATA_KEY(){return di}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){var e;this._isShown||this._isTransitioning||(this._isAnimated()&&(this._isTransitioning=!0),e=m.trigger(this._element,fi,{relatedTarget:t}),this._isShown)||e.defaultPrevented||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),m.on(this._element,yi,'[data-bs-dismiss="modal"]',t=>this.hide(t)),m.on(this._dialog,bi,()=>{m.one(this._element,"mouseup.dismiss.bs.modal",t=>{t.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(t)))}hide(t){t&&t.preventDefault(),!this._isShown||this._isTransitioning||m.trigger(this._element,"hide.bs.modal").defaultPrevented||(this._isShown=!1,(t=this._isAnimated())&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),m.off(document,mi),this._element.classList.remove(_i),m.off(this._element,yi),m.off(this._dialog,bi),t?(t=d(this._element),m.one(this._element,"transitionend",t=>this._hideModal(t)),u(this._element,t)):this._hideModal())}dispose(){[window,this._element,this._dialog].forEach(t=>m.off(t,M)),super.dispose(),m.off(document,mi),this._config=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null}handleUpdate(){this._adjustDialog()}_getConfig(t){return t={...ui,...t},i("modal",t,hi),t}_showElement(t){var e=this._isAnimated(),i=h.findOne(".modal-body",this._dialog),i=(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(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,i&&(i.scrollTop=0),e&&z(this._element),this._element.classList.add(_i),this._config.focus&&this._enforceFocus(),()=>{this._config.focus&&this._element.focus(),this._isTransitioning=!1,m.trigger(this._element,"shown.bs.modal",{relatedTarget:t})});e?(e=d(this._dialog),m.one(this._dialog,"transitionend",i),u(this._dialog,e)):i()}_enforceFocus(){m.off(document,mi),m.on(document,mi,t=>{document===t.target||this._element===t.target||this._element.contains(t.target)||this._element.focus()})}_setEscapeEvent(){this._isShown?m.on(this._element,vi,t=>{this._config.keyboard&&"Escape"===t.key?(t.preventDefault(),this.hide()):this._config.keyboard||"Escape"!==t.key||this._triggerBackdropTransition()}):m.off(this._element,vi)}_setResizeEvent(){this._isShown?m.on(window,gi,()=>this._adjustDialog()):m.off(window,gi)}_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._showBackdrop(()=>{document.body.classList.remove(wi),this._resetAdjustments(),this._resetScrollbar(),m.trigger(this._element,pi)})}_removeBackdrop(){this._backdrop.parentNode.removeChild(this._backdrop),this._backdrop=null}_showBackdrop(t){var e,i=this._isAnimated();this._isShown&&this._config.backdrop?(this._backdrop=document.createElement("div"),this._backdrop.className="modal-backdrop",i&&this._backdrop.classList.add("fade"),document.body.appendChild(this._backdrop),m.on(this._element,yi,t=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===this._config.backdrop?this._triggerBackdropTransition():this.hide())}),i&&z(this._backdrop),this._backdrop.classList.add(_i),i?(e=d(this._backdrop),m.one(this._backdrop,"transitionend",t),u(this._backdrop,e)):t()):!this._isShown&&this._backdrop?(this._backdrop.classList.remove(_i),e=()=>{this._removeBackdrop(),t()},i?(i=d(this._backdrop),m.one(this._backdrop,"transitionend",e),u(this._backdrop,i)):e()):t()}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){var t=m.trigger(this._element,"hidePrevented.bs.modal");if(!t.defaultPrevented){const e=this._element.scrollHeight>document.documentElement.clientHeight,i=(e||(this._element.style.overflowY="hidden"),this._element.classList.add(ki),d(this._dialog));m.off(this._element,"transitionend"),m.one(this._element,"transitionend",()=>{this._element.classList.remove(ki),e||(m.one(this._element,"transitionend",()=>{this._element.style.overflowY=""}),u(this._element,i))}),u(this._element,i),this._element.focus()}}_adjustDialog(){var t=this._element.scrollHeight>document.documentElement.clientHeight;(!this._isBodyOverflowing&&t&&!e()||this._isBodyOverflowing&&!t&&e())&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),(this._isBodyOverflowing&&!t&&!e()||!this._isBodyOverflowing&&t&&e())&&(this._element.style.paddingRight=this._scrollbarWidth+"px")}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}_checkScrollbar(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()}_setScrollbar(){this._isBodyOverflowing&&(this._setElementAttributes(xi,"paddingRight",t=>t+this._scrollbarWidth),this._setElementAttributes(Ti,"marginRight",t=>t-this._scrollbarWidth),this._setElementAttributes("body","paddingRight",t=>t+this._scrollbarWidth)),document.body.classList.add(wi)}_setElementAttributes(t,n,o){h.find(t).forEach(t=>{var e,i;t!==document.body&&window.innerWidth>t.clientWidth+this._scrollbarWidth||(e=t.style[n],i=window.getComputedStyle(t)[n],l.setDataAttribute(t,n,e),t.style[n]=o(Number.parseFloat(i))+"px")})}_resetScrollbar(){this._resetElementAttributes(xi,"paddingRight"),this._resetElementAttributes(Ti,"marginRight"),this._resetElementAttributes("body","paddingRight")}_resetElementAttributes(t,i){h.find(t).forEach(t=>{var e=l.getDataAttribute(t,i);void 0===e&&t===document.body?t.style[i]="":(l.removeDataAttribute(t,i),t.style[i]=e)})}_getScrollbarWidth(){var t=document.createElement("div"),e=(t.className="modal-scrollbar-measure",document.body.appendChild(t),t.getBoundingClientRect().width-t.clientWidth);return document.body.removeChild(t),e}static jQueryInterface(i,n){return this.each(function(){let t=a(this,di);var e={...ui,...l.getDataAttributes(this),..."object"==typeof i&&i?i:{}};if(t=t||new Si(this,e),"string"==typeof i){if(void 0===t[i])throw new TypeError(`No method named "${i}"`);t[i](n)}})}}m.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',function(t){const e=o(this);"A"!==this.tagName&&"AREA"!==this.tagName||t.preventDefault(),m.one(e,fi,t=>{t.defaultPrevented||m.one(e,pi,()=>{q(this)&&this.focus()})});let i=a(e,di);i||(t={...l.getDataAttributes(e),...l.getDataAttributes(this)},i=new Si(e,t)),i.toggle(this)}),t("modal",Si);const Ci=".fixed-top, .fixed-bottom, .is-fixed",Ei=".sticky-top",Di=()=>{var t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)},Ai=(t,n,o)=>{const s=Di();h.find(t).forEach(t=>{var e,i;t!==document.body&&window.innerWidth>t.clientWidth+s||(e=t.style[n],i=window.getComputedStyle(t)[n],l.setDataAttribute(t,n,e),t.style[n]=o(Number.parseFloat(i))+"px")})},Li=(t,i)=>{h.find(t).forEach(t=>{var e=l.getDataAttribute(t,i);void 0===e&&t===document.body?t.style.removeProperty(i):(l.removeDataAttribute(t,i),t.style[i]=e)})},Oi="offcanvas",$i="bs.offcanvas";zt="."+$i,Ut=".data-api";const Mi={backdrop:!0,keyboard:!0,scroll:!1},ji={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"},Pi="offcanvas-backdrop",Ni="offcanvas-toggling",Ii=".offcanvas.show",Hi=(Ii,Ni,"hidden"+zt),Fi="focusin"+zt,Ri="click"+zt+Ut;class qi extends s{constructor(t,e){super(t),this._config=this._getConfig(e),this._isShown=!1,this._addEventListeners()}static get Default(){return Mi}static get DATA_KEY(){return $i}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){var e;this._isShown||m.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._config.backdrop&&document.body.classList.add(Pi),this._config.scroll||(e=Di(),document.body.style.overflow="hidden",Ai(Ci,"paddingRight",t=>t+e),Ai(Ei,"marginRight",t=>t-e),Ai("body","paddingRight",t=>t+e)),this._element.classList.add(Ni),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add("show"),setTimeout(()=>{this._element.classList.remove(Ni),m.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t}),this._enforceFocusOnElement(this._element)},d(this._element)))}hide(){this._isShown&&!m.trigger(this._element,"hide.bs.offcanvas").defaultPrevented&&(this._element.classList.add(Ni),m.off(document,Fi),this._element.blur(),this._isShown=!1,this._element.classList.remove("show"),setTimeout(()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.backdrop&&document.body.classList.remove(Pi),this._config.scroll||(document.body.style.overflow="auto",Li(Ci,"paddingRight"),Li(Ei,"marginRight"),Li("body","paddingRight")),m.trigger(this._element,Hi),this._element.classList.remove(Ni)},d(this._element)))}_getConfig(t){return t={...Mi,...l.getDataAttributes(this._element),..."object"==typeof t?t:{}},i(Oi,t,ji),t}_enforceFocusOnElement(e){m.off(document,Fi),m.on(document,Fi,t=>{document===t.target||e===t.target||e.contains(t.target)||e.focus()}),e.focus()}_addEventListeners(){m.on(this._element,"click.dismiss.bs.offcanvas",'[data-bs-dismiss="offcanvas"]',()=>this.hide()),m.on(document,"keydown",t=>{this._config.keyboard&&"Escape"===t.key&&this.hide()}),m.on(document,Ri,t=>{var e=h.findOne(F(t.target));this._element.contains(t.target)||e===this._element||this.hide()})}static jQueryInterface(e){return this.each(function(){var t=a(this,$i)||new qi(this,"object"==typeof e?e:{});if("string"==typeof e){if(void 0===t[e]||e.startsWith("_")||"constructor"===e)throw new TypeError(`No method named "${e}"`);t[e](this)}})}}m.on(document,Ri,'[data-bs-toggle="offcanvas"]',function(t){var e=o(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),Y(this)||(m.one(e,Hi,()=>{q(this)&&this.focus()}),(t=h.findOne(".offcanvas.show, .offcanvas-toggling"))&&t!==e)||(a(e,$i)||new qi(e)).toggle(this)}),m.on(window,"load.bs.offcanvas.data-api",()=>{h.find(Ii).forEach(t=>(a(t,$i)||new qi(t)).show())}),t(Oi,qi);const Yi=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]);const Wi=/^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i,Bi=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;Gt={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],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:[]};function zi(t,i,e){if(!t.length)return t;if(e&&"function"==typeof e)return e(t);var e=(new window.DOMParser).parseFromString(t,"text/html"),n=Object.keys(i),o=[].concat(...e.body.querySelectorAll("*"));for(let t=0,e=o.length;t<e;t++){const a=o[t];var s=a.nodeName.toLowerCase();if(n.includes(s)){var r=[].concat(...a.attributes);const l=[].concat(i["*"]||[],i[s]||[]);r.forEach(t=>{((t,e)=>{var i=t.nodeName.toLowerCase();if(e.includes(i))return!Yi.has(i)||Boolean(Wi.test(t.nodeValue)||Bi.test(t.nodeValue));var n=e.filter(t=>t instanceof RegExp);for(let t=0,e=n.length;t<e;t++)if(n[t].test(i))return!0;return!1})(t,l)||a.removeAttribute(t.nodeName)})}else a.parentNode.removeChild(a)}return e.body.innerHTML}const Ui="tooltip",Gi="bs.tooltip",j="."+Gi,Vi="bs-tooltip",Xi=new RegExp(`(^|\\s)${Vi}\\S+`,"g"),Zi=new Set(["sanitize","allowList","sanitizeFn"]),Qi={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},Ji={AUTO:"auto",TOP:"top",RIGHT:e()?"left":"right",BOTTOM:"bottom",LEFT:e()?"right":"left"},Ki={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:Gt,popperConfig:null},tn={HIDE:"hide"+j,HIDDEN:"hidden"+j,SHOW:"show"+j,SHOWN:"shown"+j,INSERTED:"inserted"+j,CLICK:"click"+j,FOCUSIN:"focusin"+j,FOCUSOUT:"focusout"+j,MOUSEENTER:"mouseenter"+j,MOUSELEAVE:"mouseleave"+j},en="fade",nn="show",on="show",sn="hover",rn="focus";class an extends s{constructor(t,e){if(void 0===Be)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.config=this._getConfig(e),this.tip=null,this._setListeners()}static get Default(){return Ki}static get NAME(){return Ui}static get DATA_KEY(){return Gi}static get Event(){return tn}static get EVENT_KEY(){return j}static get DefaultType(){return Qi}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){this._isEnabled&&(t?((t=this._initializeOnDelegatedTarget(t))._activeTrigger.click=!t._activeTrigger.click,t._isWithActiveTrigger()?t._enter(null,t):t._leave(null,t)):this.getTipElement().classList.contains(nn)?this._leave(null,this):this._enter(null,this))}dispose(){clearTimeout(this._timeout),m.off(this._element,this.constructor.EVENT_KEY),m.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.parentNode&&this.tip.parentNode.removeChild(this.tip),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.config=null,this.tip=null,super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");var t,e,i;this.isWithContent()&&this._isEnabled&&(i=m.trigger(this._element,this.constructor.Event.SHOW),e=(null===(e=W(this._element))?this._element.ownerDocument.documentElement:e).contains(this._element),!i.defaultPrevented)&&e&&(i=this.getTipElement(),e=I(this.constructor.NAME),i.setAttribute("id",e),this._element.setAttribute("aria-describedby",e),this.setContent(),this.config.animation&&i.classList.add(en),e="function"==typeof this.config.placement?this.config.placement.call(this,i,this._element):this.config.placement,e=this._getAttachment(e),this._addAttachmentClass(e),t=this._getContainer(),G(i,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(t.appendChild(i),m.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=We(this._element,i,this._getPopperConfig(e)),i.classList.add(nn),(t="function"==typeof this.config.customClass?this.config.customClass():this.config.customClass)&&i.classList.add(...t.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>{m.on(t,"mouseover",B())}),e=()=>{var t=this._hoverState;this._hoverState=null,m.trigger(this._element,this.constructor.Event.SHOWN),"out"===t&&this._leave(null,this)},this.tip.classList.contains(en)?(i=d(this.tip),m.one(this.tip,"transitionend",e),u(this.tip,i)):e())}hide(){if(this._popper){const i=this.getTipElement();var t,e=()=>{this._isWithActiveTrigger()||(this._hoverState!==on&&i.parentNode&&i.parentNode.removeChild(i),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),m.trigger(this._element,this.constructor.Event.HIDDEN),this._popper&&(this._popper.destroy(),this._popper=null))};m.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented||(i.classList.remove(nn),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>m.off(t,"mouseover",B)),this._activeTrigger.click=!1,this._activeTrigger[rn]=!1,this._activeTrigger[sn]=!1,this.tip.classList.contains(en)?(t=d(i),m.one(i,"transitionend",e),u(i,t)):e(),this._hoverState="")}}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){var t;return this.tip||((t=document.createElement("div")).innerHTML=this.config.template,this.tip=t.children[0]),this.tip}setContent(){var t=this.getTipElement();this.setElementContent(h.findOne(".tooltip-inner",t),this.getTitle()),t.classList.remove(en,nn)}setElementContent(t,e){null!==t&&("object"==typeof e&&r(e)?(e.jquery&&(e=e[0]),this.config.html?e.parentNode!==t&&(t.innerHTML="",t.appendChild(e)):t.textContent=e.textContent):this.config.html?(this.config.sanitize&&(e=zi(e,this.config.allowList,this.config.sanitizeFn)),t.innerHTML=e):t.textContent=e)}getTitle(){let t=this._element.getAttribute("data-bs-original-title");return t=t||("function"==typeof this.config.title?this.config.title.call(this._element):this.config.title)}updateAttachment(t){return"right"===t?"end":"left"===t?"start":t}_initializeOnDelegatedTarget(t,e){var i=this.constructor.DATA_KEY;return(e=e||a(t.delegateTarget,i))||(e=new this.constructor(t.delegateTarget,this._getDelegateConfig()),G(t.delegateTarget,i,e)),e}_getOffset(){const e=this.config["offset"];return"string"==typeof e?e.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof e?t=>e(t,this._element):e}_getPopperConfig(t){t={placement:t,modifiers:[{name:"flip",options:{altBoundary:!0,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:"onChange",enabled:!0,phase:"afterWrite",fn:t=>this._handlePopperPlacementChange(t)}],onFirstUpdate:t=>{t.options.placement!==t.placement&&this._handlePopperPlacementChange(t)}};return{...t,..."function"==typeof this.config.popperConfig?this.config.popperConfig(t):this.config.popperConfig}}_addAttachmentClass(t){this.getTipElement().classList.add(Vi+"-"+this.updateAttachment(t))}_getContainer(){return!1===this.config.container?document.body:r(this.config.container)?this.config.container:h.findOne(this.config.container)}_getAttachment(t){return Ji[t.toUpperCase()]}_setListeners(){this.config.trigger.split(" ").forEach(t=>{var e;"click"===t?m.on(this._element,this.constructor.Event.CLICK,this.config.selector,t=>this.toggle(t)):"manual"!==t&&(e=t===sn?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,t=t===sn?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT,m.on(this._element,e,this.config.selector,t=>this._enter(t)),m.on(this._element,t,this.config.selector,t=>this._leave(t)))}),this._hideModalHandler=()=>{this._element&&this.hide()},m.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.config.selector?this.config={...this.config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){var t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");!t&&"string"==e||(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))}_enter(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?rn:sn]=!0),e.getTipElement().classList.contains(nn)||e._hoverState===on?e._hoverState=on:(clearTimeout(e._timeout),e._hoverState=on,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(()=>{e._hoverState===on&&e.show()},e.config.delay.show):e.show())}_leave(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?rn:sn]=e._element.contains(t.relatedTarget)),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(()=>{"out"===e._hoverState&&e.hide()},e.config.delay.hide):e.hide())}_isWithActiveTrigger(){for(const t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1}_getConfig(t){const e=l.getDataAttributes(this._element);return Object.keys(e).forEach(t=>{Zi.has(t)&&delete e[t]}),t&&"object"==typeof t.container&&t.container.jquery&&(t.container=t.container[0]),"number"==typeof(t={...this.constructor.Default,...e,..."object"==typeof t&&t?t:{}}).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),i(Ui,t,this.constructor.DefaultType),t.sanitize&&(t.template=zi(t.template,t.allowList,t.sanitizeFn)),t}_getDelegateConfig(){var t={};if(this.config)for(const e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t}_cleanTipClass(){const e=this.getTipElement();var t=e.getAttribute("class").match(Xi);null!==t&&0<t.length&&t.map(t=>t.trim()).forEach(t=>e.classList.remove(t))}_handlePopperPlacementChange(t){t=t.state;t&&(this.tip=t.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(t.placement)))}static jQueryInterface(i){return this.each(function(){let t=a(this,Gi);var e="object"==typeof i&&i;if((t||!/dispose|hide/.test(i))&&(t=t||new an(this,e),"string"==typeof i)){if(void 0===t[i])throw new TypeError(`No method named "${i}"`);t[i]()}})}}t(Ui,an);const ln="popover",cn="bs.popover",P="."+cn,dn="bs-popover",un=new RegExp(`(^|\\s)${dn}\\S+`,"g"),hn={...an.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'},pn={...an.DefaultType,content:"(string|element|function)"},fn={HIDE:"hide"+P,HIDDEN:"hidden"+P,SHOW:"show"+P,SHOWN:"shown"+P,INSERTED:"inserted"+P,CLICK:"click"+P,FOCUSIN:"focusin"+P,FOCUSOUT:"focusout"+P,MOUSEENTER:"mouseenter"+P,MOUSELEAVE:"mouseleave"+P};class mn extends an{static get Default(){return hn}static get NAME(){return ln}static get DATA_KEY(){return cn}static get Event(){return fn}static get EVENT_KEY(){return P}static get DefaultType(){return pn}isWithContent(){return this.getTitle()||this._getContent()}setContent(){var t=this.getTipElement();this.setElementContent(h.findOne(".popover-header",t),this.getTitle());let e=this._getContent();"function"==typeof e&&(e=e.call(this._element)),this.setElementContent(h.findOne(".popover-body",t),e),t.classList.remove("fade","show")}_addAttachmentClass(t){this.getTipElement().classList.add(dn+"-"+this.updateAttachment(t))}_getContent(){return this._element.getAttribute("data-bs-content")||this.config.content}_cleanTipClass(){const e=this.getTipElement();var t=e.getAttribute("class").match(un);null!==t&&0<t.length&&t.map(t=>t.trim()).forEach(t=>e.classList.remove(t))}static jQueryInterface(i){return this.each(function(){let t=a(this,cn);var e="object"==typeof i?i:null;if((t||!/dispose|hide/.test(i))&&(t||(t=new mn(this,e),G(this,cn,t)),"string"==typeof i)){if(void 0===t[i])throw new TypeError(`No method named "${i}"`);t[i]()}})}}t(ln,mn);const gn="scrollspy",yn="bs.scrollspy",vn="."+yn;const bn={offset:10,method:"auto",target:""},wn={offset:"number",method:"string",target:"(string|element)"};vn,vn;vn;const _n="dropdown-item",kn="active",xn=".nav-link",Tn=".list-group-item",Sn="position";class Cn extends s{constructor(t,e){super(t),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(e),this._selector=`${this._config.target} ${xn}, ${this._config.target} ${Tn}, ${this._config.target} .`+_n,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,m.on(this._scrollElement,"scroll.bs.scrollspy",()=>this._process()),this.refresh(),this._process()}static get Default(){return bn}static get DATA_KEY(){return yn}refresh(){var t=this._scrollElement===this._scrollElement.window?"offset":Sn;const n="auto"===this._config.method?t:this._config.method,o=n===Sn?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),h.find(this._selector).map(t=>{var t=F(t),e=t?h.findOne(t):null;if(e){var i=e.getBoundingClientRect();if(i.width||i.height)return[l[n](e).top+o,t]}return null}).filter(t=>t).sort((t,e)=>t[0]-e[0]).forEach(t=>{this._offsets.push(t[0]),this._targets.push(t[1])})}dispose(){super.dispose(),m.off(this._scrollElement,vn),this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null}_getConfig(e){if("string"!=typeof(e={...bn,..."object"==typeof e&&e?e:{}}).target&&r(e.target)){let t=e.target["id"];t||(t=I(gn),e.target.id=t),e.target="#"+t}return i(gn,e,wn),e}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){var e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),i=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),i<=e)t=this._targets[this._targets.length-1],this._activeTarget!==t&&this._activate(t);else if(this._activeTarget&&e<this._offsets[0]&&0<this._offsets[0])this._activeTarget=null,this._clear();else for(let t=this._offsets.length;t--;)this._activeTarget!==this._targets[t]&&e>=this._offsets[t]&&(void 0===this._offsets[t+1]||e<this._offsets[t+1])&&this._activate(this._targets[t])}_activate(e){this._activeTarget=e,this._clear();var t=this._selector.split(",").map(t=>t+`[data-bs-target="${e}"],${t}[href="${e}"]`),t=h.findOne(t.join(","));t.classList.contains(_n)?(h.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(kn),t.classList.add(kn)):(t.classList.add(kn),h.parents(t,".nav, .list-group").forEach(t=>{h.prev(t,xn+", "+Tn).forEach(t=>t.classList.add(kn)),h.prev(t,".nav-item").forEach(t=>{h.children(t,xn).forEach(t=>t.classList.add(kn))})})),m.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:e})}_clear(){h.find(this._selector).filter(t=>t.classList.contains(kn)).forEach(t=>t.classList.remove(kn))}static jQueryInterface(i){return this.each(function(){let t=a(this,yn);var e="object"==typeof i&&i;if(t=t||new Cn(this,e),"string"==typeof i){if(void 0===t[i])throw new TypeError(`No method named "${i}"`);t[i]()}})}}m.on(window,"load.bs.scrollspy.data-api",()=>{h.find('[data-bs-spy="scroll"]').forEach(t=>new Cn(t,l.getDataAttributes(t)))}),t(gn,Cn);const En="bs.tab";En;const Dn="active",An=".active",Ln=":scope > li > .active";class On extends s{static get DATA_KEY(){return En}show(){if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains(Dn)||Y(this._element))){let t;var e=o(this._element),i=this._element.closest(".nav, .list-group"),n=(i&&(n="UL"===i.nodeName||"OL"===i.nodeName?Ln:An,t=(t=h.find(n,i))[t.length-1]),t?m.trigger(t,"hide.bs.tab",{relatedTarget:this._element}):null);m.trigger(this._element,"show.bs.tab",{relatedTarget:t}).defaultPrevented||null!==n&&n.defaultPrevented||(this._activate(this._element,i),n=()=>{m.trigger(t,"hidden.bs.tab",{relatedTarget:this._element}),m.trigger(this._element,"shown.bs.tab",{relatedTarget:t})},e?this._activate(e,e.parentNode,n):n())}}_activate(t,e,i){const n=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?h.children(e,An):h.find(Ln,e))[0];var e=i&&n&&n.classList.contains("fade"),o=()=>this._transitionComplete(t,n,i);n&&e?(e=d(n),n.classList.remove("show"),m.one(n,"transitionend",o),u(n,e)):o()}_transitionComplete(t,e,i){var n;e&&(e.classList.remove(Dn),(n=h.findOne(":scope > .dropdown-menu .active",e.parentNode))&&n.classList.remove(Dn),"tab"===e.getAttribute("role"))&&e.setAttribute("aria-selected",!1),t.classList.add(Dn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),z(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&t.parentNode.classList.contains("dropdown-menu")&&(t.closest(".dropdown")&&h.find(".dropdown-toggle").forEach(t=>t.classList.add(Dn)),t.setAttribute("aria-expanded",!0)),i&&i()}static jQueryInterface(e){return this.each(function(){var t=a(this,En)||new On(this);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}})}}m.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',function(t){t.preventDefault(),(a(this,En)||new On(this)).show()}),t("tab",On);const $n="bs.toast";Qt="."+$n;const Mn="click.dismiss"+Qt,jn="show",Pn="showing",Nn={animation:"boolean",autohide:"boolean",delay:"number"},In={animation:!0,autohide:!0,delay:5e3};class Hn extends s{constructor(t,e){super(t),this._config=this._getConfig(e),this._timeout=null,this._setListeners()}static get DefaultType(){return Nn}static get Default(){return In}static get DATA_KEY(){return $n}show(){var t,e;m.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),t=()=>{this._element.classList.remove(Pn),this._element.classList.add(jn),m.trigger(this._element,"shown.bs.toast"),this._config.autohide&&(this._timeout=setTimeout(()=>{this.hide()},this._config.delay))},this._element.classList.remove("hide"),z(this._element),this._element.classList.add(Pn),this._config.animation?(e=d(this._element),m.one(this._element,"transitionend",t),u(this._element,e)):t())}hide(){var t,e;this._element.classList.contains(jn)&&!m.trigger(this._element,"hide.bs.toast").defaultPrevented&&(t=()=>{this._element.classList.add("hide"),m.trigger(this._element,"hidden.bs.toast")},this._element.classList.remove(jn),this._config.animation?(e=d(this._element),m.one(this._element,"transitionend",t),u(this._element,e)):t())}dispose(){this._clearTimeout(),this._element.classList.contains(jn)&&this._element.classList.remove(jn),m.off(this._element,Mn),super.dispose(),this._config=null}_getConfig(t){return t={...In,...l.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}},i("toast",t,this.constructor.DefaultType),t}_setListeners(){m.on(this._element,Mn,'[data-bs-dismiss="toast"]',()=>this.hide())}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(i){return this.each(function(){let t=a(this,$n);var e="object"==typeof i&&i;if(t=t||new Hn(this,e),"string"==typeof i){if(void 0===t[i])throw new TypeError(`No method named "${i}"`);t[i](this)}})}}return t("toast",Hn),{Alert:ct,Button:ht,Carousel:y,Collapse:Ot,Dropdown:$,Modal:Si,Offcanvas:qi,Popover:mn,ScrollSpy:Cn,Tab:On,Toast:Hn,Tooltip:an}}),!function(t){var e;"function"==typeof define&&define.amd?define("jquery-typeahead",["jquery"],t):"object"==typeof module&&module.exports?module.exports=(void 0===e&&(e="undefined"!=typeof window?require("jquery"):require("jquery")(void 0)),t(e)):t(jQuery)}(function(A){"use strict";function r(t,e){this.rawQuery=t.val()||"",this.query=t.val()||"",this.selector=t[0].selector,this.deferred=null,this.tmpSource={},this.source={},this.dynamicGroups=[],this.hasDynamicGroups=!1,this.generatedGroupCount=0,this.groupBy="group",this.groups=[],this.searchGroups=[],this.generateGroups=[],this.requestGroups=[],this.result=[],this.tmpResult={},this.groupTemplate="",this.resultHtml=null,this.resultCount=0,this.resultCountPerGroup={},this.options=e,this.node=t,this.namespace="."+this.helper.slugify.call(this,this.selector)+".typeahead",this.isContentEditable=void 0!==this.node.attr("contenteditable")&&"false"!==this.node.attr("contenteditable"),this.container=null,this.resultContainer=null,this.item=null,this.items=null,this.comparedItems=null,this.xhr={},this.hintIndex=null,this.filters={dropdown:{},dynamic:{}},this.dropdownFilter={static:[],dynamic:[]},this.dropdownFilterAll=null,this.isDropdownEvent=!1,this.requests={},this.backdrop={},this.hint={},this.label={},this.hasDragged=!1,this.focusOnly=!1,this.displayEmptyTemplate,this.__construct()}var i,n={input:null,minLength:2,maxLength:!(window.Typeahead={version:"2.11.1"}),maxItem:8,dynamic:!1,delay:300,order:null,offset:!1,hint:!1,accent:!1,highlight:!0,multiselect:null,group:!1,groupOrder:null,maxItemPerGroup:null,dropdownFilter:!1,dynamicFilter:null,backdrop:!1,backdropOnFocus:!1,cache:!1,ttl:36e5,compression:!1,searchOnFocus:!1,blurOnTab:!0,resultContainer:null,generateOnLoad:null,mustSelectItem:!1,href:null,display:["display"],template:null,templateValue:null,groupTemplate:null,correlativeTemplate:!1,emptyTemplate:!1,cancelButton:!0,loadingAnimation:!0,asyncResult:!1,filter:!0,matcher:null,source:null,callback:{onInit:null,onReady:null,onShowLayout:null,onHideLayout:null,onSearch:null,onResult:null,onLayoutBuiltBefore:null,onLayoutBuiltAfter:null,onNavigateBefore:null,onNavigateAfter:null,onEnter:null,onLeave:null,onClickBefore:null,onClickAfter:null,onDropdownFilter:null,onSendRequest:null,onReceiveRequest:null,onPopulateSource:null,onCacheSave:null,onSubmit:null,onCancel:null},selector:{container:"typeahead__container",result:"typeahead__result",list:"typeahead__list",group:"typeahead__group",item:"typeahead__item",empty:"typeahead__empty",display:"typeahead__display",query:"typeahead__query",filter:"typeahead__filter",filterButton:"typeahead__filter-button",dropdown:"typeahead__dropdown",dropdownItem:"typeahead__dropdown-item",labelContainer:"typeahead__label-container",label:"typeahead__label",button:"typeahead__button",backdrop:"typeahead__backdrop",hint:"typeahead__hint",cancelButton:"typeahead__cancel-button"},debug:!1},o={from:"ãàáäâẽèéëêìíïîõòóöôùúüûñç",to:"aaaaaeeeeeiiiiooooouuuunc"},s=~window.navigator.appVersion.indexOf("MSIE 9."),a=~window.navigator.appVersion.indexOf("MSIE 10"),l=!!~window.navigator.userAgent.indexOf("Trident")&&~window.navigator.userAgent.indexOf("rv:11"),e=(r.prototype={_validateCacheMethod:function(t){var e;if(!0===t)t="localStorage";else if("string"==typeof t&&!~["localStorage","sessionStorage"].indexOf(t))return!1;e=void 0!==window[t];try{window[t].setItem("typeahead","typeahead"),window[t].removeItem("typeahead")}catch(t){e=!1}return e&&t||!1},extendOptions:function(){if(this.options.cache=this._validateCacheMethod(this.options.cache),!this.options.compression||"object"==typeof LZString&&this.options.cache||(this.options.compression=!1),this.options.maxLength&&!isNaN(this.options.maxLength)||(this.options.maxLength=1/0),void 0!==this.options.maxItem&&~[0,!1].indexOf(this.options.maxItem)&&(this.options.maxItem=1/0),this.options.maxItemPerGroup&&!/^\d+$/.test(this.options.maxItemPerGroup)&&(this.options.maxItemPerGroup=null),this.options.display&&!Array.isArray(this.options.display)&&(this.options.display=[this.options.display]),this.options.multiselect&&(this.items=[],this.comparedItems=[],"string"==typeof this.options.multiselect.matchOn)&&(this.options.multiselect.matchOn=[this.options.multiselect.matchOn]),!this.options.group||Array.isArray(this.options.group)||("string"==typeof this.options.group?this.options.group={key:this.options.group}:"boolean"==typeof this.options.group&&(this.options.group={key:"group"}),this.options.group.key=this.options.group.key||"group"),this.options.highlight&&!~["any",!0].indexOf(this.options.highlight)&&(this.options.highlight=!1),this.options.dropdownFilter&&this.options.dropdownFilter instanceof Object){Array.isArray(this.options.dropdownFilter)||(this.options.dropdownFilter=[this.options.dropdownFilter]);for(var t=0,e=this.options.dropdownFilter.length;t<e;++t)this.dropdownFilter[this.options.dropdownFilter[t].value?"static":"dynamic"].push(this.options.dropdownFilter[t])}this.options.dynamicFilter&&!Array.isArray(this.options.dynamicFilter)&&(this.options.dynamicFilter=[this.options.dynamicFilter]),this.options.accent&&("object"==typeof this.options.accent?this.options.accent.from&&this.options.accent.to&&(this.options.accent.from.length,this.options.accent.to.length):this.options.accent=o),this.options.groupTemplate&&(this.groupTemplate=this.options.groupTemplate),this.options.resultContainer&&("string"==typeof this.options.resultContainer&&(this.options.resultContainer=A(this.options.resultContainer)),this.options.resultContainer instanceof A)&&this.options.resultContainer[0]&&(this.resultContainer=this.options.resultContainer),this.options.group&&this.options.group.key&&(this.groupBy=this.options.group.key),this.options.callback&&this.options.callback.onClick&&(this.options.callback.onClickBefore=this.options.callback.onClick,delete this.options.callback.onClick),this.options.callback&&this.options.callback.onNavigate&&(this.options.callback.onNavigateBefore=this.options.callback.onNavigate,delete this.options.callback.onNavigate),this.options=A.extend(!0,{},n,this.options)},unifySourceFormat:function(){var t,e,i;for(t in this.dynamicGroups=[],Array.isArray(this.options.source)&&(this.options.source={group:{data:this.options.source}}),"string"==typeof this.options.source&&(this.options.source={group:{ajax:{url:this.options.source}}}),this.options.source.ajax&&(this.options.source={group:{ajax:this.options.source.ajax}}),(this.options.source.url||this.options.source.data)&&(this.options.source={group:this.options.source}),this.options.source)if(this.options.source.hasOwnProperty(t)){if(i=(e="string"==typeof(e=this.options.source[t])?{ajax:{url:e}}:e).url||e.ajax,Array.isArray(i)?(e.ajax="string"==typeof i[0]?{url:i[0]}:i[0],e.ajax.path=e.ajax.path||i[1]||null):"object"==typeof e.url?e.ajax=e.url:"string"==typeof e.url&&(e.ajax={url:e.url}),delete e.url,!e.data&&!e.ajax)return!1;e.display&&!Array.isArray(e.display)&&(e.display=[e.display]),e.minLength=("number"==typeof e.minLength?e:this.options).minLength,e.maxLength=("number"==typeof e.maxLength?e:this.options).maxLength,e.dynamic="boolean"==typeof e.dynamic||this.options.dynamic,e.minLength>e.maxLength&&(e.minLength=e.maxLength),this.options.source[t]=e,this.options.source[t].dynamic&&this.dynamicGroups.push(t),e.cache=void 0!==e.cache?this._validateCacheMethod(e.cache):this.options.cache,!e.compression||"object"==typeof LZString&&e.cache||(e.compression=!1)}return this.hasDynamicGroups=this.options.dynamic||!!this.dynamicGroups.length,!0},init:function(){this.helper.executeCallback.call(this,this.options.callback.onInit,[this.node]),this.container=this.node.closest("."+this.options.selector.container)},delegateEvents:function(){var e,i=this,t=["focus"+this.namespace,"input"+this.namespace,"propertychange"+this.namespace,"keydown"+this.namespace,"keyup"+this.namespace,"search"+this.namespace,"generate"+this.namespace],n=(A("html").on("touchmove",function(){i.hasDragged=!0}).on("touchstart",function(){i.hasDragged=!1}),this.node.closest("form").on("submit",function(t){if(!i.options.mustSelectItem||!i.helper.isEmpty(i.item))return i.options.backdropOnFocus||i.hideLayout(),i.options.callback.onSubmit?i.helper.executeCallback.call(i,i.options.callback.onSubmit,[i.node,this,i.item||i.items,t]):void 0;t.preventDefault()}).on("reset",function(){setTimeout(function(){i.node.trigger("input"+i.namespace),i.hideLayout()})}),!1);this.node.attr("placeholder")&&(a||l)&&(e=!0,this.node.on("focusin focusout",function(){e=!(this.value||!this.placeholder)}),this.node.on("input",function(t){e&&(t.stopImmediatePropagation(),e=!1)})),this.node.off(this.namespace).on(t.join(" "),function(t,e){switch(t.type){case"generate":i.generateSource(Object.keys(i.options.source));break;case"focus":i.focusOnly?i.focusOnly=!1:(i.options.backdropOnFocus&&(i.buildBackdropLayout(),i.showLayout()),i.options.searchOnFocus&&!i.item&&(i.deferred=A.Deferred(),i.assignQuery(),i.generateSource()));break;case"keydown":8===t.keyCode&&i.options.multiselect&&i.options.multiselect.cancelOnBackspace&&""===i.query&&i.items.length?i.cancelMultiselectItem(i.items.length-1,null,t):t.keyCode&&~[9,13,27,38,39,40].indexOf(t.keyCode)&&(n=!0,i.navigate(t));break;case"keyup":s&&i.node[0].value.replace(/^\s+/,"").toString().length<i.query.length&&i.node.trigger("input"+i.namespace);break;case"propertychange":if(n){n=!1;break}case"input":i.deferred=A.Deferred(),i.assignQuery(),""===i.rawQuery&&""===i.query&&(t.originalEvent=e||{},i.helper.executeCallback.call(i,i.options.callback.onCancel,[i.node,i.item,t]),i.item=null),i.options.cancelButton&&i.toggleCancelButtonVisibility(),i.options.hint&&i.hint.container&&""!==i.hint.container.val()&&0!==i.hint.container.val().indexOf(i.rawQuery)&&(i.hint.container.val(""),i.isContentEditable)&&i.hint.container.text(""),i.hasDynamicGroups?i.helper.typeWatch(function(){i.generateSource()},i.options.delay):i.generateSource();break;case"search":i.searchResult(),i.buildLayout(),i.result.length||i.searchGroups.length&&i.displayEmptyTemplate?i.showLayout():i.hideLayout(),i.deferred&&i.deferred.resolve()}return i.deferred&&i.deferred.promise()}),this.options.generateOnLoad&&this.node.trigger("generate"+this.namespace)},assignQuery:function(){this.isContentEditable?this.rawQuery=this.node.text():this.rawQuery=this.node.val().toString(),this.rawQuery=this.rawQuery.replace(/^\s+/,""),this.rawQuery!==this.query&&(this.query=this.rawQuery)},filterGenerateSource:function(){if(this.searchGroups=[],this.generateGroups=[],!this.focusOnly||this.options.multiselect)for(var t in this.options.source)if(this.options.source.hasOwnProperty(t)&&this.query.length>=this.options.source[t].minLength&&this.query.length<=this.options.source[t].maxLength){if(this.filters.dropdown&&"group"===this.filters.dropdown.key&&this.filters.dropdown.value!==t)continue;if(this.searchGroups.push(t),!this.options.source[t].dynamic&&this.source[t])continue;this.generateGroups.push(t)}},generateSource:function(t){if(this.filterGenerateSource(),this.generatedGroupCount=0,Array.isArray(t)&&t.length)this.generateGroups=t;else if(!this.generateGroups.length)return void this.node.trigger("search"+this.namespace);if(this.requestGroups=[],this.options.loadingAnimation&&this.container.addClass("loading"),!this.helper.isEmpty(this.xhr)){for(var e in this.xhr)this.xhr.hasOwnProperty(e)&&this.xhr[e].abort();this.xhr={}}for(var i,n,o,s,r,a,l=this,c=(e=0,this.generateGroups.length);e<c;++e){if(i=this.generateGroups[e],s=(o=this.options.source[i]).cache,a=o.compression,this.options.asyncResult&&delete this.source[i],s&&(r=window[s].getItem("TYPEAHEAD_"+this.selector+":"+i))){a&&(r=LZString.decompressFromUTF16(r)),a=!1;try{(r=JSON.parse(r+"")).data&&r.ttl>(new Date).getTime()?(this.populateSource(r.data,i),a=!0):window[s].removeItem("TYPEAHEAD_"+this.selector+":"+i)}catch(t){}if(a)continue}!o.data||o.ajax?o.ajax&&(this.requests[i]||(this.requests[i]=this.generateRequestObject(i)),this.requestGroups.push(i)):"function"==typeof o.data?(n=o.data.call(this),Array.isArray(n)?l.populateSource(n,i):"function"==typeof n.promise&&function(e){A.when(n).then(function(t){t&&Array.isArray(t)&&l.populateSource(t,e)})}(i)):this.populateSource(A.extend(!0,[],o.data),i)}return this.requestGroups.length&&this.handleRequests(),this.options.asyncResult&&this.searchGroups.length!==this.generateGroups&&this.node.trigger("search"+this.namespace),!!this.generateGroups.length},generateRequestObject:function(i){var n=this,o=this.options.source[i],t={request:{url:o.ajax.url||null,dataType:"json",beforeSend:function(t,e){n.xhr[i]=t;t=n.requests[i].callback.beforeSend||o.ajax.beforeSend;"function"==typeof t&&t.apply(null,arguments)}},callback:{beforeSend:null,done:null,fail:null,then:null,always:null},extra:{path:o.ajax.path||null,group:i},validForGroup:[i]};if("function"!=typeof o.ajax&&(o.ajax instanceof Object&&(t=this.extendXhrObject(t,o.ajax)),1<Object.keys(this.options.source).length))for(var e in this.requests)!this.requests.hasOwnProperty(e)||this.requests[e].isDuplicated||t.request.url&&t.request.url===this.requests[e].request.url&&(this.requests[e].validForGroup.push(i),t.isDuplicated=!0,delete t.validForGroup);return t},extendXhrObject:function(t,e){return"object"==typeof e.callback&&(t.callback=e.callback,delete e.callback),"function"==typeof e.beforeSend&&(t.callback.beforeSend=e.beforeSend,delete e.beforeSend),t.request=A.extend(!0,t.request,e),"jsonp"!==t.request.dataType.toLowerCase()||t.request.jsonpCallback||(t.request.jsonpCallback="callback_"+t.extra.group),t},handleRequests:function(){var t,c=this,d=this.requestGroups.length;if(!1!==this.helper.executeCallback.call(this,this.options.callback.onSendRequest,[this.node,this.query]))for(var e=0,i=this.requestGroups.length;e<i;++e)t=this.requestGroups[e],this.requests[t].isDuplicated||function(t,r){if("function"==typeof c.options.source[t].ajax){var e=c.options.source[t].ajax.call(c,c.query);if("object"!=typeof(r=c.extendXhrObject(c.generateRequestObject(t),"object"==typeof e?e:{})).request||!r.request.url)return c.populateSource([],t);c.requests[t]=r}var a,i=!1,l={};if(~r.request.url.indexOf("{{query}}")&&(i||(r=A.extend(!0,{},r),i=!0),r.request.url=r.request.url.replace("{{query}}",encodeURIComponent(c.query))),r.request.data)for(var n in r.request.data)if(r.request.data.hasOwnProperty(n)&&~String(r.request.data[n]).indexOf("{{query}}")){i||(r=A.extend(!0,{},r),i=!0),r.request.data[n]=r.request.data[n].replace("{{query}}",c.query);break}A.ajax(r.request).done(function(t,e,i){for(var n,o=0,s=r.validForGroup.length;o<s;o++)n=r.validForGroup[o],"function"==typeof(a=c.requests[n]).callback.done&&(l[n]=a.callback.done.call(c,t,e,i))}).fail(function(t,e,i){for(var n=0,o=r.validForGroup.length;n<o;n++)(a=c.requests[r.validForGroup[n]]).callback.fail instanceof Function&&a.callback.fail.call(c,t,e,i)}).always(function(t,e,i){for(var n,o=0,s=r.validForGroup.length;o<s;o++){if(n=r.validForGroup[o],(a=c.requests[n]).callback.always instanceof Function&&a.callback.always.call(c,t,e,i),"abort"===e)return;c.populateSource((null!==t&&"function"==typeof t.promise?[]:l[n])||t,a.extra.group,a.extra.path||a.request.path),0==--d&&c.helper.executeCallback.call(c,c.options.callback.onReceiveRequest,[c.node,c.query])}}).then(function(t,e){for(var i=0,n=r.validForGroup.length;i<n;i++)(a=c.requests[r.validForGroup[i]]).callback.then instanceof Function&&a.callback.then.call(c,t,e)})}(t,this.requests[t])},populateSource:function(i,t,e){var n=this,o=this.options.source[t],s=o.ajax&&o.data;e&&"string"==typeof e&&(i=this.helper.namespace.call(this,e,i)),Array.isArray(i)||(i=[]),s&&("function"==typeof s&&(s=s()),Array.isArray(s))&&(i=i.concat(s));for(var r,a=o.display?"compiled"===o.display[0]?o.display[1]:o.display[0]:"compiled"===this.options.display[0]?this.options.display[1]:this.options.display[0],l=0,c=i.length;l<c;l++)null!==i[l]&&"boolean"!=typeof i[l]&&("string"==typeof i[l]&&((r={})[a]=i[l],i[l]=r),i[l].group=t);if(!this.hasDynamicGroups&&this.dropdownFilter.dynamic.length)for(var d,u,h={},l=0,c=i.length;l<c;l++)for(var p=0,f=this.dropdownFilter.dynamic.length;p<f;p++)d=this.dropdownFilter.dynamic[p].key,(u=i[l][d])&&(this.dropdownFilter.dynamic[p].value||(this.dropdownFilter.dynamic[p].value=[]),h[d]||(h[d]=[]),~h[d].indexOf(u.toLowerCase())||(h[d].push(u.toLowerCase()),this.dropdownFilter.dynamic[p].value.push(u)));if(this.options.correlativeTemplate){var s=o.template||this.options.template,m="";if(s="function"==typeof s?s.call(this,"",{}):s){if(Array.isArray(this.options.correlativeTemplate))for(l=0,c=this.options.correlativeTemplate.length;l<c;l++)m+="{{"+this.options.correlativeTemplate[l]+"}} ";else m=s.replace(/<.+?>/g," ").replace(/\s{2,}/," ").trim();for(l=0,c=i.length;l<c;l++)i[l].compiled=A("<textarea />").html(m.replace(/\{\{([\w\-\.]+)(?:\|(\w+))?}}/g,function(t,e){return n.helper.namespace.call(n,e,i[l],"get","")}).trim()).text();o.display?~o.display.indexOf("compiled")||o.display.unshift("compiled"):~this.options.display.indexOf("compiled")||this.options.display.unshift("compiled")}}this.options.callback.onPopulateSource&&(i=this.helper.executeCallback.call(this,this.options.callback.onPopulateSource,[this.node,i,t,e])),this.tmpSource[t]=Array.isArray(i)&&i||[];var s=this.options.source[t].cache,o=this.options.source[t].compression,g=this.options.source[t].ttl||this.options.ttl;s&&!window[s].getItem("TYPEAHEAD_"+this.selector+":"+t)&&(this.options.callback.onCacheSave&&(i=this.helper.executeCallback.call(this,this.options.callback.onCacheSave,[this.node,i,t,e])),e=JSON.stringify({data:i,ttl:(new Date).getTime()+g}),o&&(e=LZString.compressToUTF16(e)),window[s].setItem("TYPEAHEAD_"+this.selector+":"+t,e)),this.incrementGeneratedGroup(t)},incrementGeneratedGroup:function(t){if(this.generatedGroupCount++,this.generatedGroupCount===this.generateGroups.length||this.options.asyncResult){this.xhr&&this.xhr[t]&&delete this.xhr[t];for(var e=0,i=this.generateGroups.length;e<i;e++)this.source[this.generateGroups[e]]=this.tmpSource[this.generateGroups[e]];this.hasDynamicGroups||this.buildDropdownItemLayout("dynamic"),this.generatedGroupCount===this.generateGroups.length&&(this.xhr={},this.options.loadingAnimation)&&this.container.removeClass("loading"),this.node.trigger("search"+this.namespace)}},navigate:function(t){var e,i,n,o,s;this.helper.executeCallback.call(this,this.options.callback.onNavigateBefore,[this.node,this.query,t]),27===t.keyCode?(t.preventDefault(),this.query.length?(this.resetInput(),this.node.trigger("input"+this.namespace,[t])):(this.node.blur(),this.hideLayout())):this.result.length&&(i=(s=(e=this.resultContainer.find("."+this.options.selector.item).not("[disabled]")).filter(".active"))[0]?e.index(s):null,n=s[0]?s.attr("data-index"):null,o=null,this.clearActiveItem(),this.helper.executeCallback.call(this,this.options.callback.onLeave,[this.node,null!==i&&e.eq(i)||void 0,null!==n&&this.result[n]||void 0,t]),13===t.keyCode?(t.preventDefault(),0<s.length?"javascript:;"===s.find("a:first")[0].href?s.find("a:first").trigger("click",t):s.find("a:first")[0].click():this.node.closest("form").trigger("submit")):39!==t.keyCode?(9===t.keyCode?this.options.blurOnTab?this.hideLayout():0<s.length?i+1<e.length?(t.preventDefault(),this.addActiveItem(e.eq(o=i+1))):this.hideLayout():e.length?(t.preventDefault(),o=0,this.addActiveItem(e.first())):this.hideLayout():38===t.keyCode?(t.preventDefault(),0<s.length?0<=i-1&&this.addActiveItem(e.eq(o=i-1)):e.length&&(o=e.length-1,this.addActiveItem(e.last()))):40===t.keyCode&&(t.preventDefault(),0<s.length?i+1<e.length&&this.addActiveItem(e.eq(o=i+1)):e.length&&(o=0,this.addActiveItem(e.first()))),n=null!==o?e.eq(o).attr("data-index"):null,this.helper.executeCallback.call(this,this.options.callback.onEnter,[this.node,null!==o&&e.eq(o)||void 0,null!==n&&this.result[n]||void 0,t]),t.preventInputChange&&~[38,40].indexOf(t.keyCode)&&this.buildHintLayout(null!==n&&n<this.result.length?[this.result[n]]:null),this.options.hint&&this.hint.container&&this.hint.container.css("color",t.preventInputChange?this.hint.css.color:null===n&&this.hint.css.color||this.hint.container.css("background-color")||"fff"),s=null===n||t.preventInputChange?this.rawQuery:this.getTemplateValue.call(this,this.result[n]),this.node.val(s),this.isContentEditable&&this.node.text(s),this.helper.executeCallback.call(this,this.options.callback.onNavigateAfter,[this.node,e,null!==o&&e.eq(o).find("a:first")||void 0,null!==n&&this.result[n]||void 0,this.query,t])):null!==i?e.eq(i).find("a:first")[0].click():this.options.hint&&""!==this.hint.container.val()&&this.helper.getCaret(this.node[0])>=this.query.length&&e.filter('[data-index="'+this.hintIndex+'"]').find("a:first")[0].click())},getTemplateValue:function(i){var t,n;if(i)return(t="function"==typeof(t=i.group&&this.options.source[i.group].templateValue||this.options.templateValue)?t.call(this):t)?(n=this,t.replace(/\{\{([\w\-.]+)}}/gi,function(t,e){return n.helper.namespace.call(n,e,i,"get","")})):this.helper.namespace.call(this,i.matchedKey,i).toString()},clearActiveItem:function(){this.resultContainer.find("."+this.options.selector.item).removeClass("active")},addActiveItem:function(t){t.addClass("active")},searchResult:function(){this.resetLayout(),!1!==this.helper.executeCallback.call(this,this.options.callback.onSearch,[this.node,this.query])&&(!this.searchGroups.length||this.options.multiselect&&this.options.multiselect.limit&&this.items.length>=this.options.multiselect.limit||this.searchResultData(),this.helper.executeCallback.call(this,this.options.callback.onResult,[this.node,this.query,this.result,this.resultCount,this.resultCountPerGroup]),this.isDropdownEvent)&&(this.helper.executeCallback.call(this,this.options.callback.onDropdownFilter,[this.node,this.query,this.filters.dropdown,this.result]),this.isDropdownEvent=!1)},searchResultData:function(){var t,e,i,n,o,s,r,a,l=this.groupBy,c=this.query.toLowerCase(),d=this.options.maxItem,u=this.options.maxItemPerGroup,h=this.filters.dynamic&&!this.helper.isEmpty(this.filters.dynamic),p="function"==typeof this.options.matcher&&this.options.matcher;this.options.accent&&(c=this.helper.removeAccent.call(this,c));for(var f=0,m=this.searchGroups.length;f<m;++f)if(S=this.searchGroups[f],(!this.filters.dropdown||"group"!==this.filters.dropdown.key||this.filters.dropdown.value===S)&&(i=(void 0!==this.options.source[S].filter?this.options.source[S]:this.options).filter,o="function"==typeof this.options.source[S].matcher&&this.options.source[S].matcher||p,this.source[S]))for(var g=0,y=this.source[S].length;g<y&&(!(this.resultItemCount>=d)||this.options.callback.onResult);g++)if((!h||this.dynamicFilter.validate.apply(this,[this.source[S][g]]))&&null!==(t=this.source[S][g])&&"boolean"!=typeof t&&(!this.options.multiselect||this.isMultiselectUniqueData(t))&&(!this.filters.dropdown||(t[this.filters.dropdown.key]||"").toLowerCase()===(this.filters.dropdown.value||"").toLowerCase())){if((a="group"===l?S:t[l]||t.group)&&!this.tmpResult[a]&&(this.tmpResult[a]=[],this.resultCountPerGroup[a]=0),u&&"group"===l&&this.tmpResult[a].length>=u&&!this.options.callback.onResult)break;for(var v=0,b=(C=this.options.source[S].display||this.options.display).length;v<b;++v){if(!1!==i){if(void 0===(e=/\./.test(C[v])?this.helper.namespace.call(this,C[v],t):t[C[v]])||""===e)continue;e=this.helper.cleanStringFromScript(e)}if("function"==typeof i){if(void 0===(n=i.call(this,t,e)))break;if(!n)continue;"object"==typeof n&&(t=n)}if(~[void 0,!0].indexOf(i)){if(null===e)continue;if(n=(n=e).toString().toLowerCase(),s=(n=this.options.accent?this.helper.removeAccent.call(this,n):n).indexOf(c),this.options.correlativeTemplate&&"compiled"===C[v]&&s<0&&/\s/.test(c))for(var w=!0,_=n,k=0,x=(r=c.split(" ")).length;k<x;k++)if(""!==r[k]){if(!~_.indexOf(r[k])){w=!1;break}_=_.replace(r[k],"")}if(s<0&&!w)continue;if(this.options.offset&&0!==s)continue;if(o){if(void 0===(s=o.call(this,t,e)))break;if(!s)continue;"object"==typeof s&&(t=s)}}if(this.resultCount++,this.resultCountPerGroup[a]++,this.resultItemCount<d){if(u&&this.tmpResult[a].length>=u)break;this.tmpResult[a].push(A.extend(!0,{matchedKey:C[v]},t)),this.resultItemCount++}break}if(!this.options.callback.onResult){if(this.resultItemCount>=d)break;if(u&&this.tmpResult[a].length>=u&&"group"===l)break}}if(this.options.order){var T,S,C=[];for(S in this.tmpResult)if(this.tmpResult.hasOwnProperty(S)){for(f=0,m=this.tmpResult[S].length;f<m;f++)T=this.options.source[this.tmpResult[S][f].group].display||this.options.display,~C.indexOf(T[0])||C.push(T[0]);this.tmpResult[S].sort(this.helper.sort(C,"asc"===this.options.order,function(t){return t?t.toString().toUpperCase():""}))}}for(var E,D=[],f=0,m=(E="function"==typeof this.options.groupOrder?this.options.groupOrder.apply(this,[this.node,this.query,this.tmpResult,this.resultCount,this.resultCountPerGroup]):Array.isArray(this.options.groupOrder)?this.options.groupOrder:"string"==typeof this.options.groupOrder&&~["asc","desc"].indexOf(this.options.groupOrder)?Object.keys(this.tmpResult).sort(this.helper.sort([],"asc"===this.options.groupOrder,function(t){return t.toString().toUpperCase()})):Object.keys(this.tmpResult)).length;f<m;f++)D=D.concat(this.tmpResult[E[f]]||[]);this.groups=JSON.parse(JSON.stringify(E)),this.result=D},buildLayout:function(){this.buildHtmlLayout(),this.buildBackdropLayout(),this.buildHintLayout(),this.options.callback.onLayoutBuiltBefore&&(this.tmpResultHtml=this.helper.executeCallback.call(this,this.options.callback.onLayoutBuiltBefore,[this.node,this.query,this.result,this.resultHtml])),this.tmpResultHtml instanceof A?this.resultContainer.html(this.tmpResultHtml):this.resultHtml instanceof A&&this.resultContainer.html(this.resultHtml),this.options.callback.onLayoutBuiltAfter&&this.helper.executeCallback.call(this,this.options.callback.onLayoutBuiltAfter,[this.node,this.query,this.result])},buildHtmlLayout:function(){if(!1!==this.options.resultContainer){var c;if(this.resultContainer||(this.resultContainer=A("<div/>",{class:this.options.selector.result}),this.container.append(this.resultContainer)),!this.result.length&&this.generatedGroupCount===this.generateGroups.length)if(this.options.multiselect&&this.options.multiselect.limit&&this.items.length>=this.options.multiselect.limit)c=this.options.multiselect.limitTemplate?"function"==typeof this.options.multiselect.limitTemplate?this.options.multiselect.limitTemplate.call(this,this.query):this.options.multiselect.limitTemplate.replace(/\{\{query}}/gi,A("<div>").text(this.helper.cleanStringFromScript(this.query)).html()):"Can't select more than "+this.items.length+" items.";else{if(!this.options.emptyTemplate||""===this.query)return;c="function"==typeof this.options.emptyTemplate?this.options.emptyTemplate.call(this,this.query):this.options.emptyTemplate.replace(/\{\{query}}/gi,A("<div>").text(this.helper.cleanStringFromScript(this.query)).html())}this.displayEmptyTemplate=!!c;var o=this.query.toLowerCase(),d=(this.options.accent&&(o=this.helper.removeAccent.call(this,o)),this),t=this.groupTemplate||"<ul></ul>",u=!1;this.groupTemplate?t=A(t.replace(/<([^>]+)>\{\{(.+?)}}<\/[^>]+>/g,function(t,e,i,n,o){var s="",r="group"===i?d.groups:[i];if(!d.result.length)return!0===u?"":(u=!0,"<"+e+' class="'+d.options.selector.empty+'">'+c+"</"+e+">");for(var a=0,l=r.length;a<l;++a)s+="<"+e+' data-group-template="'+r[a]+'"><ul></ul></'+e+">";return s})):(t=A(t),this.result.length||t.append(c instanceof A?c:'<li class="'+d.options.selector.empty+'">'+c+"</li>")),t.addClass(this.options.selector.list+(this.helper.isEmpty(this.result)?" empty":""));for(var e,i,s,n,r,a,l,h,p,f,m=this.groupTemplate&&this.result.length&&d.groups||[],g=0,y=this.result.length;g<y;++g)e=(s=this.result[g]).group,n=!this.options.multiselect&&this.options.source[s.group].href||this.options.href,l=[],h=this.options.source[s.group].display||this.options.display,this.options.group&&(e=s[this.options.group.key],this.options.group.template&&("function"==typeof this.options.group.template?i=this.options.group.template.call(this,s):"string"==typeof this.options.group.template&&(i=this.options.group.template.replace(/\{\{([\w\-\.]+)}}/gi,function(t,e){return d.helper.namespace.call(d,e,s,"get","")}))),t.find('[data-search-group="'+e+'"]')[0]||(this.groupTemplate?t.find('[data-group-template="'+e+'"] ul'):t).append(A("<li/>",{class:d.options.selector.group,html:A("<a/>",{href:"javascript:;",html:i||e,tabindex:-1}),"data-search-group":e}))),this.groupTemplate&&m.length&&~(f=m.indexOf(e||s.group))&&m.splice(f,1),f=A("<li/>",{class:d.options.selector.item+" "+d.options.selector.group+"-"+this.helper.slugify.call(this,e),disabled:!!s.disabled,"data-group":e,"data-index":g,html:A("<a/>",{href:n&&!s.disabled?s.href=d.generateHref.call(d,n,s):"javascript:;",html:function(){if(r=s.group&&d.options.source[s.group].template||d.options.template)"function"==typeof r&&(r=r.call(d,d.query,s)),a=r.replace(/\{\{([^\|}]+)(?:\|([^}]+))*}}/gi,function(t,e,i){var n=d.helper.cleanStringFromScript(String(d.helper.namespace.call(d,e,s,"get","")));return~(i=i&&i.split("|")||[]).indexOf("slugify")&&(n=d.helper.slugify.call(d,n)),~i.indexOf("raw")||!0===d.options.highlight&&o&&~h.indexOf(e)&&(n=d.helper.highlight.call(d,n,o.split(" "),d.options.accent)),n});else{for(var t=0,e=h.length;t<e;t++)void 0!==(p=/\./.test(h[t])?d.helper.namespace.call(d,h[t],s,"get",""):s[h[t]])&&""!==p&&l.push(p);a='<span class="'+d.options.selector.display+'">'+d.helper.cleanStringFromScript(String(l.join(" ")))+"</span>"}(!0===d.options.highlight&&o&&!r||"any"===d.options.highlight)&&(a=d.helper.highlight.call(d,a,o.split(" "),d.options.accent)),A(this).append(a)}})}),function(i,t){t.on("click",function(t,e){i.disabled||(e&&"object"==typeof e&&(t.originalEvent=e),d.options.mustSelectItem&&d.helper.isEmpty(i))?t.preventDefault():(d.options.multiselect||(d.item=i),!1===d.helper.executeCallback.call(d,d.options.callback.onClickBefore,[d.node,A(this),i,t])||t.originalEvent&&t.originalEvent.defaultPrevented||t.isDefaultPrevented()||(d.options.multiselect?(d.query=d.rawQuery="",d.addMultiselectItemLayout(i)):(d.focusOnly=!0,d.query=d.rawQuery=d.getTemplateValue.call(d,i),d.isContentEditable&&(d.node.text(d.query),d.helper.setCaretAtEnd(d.node[0]))),d.hideLayout(),d.node.val(d.query).focus(),d.options.cancelButton&&d.toggleCancelButtonVisibility(),d.helper.executeCallback.call(d,d.options.callback.onClickAfter,[d.node,A(this),i,t])))}),t.on("mouseenter",function(t){i.disabled||(d.clearActiveItem(),d.addActiveItem(A(this))),d.helper.executeCallback.call(d,d.options.callback.onEnter,[d.node,A(this),i,t])}),t.on("mouseleave",function(t){i.disabled||d.clearActiveItem(),d.helper.executeCallback.call(d,d.options.callback.onLeave,[d.node,A(this),i,t])})}(s,f),(this.groupTemplate?t.find('[data-group-template="'+e+'"] ul'):t).append(f);if(this.result.length&&m.length)for(g=0,y=m.length;g<y;++g)t.find('[data-group-template="'+m[g]+'"]').remove();this.resultHtml=t}},generateHref:function(t,n){var o=this;return"string"==typeof t?t=t.replace(/\{\{([^\|}]+)(?:\|([^}]+))*}}/gi,function(t,e,i){e=o.helper.namespace.call(o,e,n,"get","");return e=~(i=i&&i.split("|")||[]).indexOf("slugify")?o.helper.slugify.call(o,e):e}):"function"==typeof t&&(t=t.call(this,n)),t},getMultiselectComparedData:function(t){var e="";if(Array.isArray(this.options.multiselect.matchOn))for(var i=0,n=this.options.multiselect.matchOn.length;i<n;++i)e+=void 0!==t[this.options.multiselect.matchOn[i]]?t[this.options.multiselect.matchOn[i]]:"";else{for(var o=JSON.parse(JSON.stringify(t)),s=["group","matchedKey","compiled","href"],i=0,n=s.length;i<n;++i)delete o[s[i]];e=JSON.stringify(o)}return e},buildBackdropLayout:function(){this.options.backdrop&&(this.backdrop.container||(this.backdrop.css=A.extend({opacity:.6,filter:"alpha(opacity=60)",position:"fixed",top:0,right:0,bottom:0,left:0,"z-index":1040,"background-color":"#000"},this.options.backdrop),this.backdrop.container=A("<div/>",{class:this.options.selector.backdrop,css:this.backdrop.css}).insertAfter(this.container)),this.container.addClass("backdrop").css({"z-index":this.backdrop.css["z-index"]+1,position:"relative"}))},buildHintLayout:function(t){if(this.options.hint)if(this.node[0].scrollWidth>Math.ceil(this.node.innerWidth()))this.hint.container&&this.hint.container.val("");else{var e=this,i="",n=(t=t||this.result,this.query.toLowerCase());if(this.options.accent&&(n=this.helper.removeAccent.call(this,n)),this.hintIndex=null,this.searchGroups.length){if(this.hint.container||(this.hint.css=A.extend({"border-color":"transparent",position:"absolute",top:0,display:"inline","z-index":-1,float:"none",color:"silver","box-shadow":"none",cursor:"default","-webkit-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none"},this.options.hint),this.hint.container=A("<"+this.node[0].nodeName+"/>",{type:this.node.attr("type"),class:this.node.attr("class"),readonly:!0,unselectable:"on","aria-hidden":"true",tabindex:-1,click:function(){e.node.focus()}}).addClass(this.options.selector.hint).css(this.hint.css).insertAfter(this.node),this.node.parent().css({position:"relative"})),this.hint.container.css("color",this.hint.css.color),n)for(var o,s,r=0,a=t.length;r<a;r++)if(!t[r].disabled){for(var l=t[r].group,c=0,d=(o=this.options.source[l].display||this.options.display).length;c<d;c++)if(s=String(t[r][o[c]]).toLowerCase(),0===(s=this.options.accent?this.helper.removeAccent.call(this,s):s).indexOf(n)){i=String(t[r][o[c]]),this.hintIndex=r;break}if(null!==this.hintIndex)break}var u=0<i.length&&this.rawQuery+i.substring(this.query.length)||"";this.hint.container.val(u),this.isContentEditable&&this.hint.container.text(u)}}},buildDropdownLayout:function(){var i;this.options.dropdownFilter&&A("<span/>",{class:(i=this).options.selector.filter,html:function(){A(this).append(A("<button/>",{type:"button",class:i.options.selector.filterButton,style:"display: none;",click:function(){i.container.toggleClass("filter");var e=i.namespace+"-dropdown-filter";A("html").off(e),i.container.hasClass("filter")&&A("html").on("click"+e+" touchend"+e,function(t){A(t.target).closest("."+i.options.selector.filter)[0]&&A(t.target).closest(i.container)[0]||i.hasDragged||(i.container.removeClass("filter"),A("html").off(e))})}})),A(this).append(A("<ul/>",{class:i.options.selector.dropdown}))}}).insertAfter(i.container.find("."+i.options.selector.query))},buildDropdownItemLayout:function(t){if(this.options.dropdownFilter){var e,i,o=this,s="string"==typeof this.options.dropdownFilter&&this.options.dropdownFilter||"All",r=this.container.find("."+this.options.selector.dropdown);"static"!==t||!0!==this.options.dropdownFilter&&"string"!=typeof this.options.dropdownFilter||this.dropdownFilter.static.push({key:"group",template:"{{group}}",all:s,value:Object.keys(this.options.source)});for(var n=0,a=this.dropdownFilter[t].length;n<a;n++){i=this.dropdownFilter[t][n],Array.isArray(i.value)||(i.value=[i.value]),i.all&&(this.dropdownFilterAll=i.all);for(var l=0,c=i.value.length;l<=c;l++)l===c&&n!==a-1||l===c&&n===a-1&&"static"===t&&this.dropdownFilter.dynamic.length||(e=this.dropdownFilterAll||s,i.value[l]?e=i.template?i.template.replace(new RegExp("{{"+i.key+"}}","gi"),i.value[l]):i.value[l]:this.container.find("."+o.options.selector.filterButton).html(e),function(e,i,n){r.append(A("<li/>",{class:o.options.selector.dropdownItem+" "+o.helper.slugify.call(o,i.key+"-"+(i.value[e]||s)),html:A("<a/>",{href:"javascript:;",html:n,click:function(t){t.preventDefault(),d.call(o,{key:i.key,value:i.value[e]||"*",template:n})}})}))}(l,i,e))}this.dropdownFilter[t].length&&this.container.find("."+o.options.selector.filterButton).removeAttr("style")}function d(t){"*"===t.value?delete this.filters.dropdown:this.filters.dropdown=t,this.container.removeClass("filter").find("."+this.options.selector.filterButton).html(t.template),this.isDropdownEvent=!0,this.node.trigger("input"+this.namespace),this.options.multiselect&&this.adjustInputSize(),this.node.focus()}},dynamicFilter:{init:function(){this.options.dynamicFilter&&(this.dynamicFilter.bind.call(this),this.isDynamicFilterEnabled=!0)},validate:function(t){var e,i,n,o=null,s=null;for(n in this.filters.dynamic)if(this.filters.dynamic.hasOwnProperty(n)&&(i=~n.indexOf(".")?this.helper.namespace.call(this,n,t,"get"):t[n],"|"===this.filters.dynamic[n].modifier&&(o=o||(i==this.filters.dynamic[n].value||!1)),"&"===this.filters.dynamic[n].modifier)){if(i!=this.filters.dynamic[n].value){s=!1;break}s=!0}return e=o,!!(e=null!==s&&!0===(e=s)&&null!==o?o:e)},set:function(t,e){t=t.match(/^([|&])?(.+)/);e?this.filters.dynamic[t[2]]={modifier:t[1]||"|",value:e}:delete this.filters.dynamic[t[2]],this.isDynamicFilterEnabled&&this.generateSource()},bind:function(){for(var t,e=this,i=0,n=this.options.dynamicFilter.length;i<n;i++)"string"==typeof(t=this.options.dynamicFilter[i]).selector&&(t.selector=A(t.selector)),t.selector instanceof A&&t.selector[0]&&t.key&&function(t){t.selector.off(e.namespace).on("change"+e.namespace,function(){e.dynamicFilter.set.apply(e,[t.key,e.dynamicFilter.getValue(this)])}).trigger("change"+e.namespace)}(t)},getValue:function(t){var e;return"SELECT"===t.tagName?e=t.value:"INPUT"===t.tagName&&("checkbox"===t.type?e=t.checked&&t.getAttribute("value")||t.checked||null:"radio"===t.type&&t.checked&&(e=t.value)),e}},buildMultiselectLayout:function(){var t,e;this.options.multiselect&&((e=this).label.container=A("<span/>",{class:this.options.selector.labelContainer,"data-padding-left":parseFloat(this.node.css("padding-left"))||0,"data-padding-right":parseFloat(this.node.css("padding-right"))||0,"data-padding-top":parseFloat(this.node.css("padding-top"))||0,click:function(t){A(t.target).hasClass(e.options.selector.labelContainer)&&e.node.focus()}}),this.node.closest("."+this.options.selector.query).prepend(this.label.container),this.options.multiselect.data)&&(Array.isArray(this.options.multiselect.data)?this.populateMultiselectData(this.options.multiselect.data):"function"==typeof this.options.multiselect.data&&(t=this.options.multiselect.data.call(this),Array.isArray(t)?this.populateMultiselectData(t):"function"==typeof t.promise&&A.when(t).then(function(t){t&&Array.isArray(t)&&e.populateMultiselectData(t)})))},isMultiselectUniqueData:function(t){for(var e=!0,i=0,n=this.comparedItems.length;i<n;++i)if(this.comparedItems[i]===this.getMultiselectComparedData(t)){e=!1;break}return e},populateMultiselectData:function(t){for(var e=0,i=t.length;e<i;++e)this.addMultiselectItemLayout(t[e]);this.node.trigger("search"+this.namespace,{origin:"populateMultiselectData"})},addMultiselectItemLayout:function(t){var n,e;if(this.isMultiselectUniqueData(t))return this.items.push(t),this.comparedItems.push(this.getMultiselectComparedData(t)),t=this.getTemplateValue(t),e=(n=this).options.multiselect.href?"a":"span",(t=A("<span/>",{class:this.options.selector.label,html:A("<"+e+"/>",{text:t,click:function(t){var e=A(this).closest("."+n.options.selector.label),e=n.label.container.find("."+n.options.selector.label).index(e);n.options.multiselect.callback&&n.helper.executeCallback.call(n,n.options.multiselect.callback.onClick,[n.node,n.items[e],t])},href:this.options.multiselect.href?(e=n.items[n.items.length-1],n.generateHref.call(n,n.options.multiselect.href,e)):null})})).append(A("<span/>",{class:this.options.selector.cancelButton,html:"×",click:function(t){var e=A(this).closest("."+n.options.selector.label),i=n.label.container.find("."+n.options.selector.label).index(e);n.cancelMultiselectItem(i,e,t)}})),this.label.container.append(t),this.adjustInputSize(),!0},cancelMultiselectItem:function(t,e,i){var n=this.items[t];(e=e||this.label.container.find("."+this.options.selector.label).eq(t)).remove(),this.items.splice(t,1),this.comparedItems.splice(t,1),this.options.multiselect.callback&&this.helper.executeCallback.call(this,this.options.multiselect.callback.onCancel,[this.node,n,i]),this.adjustInputSize(),this.focusOnly=!0,this.node.focus().trigger("input"+this.namespace,{origin:"cancelMultiselectItem"})},adjustInputSize:function(){var i,n=this.node[0].getBoundingClientRect().width-(parseFloat(this.label.container.data("padding-right"))||0)-(parseFloat(this.label.container.css("padding-left"))||0),o=0,s=0,r=!1,a=0,t=(this.label.container.find("."+this.options.selector.label).filter(function(t,e){0===t&&(a=A(e)[0].getBoundingClientRect().height+parseFloat(A(e).css("margin-bottom")||0)),i=A(e)[0].getBoundingClientRect().width+parseFloat(A(e).css("margin-right")||0),.7*n<s+i&&!r&&(o++,r=!0),s+i<n?s+=i:(r=!1,s=i)}),parseFloat(this.label.container.data("padding-left")||0)+(r?0:s)),e=o*a+parseFloat(this.label.container.data("padding-top")||0);this.container.find("."+this.options.selector.query).find("input, textarea, [contenteditable], .typeahead__hint").css({paddingLeft:t,paddingTop:e})},showLayout:function(){!this.container.hasClass("result")&&(this.result.length||this.displayEmptyTemplate||this.options.backdropOnFocus)&&(function(){var e=this;A("html").off("keydown"+this.namespace).on("keydown"+this.namespace,function(t){t.keyCode&&9===t.keyCode&&setTimeout(function(){A(":focus").closest(e.container).find(e.node)[0]||e.hideLayout()},0)}),A("html").off("click"+this.namespace+" touchend"+this.namespace).on("click"+this.namespace+" touchend"+this.namespace,function(t){A(t.target).closest(e.container)[0]||A(t.target).closest("."+e.options.selector.item)[0]||t.target.className===e.options.selector.cancelButton||e.hasDragged||e.hideLayout()})}.call(this),this.container.addClass([this.result.length||this.searchGroups.length&&this.displayEmptyTemplate?"result ":"",this.options.hint&&this.searchGroups.length?"hint":"",this.options.backdrop||this.options.backdropOnFocus?"backdrop":""].join(" ")),this.helper.executeCallback.call(this,this.options.callback.onShowLayout,[this.node,this.query]))},hideLayout:function(){(this.container.hasClass("result")||this.container.hasClass("backdrop"))&&(this.container.removeClass("result hint filter"+(this.options.backdropOnFocus&&A(this.node).is(":focus")?"":" backdrop")),this.options.backdropOnFocus&&this.container.hasClass("backdrop")||(A("html").off(this.namespace),this.helper.executeCallback.call(this,this.options.callback.onHideLayout,[this.node,this.query])))},resetLayout:function(){this.result=[],this.tmpResult={},this.groups=[],this.resultCount=0,this.resultCountPerGroup={},this.resultItemCount=0,this.resultHtml=null,this.options.hint&&this.hint.container&&(this.hint.container.val(""),this.isContentEditable)&&this.hint.container.text("")},resetInput:function(){this.node.val(""),this.isContentEditable&&this.node.text(""),this.query="",this.rawQuery=""},buildCancelButtonLayout:function(){var e;this.options.cancelButton&&A("<span/>",{class:(e=this).options.selector.cancelButton,html:"×",mousedown:function(t){t.stopImmediatePropagation(),t.preventDefault(),e.resetInput(),e.node.trigger("input"+e.namespace,[t])}}).insertBefore(this.node)},toggleCancelButtonVisibility:function(){this.container.toggleClass("cancel",!!this.query.length)},__construct:function(){this.extendOptions(),this.unifySourceFormat()&&(this.dynamicFilter.init.apply(this),this.init(),this.buildDropdownLayout(),this.buildDropdownItemLayout("static"),this.buildMultiselectLayout(),this.delegateEvents(),this.buildCancelButtonLayout(),this.helper.executeCallback.call(this,this.options.callback.onReady,[this.node]))},helper:{isEmpty:function(t){for(var e in t)if(t.hasOwnProperty(e))return!1;return!0},removeAccent:function(t){var e;if("string"==typeof t)return e=o,"object"==typeof this.options.accent&&(e=this.options.accent),t.toLowerCase().replace(new RegExp("["+e.from+"]","g"),function(t){return e.to[e.from.indexOf(t)]})},slugify:function(t){return t=""!==(t=String(t))?(t=this.helper.removeAccent.call(this,t)).replace(/[^-a-z0-9]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,""):t},sort:function(n,i,o){function s(t){for(var e=0,i=n.length;e<i;e++)if(void 0!==t[n[e]])return o(t[n[e]]);return t}return i=[-1,1][+!!i],function(t,e){return t=s(t),e=s(e),i*((e<t)-(t<e))}},replaceAt:function(t,e,i,n){return t.substring(0,e)+n+t.substring(e+i)},highlight:function(t,e,i){t=String(t);var i=i&&this.helper.removeAccent.call(this,t)||t,n=[];(e=Array.isArray(e)?e:[e]).sort(function(t,e){return e.length-t.length});for(var o=e.length-1;0<=o;o--)""!==e[o].trim()?e[o]=e[o].replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"):e.splice(o,1);for(i.replace(new RegExp("(?:"+e.join("|")+")(?!([^<]+)?>)","gi"),function(t,e,i){n.push({offset:i,length:t.length})}),o=n.length-1;0<=o;o--)t=this.helper.replaceAt(t,n[o].offset,n[o].length,"<strong>"+t.substr(n[o].offset,n[o].length)+"</strong>");return t},getCaret:function(t){var e=0;if(t.selectionStart)return t.selectionStart;if(document.selection){var i=document.selection.createRange();if(null===i)return e;var n=t.createTextRange(),o=n.duplicate();n.moveToBookmark(i.getBookmark()),o.setEndPoint("EndToStart",n),e=o.text.length}else window.getSelection&&(i=window.getSelection()).rangeCount&&(n=i.getRangeAt(0)).commonAncestorContainer.parentNode==t&&(e=n.endOffset);return e},setCaretAtEnd:function(t){var e,i;void 0!==window.getSelection&&void 0!==document.createRange?((e=document.createRange()).selectNodeContents(t),e.collapse(!1),(i=window.getSelection()).removeAllRanges(),i.addRange(e)):void 0!==document.body.createTextRange&&((i=document.body.createTextRange()).moveToElementText(t),i.collapse(!1),i.select())},cleanStringFromScript:function(t){return"string"==typeof t&&t.replace(/<\/?(?:script|iframe)\b[^>]*>/gm,"")||t},executeCallback:function(t,e){if(t){var i;if("function"==typeof t)i=t;else if(("string"==typeof t||Array.isArray(t))&&"function"!=typeof(i=this.helper.namespace.call(this,(t="string"==typeof t?[t,[]]:t)[0],window)))return;return i.apply(this,(t[1]||[]).concat(e||[]))}},namespace:function(t,e,i,n){if("string"!=typeof t||""===t)return!1;var o=void 0!==n?n:void 0;if(!~t.indexOf("."))return e[t]||o;for(var s,r=t.split("."),a=e||window,l=(i=i||"get",0),c=r.length;l<c;l++){if(void 0===a[s=r[l]]){if(~["get","delete"].indexOf(i))return void 0!==n?n:void 0;a[s]={}}if(~["set","create","delete"].indexOf(i)&&l===c-1){if("set"!==i&&"create"!==i)return delete a[s],!0;a[s]=o}a=a[s]}return a},typeWatch:(i=0,function(t,e){clearTimeout(i),i=setTimeout(t,e)})}},A.fn.typeahead=A.typeahead=function(t){return e.typeahead(this,t)},{typeahead:function(t,e){if(e&&e.source&&"object"==typeof e.source){if("function"==typeof t){if(!e.input)return;t=A(e.input)}if(t.length){if(void 0===t[0].value&&(t[0].value=t.text()),1===t.length)return t[0].selector=t.selector||e.input||t[0].nodeName.toLowerCase(),window.Typeahead[t[0].selector]=new r(t,e);for(var i,n={},o=0,s=t.length;o<s;++o)void 0!==n[i=t[o].nodeName.toLowerCase()]&&(i+=o),t[o].selector=i,window.Typeahead[i]=n[i]=new r(t.eq(o),e);return n}}}});return window.console=window.console||{log:function(){}},Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)}),"trim"in String.prototype||(String.prototype.trim=function(){return this.replace(/^\s+/,"").replace(/\s+$/,"")}),"indexOf"in Array.prototype||(Array.prototype.indexOf=function(t,e){(e=void 0===e?0:e)<0&&(e+=this.length),e<0&&(e=0);for(var i=this.length;e<i;e++)if(e in this&&this[e]===t)return e;return-1}),Object.keys||(Object.keys=function(t){var e,i=[];for(e in t)Object.prototype.hasOwnProperty.call(t,e)&&i.push(e);return i}),r}),!function(r,h){function t(i){return"object"!=typeof i||!i||"length"in i||w(i).forEach(function(t){if(/^(?:forceHandCursor|title|zIndex|bubbleEvents|fixLineEndings)$/.test(t))A[t]=i[t];else if(null==T.bridge){if(!("containerId"!==t&&"swfObjectId"!==t||"string"==typeof(e=i[t])&&e&&/^[A-Za-z][A-Za-z0-9_:\-\.]*$/.test(e)))throw new Error("The specified `"+t+"` value is not valid as an HTML4 Element ID");A[t]=i[t]}var e}),"string"==typeof i&&i?_.call(A,i)?A[i]:void 0:s(A)}function c(){return!!(m.addEventListener&&f.Object.keys&&f.Array.prototype.map)}function i(t){var e,i;if((t=W(t))&&!function(t){var e=t.target||l||null,i=t._source==="swf";switch(delete t._source,t.type){case"error":var n=t.name==="flash-sandboxed"||kt(t);if(typeof n==="boolean")T.sandboxed=n;if(t.name==="browser-unsupported")x(T,{disabled:false,outdated:false,unavailable:false,degraded:false,deactivated:false,overdue:false,ready:false});else if(D.indexOf(t.name)!==-1)x(T,{disabled:t.name==="flash-disabled",outdated:t.name==="flash-outdated",insecure:t.name==="flash-insecure",unavailable:t.name==="flash-unavailable",degraded:t.name==="flash-degraded",deactivated:t.name==="flash-deactivated",overdue:t.name==="flash-overdue",ready:false});else if(t.name==="version-mismatch"){u=t.swfVersion;x(T,{disabled:false,outdated:false,insecure:false,unavailable:false,degraded:false,deactivated:false,overdue:false,ready:false})}j();break;case"ready":u=t.swfVersion;var o=T.deactivated===true;x(T,{sandboxed:false,disabled:false,outdated:false,insecure:false,unavailable:false,degraded:false,deactivated:false,overdue:o,ready:!o});j();break;case"beforecopy":p=e;break;case"copy":var s,r,a=t.relatedTarget;if(!(C["text/html"]||C["text/plain"])&&a&&(r=a.value||a.outerHTML||a.innerHTML)&&(s=a.value||a.textContent||a.innerText)){t.clipboardData.clearData();t.clipboardData.setData("text/plain",s);if(r!==s)t.clipboardData.setData("text/html",r)}else if(!C["text/plain"]&&t.target&&(s=t.target.getAttribute("data-clipboard-text"))){t.clipboardData.clearData();t.clipboardData.setData("text/plain",s)}break;case"aftercopy":xt(t);P.clearData();if(e&&e!==Ot()&&e.focus)e.focus();break;case"_mouseover":P.focus(e);if(A.bubbleEvents===true&&i){if(e&&e!==t.relatedTarget&&!rt(t.relatedTarget,e))L(x({},t,{type:"mouseenter",bubbles:false,cancelable:false}));L(x({},t,{type:"mouseover"}))}break;case"_mouseout":P.blur();if(A.bubbleEvents===true&&i){if(e&&e!==t.relatedTarget&&!rt(t.relatedTarget,e))L(x({},t,{type:"mouseleave",bubbles:false,cancelable:false}));L(x({},t,{type:"mouseout"}))}break;case"_mousedown":$t(e,A.activeClass);if(A.bubbleEvents===true&&i)L(x({},t,{type:t.type.slice(1)}));break;case"_mouseup":$(e,A.activeClass);if(A.bubbleEvents===true&&i)L(x({},t,{type:t.type.slice(1)}));break;case"_click":p=null;if(A.bubbleEvents===true&&i)L(x({},t,{type:t.type.slice(1)}));break;case"_mousemove":if(A.bubbleEvents===true&&i)L(x({},t,{type:t.type.slice(1)}));break}if(/^_(?:click|mouse(?:over|out|down|up|move))$/.test(t.type))return true}(t))return"ready"===t.type&&!0===T.overdue?P.emit({type:"error",name:"flash-overdue"}):(i=x({},t),function(t){if("object"==typeof t&&t&&t.type){var e=wt(t),i=S["*"]||[],n=S[t.type]||[],o=i.concat(n);if(o&&o.length)for(var s,r,a,l,c,d=this,s=0,r=o.length;s<r;s++)l=this,"function"==typeof(a="object"==typeof(a="string"==typeof(a=o[s])&&"function"==typeof f[a]?f[a]:a)&&a&&"function"==typeof a.handleEvent?(l=a).handleEvent:a)&&(c=x({},t),_t(a,l,[c],e));return this}}.call(this,i),"copy"===t.type&&(e=(i=function(t){var e={},i={};if("object"==typeof t&&t){for(var n in t)if(n&&_.call(t,n)&&"string"==typeof t[n]&&t[n])switch(n.toLowerCase()){case"text/plain":case"text":case"air:text":case"flash:text":e.text=t[n],i.text=n;break;case"text/html":case"html":case"air:html":case"flash:html":e.html=t[n],i.html=n;break;case"application/rtf":case"text/rtf":case"rtf":case"richtext":case"air:rtf":case"flash:rtf":e.rtf=t[n],i.rtf=n}return{data:e,formatMap:i}}}(C)).data,n=i.formatMap),e)}function H(){var t=T.sandboxed;if(c()){if(d(),"boolean"!=typeof T.ready&&(T.ready=!1),T.sandboxed!==t&&!0===T.sandboxed)T.ready=!1,P.emit({type:"error",name:"flash-sandboxed"});else if(!P.isFlashUnusable()&&null===T.bridge)if((t=yt())&&t!==f.location.protocol)P.emit({type:"error",name:"flash-insecure"});else{"number"==typeof(t=A.flashLoadTimeout)&&0<=t&&(E=y(function(){"boolean"!=typeof T.deactivated&&(T.deactivated=!0),!0===T.deactivated&&P.emit({type:"error",name:"flash-deactivated"})},t)),T.overdue=!1;var t=T.bridge,e=O(t);if(!t){var i=Lt(f.location.host,A);var n=i==="never"?"none":"all";var o=At(x({jsVersion:P.version},A));var s=A.swfPath+Dt(A.swfPath,A);if(ut)s=Ct(s);e=St();var r=m.createElement("div");e.appendChild(r);m.body.appendChild(e);var a=m.createElement("div");var l=T.pluginType==="activex";a.innerHTML='<object id="'+A.swfObjectId+'" name="'+A.swfObjectId+'" '+'width="100%" height="100%" '+(l?'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"':'type="application/x-shockwave-flash" data="'+s+'"')+">"+(l?'<param name="movie" value="'+s+'"/>':"")+'<param name="allowScriptAccess" value="'+i+'"/>'+'<param name="allowNetworking" value="'+n+'"/>'+'<param name="menu" value="false"/>'+'<param name="wmode" value="transparent"/>'+'<param name="flashvars" value="'+o+'"/>'+'<div id="'+A.swfObjectId+'_fallbackContent"> </div>'+"</object>";t=a.firstChild;a=null;st(t).ZeroClipboard=P;e.replaceChild(t,r);Tt()}if(!t){t=m[A.swfObjectId];if(t&&(l=t.length))t=t[l-1];if(!t&&e)t=e.firstChild}T.bridge=t||null}}else T.ready=!1,P.emit({type:"error",name:"browser-unsupported"})}function F(){P.clearData(),P.blur(),P.emit("destroy");var i,n=T.bridge;n&&((i=O(n))&&("activex"===T.pluginType&&"readyState"in n?(n.style.display="none",function t(){if(4===n.readyState){for(var e in n)"function"==typeof n[e]&&(n[e]=null);n.parentNode&&n.parentNode.removeChild(n),i.parentNode&&i.parentNode.removeChild(i)}else y(t,10)}()):(n.parentNode&&n.parentNode.removeChild(n),i.parentNode&&i.parentNode.removeChild(i))),j(),T.ready=null,T.bridge=null,T.deactivated=null,T.insecure=null,u=h),P.off()}function R(t,e){var i,n;if("object"==typeof t&&t&&void 0===e)i=t,P.clearData();else{if("string"!=typeof t||!t)return;(i={})[t]=e}for(n in i)"string"==typeof n&&n&&_.call(i,n)&&"string"==typeof i[n]&&i[n]&&(C[n]=function(t){var e=/(\r\n|\r|\n)/g;if(typeof t==="string"&&A.fixLineEndings===true)if(ct()){if(/((^|[^\r])\n|\r([^\n]|$))/.test(t))t=t.replace(e,"\r\n")}else if(/\r/.test(t))t=t.replace(e,"\n");return t}(i[n]))}function q(t){if(void 0===t){var e=C;if(e)for(var i in e)_.call(e,i)&&delete e[i];n=null}else"string"==typeof t&&_.call(C,t)&&delete C[t]}function Y(t){if(t&&1===t.nodeType){l&&($(l,A.activeClass),l!==t)&&$(l,A.hoverClass),$t(l=t,A.hoverClass);var e=t.getAttribute("title")||A.title;"string"==typeof e&&e&&(i=O(T.bridge))&&i.setAttribute("title",e);var i=!0===A.forceHandCursor||"pointer"===Mt(t,"cursor");if(T.ready===true)if(T.bridge&&typeof T.bridge.setHandCursor==="function")T.bridge.setHandCursor(i);else T.ready=false;if(l&&(e=O(T.bridge))){t=M(l);x(e.style,{width:t.width+"px",height:t.height+"px",top:t.top+"px",left:t.left+"px",zIndex:""+o(A.zIndex)})}}}function W(t){var e;if("string"==typeof t&&t?(e=t,t={}):"object"==typeof t&&t&&"string"==typeof t.type&&t.type&&(e=t.type),e)return e=e.toLowerCase(),!t.target&&(/^(copy|aftercopy|_click)$/.test(e)||"error"===e&&"clipboard-error"===t.name)&&(t.target=p),x(t,{type:e,target:t.target||l||null,relatedTarget:t.relatedTarget||null,currentTarget:T&&T.bridge||null,timeStamp:t.timeStamp||nt()||null}),e=pt[t.type],(e="error"===t.type&&t.name?e&&e[t.name]:e)&&(t.message=e),"ready"===t.type&&x(t,{target:null,version:T.version}),"error"===t.type&&(mt.test(t.name)&&x(t,{target:null,minimumVersion:ht}),gt.test(t.name)&&x(t,{version:T.version}),"flash-insecure"===t.name)&&x(t,{pageProtocol:f.location.protocol,swfProtocol:yt()}),"copy"===t.type&&(t.clipboardData={setData:P.setData,clearData:P.clearData}),(t="aftercopy"===t.type?Et(t,n):t).target&&!t.relatedTarget&&(t.relatedTarget=vt(t.target)),bt(t)}function a(t){var e,i;return null!=t&&""!==t&&""!==(t=t.replace(/^\s+|\s+$/g,""))&&(!(t=-1===(i=(t=-1===(e=t.indexOf("//"))?t:t.slice(e+2)).indexOf("/"))?t:-1===e||0===i?null:t.slice(0,i))||".swf"!==t.slice(-4).toLowerCase())&&t||null}function d(t){var e,i,n,o=T.sandboxed,s=null;if(t=!0===t,!1==dt)s=!1;else{try{i=r.frameElement||null}catch(t){n={name:t.name,message:t.message}}if(i&&1===i.nodeType&&"IFRAME"===i.nodeName)try{s=i.hasAttribute("sandbox")}catch(t){s=null}else{try{e=document.domain||null}catch(t){e=null}(null===e||n&&"SecurityError"===n.name&&/(^|[\s\(\[@])sandbox(es|ed|ing|[\s\.,!\)\]@]|$)/.test(n.message.toLowerCase()))&&(s=!0)}}o===(T.sandboxed=s)||t||B(K)}function B(e){var i,t,n=!1,o=!1,s=!1,r="";function a(t){t=t.match(/[\d]+/g);return t.length=3,t.join(".")}function l(t){t&&(n=!0,!(r=t.version?a(t.version):r)&&t.description&&(r=a(t.description)),t.filename)&&(t=t.filename,s=!!t&&(t=t.toLowerCase())&&(/^(pepflashplayer\.dll|libpepflashplayer\.so|pepperflashplayer\.plugin)$/.test(t)||"chrome.plugin"===t.slice(-13)))}if(g.plugins&&g.plugins.length)l(g.plugins["Shockwave Flash"]),g.plugins["Shockwave Flash 2.0"]&&(n=!0,r="2.0.0.11");else if(g.mimeTypes&&g.mimeTypes.length)l((t=g.mimeTypes["application/x-shockwave-flash"])&&t.enabledPlugin);else if(void 0!==e){o=!0;try{i=new e("ShockwaveFlash.ShockwaveFlash.7"),n=!0,r=a(i.GetVariable("$version"))}catch(t){try{i=new e("ShockwaveFlash.ShockwaveFlash.6"),n=!0,r="6.0.21"}catch(t){try{i=new e("ShockwaveFlash.ShockwaveFlash"),n=!0,r=a(i.GetVariable("$version"))}catch(t){o=!1}}}}T.disabled=!0!==n,T.outdated=r&&b(r)<b(ht),T.version=r||"0.0.0",T.pluginType=s?"pepper":o?"activex":n?"netscape":"unknown"}function z(t){return function(t){if(!(t&&t.type))return false;if(t.client&&t.client!==this)return false;var e=N[this.id],i=e&&e.elements,n=!!i&&i.length>0,o=!t.target||n&&i.indexOf(t.target)!==-1,s=t.relatedTarget&&n&&i.indexOf(t.relatedTarget)!==-1,r=t.client&&t.client===this;return e&&(o||s||r)?!0:!1}.call(this,t)&&("object"==typeof t&&t&&"string"==typeof t.type&&t.type&&(t=x({},t)),t=x({},W(t),{client:this}),function(t){var e=N[this.id];if("object"==typeof t&&t&&t.type&&e){var i=wt(t),n=e&&e.handlers["*"]||[],o=e&&e.handlers[t.type]||[],s=n.concat(o);if(s&&s.length)for(var r,a,l,c,d,u=this,r=0,a=s.length;r<a;r++)c=this,"function"==typeof(l="object"==typeof(l="string"==typeof(l=s[r])&&"function"==typeof f[l]?f[l]:l)&&l&&"function"==typeof l.handleEvent?(c=l).handleEvent:l)&&(d=x({},t),_t(l,c,[d],i))}}.call(this,t)),this}function U(t){if(!N[this.id])throw new Error("Attempted to clip element(s) to a destroyed ZeroClipboard client instance");t=V(t);for(var e,i=0;i<t.length;i++)_.call(t,i)&&t[i]&&1===t[i].nodeType&&(t[i].zcClippingId?-1===I[t[i].zcClippingId].indexOf(this.id)&&I[t[i].zcClippingId].push(this.id):(t[i].zcClippingId="zcClippingId_"+Pt++,I[t[i].zcClippingId]=[this.id],!0===A.autoActivate&&function(e){var i,t;e&&1===e.nodeType&&(e.addEventListener("mouseover",t=function(t){(t=t||f.event)&&(i(t),P.focus(e))},!(i=function(t){(t=t||f.event)&&("js"!==t._source&&(t.stopImmediatePropagation(),t.preventDefault()),delete t._source)})),e.addEventListener("mouseout",i,!1),e.addEventListener("mouseenter",i,!1),e.addEventListener("mouseleave",i,!1),e.addEventListener("mousemove",i,!1),Nt[e.zcClippingId]={mouseover:t,mouseout:i,mouseenter:i,mouseleave:i,mousemove:i})}(t[i])),-1===(e=N[this.id]&&N[this.id].elements).indexOf(t[i]))&&e.push(t[i]);return this}function G(t){var e=N[this.id];if(e)for(var i,n=e.elements,o=(t=void 0===t?n.slice(0):V(t)).length;o--;)if(_.call(t,o)&&t[o]&&1===t[o].nodeType){for(i=0;-1!==(i=n.indexOf(t[o],i));)n.splice(i,1);var s=I[t[o].zcClippingId];if(s){for(i=0;-1!==(i=s.indexOf(this.id,i));)s.splice(i,1);if(0===s.length){if(!0===A.autoActivate){h=u=d=c=l=a=void 0;var r=t[o];if(r&&1===r.nodeType){var a=Nt[r.zcClippingId];if("object"==typeof a&&a){for(var l,c,d=["move","leave","enter","out","over"],u=0,h=d.length;u<h;u++)"function"==typeof(c=a[l="mouse"+d[u]])&&r.removeEventListener(l,c,!1);delete Nt[r.zcClippingId]}}}delete t[o].zcClippingId}}}return this}function V(t){return"number"!=typeof(t="string"==typeof t?[]:t).length?[t]:t}var u,l,p,f=r,m=f.document,g=f.navigator,y=f.setTimeout,X=f.clearTimeout,Z=f.setInterval,Q=f.clearInterval,J=f.getComputedStyle,v=f.encodeURIComponent,K=f.ActiveXObject,tt=f.Error,et=f.Number.parseInt||f.parseInt,b=f.Number.parseFloat||f.parseFloat,it=f.Number.isNaN||f.isNaN,nt=f.Date.now,w=f.Object.keys,_=f.Object.prototype.hasOwnProperty,ot=f.Array.prototype.slice,st=function(){var t=function(t){return t};if("function"==typeof f.wrap&&"function"==typeof f.unwrap)try{var e=m.createElement("div"),i=f.unwrap(e);1===e.nodeType&&i&&1===i.nodeType&&(t=f.unwrap)}catch(t){}return t}(),k=function(t){return ot.call(t,0)},x=function(){for(var t,e,i,n=k(arguments),o=n[0]||{},s=1,r=n.length;s<r;s++)if(null!=(t=n[s]))for(e in t)_.call(t,e)&&(o[e],o!==(i=t[e]))&&i!==h&&(o[e]=i);return o},s=function(t){var e,i,n,o;if("object"!=typeof t||null==t||"number"==typeof t.nodeType)e=t;else if("number"==typeof t.length)for(e=[],i=0,n=t.length;i<n;i++)_.call(t,i)&&(e[i]=s(t[i]));else for(o in e={},t)_.call(t,o)&&(e[o]=s(t[o]));return e},rt=function(t,e){if(t&&1===t.nodeType&&t.ownerDocument&&e&&(1===e.nodeType&&e.ownerDocument&&e.ownerDocument===t.ownerDocument||9===e.nodeType&&!e.ownerDocument&&e===t.ownerDocument))do{if(t===e)return!0}while(t=t.parentNode);return!1},at=function(t){var e;return"string"==typeof t&&t&&(e=t.split("#")[0].split("?")[0],e=t.slice(0,t.lastIndexOf("/")+1)),e},lt=function(){var t,e,i,n;try{throw new tt}catch(t){e=t}return t=e?e.sourceURL||e.fileName||(e=e.stack,i="string"==typeof e&&e&&((n=e.match(/^(?:|[^:@]*@|.+\)@(?=http[s]?|file)|.+?\s+(?: at |@)(?:[^:\(]+ )*[\(]?)((?:http[s]?|file):\/\/[\/]?.+?\/[^:\)]*?)(?::\d+)(?::\d+)?/))&&n[1]||(n=e.match(/\)@((?:http[s]?|file):\/\/[\/]?.+?\/[^:\)]*?)(?::\d+)(?::\d+)?/))&&n[1])?n[1]:i):t},ct=function(){var t=/win(dows|[\s]?(nt|me|ce|xp|vista|[\d]+))/i;return!!g&&(t.test(g.appVersion||"")||t.test(g.platform||"")||-1!==(g.userAgent||"").indexOf("Windows"))},dt=null==f.opener&&(!!f.top&&f!=f.top||!!f.parent&&f!=f.parent),ut="html"===m.documentElement.nodeName,T={bridge:null,version:"0.0.0",pluginType:"unknown",sandboxed:null,disabled:null,outdated:null,insecure:null,unavailable:null,degraded:null,deactivated:null,overdue:null,ready:null},ht="11.0.0",S={},C={},n=null,E=0,e=0,pt={ready:"Flash communication is established",error:{"flash-sandboxed":"Attempting to run Flash in a sandboxed iframe, which is impossible","flash-disabled":"Flash is disabled or not installed. May also be attempting to run Flash in a sandboxed iframe, which is impossible.","flash-outdated":"Flash is too outdated to support ZeroClipboard","flash-insecure":"Flash will be unable to communicate due to a protocol mismatch between your `swfPath` configuration and the page","flash-unavailable":"Flash is unable to communicate bidirectionally with JavaScript","flash-degraded":"Flash is unable to preserve data fidelity when communicating with JavaScript","flash-deactivated":"Flash is too outdated for your browser and/or is configured as click-to-activate.\nThis may also mean that the ZeroClipboard SWF object could not be loaded, so please check your `swfPath` configuration and/or network connectivity.\nMay also be attempting to run Flash in a sandboxed iframe, which is impossible.","flash-overdue":"Flash communication was established but NOT within the acceptable time limit","version-mismatch":"ZeroClipboard JS version number does not match ZeroClipboard SWF version number","clipboard-error":"At least one error was thrown while ZeroClipboard was attempting to inject your data into the clipboard","config-mismatch":"ZeroClipboard configuration does not match Flash's reality","swf-not-found":"The ZeroClipboard SWF object could not be loaded, so please check your `swfPath` configuration and/or network connectivity","browser-unsupported":"The browser does not support the required HTML DOM and JavaScript features"}},ft=["flash-unavailable","flash-degraded","flash-overdue","version-mismatch","config-mismatch","clipboard-error"],D=["flash-sandboxed","flash-disabled","flash-outdated","flash-insecure","flash-unavailable","flash-degraded","flash-deactivated","flash-overdue"],mt=new RegExp("^flash-("+D.map(function(t){return t.replace(/^flash-/,"")}).join("|")+")$"),gt=new RegExp("^flash-("+D.filter(function(t){return"flash-disabled"!==t}).map(function(t){return t.replace(/^flash-/,"")}).join("|")+")$"),A={swfPath:(at(function(){var t,e,i;if(m.currentScript&&(t=m.currentScript.src))return t;if(1===(e=m.getElementsByTagName("script")).length)return e[0].src||h;if("readyState"in(e[0]||document.createElement("script")))for(i=e.length;i--;)if("interactive"===e[i].readyState&&(t=e[i].src))return t;return"loading"===m.readyState&&(t=e[e.length-1].src)?t:(t=lt())||h}())||function(){for(var t,e,i=m.getElementsByTagName("script"),n=i.length;n--;){if(!(e=i[n].src)){t=null;break}if(e=at(e),null==t)t=e;else if(t!==e){t=null;break}}return t||h}()||"")+"ZeroClipboard.swf",trustedDomains:f.location.host?[f.location.host]:[],cacheBust:!0,forceEnhancedClipboard:!1,flashLoadTimeout:3e4,autoActivate:!0,bubbleEvents:!0,fixLineEndings:!0,containerId:"global-zeroclipboard-html-bridge",containerClass:"global-zeroclipboard-container",swfObjectId:"global-zeroclipboard-flash-bridge",hoverClass:!1,activeClass:!1,forceHandCursor:!1,title:null,zIndex:999999999},yt=function(){var t=A.swfPath||"",e=t.slice(0,2),t=t.slice(0,t.indexOf("://")+1);return"\\\\"===e?"file:":"//"===e||""===t?f.location.protocol:t},vt=function(t){t=t&&t.getAttribute&&t.getAttribute("data-clipboard-target");return t?m.getElementById(t):null},bt=function(t){var e,i,n,o,s,r,a,l,c,d,u;return t&&/^_(?:click|mouse(?:over|out|down|up|move))$/.test(t.type)&&(e=t.target,i="_mouseover"===t.type&&t.relatedTarget?t.relatedTarget:h,n="_mouseout"===t.type&&t.relatedTarget?t.relatedTarget:h,a=M(e),o=f.screenLeft||f.screenX||0,s=f.screenTop||f.screenY||0,r=m.body.scrollLeft+m.documentElement.scrollLeft,c=m.body.scrollTop+m.documentElement.scrollTop,l=o+(r=(o=a.left+("number"==typeof t._stageX?t._stageX:0))-r),c=s+(a=(s=a.top+("number"==typeof t._stageY?t._stageY:0))-c),d="number"==typeof t.movementX?t.movementX:0,u="number"==typeof t.movementY?t.movementY:0,delete t._stageX,delete t._stageY,x(t,{srcElement:e,fromElement:i,toElement:n,screenX:l,screenY:c,pageX:o,pageY:s,clientX:r,clientY:a,x:r,y:a,movementX:d,movementY:u,offsetX:0,offsetY:0,layerX:0,layerY:0})),t},wt=function(t){t=t&&"string"==typeof t.type&&t.type||"";return!/^(?:(?:before)?copy|destroy)$/.test(t)},_t=function(t,e,i,n){n?y(function(){t.apply(e,i)},0):t.apply(e,i)},kt=function(t){var e=null;return e=!1==dt||t&&"error"===t.type&&t.name&&-1!==ft.indexOf(t.name)?!1:e},xt=function(t){var e;t.errors&&0<t.errors.length&&(e=s(t),x(e,{type:"error",name:"clipboard-error"}),delete e.success,y(function(){P.emit(e)},0))},L=function(t){var e,i,n;t&&"string"==typeof t.type&&t&&(n={view:(i=(e=t.target||null)&&e.ownerDocument||m).defaultView||f,canBubble:!0,cancelable:!0,detail:"click"===t.type?1:0,button:"number"==typeof t.which?t.which-1:"number"==typeof t.button?t.button:i.createEvent?0:1},n=x(n,t),e)&&i.createEvent&&e.dispatchEvent&&(n=[n.type,n.canBubble,n.cancelable,n.view,n.detail,n.screenX,n.screenY,n.clientX,n.clientY,n.ctrlKey,n.altKey,n.shiftKey,n.metaKey,n.button,n.relatedTarget],(t=i.createEvent("MouseEvents")).initMouseEvent)&&(t.initMouseEvent.apply(t,n),t._source="js",e.dispatchEvent(t))},Tt=function(){var a,t=A.flashLoadTimeout;"number"==typeof t&&0<=t&&(t=Math.min(1e3,t/10),a=A.swfObjectId+"_fallbackContent",e=Z(function(){var t,e,i,n,o,s,r=m.getElementById(a);(r=r)&&!!(t=J(r,null))&&(e=0<b(t.height),i=0<b(t.width),n=0<=b(t.top),o=0<=b(t.left),r=(s=e&&i&&n&&o)?null:M(r),"none"!==t.display)&&"collapse"!==t.visibility&&(s||!!r&&(e||0<r.height)&&(i||0<r.width)&&(n||0<=r.top)&&(o||0<=r.left))&&(j(),T.deactivated=null,P.emit({type:"error",name:"swf-not-found"}))},t))},St=function(){var t=m.createElement("div");return t.id=A.containerId,t.className=A.containerClass,t.style.position="absolute",t.style.left="0px",t.style.top="-9999px",t.style.width="1px",t.style.height="1px",t.style.zIndex=""+o(A.zIndex),t},O=function(t){for(var e=t&&t.parentNode;e&&"OBJECT"===e.nodeName&&e.parentNode;)e=e.parentNode;return e||null},Ct=function(t){return"string"==typeof t&&t?t.replace(/["&'<>]/g,function(t){switch(t){case'"':return""";case"&":return"&";case"'":return"'";case"<":return"<";case">":return">";default:return t}}):t},Et=function(t,e){if("object"!=typeof t||!t||"object"!=typeof e||!e)return t;var i,n={};for(i in t)if(_.call(t,i))if("errors"===i){n[i]=t[i]?t[i].slice():[];for(var o=0,s=n[i].length;o<s;o++)n[i][o].format=e[n[i][o].format]}else if("success"!==i&&"data"!==i)n[i]=t[i];else{n[i]={};var r,a=t[i];for(r in a)r&&_.call(a,r)&&_.call(e,r)&&(n[i][e[r]]=a[r])}return n},Dt=function(t,e){return null==e||e&&!0===e.cacheBust?(-1===t.indexOf("?")?"?":"&")+"noCache="+nt():""},At=function(t){var e,i,n,o,s="",r=[];if(t.trustedDomains&&("string"==typeof t.trustedDomains?o=[t.trustedDomains]:"object"==typeof t.trustedDomains&&"length"in t.trustedDomains&&(o=t.trustedDomains)),o&&o.length)for(e=0,i=o.length;e<i;e++)if(_.call(o,e)&&o[e]&&"string"==typeof o[e]&&(n=a(o[e]))){if("*"===n){r.length=0,r.push(n);break}r.push.apply(r,[n,"//"+n,f.location.protocol+"//"+n])}return r.length&&(s+="trustedOrigins="+v(r.join(","))),!0===t.forceEnhancedClipboard&&(s+=(s?"&":"")+"forceEnhancedClipboard=true"),"string"==typeof t.swfObjectId&&t.swfObjectId&&(s+=(s?"&":"")+"swfObjectId="+v(t.swfObjectId)),"string"==typeof t.jsVersion&&t.jsVersion&&(s+=(s?"&":"")+"jsVersion="+v(t.jsVersion)),s},Lt=function(t,e){var i=a(e.swfPath),e=(null===i&&(i=t),function(t){var e,i,n,o=[];if("object"==typeof(t="string"==typeof t?[t]:t)&&t&&"number"==typeof t.length)for(e=0,i=t.length;e<i;e++)if(_.call(t,e)&&(n=a(t[e]))){if("*"===n){o.length=0,o.push("*");break}-1===o.indexOf(n)&&o.push(n)}return o}(e.trustedDomains)),n=e.length;if(0<n){if(1===n&&"*"===e[0])return"always";if(-1!==e.indexOf(t))return 1===n&&t===i?"sameDomain":"always"}return"never"},Ot=function(){try{return m.activeElement}catch(t){return null}},$t=function(t,e){var i,n,o,s=[];if("string"==typeof e&&e&&(s=e.split(/\s+/)),t&&1===t.nodeType&&0<s.length){for(o=(" "+(t.className||"")+" ").replace(/[\t\r\n\f]/g," "),i=0,n=s.length;i<n;i++)-1===o.indexOf(" "+s[i]+" ")&&(o+=s[i]+" ");(o=o.replace(/^\s+|\s+$/g,""))!==t.className&&(t.className=o)}return t},$=function(t,e){var i,n,o,s=[];if("string"==typeof e&&e&&(s=e.split(/\s+/)),t&&1===t.nodeType&&0<s.length&&t.className){for(o=(" "+t.className+" ").replace(/[\t\r\n\f]/g," "),i=0,n=s.length;i<n;i++)o=o.replace(" "+s[i]+" "," ");(o=o.replace(/^\s+|\s+$/g,""))!==t.className&&(t.className=o)}return t},Mt=function(t,e){var i=J(t,null).getPropertyValue(e);return"cursor"!==e||i&&"auto"!==i||"A"!==t.nodeName?i:"pointer"},M=function(t){var e,i,n,o,s,r,a,l,c={left:0,top:0,width:0,height:0};return t.getBoundingClientRect&&(t=t.getBoundingClientRect(),e=f.pageXOffset,i=f.pageYOffset,n=m.documentElement.clientLeft||0,o=m.documentElement.clientTop||0,l=a=0,"relative"===Mt(m.body,"position")&&(s=m.body.getBoundingClientRect(),r=m.documentElement.getBoundingClientRect(),a=s.left-r.left||0,l=s.top-r.top||0),c.left=t.left+e-n-a,c.top=t.top+i-o-l,c.width="width"in t?t.width:t.right-t.left,c.height="height"in t?t.height:t.bottom-t.top),c},j=function(){X(E),E=0,Q(e),e=0},o=function(t){var e;return/^(?:auto|inherit)$/.test(t)?t:("number"!=typeof t||it(t)?"string"==typeof t&&(e=o(et(t,10))):e=t,"number"==typeof e?e:"auto")},P=(B(K),d(!0),function(){if(!(this instanceof P))return new P;"function"==typeof P._createClient&&P._createClient.apply(this,k(arguments))}),jt=(P.version="2.4.0-beta.1",P.config=function(){return t.apply(this,k(arguments))},P.state=function(){return function(){return d(),{browser:x(function(t,e){for(var i={},n=0,o=e.length;n<o;n++)e[n]in t&&(i[e[n]]=t[e[n]]);return i}(g,["userAgent","platform","appName","appVersion"]),{isSupported:c()}),flash:function(t,e){var i,n={};for(i in t)-1===e.indexOf(i)&&(n[i]=t[i]);return n}(T,["bridge"]),zeroclipboard:{version:P.version,config:P.config()}}}.apply(this,k(arguments))},P.isFlashUnusable=function(){return function(){return!!(T.sandboxed||T.disabled||T.outdated||T.unavailable||T.degraded||T.deactivated)}.apply(this,k(arguments))},P.on=function(){return function(i,t){var e,n,o,s={};if("string"==typeof i&&i?o=i.toLowerCase().split(/\s+/):"object"!=typeof i||!i||"length"in i||void 0!==t||w(i).forEach(function(t){var e=i[t];"function"==typeof e&&P.on(t,e)}),o&&o.length&&t){for(e=0,n=o.length;e<n;e++)s[i=o[e].replace(/^on/,"")]=!0,S[i]||(S[i]=[]),S[i].push(t);if(s.ready&&T.ready&&P.emit({type:"ready"}),s.error){for(c()||P.emit({type:"error",name:"browser-unsupported"}),e=0,n=D.length;e<n;e++)if(!0===T[D[e].replace(/^flash-/,"")]){P.emit({type:"error",name:D[e]});break}u!==h&&P.version!==u&&P.emit({type:"error",name:"version-mismatch",jsVersion:P.version,swfVersion:u})}}return P}.apply(this,k(arguments))},P.off=function(){return function(i,t){var e,n,o,s,r;if(0===arguments.length?s=w(S):"string"==typeof i&&i?s=i.toLowerCase().split(/\s+/):"object"!=typeof i||!i||"length"in i||void 0!==t||w(i).forEach(function(t){var e=i[t];"function"==typeof e&&P.off(t,e)}),s&&s.length)for(e=0,n=s.length;e<n;e++)if(i=s[e].replace(/^on/,""),(r=S[i])&&r.length)if(t)for(o=r.indexOf(t);-1!==o;)r.splice(o,1),o=r.indexOf(t,o);else r.length=0;return P}.apply(this,k(arguments))},P.handlers=function(){return function(t){t="string"==typeof t&&t?s(S[t])||null:s(S);return t}.apply(this,k(arguments))},P.emit=function(){return i.apply(this,k(arguments))},P.create=function(){return H.apply(this,k(arguments))},P.destroy=function(){return F.apply(this,k(arguments))},P.setData=function(){return R.apply(this,k(arguments))},P.clearData=function(){return q.apply(this,k(arguments))},P.getData=function(){return function(t){return void 0===t?s(C):"string"==typeof t&&_.call(C,t)?C[t]:void 0}.apply(this,k(arguments))},P.focus=P.activate=function(){return Y.apply(this,k(arguments))},P.blur=P.deactivate=function(){return function(){var t=O(T.bridge);t&&(t.removeAttribute("title"),t.style.left="0px",t.style.top="-9999px",t.style.width="1px",t.style.height="1px"),l&&($(l,A.hoverClass),$(l,A.activeClass),l=null)}.apply(this,k(arguments))},P.activeElement=function(){return function(){return l||null}.apply(this,k(arguments))},0),N={},Pt=0,I={},Nt={};x(A,{autoActivate:!0});P._createClient=function(){!function(t){var e,i=this;i.id=""+jt++,N[i.id]=e={instance:i,elements:[],handlers:{},coreWildcardHandler:function(t){return i.emit(t)}},t&&i.clip(t),P.on("*",e.coreWildcardHandler),P.on("destroy",function(){i.destroy()}),P.create()}.apply(this,k(arguments))},P.prototype.on=function(){return function(i,t){var e,n,o,s={},r=this,a=N[r.id],l=a&&a.handlers;if(!a)throw new Error("Attempted to add new listener(s) to a destroyed ZeroClipboard client instance");if("string"==typeof i&&i?o=i.toLowerCase().split(/\s+/):"object"!=typeof i||!i||"length"in i||void 0!==t||w(i).forEach(function(t){var e=i[t];"function"==typeof e&&r.on(t,e)}),o&&o.length&&t){for(e=0,n=o.length;e<n;e++)s[i=o[e].replace(/^on/,"")]=!0,l[i]||(l[i]=[]),l[i].push(t);if(s.ready&&T.ready&&this.emit({type:"ready",client:this}),s.error){for(e=0,n=D.length;e<n;e++)if(T[D[e].replace(/^flash-/,"")]){this.emit({type:"error",name:D[e],client:this});break}u!==h&&P.version!==u&&this.emit({type:"error",name:"version-mismatch",jsVersion:P.version,swfVersion:u})}}return r}.apply(this,k(arguments))},P.prototype.off=function(){return function(i,t){var e,n,o,s,r,a=this,l=N[a.id],c=l&&l.handlers;if(c&&(0===arguments.length?s=w(c):"string"==typeof i&&i?s=i.split(/\s+/):"object"!=typeof i||!i||"length"in i||void 0!==t||w(i).forEach(function(t){var e=i[t];"function"==typeof e&&a.off(t,e)}),s)&&s.length)for(e=0,n=s.length;e<n;e++)if((r=c[i=s[e].toLowerCase().replace(/^on/,"")])&&r.length)if(t)for(o=r.indexOf(t);-1!==o;)r.splice(o,1),o=r.indexOf(t,o);else r.length=0;return a}.apply(this,k(arguments))},P.prototype.handlers=function(){return function(t){var e=null,i=N[this.id]&&N[this.id].handlers;return e=i?"string"==typeof t&&t?i[t]?i[t].slice(0):[]:s(i):e}.apply(this,k(arguments))},P.prototype.emit=function(){return z.apply(this,k(arguments))},P.prototype.clip=function(){return U.apply(this,k(arguments))},P.prototype.unclip=function(){return G.apply(this,k(arguments))},P.prototype.elements=function(){return function(){var t=N[this.id];return t&&t.elements?t.elements.slice(0):[]}.apply(this,k(arguments))},P.prototype.destroy=function(){return function(){var t=N[this.id];t&&(this.unclip(),this.off(),P.off("*",t.coreWildcardHandler),delete N[this.id])}.apply(this,k(arguments))},P.prototype.setText=function(t){if(N[this.id])return P.setData("text/plain",t),this;throw new Error("Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance")},P.prototype.setHtml=function(t){if(N[this.id])return P.setData("text/html",t),this;throw new Error("Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance")},P.prototype.setRichText=function(t){if(N[this.id])return P.setData("application/rtf",t),this;throw new Error("Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance")},P.prototype.setData=function(){if(N[this.id])return P.setData.apply(this,k(arguments)),this;throw new Error("Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance")},P.prototype.clearData=function(){if(N[this.id])return P.clearData.apply(this,k(arguments)),this;throw new Error("Attempted to clear pending clipboard data from a destroyed ZeroClipboard client instance")},P.prototype.getData=function(){if(N[this.id])return P.getData.apply(this,k(arguments));throw new Error("Attempted to get pending clipboard data from a destroyed ZeroClipboard client instance")},"function"==typeof define&&define.amd?define(function(){return P}):"object"==typeof module&&module&&"object"==typeof module.exports&&module.exports?module.exports=P:r.ZeroClipboard=P}(function(){return this||window}()),!function(t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Clipboard=t()}(function(){return function n(o,s,r){function a(i,t){if(!s[i]){if(!o[i]){var e="function"==typeof require&&require;if(!t&&e)return e(i,!0);if(l)return l(i,!0);t=new Error("Cannot find module '"+i+"'");throw t.code="MODULE_NOT_FOUND",t}e=s[i]={exports:{}};o[i][0].call(e.exports,function(t){var e=o[i][1][t];return a(e||t)},e,e.exports,n,o,s,r)}return s[i].exports}for(var l="function"==typeof require&&require,t=0;t<r.length;t++)a(r[t]);return a}({1:[function(t,e,i){var n;"undefined"==typeof Element||Element.prototype.matches||((n=Element.prototype).matches=n.matchesSelector||n.mozMatchesSelector||n.msMatchesSelector||n.oMatchesSelector||n.webkitMatchesSelector),e.exports=function(t,e){for(;t&&9!==t.nodeType;){if(t.matches(e))return t;t=t.parentNode}}},{}],2:[function(t,e,i){var r=t("./closest");e.exports=function(t,e,i,n,o){var s=function(e,i,t,n){return function(t){t.delegateTarget=r(t.target,i),t.delegateTarget&&n.call(e,t)}}.apply(this,arguments);return t.addEventListener(i,s,o),{destroy:function(){t.removeEventListener(i,s,o)}}}},{"./closest":1}],3:[function(t,e,i){i.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},i.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||i.node(t[0]))},i.string=function(t){return"string"==typeof t||t instanceof String},i.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},{}],4:[function(t,e,i){var c=t("./is"),d=t("delegate");e.exports=function(t,e,i){if(!t&&!e&&!i)throw new Error("Missing required arguments");if(!c.string(e))throw new TypeError("Second argument must be a String");if(!c.fn(i))throw new TypeError("Third argument must be a Function");if(c.node(t))return a=e,l=i,(r=t).addEventListener(a,l),{destroy:function(){r.removeEventListener(a,l)}};if(c.nodeList(t))return n=t,o=e,s=i,Array.prototype.forEach.call(n,function(t){t.addEventListener(o,s)}),{destroy:function(){Array.prototype.forEach.call(n,function(t){t.removeEventListener(o,s)})}};if(c.string(t))return d(document.body,t,e,i);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList");var n,o,s,r,a,l}},{"./is":3,delegate:2}],5:[function(t,e,i){e.exports=function(t){var e,i;return t="SELECT"===t.nodeName?(t.focus(),t.value):"INPUT"===t.nodeName||"TEXTAREA"===t.nodeName?((e=t.hasAttribute("readonly"))||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),e||t.removeAttribute("readonly"),t.value):(t.hasAttribute("contenteditable")&&t.focus(),e=window.getSelection(),(i=document.createRange()).selectNodeContents(t),e.removeAllRanges(),e.addRange(i),e.toString())}},{}],6:[function(t,e,i){function n(){}n.prototype={on:function(t,e,i){var n=this.e||(this.e={});return(n[t]||(n[t]=[])).push({fn:e,ctx:i}),this},once:function(t,e,i){var n=this;function o(){n.off(t,o),e.apply(i,arguments)}return o._=e,this.on(t,o,i)},emit:function(t){for(var e=[].slice.call(arguments,1),i=((this.e||(this.e={}))[t]||[]).slice(),n=0,o=i.length;n<o;n++)i[n].fn.apply(i[n].ctx,e);return this},off:function(t,e){var i=this.e||(this.e={}),n=i[t],o=[];if(n&&e)for(var s=0,r=n.length;s<r;s++)n[s].fn!==e&&n[s].fn._!==e&&o.push(n[s]);return o.length?i[t]=o:delete i[t],this}},e.exports=n},{}],7:[function(t,e,i){var n,o;n=this,o=function(t,e){var i=(e=e)&&e.__esModule?e:{default:e};var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};function o(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}(function(t,e,i){e&&o(t.prototype,e),i&&o(t,i)})(s,[{key:"resolveOptions",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var t=this,e="rtl"==document.documentElement.getAttribute("dir"),e=(this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=document.body.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[e?"right":"left"]="-9999px",window.pageYOffset||document.documentElement.scrollTop);this.fakeElem.style.top=e+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,document.body.appendChild(this.fakeElem),this.selectedText=(0,i.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(document.body.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(document.body.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=(0,i.default)(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.target&&this.target.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){if(this._action=0<arguments.length&&void 0!==arguments[0]?arguments[0]:"copy","copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(t){if(void 0!==t){if(!t||"object"!==(void 0===t?"undefined":n(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function(){return this._target}}]);e=s;function s(t){if(!(this instanceof s))throw new TypeError("Cannot call a class as a function");this.resolveOptions(t),this.initSelection()}t.exports=e},void 0!==i?o(e,t("select")):(o(o={exports:{}},n.select),n.clipboardAction=o.exports)},{select:5}],8:[function(t,e,i){var n,o;n=this,o=function(t,e,i,n){var o=r(e),e=r(i),s=r(n);function r(t){return t&&t.__esModule?t:{default:t}}var a=function(t,e,i){return e&&l(t.prototype,e),i&&l(t,i),t};function l(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}i=function(t){var e=n;if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);function n(t,e){var i;if(this instanceof n)return(i=function(t,e){if(t)return!e||"object"!=typeof e&&"function"!=typeof e?t:e;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(this,(n.__proto__||Object.getPrototypeOf(n)).call(this))).resolveOptions(e),i.listenClick(t),i;throw new TypeError("Cannot call a class as a function")}return e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t),a(n,[{key:"resolveOptions",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText}},{key:"listenClick",value:function(t){var e=this;this.listener=(0,s.default)(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){t=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new o.default({action:this.action(t),target:this.target(t),text:this.text(t),trigger:t,emitter:this})}},{key:"defaultAction",value:function(t){return c("action",t)}},{key:"defaultTarget",value:function(t){t=c("target",t);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(t){return c("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof t?[t]:t,e=!!document.queryCommandSupported;return t.forEach(function(t){e=e&&!!document.queryCommandSupported(t)}),e}}]),n}(e.default);function c(t,e){t="data-clipboard-"+t;if(e.hasAttribute(t))return e.getAttribute(t)}t.exports=i},void 0!==i?o(e,t("./clipboard-action"),t("tiny-emitter"),t("good-listener")):(o(o={exports:{}},n.clipboardAction,n.tinyEmitter,n.goodListener),n.clipboard=o.exports)},{"./clipboard-action":7,"good-listener":4,"tiny-emitter":6}]},{},[8])(8)}),!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):"undefined"!=typeof exports?module.exports=t(require("jquery")):t(jQuery)}(function(c){"use strict";var n,s=window.Slick||{};n=0,(s=function(t,e){var i=this;i.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:c(t),appendDots:c(t),arrows:!0,asNavFor:null,prevArrow:'<button class="slick-prev" aria-label="Previous" type="button">Previous</button>',nextArrow:'<button class="slick-next" aria-label="Next" type="button">Next</button>',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(t,e){return c('<button type="button" />').text(e+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,focusOnChange:!1,infinite:!0,initialSlide:0,lazyLoad:"ondemand",mobileFirst:!1,pauseOnHover:!0,pauseOnFocus:!0,pauseOnDotsHover:!1,respondTo:"window",responsive:null,rows:1,rtl:!1,slide:"",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0,zIndex:1e3},i.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,scrolling:!1,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,swiping:!1,$list:null,touchObject:{},transformsEnabled:!1,unslicked:!1},c.extend(i,i.initials),i.activeBreakpoint=null,i.animType=null,i.animProp=null,i.breakpoints=[],i.breakpointSettings=[],i.cssTransitions=!1,i.focussed=!1,i.interrupted=!1,i.hidden="hidden",i.paused=!0,i.positionProp=null,i.respondTo=null,i.rowCount=1,i.shouldClick=!0,i.$slider=c(t),i.$slidesCache=null,i.transformType=null,i.transitionType=null,i.visibilityChange="visibilitychange",i.windowWidth=0,i.windowTimer=null,t=c(t).data("slick")||{},i.options=c.extend({},i.defaults,e,t),i.currentSlide=i.options.initialSlide,i.originalSettings=i.options,void 0!==document.mozHidden?(i.hidden="mozHidden",i.visibilityChange="mozvisibilitychange"):void 0!==document.webkitHidden&&(i.hidden="webkitHidden",i.visibilityChange="webkitvisibilitychange"),i.autoPlay=c.proxy(i.autoPlay,i),i.autoPlayClear=c.proxy(i.autoPlayClear,i),i.autoPlayIterator=c.proxy(i.autoPlayIterator,i),i.changeSlide=c.proxy(i.changeSlide,i),i.clickHandler=c.proxy(i.clickHandler,i),i.selectHandler=c.proxy(i.selectHandler,i),i.setPosition=c.proxy(i.setPosition,i),i.swipeHandler=c.proxy(i.swipeHandler,i),i.dragHandler=c.proxy(i.dragHandler,i),i.keyHandler=c.proxy(i.keyHandler,i),i.instanceUid=n++,i.htmlExpr=/^(?:\s*(<[\w\W]+>)[^>]*)$/,i.registerBreakpoints(),i.init(!0)}).prototype.activateADA=function(){this.$slideTrack.find(".slick-active").attr({"aria-hidden":"false"}).find("a, input, button, select").attr({tabindex:"0"})},s.prototype.addSlide=s.prototype.slickAdd=function(t,e,i){var n=this;if("boolean"==typeof e)i=e,e=null;else if(e<0||e>=n.slideCount)return!1;n.unload(),"number"==typeof e?0===e&&0===n.$slides.length?c(t).appendTo(n.$slideTrack):i?c(t).insertBefore(n.$slides.eq(e)):c(t).insertAfter(n.$slides.eq(e)):!0===i?c(t).prependTo(n.$slideTrack):c(t).appendTo(n.$slideTrack),n.$slides=n.$slideTrack.children(this.options.slide),n.$slideTrack.children(this.options.slide).detach(),n.$slideTrack.append(n.$slides),n.$slides.each(function(t,e){c(e).attr("data-slick-index",t)}),n.$slidesCache=n.$slides,n.reinit()},s.prototype.animateHeight=function(){var t;1===this.options.slidesToShow&&!0===this.options.adaptiveHeight&&!1===this.options.vertical&&(t=this.$slides.eq(this.currentSlide).outerHeight(!0),this.$list.animate({height:t},this.options.speed))},s.prototype.animateSlide=function(t,e){var i={},n=this;n.animateHeight(),!0===n.options.rtl&&!1===n.options.vertical&&(t=-t),!1===n.transformsEnabled?!1===n.options.vertical?n.$slideTrack.animate({left:t},n.options.speed,n.options.easing,e):n.$slideTrack.animate({top:t},n.options.speed,n.options.easing,e):!1===n.cssTransitions?(!0===n.options.rtl&&(n.currentLeft=-n.currentLeft),c({animStart:n.currentLeft}).animate({animStart:t},{duration:n.options.speed,easing:n.options.easing,step:function(t){t=Math.ceil(t),!1===n.options.vertical?i[n.animType]="translate("+t+"px, 0px)":i[n.animType]="translate(0px,"+t+"px)",n.$slideTrack.css(i)},complete:function(){e&&e.call()}})):(n.applyTransition(),t=Math.ceil(t),!1===n.options.vertical?i[n.animType]="translate3d("+t+"px, 0px, 0px)":i[n.animType]="translate3d(0px,"+t+"px, 0px)",n.$slideTrack.css(i),e&&setTimeout(function(){n.disableTransition(),e.call()},n.options.speed))},s.prototype.getNavTarget=function(){var t=this.options.asNavFor;return t=t&&null!==t?c(t).not(this.$slider):t},s.prototype.asNavFor=function(e){var t=this.getNavTarget();null!==t&&"object"==typeof t&&t.each(function(){var t=c(this).slick("getSlick");t.unslicked||t.slideHandler(e,!0)})},s.prototype.applyTransition=function(t){var e=this,i={};!1===e.options.fade?i[e.transitionType]=e.transformType+" "+e.options.speed+"ms "+e.options.cssEase:i[e.transitionType]="opacity "+e.options.speed+"ms "+e.options.cssEase,(!1===e.options.fade?e.$slideTrack:e.$slides.eq(t)).css(i)},s.prototype.autoPlay=function(){this.autoPlayClear(),this.slideCount>this.options.slidesToShow&&(this.autoPlayTimer=setInterval(this.autoPlayIterator,this.options.autoplaySpeed))},s.prototype.autoPlayClear=function(){this.autoPlayTimer&&clearInterval(this.autoPlayTimer)},s.prototype.autoPlayIterator=function(){var t=this,e=t.currentSlide+t.options.slidesToScroll;t.paused||t.interrupted||t.focussed||(!1===t.options.infinite&&(1===t.direction&&t.currentSlide+1===t.slideCount-1?t.direction=0:0===t.direction&&(e=t.currentSlide-t.options.slidesToScroll,t.currentSlide-1==0)&&(t.direction=1)),t.slideHandler(e))},s.prototype.buildArrows=function(){var t=this;!0===t.options.arrows&&(t.$prevArrow=c(t.options.prevArrow).addClass("slick-arrow"),t.$nextArrow=c(t.options.nextArrow).addClass("slick-arrow"),t.slideCount>t.options.slidesToShow?(t.$prevArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),t.$nextArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),t.htmlExpr.test(t.options.prevArrow)&&t.$prevArrow.prependTo(t.options.appendArrows),t.htmlExpr.test(t.options.nextArrow)&&t.$nextArrow.appendTo(t.options.appendArrows),!0!==t.options.infinite&&t.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true")):t.$prevArrow.add(t.$nextArrow).addClass("slick-hidden").attr({"aria-disabled":"true",tabindex:"-1"}))},s.prototype.buildDots=function(){var t,e;if(!0===this.options.dots){for(this.$slider.addClass("slick-dotted"),e=c("<ul />").addClass(this.options.dotsClass),t=0;t<=this.getDotCount();t+=1)e.append(c("<li />").append(this.options.customPaging.call(this,this,t)));this.$dots=e.appendTo(this.options.appendDots),this.$dots.find("li").first().addClass("slick-active")}},s.prototype.buildOut=function(){var t=this;t.$slides=t.$slider.children(t.options.slide+":not(.slick-cloned)").addClass("slick-slide"),t.slideCount=t.$slides.length,t.$slides.each(function(t,e){c(e).attr("data-slick-index",t).data("originalStyling",c(e).attr("style")||"")}),t.$slider.addClass("slick-slider"),t.$slideTrack=0===t.slideCount?c('<div class="slick-track"/>').appendTo(t.$slider):t.$slides.wrapAll('<div class="slick-track"/>').parent(),t.$list=t.$slideTrack.wrap('<div class="slick-list"/>').parent(),t.$slideTrack.css("opacity",0),!0!==t.options.centerMode&&!0!==t.options.swipeToSlide||(t.options.slidesToScroll=1),c("img[data-lazy]",t.$slider).not("[src]").addClass("slick-loading"),t.setupInfinite(),t.buildArrows(),t.buildDots(),t.updateDots(),t.setSlideClasses("number"==typeof t.currentSlide?t.currentSlide:0),!0===t.options.draggable&&t.$list.addClass("draggable")},s.prototype.buildRows=function(){var t,e,i,n=this,o=document.createDocumentFragment(),s=n.$slider.children();if(1<n.options.rows){for(i=n.options.slidesPerRow*n.options.rows,e=Math.ceil(s.length/i),t=0;t<e;t++){for(var r=document.createElement("div"),a=0;a<n.options.rows;a++){for(var l=document.createElement("div"),c=0;c<n.options.slidesPerRow;c++){var d=t*i+(a*n.options.slidesPerRow+c);s.get(d)&&l.appendChild(s.get(d))}r.appendChild(l)}o.appendChild(r)}n.$slider.empty().append(o),n.$slider.children().children().children().css({width:100/n.options.slidesPerRow+"%",display:"inline-block"})}},s.prototype.checkResponsive=function(t,e){var i,n,o,s=this,r=!1,a=s.$slider.width(),l=window.innerWidth||c(window).width();if("window"===s.respondTo?o=l:"slider"===s.respondTo?o=a:"min"===s.respondTo&&(o=Math.min(l,a)),s.options.responsive&&s.options.responsive.length&&null!==s.options.responsive){for(i in n=null,s.breakpoints)s.breakpoints.hasOwnProperty(i)&&(!1===s.originalSettings.mobileFirst?o<s.breakpoints[i]&&(n=s.breakpoints[i]):o>s.breakpoints[i]&&(n=s.breakpoints[i]));null!==n?null!==s.activeBreakpoint&&n===s.activeBreakpoint&&!e||(s.activeBreakpoint=n,"unslick"===s.breakpointSettings[n]?s.unslick(n):(s.options=c.extend({},s.originalSettings,s.breakpointSettings[n]),!0===t&&(s.currentSlide=s.options.initialSlide),s.refresh(t)),r=n):null!==s.activeBreakpoint&&(s.activeBreakpoint=null,s.options=s.originalSettings,!0===t&&(s.currentSlide=s.options.initialSlide),s.refresh(t),r=n),t||!1===r||s.$slider.trigger("breakpoint",[s,r])}},s.prototype.changeSlide=function(t,e){var i,n=this,o=c(t.currentTarget);switch(o.is("a")&&t.preventDefault(),o.is("li")||(o=o.closest("li")),i=n.slideCount%n.options.slidesToScroll!=0?0:(n.slideCount-n.currentSlide)%n.options.slidesToScroll,t.data.message){case"previous":s=0==i?n.options.slidesToScroll:n.options.slidesToShow-i,n.slideCount>n.options.slidesToShow&&n.slideHandler(n.currentSlide-s,!1,e);break;case"next":s=0==i?n.options.slidesToScroll:i,n.slideCount>n.options.slidesToShow&&n.slideHandler(n.currentSlide+s,!1,e);break;case"index":var s=0===t.data.index?0:t.data.index||o.index()*n.options.slidesToScroll;n.slideHandler(n.checkNavigable(s),!1,e),o.children().trigger("focus");break;default:return}},s.prototype.checkNavigable=function(t){var e=this.getNavigableIndexes(),i=0;if(t>e[e.length-1])t=e[e.length-1];else for(var n in e){if(t<e[n]){t=i;break}i=e[n]}return t},s.prototype.cleanUpEvents=function(){var t=this;t.options.dots&&null!==t.$dots&&(c("li",t.$dots).off("click.slick",t.changeSlide).off("mouseenter.slick",c.proxy(t.interrupt,t,!0)).off("mouseleave.slick",c.proxy(t.interrupt,t,!1)),!0===t.options.accessibility)&&t.$dots.off("keydown.slick",t.keyHandler),t.$slider.off("focus.slick blur.slick"),!0===t.options.arrows&&t.slideCount>t.options.slidesToShow&&(t.$prevArrow&&t.$prevArrow.off("click.slick",t.changeSlide),t.$nextArrow&&t.$nextArrow.off("click.slick",t.changeSlide),!0===t.options.accessibility)&&(t.$prevArrow&&t.$prevArrow.off("keydown.slick",t.keyHandler),t.$nextArrow)&&t.$nextArrow.off("keydown.slick",t.keyHandler),t.$list.off("touchstart.slick mousedown.slick",t.swipeHandler),t.$list.off("touchmove.slick mousemove.slick",t.swipeHandler),t.$list.off("touchend.slick mouseup.slick",t.swipeHandler),t.$list.off("touchcancel.slick mouseleave.slick",t.swipeHandler),t.$list.off("click.slick",t.clickHandler),c(document).off(t.visibilityChange,t.visibility),t.cleanUpSlideEvents(),!0===t.options.accessibility&&t.$list.off("keydown.slick",t.keyHandler),!0===t.options.focusOnSelect&&c(t.$slideTrack).children().off("click.slick",t.selectHandler),c(window).off("orientationchange.slick.slick-"+t.instanceUid,t.orientationChange),c(window).off("resize.slick.slick-"+t.instanceUid,t.resize),c("[draggable!=true]",t.$slideTrack).off("dragstart",t.preventDefault),c(window).off("load.slick.slick-"+t.instanceUid,t.setPosition)},s.prototype.cleanUpSlideEvents=function(){this.$list.off("mouseenter.slick",c.proxy(this.interrupt,this,!0)),this.$list.off("mouseleave.slick",c.proxy(this.interrupt,this,!1))},s.prototype.cleanUpRows=function(){var t;1<this.options.rows&&((t=this.$slides.children().children()).removeAttr("style"),this.$slider.empty().append(t))},s.prototype.clickHandler=function(t){!1===this.shouldClick&&(t.stopImmediatePropagation(),t.stopPropagation(),t.preventDefault())},s.prototype.destroy=function(t){var e=this;e.autoPlayClear(),e.touchObject={},e.cleanUpEvents(),c(".slick-cloned",e.$slider).detach(),e.$dots&&e.$dots.remove(),e.$prevArrow&&e.$prevArrow.length&&(e.$prevArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),e.htmlExpr.test(e.options.prevArrow))&&e.$prevArrow.remove(),e.$nextArrow&&e.$nextArrow.length&&(e.$nextArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),e.htmlExpr.test(e.options.nextArrow))&&e.$nextArrow.remove(),e.$slides&&(e.$slides.removeClass("slick-slide slick-active slick-center slick-visible slick-current").removeAttr("aria-hidden").removeAttr("data-slick-index").each(function(){c(this).attr("style",c(this).data("originalStyling"))}),e.$slideTrack.children(this.options.slide).detach(),e.$slideTrack.detach(),e.$list.detach(),e.$slider.append(e.$slides)),e.cleanUpRows(),e.$slider.removeClass("slick-slider"),e.$slider.removeClass("slick-initialized"),e.$slider.removeClass("slick-dotted"),e.unslicked=!0,t||e.$slider.trigger("destroy",[e])},s.prototype.disableTransition=function(t){var e={};e[this.transitionType]="",(!1===this.options.fade?this.$slideTrack:this.$slides.eq(t)).css(e)},s.prototype.fadeSlide=function(t,e){var i=this;!1===i.cssTransitions?(i.$slides.eq(t).css({zIndex:i.options.zIndex}),i.$slides.eq(t).animate({opacity:1},i.options.speed,i.options.easing,e)):(i.applyTransition(t),i.$slides.eq(t).css({opacity:1,zIndex:i.options.zIndex}),e&&setTimeout(function(){i.disableTransition(t),e.call()},i.options.speed))},s.prototype.fadeSlideOut=function(t){!1===this.cssTransitions?this.$slides.eq(t).animate({opacity:0,zIndex:this.options.zIndex-2},this.options.speed,this.options.easing):(this.applyTransition(t),this.$slides.eq(t).css({opacity:0,zIndex:this.options.zIndex-2}))},s.prototype.filterSlides=s.prototype.slickFilter=function(t){null!==t&&(this.$slidesCache=this.$slides,this.unload(),this.$slideTrack.children(this.options.slide).detach(),this.$slidesCache.filter(t).appendTo(this.$slideTrack),this.reinit())},s.prototype.focusHandler=function(){var i=this;i.$slider.off("focus.slick blur.slick").on("focus.slick blur.slick","*",function(t){t.stopImmediatePropagation();var e=c(this);setTimeout(function(){i.options.pauseOnFocus&&(i.focussed=e.is(":focus"),i.autoPlay())},0)})},s.prototype.getCurrent=s.prototype.slickCurrentSlide=function(){return this.currentSlide},s.prototype.getDotCount=function(){var t=this,e=0,i=0,n=0;if(!0===t.options.infinite)if(t.slideCount<=t.options.slidesToShow)++n;else for(;e<t.slideCount;)++n,e=i+t.options.slidesToScroll,i+=t.options.slidesToScroll<=t.options.slidesToShow?t.options.slidesToScroll:t.options.slidesToShow;else if(!0===t.options.centerMode)n=t.slideCount;else if(t.options.asNavFor)for(;e<t.slideCount;)++n,e=i+t.options.slidesToScroll,i+=t.options.slidesToScroll<=t.options.slidesToShow?t.options.slidesToScroll:t.options.slidesToShow;else n=1+Math.ceil((t.slideCount-t.options.slidesToShow)/t.options.slidesToScroll);return n-1},s.prototype.getLeft=function(t){var e,i,n=this,o=0;return n.slideOffset=0,e=n.$slides.first().outerHeight(!0),!0===n.options.infinite?(n.slideCount>n.options.slidesToShow&&(n.slideOffset=n.slideWidth*n.options.slidesToShow*-1,i=-1,!0===n.options.vertical&&!0===n.options.centerMode&&(2===n.options.slidesToShow?i=-1.5:1===n.options.slidesToShow&&(i=-2)),o=e*n.options.slidesToShow*i),n.slideCount%n.options.slidesToScroll!=0&&t+n.options.slidesToScroll>n.slideCount&&n.slideCount>n.options.slidesToShow&&(o=t>n.slideCount?(n.slideOffset=(n.options.slidesToShow-(t-n.slideCount))*n.slideWidth*-1,(n.options.slidesToShow-(t-n.slideCount))*e*-1):(n.slideOffset=n.slideCount%n.options.slidesToScroll*n.slideWidth*-1,n.slideCount%n.options.slidesToScroll*e*-1))):t+n.options.slidesToShow>n.slideCount&&(n.slideOffset=(t+n.options.slidesToShow-n.slideCount)*n.slideWidth,o=(t+n.options.slidesToShow-n.slideCount)*e),n.slideCount<=n.options.slidesToShow&&(o=n.slideOffset=0),!0===n.options.centerMode&&n.slideCount<=n.options.slidesToShow?n.slideOffset=n.slideWidth*Math.floor(n.options.slidesToShow)/2-n.slideWidth*n.slideCount/2:!0===n.options.centerMode&&!0===n.options.infinite?n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)-n.slideWidth:!0===n.options.centerMode&&(n.slideOffset=0,n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)),i=!1===n.options.vertical?t*n.slideWidth*-1+n.slideOffset:t*e*-1+o,!0===n.options.variableWidth&&(e=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(".slick-slide").eq(t):n.$slideTrack.children(".slick-slide").eq(t+n.options.slidesToShow),i=!0===n.options.rtl?e[0]?-1*(n.$slideTrack.width()-e[0].offsetLeft-e.width()):0:e[0]?-1*e[0].offsetLeft:0,!0===n.options.centerMode)&&(e=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(".slick-slide").eq(t):n.$slideTrack.children(".slick-slide").eq(t+n.options.slidesToShow+1),i=!0===n.options.rtl?e[0]?-1*(n.$slideTrack.width()-e[0].offsetLeft-e.width()):0:e[0]?-1*e[0].offsetLeft:0,i+=(n.$list.width()-e.outerWidth())/2),i},s.prototype.getOption=s.prototype.slickGetOption=function(t){return this.options[t]},s.prototype.getNavigableIndexes=function(){for(var t=this,e=0,i=0,n=[],o=!1===t.options.infinite?t.slideCount:(e=-1*t.options.slidesToScroll,i=-1*t.options.slidesToScroll,2*t.slideCount);e<o;)n.push(e),e=i+t.options.slidesToScroll,i+=t.options.slidesToScroll<=t.options.slidesToShow?t.options.slidesToScroll:t.options.slidesToShow;return n},s.prototype.getSlick=function(){return this},s.prototype.getSlideCount=function(){var i,n=this,o=!0===n.options.centerMode?n.slideWidth*Math.floor(n.options.slidesToShow/2):0;return!0===n.options.swipeToSlide?(n.$slideTrack.find(".slick-slide").each(function(t,e){if(e.offsetLeft-o+c(e).outerWidth()/2>-1*n.swipeLeft)return i=e,!1}),Math.abs(c(i).attr("data-slick-index")-n.currentSlide)||1):n.options.slidesToScroll},s.prototype.goTo=s.prototype.slickGoTo=function(t,e){this.changeSlide({data:{message:"index",index:parseInt(t)}},e)},s.prototype.init=function(t){var e=this;c(e.$slider).hasClass("slick-initialized")||(c(e.$slider).addClass("slick-initialized"),e.buildRows(),e.buildOut(),e.setProps(),e.startLoad(),e.loadSlider(),e.initializeEvents(),e.updateArrows(),e.updateDots(),e.checkResponsive(!0),e.focusHandler()),t&&e.$slider.trigger("init",[e]),!0===e.options.accessibility&&e.initADA(),e.options.autoplay&&(e.paused=!1,e.autoPlay())},s.prototype.initADA=function(){var i=this,n=Math.ceil(i.slideCount/i.options.slidesToShow),o=i.getNavigableIndexes().filter(function(t){return 0<=t&&t<i.slideCount});i.$slides.add(i.$slideTrack.find(".slick-cloned")).attr({"aria-hidden":"true",tabindex:"-1"}).find("a, input, button, select").attr({tabindex:"-1"}),null!==i.$dots&&(i.$slides.not(i.$slideTrack.find(".slick-cloned")).each(function(t){var e=o.indexOf(t);c(this).attr({role:"tabpanel",id:"slick-slide"+i.instanceUid+t,tabindex:-1}),-1!==e&&c(this).attr({"aria-describedby":"slick-slide-control"+i.instanceUid+e})}),i.$dots.attr("role","tablist").find("li").each(function(t){var e=o[t];c(this).attr({role:"presentation"}),c(this).find("button").first().attr({role:"tab",id:"slick-slide-control"+i.instanceUid+t,"aria-controls":"slick-slide"+i.instanceUid+e,"aria-label":t+1+" of "+n,"aria-selected":null,tabindex:"-1"})}).eq(i.currentSlide).find("button").attr({"aria-selected":"true",tabindex:"0"}).end());for(var t=i.currentSlide,e=t+i.options.slidesToShow;t<e;t++)i.$slides.eq(t).attr("tabindex",0);i.activateADA()},s.prototype.initArrowEvents=function(){var t=this;!0===t.options.arrows&&t.slideCount>t.options.slidesToShow&&(t.$prevArrow.off("click.slick").on("click.slick",{message:"previous"},t.changeSlide),t.$nextArrow.off("click.slick").on("click.slick",{message:"next"},t.changeSlide),!0===t.options.accessibility)&&(t.$prevArrow.on("keydown.slick",t.keyHandler),t.$nextArrow.on("keydown.slick",t.keyHandler))},s.prototype.initDotEvents=function(){var t=this;!0===t.options.dots&&(c("li",t.$dots).on("click.slick",{message:"index"},t.changeSlide),!0===t.options.accessibility)&&t.$dots.on("keydown.slick",t.keyHandler),!0===t.options.dots&&!0===t.options.pauseOnDotsHover&&c("li",t.$dots).on("mouseenter.slick",c.proxy(t.interrupt,t,!0)).on("mouseleave.slick",c.proxy(t.interrupt,t,!1))},s.prototype.initSlideEvents=function(){this.options.pauseOnHover&&(this.$list.on("mouseenter.slick",c.proxy(this.interrupt,this,!0)),this.$list.on("mouseleave.slick",c.proxy(this.interrupt,this,!1)))},s.prototype.initializeEvents=function(){var t=this;t.initArrowEvents(),t.initDotEvents(),t.initSlideEvents(),t.$list.on("touchstart.slick mousedown.slick",{action:"start"},t.swipeHandler),t.$list.on("touchmove.slick mousemove.slick",{action:"move"},t.swipeHandler),t.$list.on("touchend.slick mouseup.slick",{action:"end"},t.swipeHandler),t.$list.on("touchcancel.slick mouseleave.slick",{action:"end"},t.swipeHandler),t.$list.on("click.slick",t.clickHandler),c(document).on(t.visibilityChange,c.proxy(t.visibility,t)),!0===t.options.accessibility&&t.$list.on("keydown.slick",t.keyHandler),!0===t.options.focusOnSelect&&c(t.$slideTrack).children().on("click.slick",t.selectHandler),c(window).on("orientationchange.slick.slick-"+t.instanceUid,c.proxy(t.orientationChange,t)),c(window).on("resize.slick.slick-"+t.instanceUid,c.proxy(t.resize,t)),c("[draggable!=true]",t.$slideTrack).on("dragstart",t.preventDefault),c(window).on("load.slick.slick-"+t.instanceUid,t.setPosition),c(t.setPosition)},s.prototype.initUI=function(){!0===this.options.arrows&&this.slideCount>this.options.slidesToShow&&(this.$prevArrow.show(),this.$nextArrow.show()),!0===this.options.dots&&this.slideCount>this.options.slidesToShow&&this.$dots.show()},s.prototype.keyHandler=function(t){t.target.tagName.match("TEXTAREA|INPUT|SELECT")||(37===t.keyCode&&!0===this.options.accessibility?this.changeSlide({data:{message:!0===this.options.rtl?"next":"previous"}}):39===t.keyCode&&!0===this.options.accessibility&&this.changeSlide({data:{message:!0===this.options.rtl?"previous":"next"}}))},s.prototype.lazyLoad=function(){function t(t){c("img[data-lazy]",t).each(function(){var t=c(this),e=c(this).attr("data-lazy"),i=c(this).attr("data-srcset"),n=c(this).attr("data-sizes")||s.$slider.attr("data-sizes"),o=document.createElement("img");o.onload=function(){t.animate({opacity:0},100,function(){i&&(t.attr("srcset",i),n)&&t.attr("sizes",n),t.attr("src",e).animate({opacity:1},200,function(){t.removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading")}),s.$slider.trigger("lazyLoaded",[s,t,e])})},o.onerror=function(){t.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),s.$slider.trigger("lazyLoadError",[s,t,e])},o.src=e})}var e,i,n,s=this;if(!0===s.options.centerMode?n=!0===s.options.infinite?(i=s.currentSlide+(s.options.slidesToShow/2+1))+s.options.slidesToShow+2:(i=Math.max(0,s.currentSlide-(s.options.slidesToShow/2+1)),s.options.slidesToShow/2+1+2+s.currentSlide):(i=s.options.infinite?s.options.slidesToShow+s.currentSlide:s.currentSlide,n=Math.ceil(i+s.options.slidesToShow),!0===s.options.fade&&(0<i&&i--,n<=s.slideCount)&&n++),e=s.$slider.find(".slick-slide").slice(i,n),"anticipated"===s.options.lazyLoad)for(var o=i-1,r=n,a=s.$slider.find(".slick-slide"),l=0;l<s.options.slidesToScroll;l++)o<0&&(o=s.slideCount-1),e=(e=e.add(a.eq(o))).add(a.eq(r)),o--,r++;t(e),s.slideCount<=s.options.slidesToShow?t(s.$slider.find(".slick-slide")):s.currentSlide>=s.slideCount-s.options.slidesToShow?t(s.$slider.find(".slick-cloned").slice(0,s.options.slidesToShow)):0===s.currentSlide&&t(s.$slider.find(".slick-cloned").slice(-1*s.options.slidesToShow))},s.prototype.loadSlider=function(){this.setPosition(),this.$slideTrack.css({opacity:1}),this.$slider.removeClass("slick-loading"),this.initUI(),"progressive"===this.options.lazyLoad&&this.progressiveLazyLoad()},s.prototype.next=s.prototype.slickNext=function(){this.changeSlide({data:{message:"next"}})},s.prototype.orientationChange=function(){this.checkResponsive(),this.setPosition()},s.prototype.pause=s.prototype.slickPause=function(){this.autoPlayClear(),this.paused=!0},s.prototype.play=s.prototype.slickPlay=function(){this.autoPlay(),this.options.autoplay=!0,this.paused=!1,this.focussed=!1,this.interrupted=!1},s.prototype.postSlide=function(t){var e=this;e.unslicked||(e.$slider.trigger("afterChange",[e,t]),e.animating=!1,e.slideCount>e.options.slidesToShow&&e.setPosition(),e.swipeLeft=null,e.options.autoplay&&e.autoPlay(),!0===e.options.accessibility&&(e.initADA(),e.options.focusOnChange)&&c(e.$slides.get(e.currentSlide)).attr("tabindex",0).focus())},s.prototype.prev=s.prototype.slickPrev=function(){this.changeSlide({data:{message:"previous"}})},s.prototype.preventDefault=function(t){t.preventDefault()},s.prototype.progressiveLazyLoad=function(t){t=t||1;var e,i,n,o,s=this,r=c("img[data-lazy]",s.$slider);r.length?(e=r.first(),i=e.attr("data-lazy"),n=e.attr("data-srcset"),o=e.attr("data-sizes")||s.$slider.attr("data-sizes"),(r=document.createElement("img")).onload=function(){n&&(e.attr("srcset",n),o)&&e.attr("sizes",o),e.attr("src",i).removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading"),!0===s.options.adaptiveHeight&&s.setPosition(),s.$slider.trigger("lazyLoaded",[s,e,i]),s.progressiveLazyLoad()},r.onerror=function(){t<3?setTimeout(function(){s.progressiveLazyLoad(t+1)},500):(e.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),s.$slider.trigger("lazyLoadError",[s,e,i]),s.progressiveLazyLoad())},r.src=i):s.$slider.trigger("allImagesLoaded",[s])},s.prototype.refresh=function(t){var e=this,i=e.slideCount-e.options.slidesToShow;!e.options.infinite&&e.currentSlide>i&&(e.currentSlide=i),e.slideCount<=e.options.slidesToShow&&(e.currentSlide=0),i=e.currentSlide,e.destroy(!0),c.extend(e,e.initials,{currentSlide:i}),e.init(),t||e.changeSlide({data:{message:"index",index:i}},!1)},s.prototype.registerBreakpoints=function(){var t,e,i,n=this,o=n.options.responsive||null;if("array"===c.type(o)&&o.length){for(t in n.respondTo=n.options.respondTo||"window",o)if(i=n.breakpoints.length-1,o.hasOwnProperty(t)){for(e=o[t].breakpoint;0<=i;)n.breakpoints[i]&&n.breakpoints[i]===e&&n.breakpoints.splice(i,1),i--;n.breakpoints.push(e),n.breakpointSettings[e]=o[t].settings}n.breakpoints.sort(function(t,e){return n.options.mobileFirst?t-e:e-t})}},s.prototype.reinit=function(){var t=this;t.$slides=t.$slideTrack.children(t.options.slide).addClass("slick-slide"),t.slideCount=t.$slides.length,t.currentSlide>=t.slideCount&&0!==t.currentSlide&&(t.currentSlide=t.currentSlide-t.options.slidesToScroll),t.slideCount<=t.options.slidesToShow&&(t.currentSlide=0),t.registerBreakpoints(),t.setProps(),t.setupInfinite(),t.buildArrows(),t.updateArrows(),t.initArrowEvents(),t.buildDots(),t.updateDots(),t.initDotEvents(),t.cleanUpSlideEvents(),t.initSlideEvents(),t.checkResponsive(!1,!0),!0===t.options.focusOnSelect&&c(t.$slideTrack).children().on("click.slick",t.selectHandler),t.setSlideClasses("number"==typeof t.currentSlide?t.currentSlide:0),t.setPosition(),t.focusHandler(),t.paused=!t.options.autoplay,t.autoPlay(),t.$slider.trigger("reInit",[t])},s.prototype.resize=function(){var t=this;c(window).width()!==t.windowWidth&&(clearTimeout(t.windowDelay),t.windowDelay=window.setTimeout(function(){t.windowWidth=c(window).width(),t.checkResponsive(),t.unslicked||t.setPosition()},50))},s.prototype.removeSlide=s.prototype.slickRemove=function(t,e,i){var n=this;if(t="boolean"==typeof t?!0===(e=t)?0:n.slideCount-1:!0===e?--t:t,n.slideCount<1||t<0||t>n.slideCount-1)return!1;n.unload(),(!0===i?n.$slideTrack.children():n.$slideTrack.children(this.options.slide).eq(t)).remove(),n.$slides=n.$slideTrack.children(this.options.slide),n.$slideTrack.children(this.options.slide).detach(),n.$slideTrack.append(n.$slides),n.$slidesCache=n.$slides,n.reinit()},s.prototype.setCSS=function(t){var e,i,n=this,o={};!0===n.options.rtl&&(t=-t),e="left"==n.positionProp?Math.ceil(t)+"px":"0px",i="top"==n.positionProp?Math.ceil(t)+"px":"0px",o[n.positionProp]=t,!1!==n.transformsEnabled&&(!(o={})===n.cssTransitions?o[n.animType]="translate("+e+", "+i+")":o[n.animType]="translate3d("+e+", "+i+", 0px)"),n.$slideTrack.css(o)},s.prototype.setDimensions=function(){var t=this,e=(!1===t.options.vertical?!0===t.options.centerMode&&t.$list.css({padding:"0px "+t.options.centerPadding}):(t.$list.height(t.$slides.first().outerHeight(!0)*t.options.slidesToShow),!0===t.options.centerMode&&t.$list.css({padding:t.options.centerPadding+" 0px"})),t.listWidth=t.$list.width(),t.listHeight=t.$list.height(),!1===t.options.vertical&&!1===t.options.variableWidth?(t.slideWidth=Math.ceil(t.listWidth/t.options.slidesToShow),t.$slideTrack.width(Math.ceil(t.slideWidth*t.$slideTrack.children(".slick-slide").length))):!0===t.options.variableWidth?t.$slideTrack.width(5e3*t.slideCount):(t.slideWidth=Math.ceil(t.listWidth),t.$slideTrack.height(Math.ceil(t.$slides.first().outerHeight(!0)*t.$slideTrack.children(".slick-slide").length))),t.$slides.first().outerWidth(!0)-t.$slides.first().width());!1===t.options.variableWidth&&t.$slideTrack.children(".slick-slide").width(t.slideWidth-e)},s.prototype.setFade=function(){var i,n=this;n.$slides.each(function(t,e){i=n.slideWidth*t*-1,!0===n.options.rtl?c(e).css({position:"relative",right:i,top:0,zIndex:n.options.zIndex-2,opacity:0}):c(e).css({position:"relative",left:i,top:0,zIndex:n.options.zIndex-2,opacity:0})}),n.$slides.eq(n.currentSlide).css({zIndex:n.options.zIndex-1,opacity:1})},s.prototype.setHeight=function(){var t;1===this.options.slidesToShow&&!0===this.options.adaptiveHeight&&!1===this.options.vertical&&(t=this.$slides.eq(this.currentSlide).outerHeight(!0),this.$list.css("height",t))},s.prototype.setOption=s.prototype.slickSetOption=function(){var t,e,i,n,o,s=this,r=!1;if("object"===c.type(arguments[0])?(i=arguments[0],r=arguments[1],o="multiple"):"string"===c.type(arguments[0])&&(i=arguments[0],n=arguments[1],r=arguments[2],"responsive"===arguments[0]&&"array"===c.type(arguments[1])?o="responsive":void 0!==arguments[1]&&(o="single")),"single"===o)s.options[i]=n;else if("multiple"===o)c.each(i,function(t,e){s.options[t]=e});else if("responsive"===o)for(e in n)if("array"!==c.type(s.options.responsive))s.options.responsive=[n[e]];else{for(t=s.options.responsive.length-1;0<=t;)s.options.responsive[t].breakpoint===n[e].breakpoint&&s.options.responsive.splice(t,1),t--;s.options.responsive.push(n[e])}r&&(s.unload(),s.reinit())},s.prototype.setPosition=function(){this.setDimensions(),this.setHeight(),!1===this.options.fade?this.setCSS(this.getLeft(this.currentSlide)):this.setFade(),this.$slider.trigger("setPosition",[this])},s.prototype.setProps=function(){var t=this,e=document.body.style;t.positionProp=!0===t.options.vertical?"top":"left","top"===t.positionProp?t.$slider.addClass("slick-vertical"):t.$slider.removeClass("slick-vertical"),void 0===e.WebkitTransition&&void 0===e.MozTransition&&void 0===e.msTransition||!0===t.options.useCSS&&(t.cssTransitions=!0),t.options.fade&&("number"==typeof t.options.zIndex?t.options.zIndex<3&&(t.options.zIndex=3):t.options.zIndex=t.defaults.zIndex),void 0!==e.OTransform&&(t.animType="OTransform",t.transformType="-o-transform",t.transitionType="OTransition",void 0===e.perspectiveProperty)&&void 0===e.webkitPerspective&&(t.animType=!1),void 0!==e.MozTransform&&(t.animType="MozTransform",t.transformType="-moz-transform",t.transitionType="MozTransition",void 0===e.perspectiveProperty)&&void 0===e.MozPerspective&&(t.animType=!1),void 0!==e.webkitTransform&&(t.animType="webkitTransform",t.transformType="-webkit-transform",t.transitionType="webkitTransition",void 0===e.perspectiveProperty)&&void 0===e.webkitPerspective&&(t.animType=!1),void 0!==e.msTransform&&(t.animType="msTransform",t.transformType="-ms-transform",t.transitionType="msTransition",void 0===e.msTransform)&&(t.animType=!1),void 0!==e.transform&&!1!==t.animType&&(t.animType="transform",t.transformType="transform",t.transitionType="transition"),t.transformsEnabled=t.options.useTransform&&null!==t.animType&&!1!==t.animType},s.prototype.setSlideClasses=function(t){var e,i,n,o=this,s=o.$slider.find(".slick-slide").removeClass("slick-active slick-center slick-current").attr("aria-hidden","true");o.$slides.eq(t).addClass("slick-current"),!0===o.options.centerMode?(i=o.options.slidesToShow%2==0?1:0,n=Math.floor(o.options.slidesToShow/2),!0===o.options.infinite&&((n<=t&&t<=o.slideCount-1-n?o.$slides.slice(t-n+i,t+n+1):(e=o.options.slidesToShow+t,s.slice(e-n+1+i,e+n+2))).addClass("slick-active").attr("aria-hidden","false"),0===t?s.eq(s.length-1-o.options.slidesToShow).addClass("slick-center"):t===o.slideCount-1&&s.eq(o.options.slidesToShow).addClass("slick-center")),o.$slides.eq(t).addClass("slick-center")):(0<=t&&t<=o.slideCount-o.options.slidesToShow?o.$slides.slice(t,t+o.options.slidesToShow):s.length<=o.options.slidesToShow?s:(i=o.slideCount%o.options.slidesToShow,e=!0===o.options.infinite?o.options.slidesToShow+t:t,o.options.slidesToShow==o.options.slidesToScroll&&o.slideCount-t<o.options.slidesToShow?s.slice(e-(o.options.slidesToShow-i),e+i):s.slice(e,e+o.options.slidesToShow))).addClass("slick-active").attr("aria-hidden","false"),"ondemand"!==o.options.lazyLoad&&"anticipated"!==o.options.lazyLoad||o.lazyLoad()},s.prototype.setupInfinite=function(){var t,e,i,n=this;if(!0===n.options.fade&&(n.options.centerMode=!1),!0===n.options.infinite&&!1===n.options.fade&&(e=null,n.slideCount>n.options.slidesToShow)){for(i=!0===n.options.centerMode?n.options.slidesToShow+1:n.options.slidesToShow,t=n.slideCount;t>n.slideCount-i;--t)c(n.$slides[e=t-1]).clone(!0).attr("id","").attr("data-slick-index",e-n.slideCount).prependTo(n.$slideTrack).addClass("slick-cloned");for(t=0;t<i+n.slideCount;t+=1)e=t,c(n.$slides[e]).clone(!0).attr("id","").attr("data-slick-index",e+n.slideCount).appendTo(n.$slideTrack).addClass("slick-cloned");n.$slideTrack.find(".slick-cloned").find("[id]").each(function(){c(this).attr("id","")})}},s.prototype.interrupt=function(t){t||this.autoPlay(),this.interrupted=t},s.prototype.selectHandler=function(t){t=c(t.target).is(".slick-slide")?c(t.target):c(t.target).parents(".slick-slide"),t=(t=parseInt(t.attr("data-slick-index")))||0;this.slideCount<=this.options.slidesToShow?this.slideHandler(t,!1,!0):this.slideHandler(t)},s.prototype.slideHandler=function(t,e,i){var n,o,s,r=this;e=e||!1,!0===r.animating&&!0===r.options.waitForAnimate||!0===r.options.fade&&r.currentSlide===t||(!1===e&&r.asNavFor(t),n=t,e=r.getLeft(n),s=r.getLeft(r.currentSlide),r.currentLeft=null===r.swipeLeft?s:r.swipeLeft,!1===r.options.infinite&&!1===r.options.centerMode&&(t<0||t>r.getDotCount()*r.options.slidesToScroll)||!1===r.options.infinite&&!0===r.options.centerMode&&(t<0||t>r.slideCount-r.options.slidesToScroll)?!1===r.options.fade&&(n=r.currentSlide,!0!==i?r.animateSlide(s,function(){r.postSlide(n)}):r.postSlide(n)):(r.options.autoplay&&clearInterval(r.autoPlayTimer),o=n<0?r.slideCount%r.options.slidesToScroll!=0?r.slideCount-r.slideCount%r.options.slidesToScroll:r.slideCount+n:n>=r.slideCount?r.slideCount%r.options.slidesToScroll!=0?0:n-r.slideCount:n,r.animating=!0,r.$slider.trigger("beforeChange",[r,r.currentSlide,o]),t=r.currentSlide,r.currentSlide=o,r.setSlideClasses(r.currentSlide),r.options.asNavFor&&(s=(s=r.getNavTarget()).slick("getSlick")).slideCount<=s.options.slidesToShow&&s.setSlideClasses(r.currentSlide),r.updateDots(),r.updateArrows(),!0===r.options.fade?(!0!==i?(r.fadeSlideOut(t),r.fadeSlide(o,function(){r.postSlide(o)})):r.postSlide(o),r.animateHeight()):!0!==i?r.animateSlide(e,function(){r.postSlide(o)}):r.postSlide(o)))},s.prototype.startLoad=function(){var t=this;!0===t.options.arrows&&t.slideCount>t.options.slidesToShow&&(t.$prevArrow.hide(),t.$nextArrow.hide()),!0===t.options.dots&&t.slideCount>t.options.slidesToShow&&t.$dots.hide(),t.$slider.addClass("slick-loading")},s.prototype.swipeDirection=function(){var t=this.touchObject.startX-this.touchObject.curX,e=this.touchObject.startY-this.touchObject.curY,e=Math.atan2(e,t);return(t=(t=Math.round(180*e/Math.PI))<0?360-Math.abs(t):t)<=45&&0<=t||t<=360&&315<=t?!1===this.options.rtl?"left":"right":135<=t&&t<=225?!1===this.options.rtl?"right":"left":!0===this.options.verticalSwiping?35<=t&&t<=135?"down":"up":"vertical"},s.prototype.swipeEnd=function(t){var e,i,n=this;if(n.dragging=!1,n.swiping=!1,n.scrolling)return n.scrolling=!1;if(n.interrupted=!1,n.shouldClick=!(10<n.touchObject.swipeLength),void 0===n.touchObject.curX)return!1;if(!0===n.touchObject.edgeHit&&n.$slider.trigger("edge",[n,n.swipeDirection()]),n.touchObject.swipeLength>=n.touchObject.minSwipe){switch(i=n.swipeDirection()){case"left":case"down":e=n.options.swipeToSlide?n.checkNavigable(n.currentSlide+n.getSlideCount()):n.currentSlide+n.getSlideCount(),n.currentDirection=0;break;case"right":case"up":e=n.options.swipeToSlide?n.checkNavigable(n.currentSlide-n.getSlideCount()):n.currentSlide-n.getSlideCount(),n.currentDirection=1}"vertical"!=i&&(n.slideHandler(e),n.touchObject={},n.$slider.trigger("swipe",[n,i]))}else n.touchObject.startX!==n.touchObject.curX&&(n.slideHandler(n.currentSlide),n.touchObject={})},s.prototype.swipeHandler=function(t){var e=this;if(!(!1===e.options.swipe||"ontouchend"in document&&!1===e.options.swipe||!1===e.options.draggable&&-1!==t.type.indexOf("mouse")))switch(e.touchObject.fingerCount=t.originalEvent&&void 0!==t.originalEvent.touches?t.originalEvent.touches.length:1,e.touchObject.minSwipe=e.listWidth/e.options.touchThreshold,!0===e.options.verticalSwiping&&(e.touchObject.minSwipe=e.listHeight/e.options.touchThreshold),t.data.action){case"start":e.swipeStart(t);break;case"move":e.swipeMove(t);break;case"end":e.swipeEnd(t)}},s.prototype.swipeMove=function(t){var e,i,n=this,o=void 0!==t.originalEvent?t.originalEvent.touches:null;return!(!n.dragging||n.scrolling||o&&1!==o.length)&&(e=n.getLeft(n.currentSlide),n.touchObject.curX=void 0!==o?o[0].pageX:t.clientX,n.touchObject.curY=void 0!==o?o[0].pageY:t.clientY,n.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(n.touchObject.curX-n.touchObject.startX,2))),o=Math.round(Math.sqrt(Math.pow(n.touchObject.curY-n.touchObject.startY,2))),!n.options.verticalSwiping&&!n.swiping&&4<o?!(n.scrolling=!0):(!0===n.options.verticalSwiping&&(n.touchObject.swipeLength=o),o=n.swipeDirection(),void 0!==t.originalEvent&&4<n.touchObject.swipeLength&&(n.swiping=!0,t.preventDefault()),t=(!1===n.options.rtl?1:-1)*(n.touchObject.curX>n.touchObject.startX?1:-1),!0===n.options.verticalSwiping&&(t=n.touchObject.curY>n.touchObject.startY?1:-1),i=n.touchObject.swipeLength,(n.touchObject.edgeHit=!1)===n.options.infinite&&(0===n.currentSlide&&"right"===o||n.currentSlide>=n.getDotCount()&&"left"===o)&&(i=n.touchObject.swipeLength*n.options.edgeFriction,n.touchObject.edgeHit=!0),!1===n.options.vertical?n.swipeLeft=e+i*t:n.swipeLeft=e+i*(n.$list.height()/n.listWidth)*t,!0===n.options.verticalSwiping&&(n.swipeLeft=e+i*t),!0!==n.options.fade&&!1!==n.options.touchMove&&(!0===n.animating?(n.swipeLeft=null,!1):void n.setCSS(n.swipeLeft))))},s.prototype.swipeStart=function(t){var e,i=this;if(i.interrupted=!0,1!==i.touchObject.fingerCount||i.slideCount<=i.options.slidesToShow)return!(i.touchObject={});void 0!==t.originalEvent&&void 0!==t.originalEvent.touches&&(e=t.originalEvent.touches[0]),i.touchObject.startX=i.touchObject.curX=void 0!==e?e.pageX:t.clientX,i.touchObject.startY=i.touchObject.curY=void 0!==e?e.pageY:t.clientY,i.dragging=!0},s.prototype.unfilterSlides=s.prototype.slickUnfilter=function(){null!==this.$slidesCache&&(this.unload(),this.$slideTrack.children(this.options.slide).detach(),this.$slidesCache.appendTo(this.$slideTrack),this.reinit())},s.prototype.unload=function(){var t=this;c(".slick-cloned",t.$slider).remove(),t.$dots&&t.$dots.remove(),t.$prevArrow&&t.htmlExpr.test(t.options.prevArrow)&&t.$prevArrow.remove(),t.$nextArrow&&t.htmlExpr.test(t.options.nextArrow)&&t.$nextArrow.remove(),t.$slides.removeClass("slick-slide slick-active slick-visible slick-current").attr("aria-hidden","true").css("width","")},s.prototype.unslick=function(t){this.$slider.trigger("unslick",[this,t]),this.destroy()},s.prototype.updateArrows=function(){var t=this;Math.floor(t.options.slidesToShow/2),!0===t.options.arrows&&t.slideCount>t.options.slidesToShow&&!t.options.infinite&&(t.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false"),t.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false"),0===t.currentSlide?(t.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true"),t.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false")):(t.currentSlide>=t.slideCount-t.options.slidesToShow&&!1===t.options.centerMode||t.currentSlide>=t.slideCount-1&&!0===t.options.centerMode)&&(t.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),t.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")))},s.prototype.updateDots=function(){null!==this.$dots&&(this.$dots.find("li").removeClass("slick-active").end(),this.$dots.find("li").eq(Math.floor(this.currentSlide/this.options.slidesToScroll)).addClass("slick-active"))},s.prototype.visibility=function(){this.options.autoplay&&(document[this.hidden]?this.interrupted=!0:this.interrupted=!1)},c.fn.slick=function(){for(var t,e=arguments[0],i=Array.prototype.slice.call(arguments,1),n=this.length,o=0;o<n;o++)if("object"==typeof e||void 0===e?this[o].slick=new s(this[o],e):t=this[o].slick[e].apply(this[o].slick,i),void 0!==t)return t;return this}});var isOldIE=$("html").is(".lt-ie9"),Portal={MenuOpened:!1,MobileVerifier:{IsMobile:!1,IsTablet:!1,IsDesktop:!1,DetectMobile:function(t){var e={detectMobileBrowsers:{fullPattern:/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i,shortPattern:/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i}};return e.detectMobileBrowsers.fullPattern.test(t)||e.detectMobileBrowsers.shortPattern.test(t.substr(0,4))},DetectTablet:function(t){var e={detectMobileBrowsers:{tabletPattern:/android|ipad|playbook|silk/i}};return e.detectMobileBrowsers.tabletPattern.test(t)},Detect:function(){Portal.MobileVerifier.DetectMobile(navigator.userAgent)&&(Portal.MobileVerifier.IsMobile=!0),Portal.MobileVerifier.DetectTablet(navigator.userAgent)&&(Portal.MobileVerifier.IsTablet=!0),990<$(window).innerWidth()&&(Portal.MobileVerifier.IsDesktop=!0)}},Init:function(){Portal.MobileVerifier.Detect(),!Portal.MobileVerifier.IsDesktop||Portal.MobileVerifier.IsMobile||Portal.MobileVerifier.IsTablet||$(".showTooltip").each(function(){var t=$(this).data(),e=void 0!==t.container?t.container:"body",t=void 0!==t.placement?t.placement:"top";$(this).tooltip({container:e,placement:t})}),$(".mainNav .menu").on("click",function(t){t.preventDefault();var t=$(this),e=t.data("rel");(e=$(e,".mainNav")).is(":visible")?(t.removeClass("opened"),e.slideUp("fast",function(){Portal.MenuOpened=!1})):(t.addClass("opened"),e.slideDown("fast",function(){Portal.MenuOpened=!0}))}),$(".scielo__menu").on("click",function(t){var e=document.querySelector(".scielo-ico-menu"),i=document.querySelector(".scielo-ico-menu-opened"),n=document.querySelector(".scielo__mainMenu");this.classList.contains("opened")?(this.classList.remove("opened"),e.style.display="inline-block",i.style.display="none",n.animate([{top:"0px"},{top:"-1000px"}],{duration:600,iterations:1}),n.style.top="-1000px",Portal.MenuOpened=!1):(this.classList.add("opened"),e.style.display="none",i.style.display="inline-block",n.animate([{top:"-500px"},{top:"0px"}],{duration:100,iterations:1}),n.style.top="0px",Portal.MenuOpened=!0)}),$(".scielo-slider").slick({focusOnChange:!1,slidesToShow:4,infinite:!1,centerPadding:"0",arrows:!0,dots:!0,slidesToScroll:4,responsive:[{breakpoint:767,settings:{dots:!0,slidesToShow:1,slidesToScroll:1,centerMode:!1,arrows:!1,focusOnChange:!1}},{breakpoint:992,settings:{dots:!0,slidesToShow:2,slidesToScroll:2,centerMode:!1,arrows:!1,focusOnChange:!1}}]}),$(".scielo-slider").each(function(){$(this).data("autoheight")&&Portal.AdjustCardHeight($(this))}),$(".shareFacebook,.shareTwitter,.shareDelicious,.shareGooglePlus,.shareLinkedIn,.shareReddit,.shareStambleUpon,.shareCiteULike,.shareMendeley").on("click",function(t){t.preventDefault();var t=escape(this.href),e="https://www.facebook.com/sharer/sharer.php?u=",i="https://twitter.com/intent/tweet?text=",n="https://delicious.com/save?url=",o="https://plus.google.com/share?url=",s="http://www.linkedin.com/shareArticle?mini=true&url=",r="http://www.reddit.com/submit?url=",a="http://www.stumbleupon.com/submit?url=",l="http://www.citeulike.org/posturl?url=",c="http://www.mendeley.com/import/?url=",d="";$(this).is(".shareFacebook")?d=e+t:$(this).is(".shareTwitter")?d=i+t:$(this).is(".shareDelicious")?d=n+t:$(this).is(".shareGooglePlus")?d=o+t:$(this).is(".shareLinkedIn")?d=s+t:$(this).is(".shareReddit")?d=r+t:$(this).is(".shareStambleUpon")?d=a+t:$(this).is(".shareCiteULike")?d=l+t:$(this).is(".shareMendeley")&&(d=c+t),window.open(d,"share")}),$(".slider").each(Portal.Slider),$(".share_modal_id").on("click",function(t){t.preventDefault();t=$(location).attr("href");$.get("/form_mail/",{url:t},function(t){$("#share_modal_id").html(t),$("#share_modal_id").modal("show")})}),$(".contact_modal_id").on("click",function(t){t.preventDefault();$(location).attr("href");$.get($(this).data("url"),function(t){$("#contact_modal_id").html(t),$("#contact_modal_id").modal("show")})}),$(".floatingBtnError, .floatingBtnErrorHamburguerMenu").on("click",function(t){t.preventDefault();t=$(location).attr("href");$.get("/error_mail/",{url:t},function(t){$("#error_modal_id").html(t),$("#error_modal_id").modal("show")})}),$("#share_modal_id").on("hidden.bs.modal",function(){$(this).empty()}),$("#error_modal_id").on("hidden.bs.modal",function(){$(this).empty()}),$(".alternativeHeader").each(function(){var t=$(".mainMenu nav ul").html();$(this).find("nav ul").html(t)});for(var e=$("header").outerHeight(),t=($(window).on("scroll",function(){var t=0<window.scrollY?window.scrollY:0<window.pageYOffset?window.pageYOffset:document.documentElement.scrollTop;e<t?$(".alternativeHeader").stop(!0,!1).animate({top:"0"},200,function(){$("#mainMenu").is(":visible")&&$(".menu:eq(0)").trigger("click")}):$(".alternativeHeader").stop(!0,!1).animate({top:"-65px"},200,function(){$(this).find(".mainMenu").is(":visible")&&$(this).find(".menu").trigger("click")})}).on("keydown",function(t){27==t.keyCode&&$("a.scielo__menu").is(".opened")&&$("a.scielo__menu").trigger("click")}),$(".expandCollapseContent").on("click",function(t){t.preventDefault();var e=$("#issueIndex"),i=$("#issueData"),n=this;e.css("float","right"),i.is(":visible")?i.fadeOut("fast",function(){e.animate({width:"100%"},300),$(n).find(".glyphBtn").removeClass("opened").addClass("closed")}):e.animate({width:"75%"},300,function(){i.fadeIn("fast"),$(n).find(".glyphBtn").removeClass("closed").addClass("opened")}),$(n).tooltip("hide")}),$(".collapse-title").on("click",function(){var t=$(this),e=$(".collapse-content");e.is(":visible")?(e.slideUp("fast"),t.addClass("closed")):(e.slideDown("fast"),t.removeClass("closed"))}),$(".goto").on("click",function(t){t.preventDefault();t=(t=$(this).attr("href")).replace("#",""),t=$("a[name="+t+"]").offset();$("html,body").animate({scrollTop:t.top-60},500)}),$(".trigger").on("click",function(t){t.preventDefault();t=$(this).data("rel");$(t).click()}),$("input[name='link-share']").focus(function(){$(this).select(),window.clipboardData&&clipboardData.setData&&clipboardData.setData("text",$(this).text())}).mouseup(function(t){t.preventDefault()}),$(".levelMenu .dropdown-container").on("mouseenter mouseleave",function(t){var e=$(this).find(".dropdown-menu"),i=$(this).find(".dropdown-toggle");"mouseenter"==t.type?(e.show(),i.addClass("hover")):(e.hide(),i.removeClass("hover"))}),$(".nav-tabs a").click(function(t){t.preventDefault(),$(this).tab("show")}),$(".translateAction").on("click",function(t){t.preventDefault(),$("#translateArticleModal").modal("show")}),"undefined"!=typeof Clipboard&&new Clipboard(".copyLink").on("success",function(t){var e=$(t.trigger);e.addClass("copyFeedback"),setTimeout(function(){e.removeClass("copyFeedback")},2e3)}).on("error",function(t){console.error("Action:",t.action),console.error("Trigger:",t.trigger)}),$(".results .item")),i=0;i<t.length;i++){var n='<br class="visible-xs visible-sm"/><span class="socialLinks articleShareLink">\t\t\t\t\t<a href="" class="articleAction sendViaMail" data-toggle="tooltip" data-placement="top" title="Enviar link por e-mail">Enviar por e-mail</a>\t\t\t\t\t<a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u='+(n=$(t[i]).parent()[0].children[i].children[1].children[0].children[0].href)+'" class="articleAction shareFacebook" data-toggle="tooltip" data-placement="top" title="Compartilhar no Facebook">Facebook</a>\t\t\t\t\t<a target="_blank" href="https://twitter.com/intent/tweet?text='+n+'" class="articleAction shareTwitter" data-toggle="tooltip" data-placement="top" title="Compartilhar no Twitter">Twitter</a>\t\t\t\t\t<a target="_blank" href="https://delicious.com/save?url='+n+'" class="articleAction shareDelicious" data-toggle="tooltip" data-placement="top" title="Compartilhar no Delicious">Delicious</a>\t\t\t\t\t<a href="" class="showTooltip dropdown-toggle" data-toggle="dropdown" data-placement="top" data-placement="top" title="Compartilhar em outras redes"><span class="glyphBtn otherNetworks"></span></a>\t\t\t\t\t<ul class="dropdown-menu articleShare">\t\t\t\t\t\t<li class="dropdown-header">Outras redes sociais</li>\t\t\t\t\t\t<li><a target="_blank" href="https://plus.google.com/share?url='+n+'" class="shareGooglePlus"><span class="glyphBtn googlePlus"></span> Google+</a></li>\t\t\t\t\t\t<li><a target="_blank" href="https://www.linkedin.com/shareArticle?mini=true&url='+n+'" class="shareLinkedIn"><span class="glyphBtn linkedIn"></span> LinkedIn</a></li>\t\t\t\t\t\t<li><a target="_blank" href="https://www.reddit.com/login?dest='+n+'" class="shareReddit"><span class="glyphBtn reddit"></span> Reddit</a></li>\t\t\t\t\t\t<li><a target="_blank" href="http://www.stumbleupon.com/submit?url='+n+'" class="shareStambleUpon"><span class="glyphBtn stambleUpon"></span> StambleUpon</a></li>\t\t\t\t\t\t<li><a target="_blank" href="http://www.citeulike.org/posturl?url='+n+'" class="shareCiteULike"><span class="glyphBtn citeULike"></span> CiteULike</a></li>\t\t\t\t\t\t<li><a target="_blank" href="https://www.mendeley.com/import/?url='+n+'" class="shareMendeley"><span class="glyphBtn mendeley"></span> Mendeley</a></li>\t\t\t\t\t</ul>\t\t\t\t</span>';$(".results .item:nth-child("+(i+1)+") div .line.articleResult").append(n)}$("#contactModal").on("show.bs.modal",function(t){t=$(t.relatedTarget).data("modal-title");$(this).find(".modal-title").text(t)}),$("#tst").length&&$("#tst").typeahead({order:"asc",minLength:3,dynamic:!0,delay:500,emptyTemplate:'Nenhum periódico encontrado para o termo: "{{query}}"',source:{journals:{display:"title",href:"{{link}}",ajax:function(t){return{type:"GET",url:"/journals/search/alpha/ajax/",contentType:"application/json",data:{query:"{{query}}",page:"1",query_filter:"current"},callback:{done:function(t){for(var e=[],i=0,n=t.journals.length;i<n;i++)e.push({title:t.journals[i].title,link:t.journals[i].links.detail});return console.log(e),e}}}}}}})},AdjustCardHeight(t){t=t.find(".card");let i=0;t.each(function(){var t=$(this).outerHeight(),e=parseFloat($(this).css("padding-bottom"));t>i&&(i=t-e)}),t.height(i)},Slider:function(){var t=$(this).attr("id"),t=$("#"+t),e=$(".slide-item",t),i=$(".slide-wrapper",t),n=$(".slide-back",t),o=$(".slide-next",t),s=$(".slide-container",t).outerWidth();warray=[],harray=[],e.each(function(){harray.push($(this).outerHeight()),warray.push($(this).outerWidth())}),itemProps={w:Math.max.apply(null,warray),h:Math.max.apply(null,harray)},wrapperWidth=e.length*itemProps.w+100,i.width(wrapperWidth),$(".slide-container",t).height(itemProps.h),n.css("top",itemProps.h/2+"px"),o.css("top",itemProps.h/2+"px"),n.hide(),i.width()<=t.width()?o.hide():o.show(),n.off().on("click",function(t){t.preventDefault();"auto"!=i.css("left")&&parseInt(i.css("left"));i.stop(!1,!0).animate({left:"+="+itemProps.w},100,function(){0==("auto"==i.css("left")?0:parseInt(i.css("left")))&&n.hide()}),o.show()}),o.off().on("click",function(t){t.preventDefault();"auto"!=i.css("left")&&parseInt(i.css("left"));i.stop(!1,!0).animate({left:"-="+itemProps.w},100,function(){("auto"==i.css("left")?0:parseInt(i.css("left")))<=-(wrapperWidth-s)&&o.hide()}),n.show()})}},SearchForm={SearchHistory:"",Init:function(){var p=".searchForm";$("input.trigger").off("click").on("click",function(){var cmd=$(this).data("rel");eval(cmd)}),$(p).on("submit",function(t){t.preventDefault();for(var e,i,n=$("*[name='q[]']",p),o=$("select[name='bool[]']",p),s=$("select[name='index[]']",p),r="",a=0,l=n.length;a<l;a++)""!=(e="iptQuery"==$(n[a]).attr("id")?$(n[a]).text():$(n[a]).val())&&(i=$("option:selected",s[a]).val(),1<=a&&(r+=" "+$("option:selected",o[a-1]).val()+" "),r+=""!=i?"("+i+":("+e+"))":2==l?e:"("+e+")");var t=$("input[name='collection']:checked",p).val(),t=(void 0!==t&&""!=t&&0==$("input[name='filter[in][]']").length&&(initial_filter_in=$("<input>").attr({type:"hidden",name:"filter[in][]",value:t}).appendTo("#searchForm")),$("input[name='publicationYear']:checked",p).val()),c=("1"==t?""!=(c=$("select[name='y1Start'] option:selected",p).val())&&(r+=" AND publication_year:["+c+" TO *]"):"2"==t&&(c=$("select[name='y2Start'] option:selected",p).val(),t=$("select[name='y2End'] option:selected",p).val(),""!=c)&&""!=t&&(r+=" AND publication_year:["+c+" TO "+t+"]"),""==(r=r.replace(/^AND|AND$|^OR|OR$/g,""))&&(r="*"),r=$.trim(r),document.searchForm.action,document.searchForm);return $("input[name='q']").val(r),c.submit(),!0}),$("textarea.form-control",p).on("keyup",SearchForm.TextareaAutoHeight).trigger("keyup").on("keypress",function(t){var e=$(this);""!=this.value?e.next().fadeIn("fast"):e.next().fadeOut("fast"),13!=t.which||t.shiftKey||$(p).submit()}),$("a.clearIptText",p).on("click",SearchForm.ClearPrevInput),$(".newSearchField",p).on("click",function(t){t.preventDefault(),SearchForm.InsertNewFieldRow(this,"#searchRow-matriz .searchRow",".searchForm .searchRow-container")}),$(".articleAction, .searchHistoryItem, .colActions .searchHistoryIcon",p).tooltip()},InsertSearchHistoryItem:function(t){var e=$(t).data("item"),i=$(t).parent().parent().find(".colSearch").text(),n=$("#iptQuery");n.append(' <div class="searchHistoryItem" contenteditable="false" data-toggle="tooltip" data-placement="top" title="'+i+'">#'+e+"</div> AND ").focus(),n.find(".searchHistoryItem").tooltip(),$(t).effect("transfer",{to:n.find(".searchHistoryItem:last-child")},1e3),SearchForm.PlaceCaretToEnd(document.getElementById("iptQuery"))},InsertNewFieldRow:function(t,e,i){t=$(t),e=$(e).clone(),i=$(i);var n=t.data("count");e.attr("id","searchRow-"+n),e.find(".eraseSearchField").data("rel",n),e.find(".eraseSearchField").on("click",function(t){t.preventDefault(),SearchForm.EraseFieldRow(this)}),""!=SearchForm.SearchHistory&&e.find("input[name='q[]']").on("focus",function(){SearchForm.SearchHistoryFocusIn(this)}).on("blur",function(){SearchForm.SearchHistoryFocusOut(this)}),e.appendTo(i).slideDown("fast"),e.find("textarea.form-control:visible").on("keyup",SearchForm.TextareaAutoHeight).trigger("keyup"),e.find("a.clearIptText").on("click",SearchForm.ClearPrevInput),e.find(".showTooltip").tooltip({container:"body"}),n=parseInt(n),t.data("count",++n)},TextareaAutoHeight:function(){""!=this.value?$(this).next("a").fadeIn("fast"):$(this).next("a").fadeOut("fast")},ClearPrevInput:function(){$(this).prev("input,textarea").val("").trigger("keyup")},EraseFieldRow:function(t){t=(t=$(t)).data("rel");$("#searchRow-"+t).slideUp("fast",function(){$(this).remove()})},CountCheckedResults:function(t,e){t=$(t);e=parseInt(t.data("preselected"))+parseInt($(e+":checked").length);t.text(e),0<e?t.addClass("highlighted"):t.removeClass("highlighted")},PlaceCaretToEnd:function(t){var e,i;t.focus(),void 0!==window.getSelection&&void 0!==document.createRange?((e=document.createRange()).selectNodeContents(t),e.collapse(!1),(i=window.getSelection()).removeAllRanges(),i.addRange(e)):void 0!==document.body.createTextRange&&((i=document.body.createTextRange()).moveToElementText(t),i.collapse(!1),i.select())},SubmitForm:function(t){var e=$(".searchForm").attr("action");$(".searchForm").attr("action",e+"?filter="+t).submit()}},Collection={Init:function(){var t=$(".collectionListStart .table-journal-list tbody tr"),s=$(".collectionListStart .table-journal-list tr td"),e=$(".collectionListStart .collectionSearch");$("#alpha .collectionListTotalInfo").text("(total "+t.length+")"),e.on("keyup",function(t){for(var e=t.target.value.toUpperCase(),i=0;i<s.length;i++){var n=s[i],o=n.textContent||n.innerText;o&&-1<o.toUpperCase().indexOf(e)?n.parentElement.style.display="":n.parentElement.style.display="none"}})},JournalListFinder:function(param,loading,container,labels,empty,scroll,callback,htmlFill){var currentPage=$(".collectionCurrentPage",container),totalPages=$(".collectionTotalPages",container),totalInfo=$(".collectionListTotalInfo",container),action=$(container).data("action");void 0!==htmlFill&&(loading=htmlFill.next(".collectionListLoading")),void 0===empty&&(empty=!1),param+="&page="+currentPage.val(),$.ajax({url:action,type:"POST",data:param,dataType:"json",beforeSend:function(){loading.show()}}).done(function(data){var ctt,ctt,ctt,ctt;loading.hide(),void 0!==data.journalList&&(-1==param.indexOf("&theme=")&&-1==param.indexOf("&publisher=")&&(totalInfo.html(labels[11].replace("{total}",data.total)),totalPages.val(data.totalPages)),ctt=Collection.JournalListFill(data,labels),(void 0!==htmlFill?(empty&&$(htmlFill).find("tbody").empty(),$(htmlFill)):(empty&&$(container).find("tbody").empty(),$(container))).find("tbody").append(ctt).find(".showTooltip").tooltip({container:"body"}),scroll)&&Collection.ScrollEvents(container,loading,labels),void 0!==data.themeList&&(totalInfo.html(labels[11].replace("{total}",data.total).replace("{totalTheme}",data.totalThemes)),ctt=Collection.ThemeListFill(data,labels,container.attr("id")),(void 0!==htmlFill?(empty&&$(htmlFill).find("tbody").empty(),$(htmlFill)):(empty&&$(container).find("tbody").empty(),$(container))).find("tbody").append(ctt).find(".showTooltip").tooltip({container:"body"}),Collection.CollapseEvents(container,labels)),void 0!==data.publisherList&&(totalInfo.html(labels[11].replace("{total}",data.total).replace("{totalPublisher}",data.totalPublisher)),ctt=Collection.PublisherListFill(data,labels,container.attr("id")),(void 0!==htmlFill?(empty&&$(htmlFill).find("tbody").empty(),$(htmlFill)):(empty&&$(container).find("tbody").empty(),$(container))).find("tbody").append(ctt).find(".showTooltip").tooltip({container:"body"}),Collection.CollapseEvents(container,labels)),void 0!==data.collectionList&&(totalInfo.html(labels[11].replace("{total}",data.total).replace("{totalCollection}",data.totalCollection)),ctt=Collection.CollectionListFill(data,labels,container.attr("id")),(void 0!==htmlFill?(empty&&$(htmlFill).find("tbody").empty(),$(htmlFill)):(empty&&$(container).find("tbody").empty(),$(container))).find("tbody").append(ctt).find(".showTooltip").tooltip({container:"body"})),void 0!==callback&&eval(callback)}).error(function(t){loading.hide(),console.warn("Error #001: Error found on loading journal list")})},JournalListFill:function(t,e){for(var i="",n=0,o=t.journalList.length;n<o;n++){var s=t.journalList[n];s.Last=s.Last.split(";"),s.Publisher=s.Publisher.split(";"),i+='\t\t\t\t\t\t<tr>\t\t\t\t\t\t\t<td class="actions">\t\t\t\t\t\t\t\t<a href="'+s.Links[0]+'" class="showTooltip" title="'+e[5]+'"><span class="glyphBtn home"></span></a> \t\t\t\t\t\t\t\t<a href="'+s.Links[1]+'" class="showTooltip" title="'+e[6]+'"><span class="glyphBtn submission"></span></a> \t\t\t\t\t\t\t\t<a href="'+s.Links[2]+'" class="showTooltip" title="'+e[7]+'"><span class="glyphBtn authorInstructions"></span></a> \t\t\t\t\t\t\t\t<a href="'+s.Links[5]+'" class="showTooltip" title="'+e[12]+'"><span class="glyphBtn editorial"></span></a> \t\t\t\t\t\t\t\t<a href="'+s.Links[3]+'" class="showTooltip" title="'+e[8]+'"><span class="glyphBtn about"></span></a> \t\t\t\t\t\t\t\t<a href="'+s.Links[4]+'" class="showTooltip" title="'+e[9]+'"><span class="glyphBtn contact"></span></a> \t\t\t\t\t\t\t</td>\t\t\t\t\t\t\t<td>\t\t\t\t\t\t\t\t<a href="'+s.Links[0]+'" class="collectionLink '+(0==s.Active?"disabled":"")+'">\t\t\t\t\t\t\t\t\t<strong class="journalTitle">'+s.Journal+'</strong>,\t\t\t\t\t\t\t\t\t<strong class="journalIssues">'+s.Issues+" "+e[0]+"</strong>,\t\t\t\t\t\t\t\t\t"+e[1]+"\t\t\t\t\t\t\t\t\t"+(""!=s.Last[0]?'<span class="journalLastVolume"><em>'+e[2]+"</em> "+s.Last[0]+"</span>":"")+"\t\t\t\t\t\t\t\t\t"+(""!=s.Last[1]?'<span class="journalLastNumber"><em>'+e[3]+"</em> "+s.Last[1]+"</span>":"")+"\t\t\t\t\t\t\t\t\t"+(""!=s.Last[2]?'<span class="journalLastSuppl"><em>'+e[4]+"</em> "+s.Last[2]+"</span>":"")+"\t\t\t\t\t\t\t\t\t- \t\t\t\t\t\t\t\t\t"+(""!=s.Last[3]?'<span class="journalLastPubDate">'+s.Last[3]+"</span>":"")+" \t\t\t\t\t\t\t\t\t"+(0==s.Active?e[10]:"")+" \t\t\t\t\t\t\t\t</a>\t\t\t\t\t\t\t</td>",s.Collection&&(i+=' \t\t\t\t\t\t\t\t<td>\t\t\t\t\t\t\t\t\t<span class="glyphFlags '+s.Collection+'"></span> '+Collection.PortalCollectionNameFill(s.Collection)+"\t\t\t\t\t\t\t\t</td>"),i+="\t\t\t\t\t\t</tr>"}return i},PortalCollectionNameFill:function(t){var e="";if(window.collections)for(var i=0,n=window.collections.length;i<n;i++)window.collections[i].id==t&&(e=window.collections[i].name);return e},ThemeListFill:function(t,e,i){for(var n='\t<tr>\t\t\t\t\t\t\t<td class="collapseContainer">',o=0,s=t.themeList.length;o<s;o++){n+='\t\t<div class="themeItem">\t\t\t\t\t\t\t\t\t<a href="javascript:;" id="'+i+"-collapseTitle-"+o+'" \t\t\t\t\t\t\t\t\tclass="collapseTitleBlock '+(void 0===t.themeList[o].journalList?"closed":"")+'" data-id="'+t.themeList[o].id+'">\t\t\t\t\t\t\t\t\t\t<strong>'+t.themeList[o].Area+"</strong>\t\t\t\t\t\t\t\t\t\t("+t.themeList[o].Total+')\t\t\t\t\t\t\t\t\t</a> \t\t\t\t\t\t\t\t\t<div class="collapseContent" id="'+i+"-collapseContent-"+o+'" '+(void 0===t.themeList[o].journalList?'style="display: none;"':"")+">";for(var r=0,a=t.themeList[o].SubAreas.length;r<a;r++)n+='\t\t\t<a href="javascript:;" id="'+i+"-collapseTitle-"+o+"-sub-"+r+'" \t\t\t\t\t\t\t\t\t\t\tclass="collapseTitle '+(void 0===t.themeList[o].SubAreas[r].journalList?"closed":"")+'" data-id="'+t.themeList[o].SubAreas[r].id+'">\t\t\t\t\t\t\t\t\t\t\t<strong>'+t.themeList[o].SubAreas[r].Area+"</strong>\t\t\t\t\t\t\t\t\t\t\t\t("+t.themeList[o].SubAreas[r].Total+')\t\t\t\t\t\t\t\t\t\t</a>\t\t\t\t\t\t\t\t\t\t<div class="collapseContent" id="'+i+"-collapseContent-"+o+"-sub-"+r+'" '+(void 0===t.themeList[o].SubAreas[r].journalList?'style="display: none;"':"")+'>\t\t\t\t\t\t\t\t\t\t\t<table> \t\t\t\t\t\t\t\t\t\t\t\t<thead> \t\t\t\t\t\t\t\t\t\t\t\t\t<tr> \t\t\t\t\t\t\t\t\t\t\t\t\t\t<th class="actions"></th> \t\t\t\t\t\t\t\t\t\t\t\t\t\t<th>'+e[12]+"</th> \t\t\t\t\t\t\t\t\t\t\t\t\t\t"+(t.collection?"<th class='flags'>"+e[14]+"</th>":"")+" \t\t\t\t\t\t\t\t\t\t\t\t\t</tr> \t\t\t\t\t\t\t\t\t\t\t\t</thead> \t\t\t\t\t\t\t\t\t\t\t\t<tbody>",void 0!==t.themeList[o].SubAreas[r].journalList&&(n+=Collection.JournalListFill(t.themeList[o].SubAreas[r],e)),n+='\t\t\t\t\t\t</tbody>\t\t\t\t\t\t\t\t\t\t\t</table> \t\t\t\t\t\t\t\t\t\t</div> \t\t\t\t\t\t\t\t\t\t<div class="collapseContent collectionListLoading" style="display: none;"></div>\t\t\t\t\t\t\t\t\t\t';n+="\t\t\t</div>"}return n+="\t\t</td>\t\t\t\t\t\t</tr>"},PublisherListFill:function(t,e,i){for(var n='\t<tr>\t\t\t\t\t\t\t<td class="collapseContainer">',o=0,s=t.publisherList.length;o<s;o++)n+='\t\t<div class="themeItem">\t\t\t\t\t\t\t\t\t<a href="javascript:;" id="'+i+"-collapseTitle-"+o+'" class="collapseTitle '+(void 0===t.publisherList[o].journalList?"closed":"")+'"><strong>'+t.publisherList[o].Publisher+"</strong> ("+t.publisherList[o].Total+')</a> \t\t\t\t\t\t\t\t\t<div class="collapseContent" id="'+i+"-collapseContent-"+o+'" '+(void 0===t.publisherList[o].journalList?'style="display: none;"':"")+'> \t\t\t\t\t\t\t\t\t\t<table> \t\t\t\t\t\t\t\t\t\t\t<thead> \t\t\t\t\t\t\t\t\t\t\t\t<tr> \t\t\t\t\t\t\t\t\t\t\t\t\t<th class="actions"></th> \t\t\t\t\t\t\t\t\t\t\t\t\t<th>'+e[12]+"</th> \t\t\t\t\t\t\t\t\t\t\t\t\t"+(t.collection?"<th class='flags'>"+e[14]+"</th>":"")+" \t\t\t\t\t\t\t\t\t\t\t\t</tr> \t\t\t\t\t\t\t\t\t\t\t</thead> \t\t\t\t\t\t\t\t\t\t\t<tbody>",void 0!==t.publisherList[o].journalList&&(n+=Collection.JournalListFill(t.publisherList[o],e)),n+='\t\t\t\t\t</tbody> \t\t\t\t\t\t\t\t\t\t</table> \t\t\t\t\t\t\t\t\t</div> \t\t\t\t\t\t\t\t\t<div class="collapseContent collectionListLoading" style="display: none;"></div>\t\t\t\t\t\t\t\t</div>';return n+="\t\t</td>\t\t\t\t\t\t</tr>"},CollectionListFill:function(t,e,i){for(var n='\t<tr>\t\t\t\t\t\t\t<td class="collapseContainer">',o=0,s=t.collectionList.length;o<s;o++)n+='\t\t<div class="themeItem collectionBold">\t\t\t\t\t\t\t\t<a href="'+t.collectionList[o].link+'" class="collapseTitle closed" target="_blank"><span class="glyphFlags '+t.collectionList[o].id+'"></span> <strong>'+t.collectionList[o].name+"</strong> ("+t.collectionList[o].Total+")</a> \t\t\t\t\t\t\t</div>";return n+="\t\t</td>\t\t\t\t\t\t</tr>"},ScrollEvents:function(e,i,n){var o=$(".collectionCurrentPage",e),s=$(".collectionTotalPages",e),t=$(".collectionSearch",e),r=$(e).data("perpage"),a=($(e).data("method"),"method=alphabetic&rp="+r+(""!=t.val()?"&query="+t.val():""));$(window).off("scroll").on("scroll",function(){var t;o.val()<s.val()?($("footer").hide(),$(window).scrollTop()+$(window).height()==$(document).height()&&(t=parseInt(o.val()),o.val(++t),a+="&page="+t,Collection.JournalListFinder(a,i,e,n,!1,!1))):$("footer").show()})},CollapseEvents:function(o,s){var r=$(o).data("method"),t=$(".collectionSearch",o),a="method=alphabetic"+(""!=t.val()?"&query="+t.val():"");$(".collapseTitle,.collapseTitleBlock",o).on("click",function(){var t=$(this),e=t.parent().find(".collectionListLoading"),i=t.next(".collapseContent"),n=i.find("table tbody tr").length;i.is(":visible")?(i.slideUp("fast"),$(this).addClass("closed")):!t.is(".collapseTitleBlock")&&0==n?(n=void 0!==t.data("id")?t.data("id"):$("strong",this).text(),a+="&"+r+"="+n,Collection.JournalListFinder(a,e,o,s,!0,!1,"Collection.CollapseOpen('#"+i.attr("id")+"','#"+t.attr("id")+"')",i)):(i.slideDown("fast"),e.hide(),$(this).removeClass("closed"))})},CollapseOpen:function(t,e){$(t).slideDown("fast"),$(e).removeClass("closed")}},Validator=(Journal={Init:function(){$("#sortBy").change(function(){$("#sortBy option:selected").each(function(){Journal.publicationSort($(this).val())})}),$(".scroll").on("click",function(t){var e=$(this).attr("href").split("#")[1];0<$("a[name="+e+"]").length&&(e=$("a[name="+e+"]").offset(),$("html,body").animate({scrollTop:e.top+1},500))})},Bindings:function(t){},publicationSort:function(t){for(var e=$(".issueIndent>ul.articles"),i=e.length,n=0;n<=i;n++){var o=e[n],s=$(o).children();("YEAR_DESC"===t?$(s).sort(function(t,e){t=parseInt($(t).data("date"));return parseInt($(e).data("date"))<t?1:-1}):$(s).sort(function(t,e){return parseInt($(t).data("date"))<parseInt($(e).data("date"))?1:-1})).each(function(){$(o).append(this)})}},publicatorName:function(){var t=$(".namePlublisher").text();56<=t.length&&($(".namePlublisher").attr("data-toggle","tooltip"),$(".namePlublisher").attr("title",t))},checkPressReleases:function(){var i,n,t=parseInt($("#pressReleasesList").attr("data-lastdays")),e=new Date;isNaN(t)||t<=0||((i=new Date).setDate(e.getDate()-t),isNaN(i.getTime())?console.error("Data inválida ao calcular a data de "+t+" dias atrás."):(n=!1,$("#pressReleasesList .card").each(function(){var t=$(this).attr("data-publication-date"),e=new Date(t);if(!isNaN(e.getTime()))return i<=e?!(n=!0):void 0;console.error("Data inválida encontrada em data-publication-date:",t)}),n&&$("#pressReleasesList").removeClass("d-none")))}},{MultipleEmails:function(t,e){for(var e=e||";",i=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,n=!0,o=t.split(e),s=0;s<o.length;s++)o[s]=o[s].trim(),""!=o[s]&&0!=i.test(o[s])||(n=!1);return n}}),Cookie={Get:function(t,e){return void 0===e?e="":e+="/",t=e+t,0<document.cookie.length&&-1!=(c_start=document.cookie.indexOf(t+"="))?(c_start=c_start+t.length+1,-1==(c_end=document.cookie.indexOf(";",c_start))&&(c_end=document.cookie.length),unescape(document.cookie.substring(c_start,c_end))):""},Set:function(t,e,i,n){var o,i=void 0!==i?((o=new Date).setTime(o.getTime()+24*i*60*60*1e3),"; expires="+o.toGMTString()):"";void 0===n?n="":n+="/",""!=Cookie.Get(t)&&(document.cookie=n+t+"="+e+"expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/"),document.cookie=n+t+"="+e+i+"; path=/"}},alertMessage=($(function(){var t;Portal.Init(),$(".searchForm").length&&SearchForm.Init(),$("body.journal").length&&Journal.Init(),Journal.checkPressReleases(),$("body.collection, body.portal").length&&Collection.Init(),$("body.portal.home").length&&$(".portal .twitter").twittie({dateFormat:"%d de %B",template:'<span>{{date}}</span><div class="info">{{tweet}}</div><div class="tShare"><a href="https://twitter.com/intent/tweet?in_reply_to={{twitterId}}" target="_blank" class="showTooltip" data-placement="top" title="" data-original-title="Compartilhar no Twitter"><span class="glyphBtn tShare"></span></a><a href="https://twitter.com/intent/retweet?tweet_id={{twitterId}}" target="_blank" class="showTooltip" data-placement="top" title="" data-original-title="Atualizar"><span class="glyphBtn tReload"></span></a><a href="https://twitter.com/intent/favorite?tweet_id={{twitterId}}" target="_blank" class="showTooltip" data-placement="top" title="" data-original-title="Adicionar as favoritos no Twitter"><span class="glyphBtn tFavorite"></span></a></div>',count:3,loadingText:"Carregando..."}),$(".portal .collectionList").length&&(t=window.location.hash),$('.portal .collection .nav-tabs a[href="'+t+'"]').tab("show"),$(".namePlublisher").length&&Journal.publicatorName()}),{isActive:!0,msgContainer:document.querySelector("div.alert.alert-warning.alert-dismissible"),setCookie:function(t,e,i){var n=new Date,i=(n.setTime(n.getTime()+24*i*60*60*1e3),"expires="+n.toUTCString());document.cookie=t+"="+e+";"+i+";path=/"},getCookie:function(t){for(var e=t+"=",i=decodeURIComponent(document.cookie).split(";"),n=0;n<i.length;n++){for(var o=i[n];" "==o.charAt(0);)o=o.substring(1);if(0==o.indexOf(e))return o.substring(e.length,o.length)}return""},checkCookie:function(t){t=alertMessage.getCookie(t);""==t||null==t?alertMessage.showAlertMessage():"object"==typeof msgContainer&&null!==msgContainer&&(alertMessage.msgContainer.style.display="none")},clearCookie:function(t){alertMessage.setCookie(t,"no",-365)},showAlertMessage:function(){var t,e;e="object"==typeof msgContainer&&null!==msgContainer?(t=alertMessage.msgContainer).querySelector("button.close"):t=null,null!==t&&null!==e&&(e.addEventListener("click",function(){alertMessage.setCookie("alert-message-accepted","yes",365)}),t.style.display="block")},Init:function(){alertMessage.isActive?alertMessage.checkCookie("alert-message-accepted"):alertMessage.clearCookie("alert-message-accepted")}}),ModalForms=(alertMessage.Init(),$(function(){$(".dropdown-toggle").dropdown(),$('[data-toggle="tooltip"], .dropdown-tooltip').tooltip(),$(".image").on("error",function(){this.src="/static/img/fallback_image.png"}),$(".collapseAbstractBlock").on("click",function(t){t.preventDefault(),$(".collapseAbstractBlock").each(function(t){var e=$(this);$("#"+e.data("id")).slideUp(),e.removeClass("opened")});var t=$(this),e=$("#"+t.data("id"));e.is(":visible")?(e.slideUp(),t.removeClass("opened")):(e.slideDown(),t.addClass("opened"))}),$(".modal").on("hidden.bs.modal",function(t){$(this).find("input[type=text], textarea, select").val("").end().find("input[type=checkbox], input[type=radio]").prop("checked","").end()})}),!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.moment=e()}(this,function(){"use strict";var N;function p(){return N.apply(null,arguments)}function u(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function I(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function h(t){return void 0===t}function H(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function F(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function R(t,e){for(var i=[],n=0;n<t.length;++n)i.push(e(t[n],n));return i}function f(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function m(t,e){for(var i in e)f(e,i)&&(t[i]=e[i]);return f(e,"toString")&&(t.toString=e.toString),f(e,"valueOf")&&(t.valueOf=e.valueOf),t}function c(t,e,i,n){return Ae(t,e,i,n,!0).utc()}function g(t){return null==t._pf&&(t._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}),t._pf}var q=Array.prototype.some||function(t){for(var e=Object(this),i=e.length>>>0,n=0;n<i;n++)if(n in e&&t.call(this,e[n],n,e))return!0;return!1};function Y(t){if(null==t._isValid){var e=g(t),i=q.call(e.parsedDateParts,function(t){return null!=t}),i=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidMonth&&!e.invalidWeekday&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&i);if(t._strict&&(i=i&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour),null!=Object.isFrozen&&Object.isFrozen(t))return i;t._isValid=i}return t._isValid}function W(t){var e=c(NaN);return null!=t?m(g(e),t):g(e).userInvalidated=!0,e}var B=p.momentProperties=[];function z(t,e){var i,n,o;if(h(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),h(e._i)||(t._i=e._i),h(e._f)||(t._f=e._f),h(e._l)||(t._l=e._l),h(e._strict)||(t._strict=e._strict),h(e._tzm)||(t._tzm=e._tzm),h(e._isUTC)||(t._isUTC=e._isUTC),h(e._offset)||(t._offset=e._offset),h(e._pf)||(t._pf=g(e)),h(e._locale)||(t._locale=e._locale),0<B.length)for(i=0;i<B.length;i++)h(o=e[n=B[i]])||(t[n]=o);return t}var U=!1;function G(t){z(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===U&&(U=!0,p.updateOffset(this),U=!1)}function y(t){return t instanceof G||null!=t&&null!=t._isAMomentObject}function a(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function d(t){var t=+t,e=0;return e=0!=t&&isFinite(t)?a(t):e}function V(t,e,i){for(var n=Math.min(t.length,e.length),o=Math.abs(t.length-e.length),s=0,r=0;r<n;r++)(i&&t[r]!==e[r]||!i&&d(t[r])!==d(e[r]))&&s++;return s+o}function X(t){!1===p.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function t(o,s){var r=!0;return m(function(){if(null!=p.deprecationHandler&&p.deprecationHandler(null,o),r){for(var t,e=[],i=0;i<arguments.length;i++){if(t="","object"==typeof arguments[i]){for(var n in t+="\n["+i+"] ",arguments[0])t+=n+": "+arguments[0][n]+", ";t=t.slice(0,-2)}else t=arguments[i];e.push(t)}X(o+"\nArguments: "+Array.prototype.slice.call(e).join("")+"\n"+(new Error).stack),r=!1}return s.apply(this,arguments)},s)}var Z={};function Q(t,e){null!=p.deprecationHandler&&p.deprecationHandler(t,e),Z[t]||(X(e),Z[t]=!0)}function r(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function J(t,e){var i,n=m({},t);for(i in e)f(e,i)&&(I(t[i])&&I(e[i])?(n[i]={},m(n[i],t[i]),m(n[i],e[i])):null!=e[i]?n[i]=e[i]:delete n[i]);for(i in t)f(t,i)&&!f(e,i)&&I(t[i])&&(n[i]=m({},n[i]));return n}function K(t){null!=t&&this.set(t)}p.suppressDeprecationWarnings=!1,p.deprecationHandler=null;var tt=Object.keys||function(t){var e,i=[];for(e in t)f(t,e)&&i.push(e);return i};var et={};function e(t,e){var i=t.toLowerCase();et[i]=et[i+"s"]=et[e]=t}function s(t){return"string"==typeof t?et[t]||et[t.toLowerCase()]:void 0}function it(t){var e,i,n={};for(i in t)f(t,i)&&(e=s(i))&&(n[e]=t[i]);return n}var nt={};function i(t,e){nt[t]=e}function ot(e,i){return function(t){return null!=t?(rt(this,e,t),p.updateOffset(this,i),this):st(this,e)}}function st(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function rt(t,e,i){t.isValid()&&t._d["set"+(t._isUTC?"UTC":"")+e](i)}function l(t,e,i){var n=""+Math.abs(t);return(0<=t?i?"+":"":"-")+Math.pow(10,Math.max(0,e-n.length)).toString().substr(1)+n}var at=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,lt=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,ct={},dt={};function n(t,e,i,n){var o="string"==typeof n?function(){return this[n]()}:n;t&&(dt[t]=o),e&&(dt[e[0]]=function(){return l(o.apply(this,arguments),e[1],e[2])}),i&&(dt[i]=function(){return this.localeData().ordinal(o.apply(this,arguments),t)})}function ut(t,e){return t.isValid()?(e=ht(e,t.localeData()),ct[e]=ct[e]||function(n){for(var t,o=n.match(at),e=0,s=o.length;e<s;e++)dt[o[e]]?o[e]=dt[o[e]]:o[e]=(t=o[e]).match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"");return function(t){for(var e="",i=0;i<s;i++)e+=r(o[i])?o[i].call(t,n):o[i];return e}}(e),ct[e](t)):t.localeData().invalidDate()}function ht(t,e){var i=5;function n(t){return e.longDateFormat(t)||t}for(lt.lastIndex=0;0<=i&<.test(t);)t=t.replace(lt,n),lt.lastIndex=0,--i;return t}var pt=/\d/,o=/\d\d/,ft=/\d{3}/,mt=/\d{4}/,v=/[+-]?\d{6}/,b=/\d\d?/,gt=/\d\d\d\d?/,yt=/\d\d\d\d\d\d?/,vt=/\d{1,3}/,bt=/\d{1,4}/,w=/[+-]?\d{1,6}/,wt=/\d+/,_t=/[+-]?\d+/,kt=/Z|[+-]\d\d:?\d\d/gi,xt=/Z|[+-]\d\d(?::?\d\d)?/gi,Tt=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,St={};function _(t,i,n){St[t]=r(i)?i:function(t,e){return t&&n?n:i}}function Ct(t,e){return f(St,t)?St[t](e._strict,e._locale):new RegExp(Et(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,n,o){return e||i||n||o})))}function Et(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var Dt={};function k(t,i){var e,n=i;for("string"==typeof t&&(t=[t]),H(i)&&(n=function(t,e){e[i]=d(t)}),e=0;e<t.length;e++)Dt[t[e]]=n}function At(t,o){k(t,function(t,e,i,n){i._w=i._w||{},o(t,i._w,i,n)})}var x=0,T=1,S=2,C=3,E=4,D=5,Lt=6,Ot=7,$t=8,Mt=Array.prototype.indexOf||function(t){for(var e=0;e<this.length;++e)if(this[e]===t)return e;return-1},A=Mt;function jt(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}n("M",["MM",2],"Mo",function(){return this.month()+1}),n("MMM",0,0,function(t){return this.localeData().monthsShort(this,t)}),n("MMMM",0,0,function(t){return this.localeData().months(this,t)}),e("month","M"),i("month",8),_("M",b),_("MM",b,o),_("MMM",function(t,e){return e.monthsShortRegex(t)}),_("MMMM",function(t,e){return e.monthsRegex(t)}),k(["M","MM"],function(t,e){e[T]=d(t)-1}),k(["MMM","MMMM"],function(t,e,i,n){n=i._locale.monthsParse(t,n,i._strict);null!=n?e[T]=n:g(i).invalidMonth=t});var Pt=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,Mt="January_February_March_April_May_June_July_August_September_October_November_December".split("_");var Nt="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_");function It(t,e){var i;if(t.isValid()){if("string"==typeof e)if(/^\d+$/.test(e))e=d(e);else if(!H(e=t.localeData().monthsParse(e)))return;i=Math.min(t.date(),jt(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,i)}}function Ht(t){return null!=t?(It(this,t),p.updateOffset(this,!0),this):st(this,"Month")}var Ft=Tt;var Rt=Tt;function qt(){function t(t,e){return e.length-t.length}for(var e,i=[],n=[],o=[],s=0;s<12;s++)e=c([2e3,s]),i.push(this.monthsShort(e,"")),n.push(this.months(e,"")),o.push(this.months(e,"")),o.push(this.monthsShort(e,""));for(i.sort(t),n.sort(t),o.sort(t),s=0;s<12;s++)i[s]=Et(i[s]),n[s]=Et(n[s]);for(s=0;s<24;s++)o[s]=Et(o[s]);this._monthsRegex=new RegExp("^("+o.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+n.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+i.join("|")+")","i")}function Yt(t){return Wt(t)?366:365}function Wt(t){return t%4==0&&t%100!=0||t%400==0}n("Y",0,0,function(){var t=this.year();return t<=9999?""+t:"+"+t}),n(0,["YY",2],0,function(){return this.year()%100}),n(0,["YYYY",4],0,"year"),n(0,["YYYYY",5],0,"year"),n(0,["YYYYYY",6,!0],0,"year"),e("year","y"),i("year",1),_("Y",_t),_("YY",b,o),_("YYYY",bt,mt),_("YYYYY",w,v),_("YYYYYY",w,v),k(["YYYYY","YYYYYY"],x),k("YYYY",function(t,e){e[x]=2===t.length?p.parseTwoDigitYear(t):d(t)}),k("YY",function(t,e){e[x]=p.parseTwoDigitYear(t)}),k("Y",function(t,e){e[x]=parseInt(t,10)}),p.parseTwoDigitYear=function(t){return d(t)+(68<d(t)?1900:2e3)};var Bt=ot("FullYear",!0);function zt(t,e,i,n,o,s,r){e=new Date(t,e,i,n,o,s,r);return t<100&&0<=t&&isFinite(e.getFullYear())&&e.setFullYear(t),e}function Ut(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&0<=t&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function Gt(t,e,i){i=7+e-i;return i-(7+Ut(t,0,i).getUTCDay()-e)%7-1}function Vt(t,e,i,n,o){var s,e=1+7*(e-1)+(7+i-n)%7+Gt(t,n,o),i=e<=0?Yt(s=t-1)+e:e>Yt(t)?(s=t+1,e-Yt(t)):(s=t,e);return{year:s,dayOfYear:i}}function Xt(t,e,i){var n,o,s=Gt(t.year(),e,i),s=Math.floor((t.dayOfYear()-s-1)/7)+1;return s<1?n=s+Zt(o=t.year()-1,e,i):s>Zt(t.year(),e,i)?(n=s-Zt(t.year(),e,i),o=t.year()+1):(o=t.year(),n=s),{week:n,year:o}}function Zt(t,e,i){var n=Gt(t,e,i),e=Gt(t+1,e,i);return(Yt(t)-n+e)/7}n("w",["ww",2],"wo","week"),n("W",["WW",2],"Wo","isoWeek"),e("week","w"),e("isoWeek","W"),i("week",5),i("isoWeek",5),_("w",b),_("ww",b,o),_("W",b),_("WW",b,o),At(["w","ww","W","WW"],function(t,e,i,n){e[n.substr(0,1)]=d(t)});n("d",0,"do","day"),n("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),n("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),n("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),n("e",0,0,"weekday"),n("E",0,0,"isoWeekday"),e("day","d"),e("weekday","e"),e("isoWeekday","E"),i("day",11),i("weekday",11),i("isoWeekday",11),_("d",b),_("e",b),_("E",b),_("dd",function(t,e){return e.weekdaysMinRegex(t)}),_("ddd",function(t,e){return e.weekdaysShortRegex(t)}),_("dddd",function(t,e){return e.weekdaysRegex(t)}),At(["dd","ddd","dddd"],function(t,e,i,n){n=i._locale.weekdaysParse(t,n,i._strict);null!=n?e.d=n:g(i).invalidWeekday=t}),At(["d","e","E"],function(t,e,i,n){e[n]=d(t)});var Qt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var Jt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var Kt="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var te=Tt;var ee=Tt;var ie=Tt;function ne(){function t(t,e){return e.length-t.length}for(var e,i,n,o=[],s=[],r=[],a=[],l=0;l<7;l++)n=c([2e3,1]).day(l),e=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),n=this.weekdays(n,""),o.push(e),s.push(i),r.push(n),a.push(e),a.push(i),a.push(n);for(o.sort(t),s.sort(t),r.sort(t),a.sort(t),l=0;l<7;l++)s[l]=Et(s[l]),r[l]=Et(r[l]),a[l]=Et(a[l]);this._weekdaysRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function oe(){return this.hours()%12||12}function se(t,e){n(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function re(t,e){return e._meridiemParse}n("H",["HH",2],0,"hour"),n("h",["hh",2],0,oe),n("k",["kk",2],0,function(){return this.hours()||24}),n("hmm",0,0,function(){return""+oe.apply(this)+l(this.minutes(),2)}),n("hmmss",0,0,function(){return""+oe.apply(this)+l(this.minutes(),2)+l(this.seconds(),2)}),n("Hmm",0,0,function(){return""+this.hours()+l(this.minutes(),2)}),n("Hmmss",0,0,function(){return""+this.hours()+l(this.minutes(),2)+l(this.seconds(),2)}),se("a",!0),se("A",!1),e("hour","h"),i("hour",13),_("a",re),_("A",re),_("H",b),_("h",b),_("k",b),_("HH",b,o),_("hh",b,o),_("kk",b,o),_("hmm",gt),_("hmmss",yt),_("Hmm",gt),_("Hmmss",yt),k(["H","HH"],C),k(["k","kk"],function(t,e,i){t=d(t);e[C]=24===t?0:t}),k(["a","A"],function(t,e,i){i._isPm=i._locale.isPM(t),i._meridiem=t}),k(["h","hh"],function(t,e,i){e[C]=d(t),g(i).bigHour=!0}),k("hmm",function(t,e,i){var n=t.length-2;e[C]=d(t.substr(0,n)),e[E]=d(t.substr(n)),g(i).bigHour=!0}),k("hmmss",function(t,e,i){var n=t.length-4,o=t.length-2;e[C]=d(t.substr(0,n)),e[E]=d(t.substr(n,2)),e[D]=d(t.substr(o)),g(i).bigHour=!0}),k("Hmm",function(t,e,i){var n=t.length-2;e[C]=d(t.substr(0,n)),e[E]=d(t.substr(n))}),k("Hmmss",function(t,e,i){var n=t.length-4,o=t.length-2;e[C]=d(t.substr(0,n)),e[E]=d(t.substr(n,2)),e[D]=d(t.substr(o))});var ae,Tt=ot("Hours",!0),le={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Mt,monthsShort:Nt,week:{dow:0,doy:6},weekdays:Qt,weekdaysMin:Kt,weekdaysShort:Jt,meridiemParse:/[ap]\.?m?\.?/i},L={},ce={};function de(t){return t&&t.toLowerCase().replace("_","-")}function ue(t){var e;if(!L[t]&&"undefined"!=typeof module&&module&&module.exports)try{e=ae._abbr,require("./locale/"+t),he(e)}catch(t){}return L[t]}function he(t,e){return(ae=t&&(t=h(e)?fe(t):pe(t,e))?t:ae)._abbr}function pe(t,e){if(null===e)return delete L[t],null;var i=le;if(e.abbr=t,null!=L[t])Q("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=L[t]._config;else if(null!=e.parentLocale){if(null==L[e.parentLocale])return ce[e.parentLocale]||(ce[e.parentLocale]=[]),ce[e.parentLocale].push({name:t,config:e}),null;i=L[e.parentLocale]._config}return L[t]=new K(J(i,e)),ce[t]&&ce[t].forEach(function(t){pe(t.name,t.config)}),he(t),L[t]}function fe(t){var e;if(!(t=t&&t._locale&&t._locale._abbr?t._locale._abbr:t))return ae;if(!u(t)){if(e=ue(t))return e;t=[t]}for(var i,n,o,s,r=t,a=0;a<r.length;){for(i=(s=de(r[a]).split("-")).length,n=(n=de(r[a+1]))?n.split("-"):null;0<i;){if(o=ue(s.slice(0,i).join("-")))return o;if(n&&n.length>=i&&V(s,n,!0)>=i-1)break;i--}a++}return null}function me(t){var e=t._a;return e&&-2===g(t).overflow&&(e=e[T]<0||11<e[T]?T:e[S]<1||e[S]>jt(e[x],e[T])?S:e[C]<0||24<e[C]||24===e[C]&&(0!==e[E]||0!==e[D]||0!==e[Lt])?C:e[E]<0||59<e[E]?E:e[D]<0||59<e[D]?D:e[Lt]<0||999<e[Lt]?Lt:-1,g(t)._overflowDayOfYear&&(e<x||S<e)&&(e=S),g(t)._overflowWeeks&&-1===e&&(e=Ot),g(t)._overflowWeekday&&-1===e&&(e=$t),g(t).overflow=e),t}var ge=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ye=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ve=/Z|[+-]\d\d(?::?\d\d)?/,be=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],we=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],_e=/^\/?Date\((\-?\d+)/i;function ke(t){var e,i,n,o,s,r,a=t._i,l=ge.exec(a)||ye.exec(a);if(l){for(g(t).iso=!0,e=0,i=be.length;e<i;e++)if(be[e][1].exec(l[1])){o=be[e][0],n=!1!==be[e][2];break}if(null==o)t._isValid=!1;else{if(l[3]){for(e=0,i=we.length;e<i;e++)if(we[e][1].exec(l[3])){s=(l[2]||" ")+we[e][0];break}if(null==s)return void(t._isValid=!1)}if(n||null==s){if(l[4]){if(!ve.exec(l[4]))return void(t._isValid=!1);r="Z"}t._f=o+(s||"")+(r||""),Ee(t)}else t._isValid=!1}}else t._isValid=!1}var xe=/^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d?\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(?:\d\d)?\d\d\s)(\d\d:\d\d)(\:\d\d)?(\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\d{4}))$/;function Te(t){var e,i,n,o,s={" GMT":" +0000"," EDT":" -0400"," EST":" -0500"," CDT":" -0500"," CST":" -0600"," MDT":" -0600"," MST":" -0700"," PDT":" -0700"," PST":" -0800"},r=t._i.replace(/\([^\)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s|\s$/g,""),a=xe.exec(r);if(a){if(r=a[1]?"ddd"+(5===a[1].length?", ":" "):"",e="D MMM "+(10<a[2].length?"YYYY ":"YY "),i="HH:mm"+(a[4]?":ss":""),a[1]){var l=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][new Date(a[2]).getDay()];if(a[1].substr(0,3)!==l)return g(t).weekdayMismatch=!0,void(t._isValid=!1)}switch(a[5].length){case 2:n=0===o?" +0000":((o="YXWVUTSRQPONZABCDEFGHIKLM".indexOf(a[5][1].toUpperCase())-12)<0?" -":" +")+(""+o).replace(/^-?/,"0").match(/..$/)[0]+"00";break;case 4:n=s[a[5]];break;default:n=s[" GMT"]}a[5]=n,t._i=a.splice(1).join(""),t._f=r+e+i+" ZZ",Ee(t),g(t).rfc2822=!0}else t._isValid=!1}function Se(t,e,i){return null!=t?t:null!=e?e:i}function Ce(t){var e,i,n,o,s,r,a,l,c,d,u,h=[];if(!t._d){for(n=t,o=new Date(p.now()),i=n._useUTC?[o.getUTCFullYear(),o.getUTCMonth(),o.getUTCDate()]:[o.getFullYear(),o.getMonth(),o.getDate()],t._w&&null==t._a[S]&&null==t._a[T]&&(null!=(o=(n=t)._w).GG||null!=o.W||null!=o.E?(l=1,c=4,s=Se(o.GG,n._a[x],Xt(O(),1,4).year),r=Se(o.W,1),((a=Se(o.E,1))<1||7<a)&&(d=!0)):(l=n._locale._week.dow,c=n._locale._week.doy,u=Xt(O(),l,c),s=Se(o.gg,n._a[x],u.year),r=Se(o.w,u.week),null!=o.d?((a=o.d)<0||6<a)&&(d=!0):null!=o.e?(a=o.e+l,(o.e<0||6<o.e)&&(d=!0)):a=l),r<1||r>Zt(s,l,c)?g(n)._overflowWeeks=!0:null!=d?g(n)._overflowWeekday=!0:(u=Vt(s,r,a,l,c),n._a[x]=u.year,n._dayOfYear=u.dayOfYear)),null!=t._dayOfYear&&(o=Se(t._a[x],i[x]),(t._dayOfYear>Yt(o)||0===t._dayOfYear)&&(g(t)._overflowDayOfYear=!0),d=Ut(o,0,t._dayOfYear),t._a[T]=d.getUTCMonth(),t._a[S]=d.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=h[e]=i[e];for(;e<7;e++)t._a[e]=h[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[C]&&0===t._a[E]&&0===t._a[D]&&0===t._a[Lt]&&(t._nextDay=!0,t._a[C]=0),t._d=(t._useUTC?Ut:zt).apply(null,h),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[C]=24)}}function Ee(t){if(t._f===p.ISO_8601)ke(t);else if(t._f===p.RFC_2822)Te(t);else{t._a=[],g(t).empty=!0;for(var e,i,n,o,s,r=""+t._i,a=r.length,l=0,c=ht(t._f,t._locale).match(at)||[],d=0;d<c.length;d++)i=c[d],(e=(r.match(Ct(i,t))||[])[0])&&(0<(n=r.substr(0,r.indexOf(e))).length&&g(t).unusedInput.push(n),r=r.slice(r.indexOf(e)+e.length),l+=e.length),dt[i]?(e?g(t).empty=!1:g(t).unusedTokens.push(i),n=i,s=t,null!=(o=e)&&f(Dt,n)&&Dt[n](o,s._a,s,n)):t._strict&&!e&&g(t).unusedTokens.push(i);g(t).charsLeftOver=a-l,0<r.length&&g(t).unusedInput.push(r),t._a[C]<=12&&!0===g(t).bigHour&&0<t._a[C]&&(g(t).bigHour=void 0),g(t).parsedDateParts=t._a.slice(0),g(t).meridiem=t._meridiem,t._a[C]=function(t,e,i){if(null==i)return e;return null!=t.meridiemHour?t.meridiemHour(e,i):null!=t.isPM?((t=t.isPM(i))&&e<12&&(e+=12),e=t||12!==e?e:0):e}(t._locale,t._a[C],t._meridiem),Ce(t),me(t)}}function De(t){var e,i,n=t._i,o=t._f;if(t._locale=t._locale||fe(t._l),null===n||void 0===o&&""===n)return W({nullInput:!0});if("string"==typeof n&&(t._i=n=t._locale.preparse(n)),y(n))return new G(me(n));if(F(n))t._d=n;else if(u(o)){var s,r,a,l,c,d=t;if(0===d._f.length)g(d).invalidFormat=!0,d._d=new Date(NaN);else{for(l=0;l<d._f.length;l++)c=0,s=z({},d),null!=d._useUTC&&(s._useUTC=d._useUTC),s._f=d._f[l],Ee(s),Y(s)&&(c=(c+=g(s).charsLeftOver)+10*g(s).unusedTokens.length,g(s).score=c,null==a||c<a)&&(a=c,r=s);m(d,r||s)}}else if(o)Ee(t);else if(h(o=(n=t)._i))n._d=new Date(p.now());else F(o)?n._d=new Date(o.valueOf()):"string"==typeof o?(i=n,null!==(e=_e.exec(i._i))?i._d=new Date(+e[1]):(ke(i),!1===i._isValid&&(delete i._isValid,Te(i),!1===i._isValid)&&(delete i._isValid,p.createFromInputFallback(i)))):u(o)?(n._a=R(o.slice(0),function(t){return parseInt(t,10)}),Ce(n)):I(o)?(e=n)._d||(i=it(e._i),e._a=R([i.year,i.month,i.day||i.date,i.hour,i.minute,i.second,i.millisecond],function(t){return t&&parseInt(t,10)}),Ce(e)):H(o)?n._d=new Date(o):p.createFromInputFallback(n);return Y(t)||(t._d=null),t}function Ae(t,e,i,n,o){var s={};return!0!==i&&!1!==i||(n=i,i=void 0),(I(t)&&function(t){for(var e in t)return;return 1}(t)||u(t)&&0===t.length)&&(t=void 0),s._isAMomentObject=!0,s._useUTC=s._isUTC=o,s._l=i,s._i=t,s._f=e,s._strict=n,(o=new G(me(De(o=s))))._nextDay&&(o.add(1,"d"),o._nextDay=void 0),o}function O(t,e,i,n){return Ae(t,e,i,n,!1)}p.createFromInputFallback=t("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),p.ISO_8601=function(){},p.RFC_2822=function(){};gt=t("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var t=O.apply(null,arguments);return this.isValid()&&t.isValid()?t<this?this:t:W()}),yt=t("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var t=O.apply(null,arguments);return this.isValid()&&t.isValid()?this<t?this:t:W()});function Le(t,e){var i,n;if(!(e=1===e.length&&u(e[0])?e[0]:e).length)return O();for(i=e[0],n=1;n<e.length;++n)e[n].isValid()&&!e[n][t](i)||(i=e[n]);return i}var Oe=["year","quarter","month","week","day","hour","minute","second","millisecond"];function $e(t){var t=it(t),e=t.year||0,i=t.quarter||0,n=t.month||0,o=t.week||0,s=t.day||0,r=t.hour||0,a=t.minute||0,l=t.second||0,c=t.millisecond||0;this._isValid=function(t){for(var e in t)if(-1===Oe.indexOf(e)||null!=t[e]&&isNaN(t[e]))return!1;for(var i=!1,n=0;n<Oe.length;++n)if(t[Oe[n]]){if(i)return!1;parseFloat(t[Oe[n]])!==d(t[Oe[n]])&&(i=!0)}return!0}(t),this._milliseconds=+c+1e3*l+6e4*a+1e3*r*60*60,this._days=+s+7*o,this._months=+n+3*i+12*e,this._data={},this._locale=fe(),this._bubble()}function Me(t){return t instanceof $e}function je(t){return t<0?-1*Math.round(-1*t):Math.round(t)}function Pe(t,i){n(t,0,0,function(){var t=this.utcOffset(),e="+";return t<0&&(t=-t,e="-"),e+l(~~(t/60),2)+i+l(~~t%60,2)})}Pe("Z",":"),Pe("ZZ",""),_("Z",xt),_("ZZ",xt),k(["Z","ZZ"],function(t,e,i){i._useUTC=!0,i._tzm=Ie(xt,t)});var Ne=/([\+\-]|\d\d)/gi;function Ie(t,e){var e=(e||"").match(t);return null===e?null:0===(e=60*(t=((e[e.length-1]||[])+"").match(Ne)||["-",0,0])[1]+d(t[2]))?0:"+"===t[0]?e:-e}function He(t,e){var i;return e._isUTC?(e=e.clone(),i=(y(t)||F(t)?t:O(t)).valueOf()-e.valueOf(),e._d.setTime(e._d.valueOf()+i),p.updateOffset(e,!1),e):O(t).local()}function Fe(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function Re(){return!!this.isValid()&&this._isUTC&&0===this._offset}p.updateOffset=function(){};var qe=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,Ye=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;function $(t,e){var i,n=t;return Me(t)?n={ms:t._milliseconds,d:t._days,M:t._months}:H(t)?(n={},e?n[e]=t:n.milliseconds=t):(e=qe.exec(t))?(i="-"===e[1]?-1:1,n={y:0,d:d(e[S])*i,h:d(e[C])*i,m:d(e[E])*i,s:d(e[D])*i,ms:d(je(1e3*e[Lt]))*i}):(e=Ye.exec(t))?(i="-"===e[1]?-1:1,n={y:We(e[2],i),M:We(e[3],i),w:We(e[4],i),d:We(e[5],i),h:We(e[6],i),m:We(e[7],i),s:We(e[8],i)}):null==n?n={}:"object"==typeof n&&("from"in n||"to"in n)&&(e=function(t,e){var i;if(!t.isValid()||!e.isValid())return{milliseconds:0,months:0};e=He(e,t),t.isBefore(e)?i=Be(t,e):((i=Be(e,t)).milliseconds=-i.milliseconds,i.months=-i.months);return i}(O(n.from),O(n.to)),(n={}).ms=e.milliseconds,n.M=e.months),i=new $e(n),Me(t)&&f(t,"_locale")&&(i._locale=t._locale),i}function We(t,e){t=t&&parseFloat(t.replace(",","."));return(isNaN(t)?0:t)*e}function Be(t,e){var i={milliseconds:0,months:0};return i.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(i.months,"M").isAfter(e)&&--i.months,i.milliseconds=+e-+t.clone().add(i.months,"M"),i}function ze(n,o){return function(t,e){var i;return null===e||isNaN(+e)||(Q(o,"moment()."+o+"(period, number) is deprecated. Please use moment()."+o+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),i=t,t=e,e=i),Ue(this,$(t="string"==typeof t?+t:t,e),n),this}}function Ue(t,e,i,n){var o=e._milliseconds,s=je(e._days),e=je(e._months);t.isValid()&&(n=null==n||n,o&&t._d.setTime(t._d.valueOf()+o*i),s&&rt(t,"Date",st(t,"Date")+s*i),e&&It(t,st(t,"Month")+e*i),n)&&p.updateOffset(t,s||e)}$.fn=$e.prototype,$.invalid=function(){return $(NaN)};Mt=ze(1,"add"),Nt=ze(-1,"subtract");function Ge(t){return void 0===t?this._locale._abbr:(null!=(t=fe(t))&&(this._locale=t),this)}p.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",p.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";Qt=t("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});function Ve(){return this._locale}function Xe(t,e){n(0,[t,t.length],0,e)}function Ze(t,e,i,n,o){var s;return null==t?Xt(this,n,o).year:(s=Zt(t,n,o),function(t,e,i,n,o){t=Vt(t,e,i,n,o),e=Ut(t.year,0,t.dayOfYear);return this.year(e.getUTCFullYear()),this.month(e.getUTCMonth()),this.date(e.getUTCDate()),this}.call(this,t,e=s<e?s:e,i,n,o))}n(0,["gg",2],0,function(){return this.weekYear()%100}),n(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Xe("gggg","weekYear"),Xe("ggggg","weekYear"),Xe("GGGG","isoWeekYear"),Xe("GGGGG","isoWeekYear"),e("weekYear","gg"),e("isoWeekYear","GG"),i("weekYear",1),i("isoWeekYear",1),_("G",_t),_("g",_t),_("GG",b,o),_("gg",b,o),_("GGGG",bt,mt),_("gggg",bt,mt),_("GGGGG",w,v),_("ggggg",w,v),At(["gggg","ggggg","GGGG","GGGGG"],function(t,e,i,n){e[n.substr(0,2)]=d(t)}),At(["gg","GG"],function(t,e,i,n){e[n]=p.parseTwoDigitYear(t)}),n("Q",0,"Qo","quarter"),e("quarter","Q"),i("quarter",7),_("Q",pt),k("Q",function(t,e){e[T]=3*(d(t)-1)}),n("D",["DD",2],"Do","date"),e("date","D"),i("date",9),_("D",b),_("DD",b,o),_("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),k(["D","DD"],S),k("Do",function(t,e){e[S]=d(t.match(b)[0])});Kt=ot("Date",!0);n("DDD",["DDDD",3],"DDDo","dayOfYear"),e("dayOfYear","DDD"),i("dayOfYear",4),_("DDD",vt),_("DDDD",ft),k(["DDD","DDDD"],function(t,e,i){i._dayOfYear=d(t)}),n("m",["mm",2],0,"minute"),e("minute","m"),i("minute",14),_("m",b),_("mm",b,o),k(["m","mm"],E);var Qe,Jt=ot("Minutes",!1),bt=(n("s",["ss",2],0,"second"),e("second","s"),i("second",15),_("s",b),_("ss",b,o),k(["s","ss"],D),ot("Seconds",!1));for(n("S",0,0,function(){return~~(this.millisecond()/100)}),n(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),n(0,["SSS",3],0,"millisecond"),n(0,["SSSS",4],0,function(){return 10*this.millisecond()}),n(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),n(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),n(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),n(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),n(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),e("millisecond","ms"),i("millisecond",16),_("S",vt,pt),_("SS",vt,o),_("SSS",vt,ft),Qe="SSSS";Qe.length<=9;Qe+="S")_(Qe,wt);function Je(t,e){e[Lt]=d(1e3*("0."+t))}for(Qe="S";Qe.length<=9;Qe+="S")k(Qe,Je);mt=ot("Milliseconds",!1);n("z",0,0,"zoneAbbr"),n("zz",0,0,"zoneName");w=G.prototype;function Ke(t){return t}w.add=Mt,w.calendar=function(t,e){var i=He(t=t||O(),this).startOf("day"),i=p.calendarFormat(this,i)||"sameElse",e=e&&(r(e[i])?e[i].call(this,t):e[i]);return this.format(e||this.localeData().calendar(i,this,O(t)))},w.clone=function(){return new G(this)},w.diff=function(t,e,i){var n,o;return this.isValid()&&(t=He(t,this)).isValid()?(n=6e4*(t.utcOffset()-this.utcOffset()),"year"===(e=s(e))||"month"===e||"quarter"===e?(o=function(t,e){var i,n=12*(e.year()-t.year())+(e.month()-t.month()),o=t.clone().add(n,"months");t=e-o<0?(i=t.clone().add(n-1,"months"),(e-o)/(o-i)):(i=t.clone().add(1+n,"months"),(e-o)/(i-o));return-(n+t)||0}(this,t),"quarter"===e?o/=3:"year"===e&&(o/=12)):(t=this-t,o="second"===e?t/1e3:"minute"===e?t/6e4:"hour"===e?t/36e5:"day"===e?(t-n)/864e5:"week"===e?(t-n)/6048e5:t),i?o:a(o)):NaN},w.endOf=function(t){return void 0===(t=s(t))||"millisecond"===t?this:this.startOf(t="date"===t?"day":t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms")},w.format=function(t){return t=t||(this.isUtc()?p.defaultFormatUtc:p.defaultFormat),t=ut(this,t),this.localeData().postformat(t)},w.from=function(t,e){return this.isValid()&&(y(t)&&t.isValid()||O(t).isValid())?$({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},w.fromNow=function(t){return this.from(O(),t)},w.to=function(t,e){return this.isValid()&&(y(t)&&t.isValid()||O(t).isValid())?$({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},w.toNow=function(t){return this.to(O(),t)},w.get=function(t){return r(this[t=s(t)])?this[t]():this},w.invalidAt=function(){return g(this).overflow},w.isAfter=function(t,e){return t=y(t)?t:O(t),!(!this.isValid()||!t.isValid())&&("millisecond"===(e=s(h(e)?"millisecond":e))?this.valueOf()>t.valueOf():t.valueOf()<this.clone().startOf(e).valueOf())},w.isBefore=function(t,e){return t=y(t)?t:O(t),!(!this.isValid()||!t.isValid())&&("millisecond"===(e=s(h(e)?"millisecond":e))?this.valueOf()<t.valueOf():this.clone().endOf(e).valueOf()<t.valueOf())},w.isBetween=function(t,e,i,n){return("("===(n=n||"()")[0]?this.isAfter(t,i):!this.isBefore(t,i))&&(")"===n[1]?this.isBefore(e,i):!this.isAfter(e,i))},w.isSame=function(t,e){var t=y(t)?t:O(t);return!(!this.isValid()||!t.isValid())&&("millisecond"===(e=s(e||"millisecond"))?this.valueOf()===t.valueOf():(t=t.valueOf(),this.clone().startOf(e).valueOf()<=t&&t<=this.clone().endOf(e).valueOf()))},w.isSameOrAfter=function(t,e){return this.isSame(t,e)||this.isAfter(t,e)},w.isSameOrBefore=function(t,e){return this.isSame(t,e)||this.isBefore(t,e)},w.isValid=function(){return Y(this)},w.lang=Qt,w.locale=Ge,w.localeData=Ve,w.max=yt,w.min=gt,w.parsingFlags=function(){return m({},g(this))},w.set=function(t,e){if("object"==typeof t)for(var i=function(t){var e,i=[];for(e in t)i.push({unit:e,priority:nt[e]});return i.sort(function(t,e){return t.priority-e.priority}),i}(t=it(t)),n=0;n<i.length;n++)this[i[n].unit](t[i[n].unit]);else if(r(this[t=s(t)]))return this[t](e);return this},w.startOf=function(t){switch(t=s(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this},w.subtract=Nt,w.toArray=function(){return[this.year(),this.month(),this.date(),this.hour(),this.minute(),this.second(),this.millisecond()]},w.toObject=function(){return{years:this.year(),months:this.month(),date:this.date(),hours:this.hours(),minutes:this.minutes(),seconds:this.seconds(),milliseconds:this.milliseconds()}},w.toDate=function(){return new Date(this.valueOf())},w.toISOString=function(){var t;return this.isValid()?(t=this.clone().utc()).year()<0||9999<t.year()?ut(t,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):r(Date.prototype.toISOString)?this.toDate().toISOString():ut(t,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):null},w.inspect=function(){var t,e,i;return this.isValid()?(e="moment",t="",this.isLocal()||(e=0===this.utcOffset()?"moment.utc":"moment.parseZone",t="Z"),e="["+e+'("]',i=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",this.format(e+i+"-MM-DD[T]HH:mm:ss.SSS"+(t+'[")]'))):"moment.invalid(/* "+this._i+" */)"},w.toJSON=function(){return this.isValid()?this.toISOString():null},w.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},w.unix=function(){return Math.floor(this.valueOf()/1e3)},w.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},w.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},w.year=Bt,w.isLeapYear=function(){return Wt(this.year())},w.weekYear=function(t){return Ze.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},w.isoWeekYear=function(t){return Ze.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},w.quarter=w.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},w.month=Ht,w.daysInMonth=function(){return jt(this.year(),this.month())},w.week=w.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},w.isoWeek=w.isoWeeks=function(t){var e=Xt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},w.weeksInYear=function(){var t=this.localeData()._week;return Zt(this.year(),t.dow,t.doy)},w.isoWeeksInYear=function(){return Zt(this.year(),1,4)},w.date=Kt,w.day=w.days=function(t){var e,i,n;return this.isValid()?(e=this._isUTC?this._d.getUTCDay():this._d.getDay(),null!=t?(i=t,n=this.localeData(),t="string"!=typeof i?i:isNaN(i)?"number"==typeof(i=n.weekdaysParse(i))?i:null:parseInt(i,10),this.add(t-e,"d")):e):null!=t?this:NaN},w.weekday=function(t){var e;return this.isValid()?(e=(this.day()+7-this.localeData()._week.dow)%7,null==t?e:this.add(t-e,"d")):null!=t?this:NaN},w.isoWeekday=function(t){var e,i;return this.isValid()?null!=t?(e=t,i=this.localeData(),i="string"==typeof e?i.weekdaysParse(e)%7||7:isNaN(e)?null:e,this.day(this.day()%7?i:i-7)):this.day()||7:null!=t?this:NaN},w.dayOfYear=function(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},w.hour=w.hours=Tt,w.minute=w.minutes=Jt,w.second=w.seconds=bt,w.millisecond=w.milliseconds=mt,w.utcOffset=function(t,e,i){var n,o=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null==t)return this._isUTC?o:Fe(this);if("string"==typeof t){if(null===(t=Ie(xt,t)))return this}else Math.abs(t)<16&&!i&&(t*=60);return!this._isUTC&&e&&(n=Fe(this)),this._offset=t,this._isUTC=!0,null!=n&&this.add(n,"m"),o!==t&&(!e||this._changeInProgress?Ue(this,$(t-o,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,p.updateOffset(this,!0),this._changeInProgress=null)),this},w.utc=function(t){return this.utcOffset(0,t)},w.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t)&&this.subtract(Fe(this),"m"),this},w.parseZone=function(){var t;return null!=this._tzm?this.utcOffset(this._tzm,!1,!0):"string"==typeof this._i&&(null!=(t=Ie(kt,this._i))?this.utcOffset(t):this.utcOffset(0,!0)),this},w.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?O(t).utcOffset():0,(this.utcOffset()-t)%60==0)},w.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},w.isLocal=function(){return!!this.isValid()&&!this._isUTC},w.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},w.isUtc=Re,w.isUTC=Re,w.zoneAbbr=function(){return this._isUTC?"UTC":""},w.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},w.dates=t("dates accessor is deprecated. Use date instead.",Kt),w.months=t("months accessor is deprecated. Use month instead",Ht),w.years=t("years accessor is deprecated. Use year instead",Bt),w.zone=t("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(t,e){return null!=t?(this.utcOffset(t="string"!=typeof t?-t:t,e),this):-this.utcOffset()}),w.isDSTShifted=t("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){var t,e;return h(this._isDSTShifted)&&(z(t={},this),(t=De(t))._a?(e=(t._isUTC?c:O)(t._a),this._isDSTShifted=this.isValid()&&0<V(t._a,e.toArray())):this._isDSTShifted=!1),this._isDSTShifted});v=K.prototype;function ti(t,e,i,n){var o=fe(),n=c().set(n,e);return o[i](n,t)}function ei(t,e,i){if(H(t)&&(e=t,t=void 0),t=t||"",null!=e)return ti(t,e,i,"month");for(var n=[],o=0;o<12;o++)n[o]=ti(t,o,i,"month");return n}function ii(t,e,i,n){e=("boolean"==typeof t?H(e)&&(i=e,e=void 0):(e=t,t=!1,H(i=e)&&(i=e,e=void 0)),e||"");var o=fe(),s=t?o._week.dow:0;if(null!=i)return ti(e,(i+s)%7,n,"day");for(var r=[],a=0;a<7;a++)r[a]=ti(e,(a+s)%7,n,"day");return r}v.calendar=function(t,e,i){return r(t=this._calendar[t]||this._calendar.sameElse)?t.call(e,i):t},v.longDateFormat=function(t){var e=this._longDateFormat[t],i=this._longDateFormat[t.toUpperCase()];return e||!i?e:(this._longDateFormat[t]=i.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])},v.invalidDate=function(){return this._invalidDate},v.ordinal=function(t){return this._ordinal.replace("%d",t)},v.preparse=Ke,v.postformat=Ke,v.relativeTime=function(t,e,i,n){var o=this._relativeTime[i];return r(o)?o(t,e,i,n):o.replace(/%d/i,t)},v.pastFuture=function(t,e){return r(t=this._relativeTime[0<t?"future":"past"])?t(e):t.replace(/%s/i,e)},v.set=function(t){var e,i;for(i in t)r(e=t[i])?this[i]=e:this["_"+i]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},v.months=function(t,e){return t?(u(this._months)?this._months:this._months[(this._months.isFormat||Pt).test(e)?"format":"standalone"])[t.month()]:u(this._months)?this._months:this._months.standalone},v.monthsShort=function(t,e){return t?(u(this._monthsShort)?this._monthsShort:this._monthsShort[Pt.test(e)?"format":"standalone"])[t.month()]:u(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},v.monthsParse=function(t,e,i){var n,o;if(this._monthsParseExact)return function(t,e,i){var n,o,s,t=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],n=0;n<12;++n)s=c([2e3,n]),this._shortMonthsParse[n]=this.monthsShort(s,"").toLocaleLowerCase(),this._longMonthsParse[n]=this.months(s,"").toLocaleLowerCase();return i?"MMM"===e?-1!==(o=A.call(this._shortMonthsParse,t))?o:null:-1!==(o=A.call(this._longMonthsParse,t))?o:null:"MMM"===e?-1!==(o=A.call(this._shortMonthsParse,t))||-1!==(o=A.call(this._longMonthsParse,t))?o:null:-1!==(o=A.call(this._longMonthsParse,t))||-1!==(o=A.call(this._shortMonthsParse,t))?o:null}.call(this,t,e,i);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),n=0;n<12;n++){if(o=c([2e3,n]),i&&!this._longMonthsParse[n]&&(this._longMonthsParse[n]=new RegExp("^"+this.months(o,"").replace(".","")+"$","i"),this._shortMonthsParse[n]=new RegExp("^"+this.monthsShort(o,"").replace(".","")+"$","i")),i||this._monthsParse[n]||(o="^"+this.months(o,"")+"|^"+this.monthsShort(o,""),this._monthsParse[n]=new RegExp(o.replace(".",""),"i")),i&&"MMMM"===e&&this._longMonthsParse[n].test(t))return n;if(i&&"MMM"===e&&this._shortMonthsParse[n].test(t))return n;if(!i&&this._monthsParse[n].test(t))return n}},v.monthsRegex=function(t){return this._monthsParseExact?(f(this,"_monthsRegex")||qt.call(this),t?this._monthsStrictRegex:this._monthsRegex):(f(this,"_monthsRegex")||(this._monthsRegex=Rt),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},v.monthsShortRegex=function(t){return this._monthsParseExact?(f(this,"_monthsRegex")||qt.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(f(this,"_monthsShortRegex")||(this._monthsShortRegex=Ft),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},v.week=function(t){return Xt(t,this._week.dow,this._week.doy).week},v.firstDayOfYear=function(){return this._week.doy},v.firstDayOfWeek=function(){return this._week.dow},v.weekdays=function(t,e){return t?(u(this._weekdays)?this._weekdays:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"])[t.day()]:u(this._weekdays)?this._weekdays:this._weekdays.standalone},v.weekdaysMin=function(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin},v.weekdaysShort=function(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort},v.weekdaysParse=function(t,e,i){var n,o;if(this._weekdaysParseExact)return function(t,e,i){var n,o,s,t=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],n=0;n<7;++n)s=c([2e3,1]).day(n),this._minWeekdaysParse[n]=this.weekdaysMin(s,"").toLocaleLowerCase(),this._shortWeekdaysParse[n]=this.weekdaysShort(s,"").toLocaleLowerCase(),this._weekdaysParse[n]=this.weekdays(s,"").toLocaleLowerCase();return i?"dddd"===e?-1!==(o=A.call(this._weekdaysParse,t))?o:null:"ddd"===e?-1!==(o=A.call(this._shortWeekdaysParse,t))?o:null:-1!==(o=A.call(this._minWeekdaysParse,t))?o:null:"dddd"===e?-1!==(o=A.call(this._weekdaysParse,t))||-1!==(o=A.call(this._shortWeekdaysParse,t))||-1!==(o=A.call(this._minWeekdaysParse,t))?o:null:"ddd"===e?-1!==(o=A.call(this._shortWeekdaysParse,t))||-1!==(o=A.call(this._weekdaysParse,t))||-1!==(o=A.call(this._minWeekdaysParse,t))?o:null:-1!==(o=A.call(this._minWeekdaysParse,t))||-1!==(o=A.call(this._weekdaysParse,t))||-1!==(o=A.call(this._shortWeekdaysParse,t))?o:null}.call(this,t,e,i);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),n=0;n<7;n++){if(o=c([2e3,1]).day(n),i&&!this._fullWeekdaysParse[n]&&(this._fullWeekdaysParse[n]=new RegExp("^"+this.weekdays(o,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[n]=new RegExp("^"+this.weekdaysShort(o,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[n]=new RegExp("^"+this.weekdaysMin(o,"").replace(".",".?")+"$","i")),this._weekdaysParse[n]||(o="^"+this.weekdays(o,"")+"|^"+this.weekdaysShort(o,"")+"|^"+this.weekdaysMin(o,""),this._weekdaysParse[n]=new RegExp(o.replace(".",""),"i")),i&&"dddd"===e&&this._fullWeekdaysParse[n].test(t))return n;if(i&&"ddd"===e&&this._shortWeekdaysParse[n].test(t))return n;if(i&&"dd"===e&&this._minWeekdaysParse[n].test(t))return n;if(!i&&this._weekdaysParse[n].test(t))return n}},v.weekdaysRegex=function(t){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||ne.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(f(this,"_weekdaysRegex")||(this._weekdaysRegex=te),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},v.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||ne.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(f(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=ee),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},v.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||ne.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(f(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=ie),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},v.isPM=function(t){return"p"===(t+"").toLowerCase().charAt(0)},v.meridiem=function(t,e,i){return 11<t?i?"pm":"PM":i?"am":"AM"},he("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===d(t%100/10)?"th":1==e?"st":2==e?"nd":3==e?"rd":"th")}}),p.lang=t("moment.lang is deprecated. Use moment.locale instead.",he),p.langData=t("moment.langData is deprecated. Use moment.localeData instead.",fe);var M=Math.abs;function ni(t,e,i,n){e=$(e,i);return t._milliseconds+=n*e._milliseconds,t._days+=n*e._days,t._months+=n*e._months,t._bubble()}function oi(t){return t<0?Math.floor(t):Math.ceil(t)}function si(t){return 4800*t/146097}function ri(t){return 146097*t/4800}function ai(t){return function(){return this.as(t)}}pt=ai("ms"),o=ai("s"),vt=ai("m"),ft=ai("h"),Mt=ai("d"),yt=ai("w"),gt=ai("M"),Nt=ai("y");function li(t){return function(){return this.isValid()?this._data[t]:NaN}}Tt=li("milliseconds"),Jt=li("seconds"),bt=li("minutes"),mt=li("hours"),Kt=li("days"),Bt=li("months"),v=li("years");var ci=Math.round,j={ss:44,s:45,m:45,h:22,d:26,M:11};function di(t,e,i){var n=$(t).abs(),o=ci(n.as("s")),s=ci(n.as("m")),r=ci(n.as("h")),a=ci(n.as("d")),l=ci(n.as("M")),n=ci(n.as("y")),o=(o<=j.ss?["s",o]:o<j.s&&["ss",o])||(s<=1?["m"]:s<j.m&&["mm",s])||(r<=1?["h"]:r<j.h&&["hh",r])||(a<=1?["d"]:a<j.d&&["dd",a])||(l<=1?["M"]:l<j.M&&["MM",l])||(n<=1?["y"]:["yy",n]);return o[2]=e,o[3]=0<+t,o[4]=i,function(t,e,i,n,o){return o.relativeTime(e||1,!!i,t,n)}.apply(null,o)}var ui=Math.abs;function hi(){var t,e,i,n,o,s,r;return this.isValid()?(s=ui(this._milliseconds)/1e3,i=ui(this._days),e=ui(this._months),o=a(s/60),n=a(o/60),s%=60,o%=60,t=a(e/12),e=e%=12,i=i,n=n,o=o,s=s,(r=this.asSeconds())?(r<0?"-":"")+"P"+(t?t+"Y":"")+(e?e+"M":"")+(i?i+"D":"")+(n||o||s?"T":"")+(n?n+"H":"")+(o?o+"M":"")+(s?s+"S":""):"P0D"):this.localeData().invalidDate()}var P=$e.prototype;return P.isValid=function(){return this._isValid},P.abs=function(){var t=this._data;return this._milliseconds=M(this._milliseconds),this._days=M(this._days),this._months=M(this._months),t.milliseconds=M(t.milliseconds),t.seconds=M(t.seconds),t.minutes=M(t.minutes),t.hours=M(t.hours),t.months=M(t.months),t.years=M(t.years),this},P.add=function(t,e){return ni(this,t,e,1)},P.subtract=function(t,e){return ni(this,t,e,-1)},P.as=function(t){if(!this.isValid())return NaN;var e,i,n=this._milliseconds;if("month"===(t=s(t))||"year"===t)return e=this._days+n/864e5,i=this._months+si(e),"month"===t?i:i/12;switch(e=this._days+Math.round(ri(this._months)),t){case"week":return e/7+n/6048e5;case"day":return e+n/864e5;case"hour":return 24*e+n/36e5;case"minute":return 1440*e+n/6e4;case"second":return 86400*e+n/1e3;case"millisecond":return Math.floor(864e5*e)+n;default:throw new Error("Unknown unit "+t)}},P.asMilliseconds=pt,P.asSeconds=o,P.asMinutes=vt,P.asHours=ft,P.asDays=Mt,P.asWeeks=yt,P.asMonths=gt,P.asYears=Nt,P.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*d(this._months/12):NaN},P._bubble=function(){var t=this._milliseconds,e=this._days,i=this._months,n=this._data;return 0<=t&&0<=e&&0<=i||t<=0&&e<=0&&i<=0||(t+=864e5*oi(ri(i)+e),i=e=0),n.milliseconds=t%1e3,t=a(t/1e3),n.seconds=t%60,t=a(t/60),n.minutes=t%60,t=a(t/60),n.hours=t%24,e+=a(t/24),i+=t=a(si(e)),e-=oi(ri(t)),t=a(i/12),i%=12,n.days=e,n.months=i,n.years=t,this},P.get=function(t){return t=s(t),this.isValid()?this[t+"s"]():NaN},P.milliseconds=Tt,P.seconds=Jt,P.minutes=bt,P.hours=mt,P.days=Kt,P.weeks=function(){return a(this.days()/7)},P.months=Bt,P.years=v,P.humanize=function(t){var e,i;return this.isValid()?(e=this.localeData(),i=di(this,!t,e),t&&(i=e.pastFuture(+this,i)),e.postformat(i)):this.localeData().invalidDate()},P.toISOString=hi,P.toString=hi,P.toJSON=hi,P.locale=Ge,P.localeData=Ve,P.toIsoString=t("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",hi),P.lang=Qt,n("X",0,0,"unix"),n("x",0,0,"valueOf"),_("x",_t),_("X",/[+-]?\d+(\.\d{1,3})?/),k("X",function(t,e,i){i._d=new Date(1e3*parseFloat(t,10))}),k("x",function(t,e,i){i._d=new Date(d(t))}),p.version="2.18.1",N=O,p.fn=w,p.min=function(){return Le("isBefore",[].slice.call(arguments,0))},p.max=function(){return Le("isAfter",[].slice.call(arguments,0))},p.now=function(){return Date.now?Date.now():+new Date},p.utc=c,p.unix=function(t){return O(1e3*t)},p.months=function(t,e){return ei(t,e,"months")},p.isDate=F,p.locale=he,p.invalid=W,p.duration=$,p.isMoment=y,p.weekdays=function(t,e,i){return ii(t,e,i,"weekdays")},p.parseZone=function(){return O.apply(null,arguments).parseZone()},p.localeData=fe,p.isDuration=Me,p.monthsShort=function(t,e){return ei(t,e,"monthsShort")},p.weekdaysMin=function(t,e,i){return ii(t,e,i,"weekdaysMin")},p.defineLocale=pe,p.updateLocale=function(t,e){var i;return null!=e?(i=le,(i=new K(e=J(i=null!=L[t]?L[t]._config:i,e))).parentLocale=L[t],L[t]=i,he(t)):null!=L[t]&&(null!=L[t].parentLocale?L[t]=L[t].parentLocale:null!=L[t]&&delete L[t]),L[t]},p.locales=function(){return tt(L)},p.weekdaysShort=function(t,e,i){return ii(t,e,i,"weekdaysShort")},p.normalizeUnits=s,p.relativeTimeRounding=function(t){return void 0===t?ci:"function"==typeof t&&(ci=t,!0)},p.relativeTimeThreshold=function(t,e){return void 0!==j[t]&&(void 0===e?j[t]:(j[t]=e,"s"===t&&(j.ss=e-1),!0))},p.calendarFormat=function(t,e){return(t=t.diff(e,"days",!0))<-6?"sameElse":t<-1?"lastWeek":t<0?"lastDay":t<1?"sameDay":t<2?"nextDay":t<7?"nextWeek":"sameElse"},p.prototype=w,p}),!function(t,e){"object"==typeof exports&&"undefined"!=typeof module&&"function"==typeof require?e(require("../moment")):"function"==typeof define&&define.amd?define(["../moment"],e):e(t.moment)}(this,function(t){"use strict";return t.defineLocale("pt-br",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Do_2ª_3ª_4ª_5ª_6ª_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"poucos segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº"})}),!function(t,e){"object"==typeof exports&&"undefined"!=typeof module&&"function"==typeof require?e(require("../moment")):"function"==typeof define&&define.amd?define(["../moment"],e):e(t.moment)}(this,function(t){"use strict";var i="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");return t.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,e){return t?(/-MMM-/.test(e)?n:i)[t.month()]:i},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})}),{modal_id:null,form_id:null,url:"/",method:"POST",submit_btn_id:null,has_captcha:!1,captcha_key:null,captcha_theme:"light",captcha_id:null,email_confirm_modal_id:"#modal_confirm",success_message:null,error_message:null,rcaptcha:null,submit:function(){var e=this;$.ajax({type:e.method,url:e.url,data:$(e.form_id).serialize(),success:function(t){$.each(t.fields,function(t,e){$("#"+e).parent().removeClass("has-error"),$("#"+e+"_error").html("")}),!1===t.sent?(!0===e.has_captcha&&($(e.submit_btn_id).attr("disabled","disabled"),e.render_captcha()),$.each(t.message,function(t,e){$("#"+t).parent().addClass("has-error"),$("#"+t+"_error").html(e)})):($(e.modal_id).modal("toggle"),$(".midGlyph").addClass("success"),$(".midGlyph").html(e.success_message),$(e.email_confirm_modal_id).modal("show"))},error:function(t){$(e.modal_id).modal("toggle"),$(".midGlyph").removeClass("success").toggleClass("unsuccess"),$(".midGlyph").html(e.error_message),$(e.email_confirm_modal_id).modal("show")}})},recaptcha_callback:function(){$(this.submit_btn_id).removeAttr("disabled")},registry_recaptcha_modal:function(){var t=this;$(this.modal_id).on("show.bs.modal",function(){setTimeout(function(){t.render_captcha(t.captcha_id,t.captcha_key,t.captcha_theme)},100)})},render_captcha:function(t,e,i){this.render_captcha&&$(this.submit_btn_id).attr("disabled","disabled"),null===this.rcaptcha?this.rcaptcha=grecaptcha.render(t,{sitekey:e,theme:i,callback:this.recaptcha_callback.bind(this)}):grecaptcha.reset(this.rcaptcha)},init:function(t,e,i,n,o,s,r,a,l,c,d,u){this.modal_id=t,this.form_id=e,this.url=i,this.method=n,this.submit_btn_id=o,this.has_captcha=s,this.captcha_key=r,this.captcha_theme=l,this.captcha_id=a,this.email_confirm_modal_id=c,this.success_message=d,this.error_message=u,!(this.rcaptcha=null)===this.has_captcha&&this.registry_recaptcha_modal();var h=this;return $(this.form_id).submit(function(t){t.preventDefault(),h.submit()}),this}}); +//# sourceMappingURL=../maps/scielo-bundle-min.js.map \ No newline at end of file diff --git a/markup_doc/static/js/xref-button.js b/markup_doc/static/js/xref-button.js new file mode 100644 index 0000000..5950941 --- /dev/null +++ b/markup_doc/static/js/xref-button.js @@ -0,0 +1,530 @@ +function getCookie(name) { + let cookieValue = null; + if (document.cookie && document.cookie !== '') { + const cookies = document.cookie.split(';'); + for (let i = 0; i < cookies.length; i++) { + const cookie = cookies[i].trim(); + // Verifica si el cookie empieza con el nombre que queremos + if (cookie.substring(0, name.length + 1) === (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; +} + +function getCSRFTokenFromInput() { + const input = document.querySelector('input[name="csrfmiddlewaretoken"]'); + return input ? input.value : null; +} + +function get_cite(text){ + const path = window.location.pathname; + const match = path.match(/edit\/(\d+)\//); // Extrae el número entre 'edit/' y el siguiente '/' + var pk_register = parseInt(match[1], 10); + + return fetch('/admin/extract-citation/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRFToken': getCSRFTokenFromInput() + }, + body: JSON.stringify({ + text: text, + pk: pk_register + }) + }) + .then(response => response.json()) + .then(data => { + console.log("Cita extraída:", data); + return data.refid; + // Aquí podrías hacer algo con los resultados + }) + .catch(error => { + console.error("Error al extraer citas:", error); + }); +} + +//document.addEventListener("DOMContentLoaded", function () { +function addXrefButtonToTextareas() { + //var tab = document.querySelector('a[role="tab"][aria-selected="true"]'); + //if(tab.id !== 'tab-label-body'){ + // return false; + //} + + var frontTab = document.querySelector('#tab-body'); + + if (frontTab) { + + // Espera a que el campo se cargue + frontTab.querySelectorAll('textarea').forEach(function (textarea) { + if(textarea.value.length < 50){ + return false; + } + + // Evita insertar el botón más de una vez + if (textarea.dataset.xrefButtonAdded === 'true') return; + + // Marca el textarea como procesado + textarea.dataset.xrefButtonAdded = 'true'; + + // Crea el botón + const button = document.createElement('button'); + button.type = 'button'; + button.innerText = 'Add <xref>'; + button.style.margin = '5px'; + + button.style.padding = "4px 8px"; + button.style.cursor = "pointer"; + button.style.marginLeft = "auto"; + + button.style.backgroundColor = "#007d7e"; // fondo azul (Bootstrap-like) + button.style.color = "white"; + button.style.fontWeight = "bold"; + + button.addEventListener("mouseover", () => { + button.style.backgroundColor = "#006465"; + }); + button.addEventListener("mouseout", () => { + button.style.backgroundColor = "#007d7e"; + }); + + + // Crea el botón + const btn2 = document.createElement('button'); + btn2.type = 'button'; + btn2.innerText = "Delete all <xref>"; + btn2.style.margin = '5px'; + + btn2.style.padding = "4px 8px"; + btn2.style.cursor = "pointer"; + btn2.style.marginLeft = "auto"; + + btn2.style.backgroundColor = "#007d7e"; // fondo azul (Bootstrap-like) + btn2.style.color = "white"; + btn2.style.fontWeight = "bold"; + + btn2.addEventListener("mouseover", () => { + btn2.style.backgroundColor = "#006465"; + }); + btn2.addEventListener("mouseout", () => { + btn2.style.backgroundColor = "#007d7e"; + }); + + // Acción al hacer clic + button.addEventListener('click', function () { + const start = textarea.selectionStart; + const end = textarea.selectionEnd; + const selectedText = textarea.value.substring(start, end); + + if (!selectedText) { + alert('Selecciona un texto para aplicar <xref>'); + return; + } + + var textClean = selectedText.replace('[style name="italic"]','').replace('[/style]',''); + //var cite = get_cite(textClean); + + get_cite(textClean).then(cite => { + // aquí ya tienes el valor real + const xrefWrapped = `<xref ref-type="bibr" rid="${cite}">${selectedText}</xref>`; + const newText = textarea.value.slice(0, start) + xrefWrapped + textarea.value.slice(end); + textarea.value = newText; + }); + + }); + + btn2.addEventListener('click', function () { + // Reemplaza <xref ...>...</xref> por solo su contenido + textarea.value = textarea.value.replace(/<xref\b[^>]*>(.*?)<\/xref>/gi, '$1'); + }); + + // Agrega el botón justo después del textarea + textarea.parentNode.insertBefore(button, textarea.nextSibling); + + textarea.parentNode.insertBefore(btn2, textarea.nextSibling); + }); + } +} +//}); + +// Inicial: aplica en los visibles al cargar +document.addEventListener('DOMContentLoaded', function () { + addXrefButtonToTextareas(); +}); + + +document.addEventListener("DOMContentLoaded", function () { + document.querySelectorAll('.w-tabs__tab').forEach(function(tabLink) { + tabLink.addEventListener('click', function() { + // Espera a que el contenido del tab se muestre + setTimeout(function () { + // ID del contenido al que apunta el tab + const tabContentId = tabLink.getAttribute('href'); // por ejemplo: "#tab-xml" + const tabContent = document.querySelector(tabContentId); + + if (tabContent) { + addXrefButtonToTextareas(); + } + }, 100); // delay leve para permitir render + }); + }); +}); + + +document.addEventListener("DOMContentLoaded", function () { + var path = window.location.pathname; + // Busca el campo por su ID (ajústalo si es diferente) + if ( path.indexOf('markupxml/edit') == -1 ){ + return false; + } + var ids = ['collection', 'journal_title', 'short_title', 'title_nlm', 'acronym', 'issn', 'pissn', 'eissn', 'pubname'] + $.each(ids, function(i, val){ + const collectionField = document.querySelector('#id_'+val); + if (collectionField) { + collectionField.setAttribute('readonly', true); // Solo lectura + collectionField.classList.add('disabled'); // Para aplicar estilo visual + // Agregar estilos Wagtail para apariencia "inactiva" + collectionField.style.backgroundColor = 'var(--w-color-surface-field-inactive)'; + collectionField.style.borderColor = 'var(--w-color-border-field-inactive)'; + collectionField.style.color = 'var(--w-color-text-placeholder)'; + collectionField.style.cursor = 'not-allowed'; + } + }); +}); + +document.addEventListener("DOMContentLoaded", function () { + const journalInput = document.querySelector("#id_journal"); + + //if (!journalInput) return; + + // MutationObserver para detectar cambios en la selección del widget + const journalWrapper = document.querySelector('[data-autocomplete-input-id="id_journal"]'); + + if (!journalWrapper) return; + + const observer = new MutationObserver(() => { + // Buscar el input hidden que contiene el valor + const hiddenInput = journalWrapper.querySelector('input[type="hidden"][name="journal"]'); + if (!hiddenInput) return; + + let journalValue; + + try { + journalValue = JSON.parse(hiddenInput.value); + } catch (e) { + return; + } + + if (journalValue && journalValue.pk) { + + fetch('/admin/get_journal/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRFToken': getCSRFTokenFromInput() + }, + body: JSON.stringify({ + pk: journalValue.pk + }) + }) + .then(response => response.json()) + .then(data => { + console.log(data); + $('#id_journal_title').val(data.journal_title); + $('#id_short_title').val(data.short_title); + $('#id_title_nlm').val(data.title_nlm); + $('#id_acronym').val(data.acronym); + $('#id_issn').val(data.issn); + $('#id_pissn').val(data.pissn); + $('#id_eissn').val(data.eissn); + $('#id_pubname').val(data.pubname); + }) + .catch(error => { + console.error("Error:", error); + $('#id_journal_title').val(""); + $('#id_short_title').val(""); + $('#id_title_nlm').val(""); + $('#id_acronym').val(""); + $('#id_issn').val(""); + $('#id_pissn').val(""); + $('#id_eissn').val(""); + $('#id_pubname').val(""); + }); + + }else{ + $('#id_journal_title').val(""); + $('#id_short_title').val(""); + $('#id_title_nlm').val(""); + $('#id_acronym').val(""); + $('#id_issn').val(""); + $('#id_pissn').val(""); + $('#id_eissn').val(""); + $('#id_pubname').val(""); + } + }); + + observer.observe(journalWrapper, { childList: true, subtree: true }); +}); + + +function get_zip() { + // Extraer el pk desde /edit/<id>/ + const path = window.location.pathname; + const match = path.match(/edit\/(\d+)\//); + const pk_register = match ? parseInt(match[1], 10) : null; + if (!pk_register) { + console.error("No se pudo obtener el ID del registro desde la URL."); + return; + } + + return fetch('/admin/download-zip/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRFToken': getCSRFTokenFromInput(), // asegúrate de que esta func devuelva el token correcto + 'Accept': 'application/zip' // opcional, para claridad + }, + body: JSON.stringify({ pk: pk_register }) + }) + .then(async (response) => { + if (!response.ok) { + // Si el backend a veces devuelve JSON de error, intenta leerlo: + let errorText = `Error ${response.status}`; + try { + const data = await response.json(); + if (data && data.error) errorText += `: ${data.error}`; + } catch { + // Si no era JSON, lee como texto + try { + errorText += `: ${await response.text()}`; + } catch {} + } + throw new Error(errorText); + } + + // Leer el ZIP como Blob + const blob = await response.blob(); + + // Intentar extraer filename del header Content-Disposition + let filename = "archivo.zip"; + const cd = response.headers.get('Content-Disposition'); + if (cd) { + // ej: attachment; filename="article_123.zip" + const match = cd.match(/filename\*?=(?:UTF-8'')?"?([^\";]+)/i); + if (match && match[1]) { + filename = decodeURIComponent(match[1].replace(/\"/g, '')); + } + } + + // Crear un Object URL y disparar descarga + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.style.display = 'none'; + a.href = url; + a.download = filename; // sugiere el nombre + document.body.appendChild(a); + a.click(); + // Limpieza + URL.revokeObjectURL(url); + a.remove(); + }) + .catch((error) => { + console.error("Error al descargar el ZIP:", error); + alert("No se pudo descargar el ZIP. " + error.message); + }); + } + + function openPreviewHTMLFetch() { + // Extraer el pk desde /edit/<id>/ + const path = window.location.pathname; + const match = path.match(/edit\/(\d+)\//); + const pk_register = match ? parseInt(match[1], 10) : null; + if (!pk_register) { + console.error("No se pudo obtener el ID del registro desde la URL."); + return; + } + + const w = window.open('', '_blank'); + fetch('/admin/preview-html/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRFToken': getCSRFTokenFromInput(), + 'Accept': 'text/html' + }, + body: JSON.stringify({ pk: pk_register }) + }) + .then(r => { + if (!r.ok) throw new Error('Error ' + r.status); + return r.text(); + }) + .then(html => { + w.document.open(); + w.document.write(html); + w.document.close(); + }) + .catch(err => { + w.close(); + alert('No se pudo abrir la vista previa: ' + err.message); + }); + } + + + function openPrettyXML() { + // Extraer el pk desde /edit/<id>/ + const path = window.location.pathname; + const match = path.match(/edit\/(\d+)\//); + const pk_register = match ? parseInt(match[1], 10) : null; + if (!pk_register) { + console.error("No se pudo obtener el ID del registro desde la URL."); + return; + } + + const w = window.open('', '_blank'); + fetch('/admin/pretty-xml/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRFToken': getCSRFTokenFromInput(), + 'Accept': 'text/xml' + }, + body: JSON.stringify({ pk: pk_register }) + }) + .then(r => { + if (!r.ok) throw new Error('Error ' + r.status); + return r.text(); + }) + .then(html => { + w.document.open(); + w.document.write(html); + w.document.close(); + }) + .catch(err => { + w.close(); + alert('No se pudo abrir la vista previa: ' + err.message); + }); + } + + +(function() { + + function createXrefButton(textarea) { + // Evita duplicados + if (textarea.dataset.xrefButtonAdded === "true") return; + + // Marca como procesado + textarea.dataset.xrefButtonAdded = "true"; + + // Contenedor estilo "toolbar" (opcional) + const bar = document.createElement("div"); + bar.style.display = "flex"; + bar.style.gap = "8px"; + bar.style.alignItems = "center"; + bar.style.marginBottom = "6px"; + + // Botón + const btn = document.createElement("button"); + btn.type = "button"; + btn.textContent = "Download ZIP"; + btn.style.padding = "4px 8px"; + btn.style.cursor = "pointer"; + btn.style.marginLeft = "auto"; + + btn.style.backgroundColor = "#007d7e"; // fondo azul (Bootstrap-like) + btn.style.color = "white"; + btn.style.fontWeight = "bold"; + + btn.addEventListener("mouseover", () => { + btn.style.backgroundColor = "#006465"; + }); + btn.addEventListener("mouseout", () => { + btn.style.backgroundColor = "#007d7e"; + }); + + bar.appendChild(btn); + + + // Botón 2 + const btn2 = document.createElement("button"); + btn2.type = "button"; + btn2.textContent = "Preview HTML"; + btn2.style.padding = "4px 8px"; + btn2.style.cursor = "pointer"; + //btn2.style.marginLeft = "auto"; + + btn2.style.backgroundColor = "#007d7e"; // fondo azul (Bootstrap-like) + btn2.style.color = "white"; + btn2.style.fontWeight = "bold"; + + btn2.addEventListener("mouseover", () => { + btn2.style.backgroundColor = "#006465"; + }); + btn2.addEventListener("mouseout", () => { + btn2.style.backgroundColor = "#007d7e"; + }); + + bar.appendChild(btn2); + + + // Botón 3 + const btn3 = document.createElement("button"); + btn3.type = "button"; + btn3.textContent = "Pretty XML"; + btn3.style.padding = "4px 8px"; + btn3.style.cursor = "pointer"; + //btn2.style.marginLeft = "auto"; + + btn3.style.backgroundColor = "#007d7e"; // fondo azul (Bootstrap-like) + btn3.style.color = "white"; + btn3.style.fontWeight = "bold"; + + btn3.addEventListener("mouseover", () => { + btn2.style.backgroundColor = "#006465"; + }); + btn3.addEventListener("mouseout", () => { + btn3.style.backgroundColor = "#007d7e"; + }); + + bar.appendChild(btn3); + + // Inserta la barra **antes** del textarea (o sea, arriba) + textarea.parentNode.insertBefore(bar, textarea); + + // Lógica de click + btn.addEventListener("click", async function() { + + get_zip() + }); + + // Lógica de click + btn2.addEventListener("click", async function() { + + openPreviewHTMLFetch() + }); + + // Lógica de click + btn3.addEventListener("click", async function() { + + openPrettyXML() + }); + } + + // Intenta inmediatamente si ya está en el DOM + function tryAttach() { + const ta = document.getElementById("id_text_xml"); + if (ta) createXrefButton(ta); + } + + // Observa por si el textarea aparece más tarde o se re-renderiza + const observer = new MutationObserver(() => tryAttach()); + observer.observe(document.documentElement, { childList: true, subtree: true }); + + // También en DOMContentLoaded por si basta + document.addEventListener("DOMContentLoaded", tryAttach); + + // Llama una vez por si ya está listo + tryAttach(); + })(); + diff --git a/markup_doc/static/xsl/jats-html.xsl b/markup_doc/static/xsl/jats-html.xsl new file mode 100644 index 0000000..e35215a --- /dev/null +++ b/markup_doc/static/xsl/jats-html.xsl @@ -0,0 +1,4028 @@ +<?xml version="1.0"?> +<!-- ============================================================= --> +<!-- MODULE: HTML Preview of NISO JATS Publishing 1.0 XML --> +<!-- DATE: May-June 2012 --> +<!-- --> +<!-- ============================================================= --> + +<!-- ============================================================= --> +<!-- SYSTEM: NCBI Archiving and Interchange Journal Articles --> +<!-- --> +<!-- PURPOSE: Provide an HTML preview of a journal article, --> +<!-- in a form suitable for reading. --> +<!-- --> +<!-- PROCESSOR DEPENDENCIES: --> +<!-- None: standard XSLT 1.0 --> +<!-- Tested using Saxon 6.5, Tranformiix (Firefox), --> +<!-- Saxon 9.4.0.3 --> +<!-- --> +<!-- COMPONENTS REQUIRED: --> +<!-- 1) This stylesheet --> +<!-- 2) CSS styles defined in jats-preview.css --> +<!-- (to be placed with the results) --> +<!-- --> +<!-- INPUT: An XML document valid to (any of) the --> +<!-- NISO JATS 1.0, NLM/NCBI Journal Publishing 3.0, --> +<!-- or NLM/NCBI Journal Publishing 2.3 DTDs. --> +<!-- (May also work with older variants, --> +<!-- and note further assumptions and limitations --> +<!-- below.) --> +<!-- --> +<!-- OUTPUT: HTML (XHTML if a postprocessor is used) --> +<!-- --> +<!-- CREATED FOR: --> +<!-- Digital Archive of Journal Articles --> +<!-- National Center for Biotechnology Information (NCBI) --> +<!-- National Library of Medicine (NLM) --> +<!-- --> +<!-- CREATED BY: --> +<!-- Wendell Piez (based on HTML design by --> +<!-- Kate Hamilton and Debbie Lapeyre, 2004), --> +<!-- Mulberry Technologies, Inc. --> +<!-- --> +<!-- ============================================================= --> + +<!-- ============================================================= --> +<!-- + This work is in the public domain and may be reproduced, published or + otherwise used without the permission of the National Library of Medicine (NLM). + + We request only that the NLM is cited as the source of the work. + + Although all reasonable efforts have been taken to ensure the accuracy and + reliability of the software and data, the NLM and the U.S. Government do + not and cannot warrant the performance or results that may be obtained by + using this software or data. The NLM and the U.S. Government disclaim all + warranties, express or implied, including warranties of performance, + merchantability or fitness for any particular purpose. +--> +<!-- ============================================================= --> + +<!-- Change history --> + +<!-- From jpub3-html.xsl v3.0 to jats-html.xsl v1.0: + +Calls to 'normalize-space($node)' where $node is not a string are +expressed as 'normalize-space(string($node)) in order to provide +type safety in some XSLT 2.0 processors. + +Support for certain elements in NLM Blue v2.3 is added to provide +backward compatibility: + floats-wrap (same as floats-group) + chem-struct-wrapper (same as chem-struct-wrap) + custom-meta-wrap (same as custom-meta-group) + floats-wrap (same as floats-group) + gloss-group (same as glossary) + citation + contract-num + contract-sponsor + grant-num + grant-sponsor + +Support is added for looser structures for title-group elements +in 2.3 (title, trans-title, trans-subtitle etc.) Same for 2.3 +tagging of permissions info (copyright-statement, copyright-year, +license) and funding/contract info (contract-num, contract-sponsor, +grant-num, grant-sponsor). + +Elements newly permitted in JATS journal-meta +(contrib-group, aff, aff-alternatives) are supported. + +New elements in NISO JATS v1.0 are supported: + aff-alternatives + citation-alternatives + collab-alternatives + trans-title-group (with @xml:lang) + contrib-id + count> + issn-l + nested-kwd + +Added support for @pub-id-type='arXiv' + +Named anchor logic extended to support "alternatives" wrappers +for aff, contrib, citation etc. + +Footer text is emended, with name of transformation (stylesheet +or pipeline) parameterized. + +--> +<xsl:stylesheet version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:mml="http://www.w3.org/1998/Math/MathML" + exclude-result-prefixes="xlink mml"> + + + <!--<xsl:output method="xml" indent="no" encoding="UTF-8" + doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" + doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>--> + + + <xsl:output doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" + doctype-system="http://www.w3.org/TR/html4/loose.dtd" + encoding="UTF-8"/> + + <xsl:strip-space elements="*"/> + + <!-- Space is preserved in all elements allowing #PCDATA --> + <xsl:preserve-space + elements="abbrev abbrev-journal-title access-date addr-line + aff alt-text alt-title article-id article-title + attrib award-id bold chapter-title chem-struct + collab comment compound-kwd-part compound-subject-part + conf-acronym conf-date conf-loc conf-name conf-num + conf-sponsor conf-theme contrib-id copyright-holder + copyright-statement copyright-year corresp country + date-in-citation day def-head degrees disp-formula + edition elocation-id email etal ext-link fax fpage + funding-source funding-statement given-names glyph-data + gov inline-formula inline-supplementary-material + institution isbn issn-l issn issue issue-id issue-part + issue-sponsor issue-title italic journal-id + journal-subtitle journal-title kwd label license-p + long-desc lpage meta-name meta-value mixed-citation + monospace month named-content object-id on-behalf-of + overline p page-range part-title patent person-group + phone prefix preformat price principal-award-recipient + principal-investigator product pub-id publisher-loc + publisher-name related-article related-object role + roman sans-serif sc season self-uri series series-text + series-title sig sig-block size source speaker std + strike string-name styled-content std-organization + sub subject subtitle suffix sup supplement surname + target td term term-head tex-math textual-form th + time-stamp title trans-source trans-subtitle trans-title + underline uri verse-line volume volume-id volume-series + xref year + + mml:annotation mml:ci mml:cn mml:csymbol mml:mi mml:mn + mml:mo mml:ms mml:mtext"/> + + + <xsl:param name="transform" select="'jats-html.xsl'"/> + + <xsl:param name="css" select="'jats-preview.css'"/> + + <xsl:param name="report-warnings" select="'no'"/> + + <xsl:variable name="verbose" select="$report-warnings='yes'"/> + + <!-- Keys --> + + <!-- To reduce dependency on a DTD for processing, we declare + a key to use instead of the id() function. --> + <xsl:key name="element-by-id" match="*[@id]" use="@id"/> + + <!-- Enabling retrieval of cross-references to objects --> + <xsl:key name="xref-by-rid" match="xref" use="@rid"/> + + <!-- ============================================================= --> + <!-- ROOT TEMPLATE - HANDLES HTML FRAMEWORK --> + <!-- ============================================================= --> + + <xsl:template match="/"> + <html> + <!-- HTML header --> + <xsl:call-template name="make-html-header"/> + <body> + <xsl:apply-templates/> + </body> + </html> + </xsl:template> + + + <xsl:template name="make-html-header"> + <head> + <title> + <xsl:variable name="authors"> + <xsl:call-template name="author-string"/> + </xsl:variable> + <xsl:value-of select="normalize-space(string($authors))"/> + <xsl:if test="normalize-space(string($authors))">: </xsl:if> + <xsl:value-of + select="/article/front/article-meta/title-group/article-title[1]"/> + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ + + +
+ +
+
+ + + +
+ + + Floating objects + + + +
+
+ + + + + + + +
+ + + + + +
+ + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [ + + ] + + + + + + + + + + , + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +


+ + + + + + + + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Private character + + + + + ] + + + + + + (Glyph not rendered) + + + + + [Related article:] + + + + + + [Related object:] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Notes + + + + + + + + + + Acknowledgements + + + + + + + Appendices + + + + + + + Biography + + + + + + + Notes + + + + + + + Glossary + + + + + + + References + + + + + + + + + + Notes + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + +

+ + + + + + + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Box + + + + + + + + + + + + + + Formula + + + + + + + + + + + + + + Formula (chemical) + + + + + + + + + + + + + + Figure + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [ + + ] + + + + + + + + + + + + + + + + [ + + ] + + + + + + + Abbreviation + + + + Communicated by + + + + Contributed by + + + + Conflicts of interest + + + + Corresponding author + + + + Current affiliation + + + + Deceased + + + + Edited by + + + + Equal contributor + + + + Financial disclosure + + + + On leave + + + + + + Participating researcher + + + + Current address + + + + Presented at + + + + Presented by + + + + Previously at + + + + Study group member + + + + Supplementary material + + + + Supported by + + + + + + + + + + + + + + + + + + + + + + + + + + Statement + + + + + + + + + + + + + + Supplementary Material + + + + + + + + + + + + + + Table + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ( + + + electronic + print + print and electronic + electronic preprint + print preprint + corrected, electronic + corrected, print + retracted, electronic + retracted, print + + + + + + ) + + + + + + + + + + + + + + + : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { label + (or @symbol) + needed for + + + [@id=' + + '] + + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + named anchor + + + + + + + + + + + + + + + + + + + + + + +
  • + + + +
  • +
    +
    +
    + + +

    Elements are cross-referenced without labels.

    +

    Either the element should be provided a label, or their cross-reference(s) should + have literal text content.

    +
      + +
    +
    + + + + + +
  • + In + +
      + +
    • + +
    • +
      +
    + +
  • +
    +
    + + +

    Elements with different 'specific-use' assignments appearing together

    +
      + +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + January + February + March + April + May + June + July + August + September + October + November + December + + + + + + + + + + + + + + + + + , + + + and + + + + + + + + + + + +
    +
    +

    + This display is generated from + NISO JATS XML with + + + + . The XSLT engine is + + . +

    +
    +
    + + + + + + + + + + + + + + + + [@ + + =' + + '] + + + + + + + + + + + + + + + + / + + + [ + + ] + + + + + + /@ + + + + + + /comment() + + [ + + ] + + + + + + /processing-instruction() + + [ + + ] + + + + + + /text() + + [ + + ] + + + + + + + + + diff --git a/markup_doc/static/xsl/xml-tree.xsl b/markup_doc/static/xsl/xml-tree.xsl new file mode 100644 index 0000000..35bb61d --- /dev/null +++ b/markup_doc/static/xsl/xml-tree.xsl @@ -0,0 +1,103 @@ + + + + + + + + + + + XML Viewer + + + + +
    + + +
    +
    + + +
    + + < + +  = + "" + + > + + +
    </>
    +
    +
    +
    + + +
    + + + +
    + + < + +  = + "" + + > + + +
    </>
    +
    +
    + + + + + +
    +
    +
    + + + +
    <!-- -->
    +
    + + +
    + diff --git a/markup_doc/sync_api.py b/markup_doc/sync_api.py new file mode 100644 index 0000000..56b8d09 --- /dev/null +++ b/markup_doc/sync_api.py @@ -0,0 +1,117 @@ +import requests +from django.db import transaction +from markup_doc.models import CollectionValuesModel, JournalModel, CollectionModel + +def sync_collection_from_api(): + url = "https://core.scielo.org/api/v2/pid/collection/" + all_results = [] + + while url: + print(url) + response = requests.get(url, headers={"Accept": "application/json"}) + data = response.json() + all_results.extend(data['results']) + url = data['next'] + + # Borra todo + print('Borrando...') + CollectionModel.objects.all().delete() + deleted_count, _ = CollectionValuesModel.objects.all().delete() + print('Borrado...') + + for item in all_results: + acron = item.get('acron3') + name = item.get('main_name', '').strip() + if acron and name: + print(name) + CollectionValuesModel.objects.update_or_create( + acron=acron, + defaults={'name': name} + ) + + +def sync_journals_from_api(): + journals = JournalModel.objects.all() + if journals.exists(): + deleted_count, _ = journals.delete() + + obj = CollectionModel.objects.select_related('collection').first() + + acron_selected = obj.collection.acron if obj and obj.collection else None + + new_journals = [] + + if acron_selected: + + url = "https://core.scielo.org/api/v2/pid/journal/" + + while url: + response = requests.get(url, headers={"Accept": "application/json"}) + try: + data = response.json() + + for item in data["results"]: + title = item.get("title", None) + short_title = item.get("short_title", None) + acronym = item.get("acronym", None) + pissn = item.get("official", {}).get("issn_print", None) + eissn = item.get("official", {}).get("issn_electronic", None) + acronym = item.get("acronym", None) + pubname = item.get("publisher", []) + title_in_database = item.get("title_in_database", []) + title_nlm = None + + if title_in_database: + for t in title_in_database: + if t.get("name", None) == 'MEDLINE': + title_nlm = t.get("title", None) + + if pubname: + pubname = pubname[0].get("name", None) + + scielo_journals = item.get("scielo_journal", []) + + # Obtener la primera colección asociada, si existe + collection_acron = None + if scielo_journals: + collection_acron = scielo_journals[0].get("collection_acron") + issn_scielo = scielo_journals[0].get("issn_scielo", None) + + if not title or acron_selected != collection_acron: + continue # Saltar si falta el título + + #collection_instance = None + #if collection_acron: + # collection_instance, _ = CollectionModel.objects.get_or_create( + # acron=collection_acron, + # defaults={'name': collection_acron.upper()} + # ) + + # Crear o actualizar el journal + print(title) + print(item) + journal = JournalModel( + title=title, + short_title=short_title or None, + title_nlm = title_nlm or None, + acronym=acronym or None, + issn=issn_scielo or None, + pissn=pissn or None, + eissn=eissn or None, + pubname=pubname or None, + # collection=collection_instance, + # defaults={} + ) + new_journals.append(journal) + + url = data.get("next") + except: + print('**ERROR url') + print(url) + url = None + + # Guardar todo junto + if new_journals: + with transaction.atomic(): + JournalModel.objects.bulk_create(new_journals, ignore_conflicts=True) + diff --git a/markup_doc/tasks.py b/markup_doc/tasks.py new file mode 100644 index 0000000..2eee90f --- /dev/null +++ b/markup_doc/tasks.py @@ -0,0 +1,326 @@ +from config import celery_app +from django.core.files.base import ContentFile +from markup_doc.models import UploadDocx, MarkupXML #ArticleDocx, ArticleDocxMarkup +import re, json, langid, math +from markuplib.function_docx import functionsDocx +from packtools.sps.formats.sps_xml.contrib import build_contrib_author +from markup_doc.xml import get_xml +from markup_doc.labeling_utils import ( + split_in_three, + create_special_content_object, + process_reference, + process_references, + extract_keywords, + create_labeled_object2, + get_data_first_block, + getLLM +) +from markup_doc.models import( + ProcessStatus +) +from markup_doc.sync_api import sync_journals_from_api +from model_ai.generic_llama import GenericLlama +from model_ai.function_llama import functionsLlama +from reference.config_gemini import create_prompt_reference + +def clean_labels(text): + # Eliminar etiquetas tipo [kwd] o [sectitle], incluso si tienen espacios como [/ doctitle ] + text = re.sub(r'\[\s*/?\s*\w+(?:\s+[^\]]+)?\s*\]', '', text) + + # Reemplazar múltiples espacios por uno solo + text = re.sub(r'[ \t]+', ' ', text) + + # Eliminar espacios antes de los signos de puntuación + text = re.sub(r'\s+([;:,.])', r'\1', text) + + # Normalizar múltiples saltos de línea + text = re.sub(r'\n+', '\n', text) + + # Quitar espacios al principio y final + return text.strip() + + +@celery_app.task() +def update_xml(instance_id, instance_content, instance_content_body, instance_content_back): + instance = MarkupXML.objects.get(id=instance_id) + content_head = instance_content + content_body_dict = instance_content_body + xml, stream_data_body = get_xml(instance, content_head, content_body_dict, instance_content_back) + + instance.content_body = stream_data_body + # Guardar el XML en el campo `file_xml` + #archive_xml = ContentFile(xml) # Crea un archivo temporal en memoria + instance.estatus = ProcessStatus.PROCESSED + #instance.file_xml.save("archivo.xml", archive_xml) # Guarda en el campo `file_xml` + instance.text_xml = xml + + instance.save() + + +@celery_app.task() +def get_labels(title, user_id): + article_docx = UploadDocx.objects.get(title=title) + doc = functionsDocx.openDocx(article_docx.file.path) + sections, content = functionsDocx().extractContent(doc, article_docx.file.path) + article_docx_markup = article_docx + text_title = '' + text_paragraph = '' + stream_data = [] + stream_data_body = [] + stream_data_back = [] + num_ref=0 + state = { + 'label': None, + 'label_next': None, + 'label_next_reset': None, + 'reset': False, + 'repeat': None, + 'body_trans': False, + 'body': False, + 'back': False, + 'references': False + } + counts = { + 'numref': 0, + 'numtab': 0, + 'numfig': 0, + 'numeq': 0 + } + + next_item = None + obj_reference = [] + llama_model = False + + for i, item in enumerate(content): + if next_item: + next_item = None + continue + + obj = {} + if item.get('type') in [ + '', + '', + '', + '' + ]: + if item.get('type') == '': + if i + 1 < len(content): + obj['type'] = 'paragraph' + obj['value'] = { + 'label': '', + 'paragraph': item.get('text') + } + stream_data.append(obj.copy()) + + next_item = content[i + 1] + obj['type'] = 'paragraph_with_language' + obj['value'] = { + 'label': '', + 'paragraph': next_item.get('text'), + 'language': langid.classify(next_item.get('text'))[0] or None + } + stream_data.append(obj.copy()) + + elif item.get('type') == '': + keywords = extract_keywords(item.get('text')) + obj['type'] = 'paragraph' + obj['value'] = { + 'label': '', + 'paragraph': keywords['title'] + } + stream_data.append(obj.copy()) + + obj['type'] = 'paragraph_with_language' + obj['value'] = { + 'label': '', + 'paragraph': keywords['keywords'], + 'language': langid.classify(keywords['title'].replace('', '').replace('', ''))[0] or None + } + stream_data.append(obj.copy()) + + else: + obj['type'] = 'paragraph' + obj['value'] = { + 'label': item.get('type') , + 'paragraph': item.get('text') + } + stream_data.append(obj.copy()) + continue + + if item.get('type') == 'first_block': + first_block = GenericLlama(type='prompt', temperature=0.1) + + if getLLM() == 'GEMINI': + output = first_block.run(functionsLlama.getFirstMetadata(clean_labels(item.get('text')))) + match = re.search(r'\{.*\}', output, re.DOTALL) + if match: + output = match.group(0) + output = json.loads(output) + + if getLLM() == 'LLAMA': + + output_author = get_data_first_block(clean_labels(item.get('text')), 'author', user_id) + + output_affiliation = get_data_first_block(clean_labels(item.get('text')), 'affiliation', user_id) + + output_doi = get_data_first_block(clean_labels(item.get('text')), 'doi', user_id) + + output_title = get_data_first_block(clean_labels(item.get('text')), 'title', user_id) + + # 1. Parsear cada salida + doi_section = output_doi + titles = output_title + authors = output_author + affiliations = output_affiliation + + # 2. Combinar en un único JSON + output = { + "doi": doi_section.get("doi", ""), + "section": doi_section.get("section", ""), + "titles": titles, + "authors": authors, + "affiliations": affiliations + } + + obj['type'] = 'paragraph' + obj['value'] = { + 'label': '', + 'paragraph': output['doi'] + } + stream_data.append(obj.copy()) + obj['value'] = { + 'label': '', + 'paragraph': output['section'] + } + stream_data.append(obj.copy()) + for i, tit in enumerate(output['titles']): + obj['type'] = 'paragraph_with_language' + obj['value'] = { + 'label': '' if i == 0 else '', + 'paragraph': tit['title'], + 'language': tit['language'] + } + stream_data.append(obj.copy()) + + for i, auth in enumerate(output['authors']): + obj['type'] = 'author_paragraph' + obj['value'] = { + 'label': '', + 'surname': auth['surname'], + 'given_names': auth['name'], + 'orcid': auth['orcid'], + 'affid': auth['aff'], + 'char': auth['char'] + } + stream_data.append(obj.copy()) + + for i, aff in enumerate(output['affiliations']): + obj['type'] = 'aff_paragraph' + obj['value'] = { + 'label': '', + 'affid': aff['aff'], + 'char': aff['char'], + 'orgname': aff['orgname'], + 'orgdiv2': aff['orgdiv2'], + 'orgdiv1': aff['orgdiv1'], + 'zipcode': aff['postal'], + 'city': aff['city'], + 'country': aff['name_country'], + 'code_country': aff['code_country'], + 'state': aff['state'], + 'text_aff': aff['text_aff'], + #'original': aff['original'] + } + stream_data.append(obj.copy()) + + if item.get('type') in ['image', 'table', 'list', 'compound']: + obj, counts = create_special_content_object(item, stream_data_body, counts) + stream_data_body.append(obj) + continue + + if item.get('text') is None or item.get('text') == '': + state['label_next'] = state['label_next_reset'] if state['reset'] else state['label_next'] + if state['back']: + state['back'] = False + state['body'] = False + state['references'] = True + else: + + obj, result, state = create_labeled_object2(i, item, state, sections) + + if result: + if item.get('text').lower() in ['introducción', 'introduction', 'introdução'] and state['references']: + state['body_trans'] = True + obj_trans = { + 'type': 'paragraph_with_language', + 'value': { + 'label': '', + 'paragraph': 'Translate' + } + } + stream_data_body.append(obj_trans) + if state['body']: + if state['references']: + if state['body_trans']: + stream_data_body.append(obj) + else: + stream_data.append(obj) + else: + stream_data_body.append(obj) + elif state['back']: + if state['label'] == '': + stream_data_back.append(obj) + if state['label'] == '

    ': + num_ref = num_ref + 1 + #obj = {}#process_reference(num_ref, obj, user_id) + obj_reference.append({"num_ref": num_ref, "obj": obj, "text": obj['value']['paragraph'],}) + #stream_data_back.append(obj) + else: + stream_data.append(obj) + + num_refs = [item["num_ref"] for item in obj_reference] + + if getLLM() == 'LLAMA': + for obj_ref in obj_reference: + obj = process_reference(obj_ref['num_ref'], obj_ref['obj'], user_id) + stream_data_back.append(obj) + + else: + chunks = split_in_three(obj_reference) + output=[] + + for chunk in chunks: + if len(chunk) > 0: + text_references = "\n".join([item["text"] for item in chunk]).replace('', '').replace('', '') + prompt_reference = create_prompt_reference(text_references) + + result = first_block.run(prompt_reference) + + match = re.search(r'\[.*\]', result, re.DOTALL) + if match: + parsed = json.loads(match.group(0)) + output.extend(parsed) # Agrega a la lista de salida + + stream_data_back.extend(process_references(num_refs, output)) + + article_docx_markup.content = stream_data + article_docx_markup.content_body = stream_data_body + article_docx_markup.content_back = stream_data_back + article_docx_markup.save() + + article_docx.estatus = ProcessStatus.PROCESSED + article_docx.save() + + xml, stream_data_body = get_xml(article_docx, stream_data, stream_data_body, stream_data_back) + article_docx_markup.content_body = stream_data_body + + # Guardar el XML en el campo `file_xml` + #archive_xml = ContentFile(xml) # Crea un archivo temporal en memoria + #article_docx_markup.file_xml.save("archivo.xml", archive_xml) # Guarda en el campo `file_xml` + article_docx_markup.text_xml = xml + article_docx.save() + + +@celery_app.task() +def task_sync_journals_from_api(): + sync_journals_from_api() diff --git a/markup_doc/tests.py b/markup_doc/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/markup_doc/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/markup_doc/views.py b/markup_doc/views.py new file mode 100644 index 0000000..037bb80 --- /dev/null +++ b/markup_doc/views.py @@ -0,0 +1,575 @@ +from django.shortcuts import render +from django.http import HttpResponse, HttpResponseBadRequest, Http404 +from .models import ArticleDocxMarkup +#from .xml import extraer_citas_apa +from django.http import JsonResponse +from markup_doc.models import JournalModel +import json + +import io, base64, mimetypes, os +import zipfile +from django.utils.text import slugify + +from django.conf import settings +from django.views.decorators.http import require_POST +from django.contrib.staticfiles import finders + +from lxml import etree, html as lxml_html +from urllib.parse import urlsplit, unquote +from django.templatetags.static import static +from markup_doc.labeling_utils import ( + proccess_labeled_text, +) +from packtools import XML, HTMLGenerator, catalogs +from packtools.htmlgenerator import get_htmlgenerator +from io import StringIO +from packtools.sps.pid_provider.xml_sps_lib import get_xml_with_pre, XMLWithPre +from .pkg_zip_builder import PkgZipBuilder +from urllib.parse import urlparse +from wagtail.images import get_image_model +from markup_doc.issue_proc import XmlIssueProc + + +# Create your views here. +def generate_xml(request, id_registro): + try: + # Obtener el registro del modelo que contiene el XML + registro = ArticleDocxMarkup.objects.get(pk=id_registro) + + # Obtener el contenido XML del campo + contenido_xml = registro.text_xml # Ajusta esto según la estructura de tu modelo + + # Crear una respuesta HTTP con el tipo de contenido XML + response = HttpResponse(contenido_xml, content_type='application/xml') + + # Definir el nombre del archivo para descargar + nombre_archivo = f"document_{id_registro}.xml" + response['Content-Disposition'] = f'attachment; filename="{nombre_archivo}"' + + return response + except TuModelo.DoesNotExist: + return HttpResponse("El registro solicitado no existe", status=404) + except Exception as e: + return HttpResponse(f"Error al generar el XML: {str(e)}", status=500) + + +def extract_citation(request): + + if request.method == "POST": + body = json.loads(request.body) + text = body.get("text", "") + pk_register = body.get("pk", "") + + #print(text) + #print(pk_register) + + # Obtener el registro del modelo que contiene el XML + registro = ArticleDocxMarkup.objects.get(pk=pk_register) + + #result = extraer_citas_apa(text, registro.content_back.get_prep_value()) # <-- Aquí pasas el texto a tu función normal + + ref = proccess_labeled_text(text, registro.content_back.get_prep_value()) + #text = text.replace(ref[0]['cita'], f"{ref[0]['cita']}") + + return JsonResponse({"refid": ref[0]['refid']}) + + +def get_journal(request): + + if request.method == "POST": + body = json.loads(request.body) + text = body.get("text", "") + pk = body.get("pk", "") + + journal = JournalModel.objects.get(pk=pk) + + return JsonResponse({ + 'journal_title': journal.title, + 'short_title': journal.short_title, + 'title_nlm': journal.title_nlm, + 'acronym': journal.acronym, + 'issn': journal.issn, + 'pissn': journal.pissn, + 'eissn': journal.eissn, + 'pubname': journal.pubname, + # Agrega los campos que necesites + }) + + +def generate_zip(request): + if request.method == "POST": + body = json.loads(request.body) + id_registro = body.get("pk", "") + + try: + registro = ArticleDocxMarkup.objects.get(pk=id_registro) + except ArticleDocxMarkup.DoesNotExist: + raise Http404("El registro solicitado no existe") + + # Crear XMLWithPre + contenido_xml = registro.text_xml or "" + xml_with_pre = get_xml_with_pre(contenido_xml) + + # Crear builder + builder = PkgZipBuilder(xml_with_pre) + + # Dummy IssueProc con imágenes + issue_proc = XmlIssueProc(registro) + + # Construir paquete SPS + import tempfile + output_folder = tempfile.mkdtemp() + + zip_path = builder.build_sps_package( + output_folder=output_folder, + renditions=[], # PDFs si los tienes + translations={}, # HTML si los tienes + main_paragraphs_lang="es", + issue_proc=issue_proc, + ) + + # Respuesta HTTP + with open(zip_path, "rb") as fp: + response = HttpResponse(fp.read(), content_type="application/zip") + response["Content-Disposition"] = f'attachment; filename="{builder.sps_pkg_name}.zip"' + return response + + +def _file_to_data_uri(file_obj, name_hint="file.bin"): + file_obj.open('rb') + try: + data = file_obj.read() + finally: + file_obj.close() + mime, _ = mimetypes.guess_type(name_hint) + if not mime: mime = 'application/octet-stream' + b64 = base64.b64encode(data).decode('ascii') + return f"data:{mime};base64,{b64}" + + +def _gather_images_from_streamfield(registro): + """ + Devuelve: + - by_figid: {figid -> (data_uri, original_basename)} + - by_basename: {basename -> data_uri} + """ + by_figid, by_basename = {}, {} + if not registro.content_body: + return by_figid, by_basename + + for block in registro.content_body: + if block.block_type != "image" or not block.value: + continue + struct = block.value + wagtail_image = struct.get("image") + if not wagtail_image: + continue + + # nombre original + original_name = (wagtail_image.file.name or "").split("/")[-1] or f"image-{wagtail_image.pk}" + data_uri = _file_to_data_uri(wagtail_image.file, original_name) + + # por basename + by_basename[original_name] = data_uri + + # por figid si existe + figid = (struct.get("figid") or "").strip() + if figid: + by_figid[figid] = (data_uri, original_name) + return by_figid, by_basename + + +def ensure_utf8_meta(root): + # 1) Asegurar estructura html/head/body + if root.tag.lower() != 'html': + html = html.Element('html') + head = html.Element('head') + body = lxml_html.Element('body') + html.append(head); html.append(body) + body.append(root) + root = html + else: + html = root + head = html.find('head') + body = html.find('body') + if head is None: + head = lxml_html.Element('head'); html.insert(0, head) + if body is None: + body = lxml_html.Element('body'); html.append(body) + + # 2) Quitar metas http-equiv=Content-Type (pueden contradecir el charset) + for m in head.xpath('meta[translate(@http-equiv,"CONTENT-TYPE","content-type")="content-type"]'): + head.remove(m) + + # 3) Insertar (o normalizar) al principio + metas = head.xpath('meta[@charset]') + if metas: + metas[0].set('charset', 'utf-8') + head.remove(metas[0]); head.insert(0, metas[0]) + else: + meta = lxml_html.Element('meta'); meta.set('charset', 'utf-8') + head.insert(0, meta) + + return root + + +def ensure_jats_css_link(root): + head = root.find('.//head') + if head is None: + head = lxml_html.Element('head'); root.insert(0, head) + + # Si el XSL ya puso un link a jats-preview.css, reescribe su href + rewritten = False + for link in head.xpath('link[@rel="stylesheet"]'): + href = link.get('href', '') + if 'jats-preview.css' in href: + link.set('href', static('jats/jats-preview.css')) + link.set('type', 'text/css') + rewritten = True + break + + # Si no había, añade uno + if not rewritten: + link = lxml_html.Element('link') + link.set('rel', 'stylesheet') + link.set('type', 'text/css') + link.set('href', static('jats/jats-preview.css')) + head.append(link) + + return root + + +def fix_img_src(html_text): + Image = get_image_model() + # Parsear el HTML + doc = lxml_html.fromstring(html_text) + + # Iterar sobre todas las imágenes + for img in doc.xpath("//img[@src]"): + src = img.attrib.get("src") + if not src or 'open-access' in src: + continue + + # ejemplo: "image3_pVQTCFR.original.jpg" + basename = os.path.basename(urlparse(src).path) + + try: + # Buscar en la base de datos (por nombre de archivo que contenga el basename) + #image_obj = Image.objects.filter(file__icontains=basename).first() + image_obj = '/media/images/' + basename + if image_obj: + # Obtener la URL real + #real_url = image_obj.get_rendition("original").url + #img.attrib["src"] = real_url + img.attrib["src"] = image_obj + except Exception: + # si no hay match, dejarlo como está + pass + + # Volver a convertir a string + return lxml_html.tostring(doc, pretty_print=True, encoding="utf-8", method="html").decode("utf-8") + + +def load_file_content(path): + with open(path, "r", encoding="utf-8") as f: + return f.read() + + +def preview_html_post(request): + # 1) pk desde JSON o formulario + id_registro = None + if request.content_type and request.content_type.startswith('application/json'): + try: + payload = json.loads(request.body.decode('utf-8')) + id_registro = int(payload.get('pk')) + except Exception: + return HttpResponseBadRequest("pk inválido") + else: + id_registro = request.POST.get('pk') + try: + id_registro = int(id_registro) + except Exception: + return HttpResponseBadRequest("pk inválido") + + try: + registro = ArticleDocxMarkup.objects.get(pk=id_registro) + except ArticleDocxMarkup.DoesNotExist: + raise Http404("Registro no existe") + + if not registro.text_xml or not registro.text_xml.strip(): + return HttpResponse("

    Sin XML

    ", content_type="text/html; charset=utf-8") + + try: + xml_content = registro.text_xml + xml_filelike = StringIO(xml_content) + + parsed_xml = XML(xml_filelike, no_network=True) + + """ + generator = HTMLGenerator.parse( + parsed_xml, + valid_only=False, + output_style="website", + xslt="3.0" + )""" + + bootstrap_css = """ + + """ + + bootstrap_js = """ + + """ + + print("css:", catalogs.HTML_GEN_DEFAULT_CSS_PATH) + print("print_css:", catalogs.HTML_GEN_DEFAULT_PRINT_CSS_PATH) + print("bootstrap_css:", catalogs.HTML_GEN_BOOTSTRAP_CSS_PATH) + print("article_css:", catalogs.HTML_GEN_ARTICLE_CSS_PATH) + print("js:", catalogs.HTML_GEN_DEFAULT_JS_PATH) + + # Cargar CSS/JS desde packtools + css_main = load_file_content(catalogs.HTML_GEN_DEFAULT_CSS_PATH) + css_print = load_file_content(catalogs.HTML_GEN_DEFAULT_PRINT_CSS_PATH) + js_main = load_file_content(catalogs.HTML_GEN_DEFAULT_JS_PATH) + + link_css = f""" + + + + + """ + + link_js = f""" + + + """ + + #link_css = f""" + # + # + #""" + + #link_js = f""" + # + #""" + + generator = HTMLGenerator.parse( + xml_filelike, + valid_only=False, + css=catalogs.HTML_GEN_DEFAULT_CSS_PATH, + print_css=catalogs.HTML_GEN_DEFAULT_PRINT_CSS_PATH, + js=catalogs.HTML_GEN_DEFAULT_JS_PATH, + math_elem_preference="mml:math", + math_js="https://cdn.jsdelivr.net/npm/mathjax@3.0.0/es5/tex-mml-svg.js", + permlink="", + url_article_page="", + url_download_ris="", + gs_abstract=False, + output_style="website", + xslt="3.0", + bootstrap_css=catalogs.HTML_GEN_BOOTSTRAP_CSS_PATH, + article_css=catalogs.HTML_GEN_ARTICLE_CSS_PATH, + design_system_static_img_path=None, + ) + + template = """ + + + + Artículo + + {css} + + + + + + + + + {content} + + + + + {js} + + """ + + has_output = False + for lang, trans_result in generator: + has_output = True + html_text = etree.tostring( + trans_result, + pretty_print=True, + encoding="utf-8", + method="html", + doctype="" + ).decode("utf-8") + + # corregir las imágenes + html_text = fix_img_src(html_text) + + # insertar el fragmento dentro de la plantilla + html_text = template.format( + css_main="", + css_print="", + css=link_css, + js=link_js, + js_main="", + content=html_text + ) + + # 3) Postprocesado: meta, css, imágenes + root = lxml_html.fromstring(html_text) + root = ensure_utf8_meta(root) + root = ensure_jats_css_link(root) + + by_figid, _by_basename = _gather_images_from_streamfield(registro) + href_to_datauri = { + f"{fid}.jpeg".lower(): data_uri + for fid, (data_uri, _orig) in by_figid.items() if fid + } + + for img in root.xpath('//img[@src]'): + src = img.get('src', '') + if src.startswith('data:'): + continue + base = unquote(os.path.basename(urlsplit(src).path)).lower() + data_uri = href_to_datauri.get(base) + if data_uri: + img.set('src', data_uri) + else: + img.set('src', settings.MEDIA_URL + base) + + final_html = lxml_html.tostring( + root, + encoding='unicode', + method='html', + doctype='', + pretty_print=True + ) + + return HttpResponse(html_text, content_type="text/html; charset=utf-8") + + except Exception as exc: + return HttpResponse( + f"

    Error al generar HTML

    {exc}
    ", + content_type="text/html; charset=utf-8" + ) + + +def xml_to_collapsible_html(xml_string): + try: + root = etree.fromstring(xml_string.encode("utf-8")) + except Exception as e: + return f"
    Error al parsear XML: {e}
    " + + def render_node(node): + # Construir apertura con atributos coloreados + attrs = "" + for k, v in node.attrib.items(): + attrs += f' {k}="{v}"' + + # Ej: + tag_open = f"<{node.tag}{attrs}>" + + # Texto dentro del nodo + text_html = "" + if (node.text or "").strip(): + text_html = f"
    {node.text.strip()}
    " + + # Renderizar hijos recursivamente + children_html = "".join(render_node(child) for child in node) + + # Nodo hoja (sin texto ni hijos) + if not children_html and not text_html: + return f"
    {tag_open}</{node.tag}>
    " + + # Nodo con contenido + return f""" +
    + {tag_open} + {text_html} + {children_html} +
    </{node.tag}>
    +
    + """ + + return render_node(root) + + +def preview_xml_tree(request): + # 1) pk desde JSON o formulario + id_registro = None + if request.content_type and request.content_type.startswith('application/json'): + try: + payload = json.loads(request.body.decode('utf-8')) + id_registro = int(payload.get('pk')) + except Exception: + return HttpResponseBadRequest("pk inválido") + else: + id_registro = request.POST.get('pk') + try: + id_registro = int(id_registro) + except Exception: + return HttpResponseBadRequest("pk inválido") + + try: + registro = ArticleDocxMarkup.objects.get(pk=id_registro) + except ArticleDocxMarkup.DoesNotExist: + raise Http404("Registro no existe") + + xml_string = registro.text_xml or "" + if not xml_string.strip(): + return HttpResponse("

    Sin XML

    ", content_type="text/html; charset=utf-8") + + collapsible_html = xml_to_collapsible_html(xml_string) + + final_html = f""" + + + + + + + +

    Collapsible XML view

    + {collapsible_html} + + + """ + + return HttpResponse(final_html, content_type="text/html; charset=utf-8") \ No newline at end of file diff --git a/markup_doc/wagtail_hooks.py b/markup_doc/wagtail_hooks.py new file mode 100644 index 0000000..7dbf484 --- /dev/null +++ b/markup_doc/wagtail_hooks.py @@ -0,0 +1,269 @@ +from django.http import HttpResponseRedirect +from django.utils.translation import gettext_lazy as _ +from django.contrib import messages +from django.template.response import TemplateResponse +from wagtail_modeladmin.options import ( + ModelAdmin, + ModelAdminGroup, + modeladmin_register, +) + +from wagtail.snippets.views.snippets import ( + CreateView, + EditView, + SnippetViewSet, + SnippetViewSetGroup +) +#from wagtail.contrib.modeladmin.views import CreateView, EditView + +from markup_doc.models import ( + ArticleDocx, + ArticleDocxMarkup, + UploadDocx, + MarkupXML, + CollectionModel, + JournalModel, + ProcessStatus +) + +from config.menu import get_menu_order +from markup_doc.tasks import get_labels, update_xml, task_sync_journals_from_api +from django.urls import path, reverse +from django.utils.html import format_html +from wagtail.admin import messages +from wagtail.admin.views import generic + +from django.shortcuts import redirect, get_object_or_404 +from django.views import View + +from wagtail.snippets.models import register_snippet +from django.db.models.signals import post_save +from django.dispatch import receiver +from django.db import transaction + +from wagtail import hooks +from . import views, xml +from django.templatetags.static import static +from markup_doc.sync_api import sync_collection_from_api, sync_journals_from_api + + +@hooks.register('register_admin_urls') +def register_admin_urls(): + return [ + path('download-xml//', views.generate_xml, name='generate_xml'), + path('extract-citation/', views.extract_citation, name='extract_citation'), + path('get_journal/', views.get_journal, name='get_journal'), + path('download-zip/', views.generate_zip, name='generate_zip'), + path('preview-html/', views.preview_html_post, name='preview_html_post'), + path('pretty-xml/', views.preview_xml_tree, name='preview_xml_tree'), + ] + +@hooks.register('insert_editor_js') +def xref_js(): + return format_html( + '', + static('js/xref-button.js') + ) + + +class ArticleDocxCreateView(CreateView): + #def get_form_class(self): + def dispatch(self, request, *args, **kwargs): + if not CollectionModel.objects.exists(): + messages.warning(request, "Debes seleccionar primero una colección.") + return HttpResponseRedirect(self.get_success_url()) + if not JournalModel.objects.exists(): + messages.warning(request, "Espera un momento, aún no existen elementos en Journal.") + return HttpResponseRedirect(self.get_success_url()) + return super().dispatch(request, *args, **kwargs) + + def form_valid(self, form): + self.object = form.save_all(self.request.user) + self.object.estatus = ProcessStatus.PROCESSING + self.object.save() + transaction.on_commit(lambda: get_labels.delay(self.object.title, self.request.user.id)) + return HttpResponseRedirect(self.get_success_url()) + + +class ArticleDocxEditView(EditView): + def form_valid(self, form): + form.instance.updated_by = self.request.user + form.instance.save() + update_xml.delay(form.instance.id, form.instance.content.get_prep_value(), form.instance.content_body.get_prep_value(), form.instance.content_back.get_prep_value()) + return HttpResponseRedirect(self.get_success_url()) + + +class ArticleDocxAdmin(ModelAdmin): + model = ArticleDocx + create_view_class = ArticleDocxCreateView + menu_label = _("Documents") + menu_icon = "folder" + menu_order = 1 + add_to_settings_menu = False # or True to add your model to the Settings sub-menu + exclude_from_explorer = ( + False # or True to exclude pages of this type from Wagtail's explorer view + ) + list_per_page = 20 + list_display = ( + "title", + "get_estatus_display" + ) + + +class ArticleDocxMarkupCreateView(CreateView): + def form_valid(self, form): + self.object = form.save_all(self.request.user) + return HttpResponseRedirect(self.get_success_url()) + + +class ArticleDocxMarkupAdmin(ModelAdmin): + model = ArticleDocxMarkup + create_view_class = ArticleDocxMarkupCreateView + menu_label = _("Documents Markup") + menu_icon = "folder" + menu_order = 1 + add_to_settings_menu = False # or True to add your model to the Settings sub-menu + exclude_from_explorer = ( + False # or True to exclude pages of this type from Wagtail's explorer view + ) + list_per_page = 20 + + +#class UploadDocxAdmin(ModelAdmin): +class UploadDocxViewSet(SnippetViewSet): + model = UploadDocx + #create_view_class = ArticleDocxCreateView + add_view_class = ArticleDocxCreateView + menu_label = _("UploadDocx") + menu_icon = "folder" + menu_order = 1 + add_to_settings_menu = False # or True to add your model to the Settings sub-menu + exclude_from_explorer = ( + False # or True to exclude pages of this type from Wagtail's explorer view + ) + list_per_page = 20 + list_display = ( + "title", + "get_estatus_display" + ) + + +#class MarkupXMLAdmin(ModelAdmin): +class MarkupXMLViewSet(SnippetViewSet): + model = MarkupXML + #create_view_class = ArticleDocxMarkupCreateView + add_view_class = ArticleDocxMarkupCreateView + edit_view_class = ArticleDocxEditView + menu_label = _("MarkupXML") + menu_icon = "folder" + menu_order = 1 + add_to_settings_menu = False # or True to add your model to the Settings sub-menu + exclude_from_explorer = ( + False # or True to exclude pages of this type from Wagtail's explorer view + ) + + list_display=("title", ) + + + list_per_page = 20 + +""" +class MarkupAdminGroup(ModelAdminGroup): + menu_label = _("Markup") + menu_icon = "folder-open-inverse" + menu_order = 1 + items = (UploadDocxAdmin, MarkupXMLAdmin) + +modeladmin_register(MarkupAdminGroup) +""" + +class CollectionModelCreateView(CreateView): + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + sync_collection_from_api() + return context + + def form_valid(self, form): + form.instance.save() + task_sync_journals_from_api.delay() + return HttpResponseRedirect(self.get_success_url()) + + """ + def get_initial(self): + initial = super().get_initial() + initial["campo"] = "valor inicial dinámico" + return initial + """ + + +class CollectionModelViewSet(SnippetViewSet): + model = CollectionModel + add_view_class = CollectionModelCreateView + menu_label = _("CollectionModel") + menu_icon = "folder" + menu_order = 1 + add_to_settings_menu = False # or True to add your model to the Settings sub-menu + exclude_from_explorer = ( + False # or True to exclude pages of this type from Wagtail's explorer view + ) + list_per_page = 20 + list_display = ( + "collection", + ) + + +class JournalModelCreateView(CreateView): + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + task_sync_journals_from_api + return context + + +class JournalModelViewSet(SnippetViewSet): + model = JournalModel + #add_view_class = JournalModelCreateView + menu_label = _("JournalModel") + menu_icon = "folder" + menu_order = 1 + add_to_settings_menu = False # or True to add your model to the Settings sub-menu + exclude_from_explorer = ( + False # or True to exclude pages of this type from Wagtail's explorer view + ) + list_per_page = 20 + list_display = ( + "title", + ) + + def index_view(self, request): + response = super().index_view(request) + + if isinstance(response, TemplateResponse): + if not CollectionModel.objects.exists(): + messages.warning(request, "Debes seleccionar primero una colección.") + response.context_data["can_add"] = False + response.context_data["can_add_snippet"] = False + return response + + if not JournalModel.objects.exists(): + messages.warning(request, "Sincronizando journals desde la API, espera unos momentos…") + response.context_data["can_add"] = False + response.context_data["can_add_snippet"] = False + return response + + return response + + +class MarkupSnippetViewSetGroup(SnippetViewSetGroup): + menu_name = 'markup_docx' + menu_label = _('Markup Docx') + menu_icon = "folder-open-inverse" + menu_order = get_menu_order('markup_docx') + items = ( + UploadDocxViewSet, + MarkupXMLViewSet, + CollectionModelViewSet, + JournalModelViewSet + ) + + +register_snippet(MarkupSnippetViewSetGroup) \ No newline at end of file diff --git a/markup_doc/xml.py b/markup_doc/xml.py new file mode 100644 index 0000000..d9e1094 --- /dev/null +++ b/markup_doc/xml.py @@ -0,0 +1,864 @@ +from lxml import etree +import re, html, os +from markup_doc.labeling_utils import ( + extract_subsection, + proccess_labeled_text, + proccess_special_content, + append_fragment +) +from wagtail.images import get_image_model +from urllib.parse import urlparse + + +def extract_date(texto): + try: + # Patrón para detectar YYYY-MM-DD, YYYY/MM/DD, DD-MM-YYYY, DD/MM/YYYY + patron_fecha = r'\b(\d{4})[-/](\d{2})[-/](\d{2})\b|\b(\d{2})[-/](\d{2})[-/](\d{4})\b' + + match = re.search(patron_fecha, texto) + if match: + if match.group(1): # Formato YYYY-MM-DD o YYYY/MM/DD + año = match.group(1) + mes = match.group(2).zfill(2) + dia = match.group(3).zfill(2) + else: # Formato DD-MM-YYYY o DD/MM/YYYY + dia = match.group(4).zfill(2) + mes = match.group(5).zfill(2) + año = match.group(6) + return (dia, mes, año) + except: + pass + + return None # No se encontró + + +def get_xml(article_docx, data_front, data, data_back): + # Crear el elemento raíz + nsmap = { + 'mml': 'http://www.w3.org/1998/Math/MathML', + 'xlink': 'http://www.w3.org/1999/xlink' + } + root = etree.Element('article', + nsmap=nsmap, + attrib={ + 'article-type': 'research-article', + 'dtd-version': '1.1', + 'specific-use': 'sps-1.9', + '{http://www.w3.org/XML/1998/namespace}lang': article_docx.language or 'en'} + #'{http://www.w3.org/1998/Math/MathML}mml': 'http://www.w3.org/1998/Math/MathML', + #'{http://www.w3.org/1999/xlink}xlink': 'http://www.w3.org/1999/xlink'} + ) + + # Añadir un elemento hijo + front = etree.SubElement(root, "front") + body = etree.SubElement(root, "body") + back = etree.SubElement(root, "back") + node_reflist = etree.SubElement(back, 'ref-list') + + subsec = None + num_table = 1 + continue_t = False + arr_subarticle = [] + + node = etree.SubElement(front, 'journal-meta') + + if article_docx.acronym: + node_tmp = etree.SubElement(node, 'journal-id') + node_tmp.set('journal-id-type', 'publisher-id') + node_tmp.text = article_docx.acronym + + if article_docx.title_nlm: + node_tmp = etree.SubElement(node, 'journal-id') + node_tmp.set('journal-id-type', 'nlm-ta') + node_tmp.text = article_docx.title_nlm + + node_tmp = etree.SubElement(node, 'journal-title-group') + + if article_docx.journal_title: + node_tmp2 = etree.SubElement(node_tmp, 'journal-title') + node_tmp2.text = article_docx.journal_title + + if article_docx.short_title: + node_tmp2 = etree.SubElement(node_tmp, 'abbrev-journal-title') + node_tmp2.set('abbrev-type', 'publisher') + node_tmp2.text = article_docx.short_title + + if article_docx.pissn: + node_tmp = etree.SubElement(node, 'issn') + node_tmp.set('pub-type', 'ppub') + node_tmp.text = article_docx.pissn + + if article_docx.eissn: + node_tmp = etree.SubElement(node, 'issn') + node_tmp.set('pub-type', 'epub') + node_tmp.text = article_docx.eissn + + node_tmp = etree.SubElement(node, 'publisher') + + if article_docx.pubname: + node_tmp2 = etree.SubElement(node_tmp, 'publisher-name') + node_tmp2.text = article_docx.pubname + + ##### Article Meta + + translates = [] + current_trans = [] + + for block in article_docx.content: + if ( + block.block_type == "paragraph_with_language" + and block.value.get("label") == "" + ): + # Si ya tenemos contenido acumulado, lo guardamos como parte + if current_trans: + translates.append(current_trans) + current_trans = [] + current_trans.append(block) + + if current_trans: + translates.append(current_trans) + + for i, data_t in enumerate(translates): + if i == 0: + node = etree.SubElement(front, 'article-meta') + else: + subarticle = etree.SubElement(root, "sub-article") + arr_subarticle.append(subarticle) + subarticle.attrib['article-type'] = "translation" + subarticle.attrib['id'] = f"S{len(arr_subarticle)}" + subarticle.attrib['{http://www.w3.org/XML/1998/namespace}lang'] = data_t[0].value['language'] + + node = etree.SubElement(subarticle, 'front-stub') + + val = next( + (b.value['paragraph'] for b in data_t + if b.block_type == 'paragraph' and b.value.get('label') == ''), + None + ) + + if val: + node_tmp = etree.SubElement(node, 'article-id') + node_tmp.set('pub-id-type', 'doi') + node_tmp.text = val + + val = next( + (b.value['paragraph'] for b in data_t + if b.block_type == 'paragraph' and b.value.get('label') == ''), + None + ) + + if val: + node_tmp = etree.SubElement(node, 'article-categories') + node_tmp2 = etree.SubElement(node_tmp, 'subj-group') + node_tmp2.set('subj-group-type', 'heading') + node_tmp3 = etree.SubElement(node_tmp2, 'subject') + node_tmp3.text = val + + val = next( + (b.value['paragraph'] for b in data_t + if b.block_type == 'paragraph_with_language' and b.value.get('label') == ''), + None + ) + + if val: + node_tmp = etree.SubElement(node, 'title-group') + node_tmp2 = etree.SubElement(node_tmp, 'article-title') + append_fragment(node_tmp2, val) + + vals = [ + b + for b in data_t + if b.block_type == 'paragraph_with_language' and b.value.get('label') == '' + ] + + for val in vals: + node_tmp2 = etree.SubElement(node_tmp, 'trans-title-group') + node_tmp2.set('{http://www.w3.org/XML/1998/namespace}lang', val.value.get('language')) + node_tmp3 = etree.SubElement(node_tmp2, 'trans-title') + append_fragment(node_tmp3, val.value.get('paragraph')) + + node_tmp = etree.SubElement(node, 'contrib-group') + + vals = [ + b + for b in data_t + if b.block_type == 'author_paragraph' + ] + + for val in vals: + node_tmp2 = etree.SubElement(node_tmp, 'contrib') + node_tmp2.set('contrib-type', 'author') + if val.value.get('orcid'): + node_tmp3 = etree.SubElement(node_tmp2, 'contrib-id') + node_tmp3.set('contrib-id-type', 'orcid') + node_tmp3.text = val.value.get('orcid') + node_tmp3 = etree.SubElement(node_tmp2, 'name') + if val.value.get('surname'): + node_tmp4 = etree.SubElement(node_tmp3, 'surname') + append_fragment(node_tmp4, val.value.get('surname')) + + if val.value.get('given_names'): + node_tmp4 = etree.SubElement(node_tmp3, 'given-names') + append_fragment(node_tmp4, val.value.get('given_names')) + + if val.value.get('affid'): + node_tmp3 = etree.SubElement(node_tmp2, 'xref') + node_tmp3.set('ref-type', 'aff') + node_tmp3.set('rid', f"aff{val.value.get('affid')}") + node_tmp3.text = val.value.get('char') or ('*' * int(val.value.get('affid'))) + + vals = [ + b + for b in data_t + if b.block_type == 'aff_paragraph' + ] + + for val in vals: + node_tmp = etree.SubElement(node, 'aff') + node_tmp.set('id', f"aff{val.value.get('affid')}") + + node_tmp2 = etree.SubElement(node_tmp, 'label') + node_tmp2.text = val.value.get('char') or ('*' * int(val.value.get('affid'))) + + if val.value.get('orgname'): + node_tmp2 = etree.SubElement(node_tmp, 'institution') + node_tmp2.set('content-type', 'orgname') + append_fragment(node_tmp2, val.value.get('orgname')) + + if val.value.get('orgdiv1'): + node_tmp2 = etree.SubElement(node_tmp, 'institution') + node_tmp2.set('content-type', 'orgdiv1') + append_fragment(node_tmp2, val.value.get('orgdiv1')) + + if val.value.get('orgdiv2'): + node_tmp2 = etree.SubElement(node_tmp, 'institution') + node_tmp2.set('content-type', 'orgdiv2') + append_fragment(node_tmp2, val.value.get('orgdiv2')) + + node_tmp2 = etree.SubElement(node_tmp, 'addr-line') + + if val.value.get('city'): + node_tmp3 = etree.SubElement(node_tmp2, 'city') + append_fragment(node_tmp3, val.value.get('city')) + + if val.value.get('state'): + node_tmp3 = etree.SubElement(node_tmp2, 'state') + append_fragment(node_tmp3, val.value.get('state')) + + if val.value.get('country'): + node_tmp2 = etree.SubElement(node_tmp, 'country') + node_tmp2.set('country', val.value.get('code_country')) + append_fragment(node_tmp2, val.value.get('code_country')) + + node_tmp = etree.SubElement(node, 'author-notes') + + for val in vals: + + if val.value.get('text_aff'): + node_tmp2 = etree.SubElement(node_tmp, 'fn') + node_tmp2.set('fn-type', 'other') + node_tmp2.set('id', f"fn{val.value.get('affid')}") + + node_tmp3 = etree.SubElement(node_tmp2, 'label') + node_tmp3.text = val.value.get('char') or ('*' * int(val.value.get('affid'))) + + node_tmp3 = etree.SubElement(node_tmp2, 'p') + append_fragment(node_tmp3, val.value.get('text_aff')) + + if article_docx.artdate: + node_tmp = etree.SubElement(node, 'pub-date') + node_tmp.set('date-type', 'pub') + node_tmp.set('publication-format', 'electronic') + + node_tmp2 = etree.SubElement(node_tmp, 'day') + node_tmp2.text = article_docx.artdate.strftime("%d") + + node_tmp2 = etree.SubElement(node_tmp, 'month') + node_tmp2.text = article_docx.artdate.strftime("%m") + + node_tmp2 = etree.SubElement(node_tmp, 'year') + node_tmp2.text = article_docx.artdate.strftime("%Y") + + if article_docx.dateiso: + node_tmp = etree.SubElement(node, 'pub-date') + node_tmp.set('date-type', 'collection') + node_tmp.set('publication-format', 'electronic') + + if article_docx.dateiso.split('-')[2] and article_docx.dateiso.split('-')[2] != '00': + node_tmp2 = etree.SubElement(node_tmp, 'day') + node_tmp2.text = article_docx.dateiso.split('-')[2] + + if article_docx.dateiso.split('-')[1] and article_docx.dateiso.split('-')[1] != '00': + node_tmp2 = etree.SubElement(node_tmp, 'month') + node_tmp2.text = article_docx.dateiso.split('-')[1] + + node_tmp2 = etree.SubElement(node_tmp, 'year') + node_tmp2.text = article_docx.dateiso.split('-')[0] + + if article_docx.vol: + node_tmp = etree.SubElement(node, 'volume') + node_tmp.text = str(article_docx.vol) + + if article_docx.issue: + node_tmp = etree.SubElement(node, 'issue') + node_tmp.text = str(article_docx.issue) + + if article_docx.elocatid: + node_tmp = etree.SubElement(node, 'elocation-id') + node_tmp.text = article_docx.elocatid + + node_tmp = etree.SubElement(node, 'history') + + val = next( + (b.value['paragraph'] for b in data_t + if b.block_type == 'paragraph' and b.value.get('label') == ''), + None + ) + + date = extract_date(val) + + if date: + node_tmp2 = etree.SubElement(node_tmp, 'date') + node_tmp2.set('date-type', 'received') + + node_tmp3 = etree.SubElement(node_tmp2, 'day') + node_tmp3.text = date[0] + + node_tmp3 = etree.SubElement(node_tmp2, 'month') + node_tmp3.text = date[1] + + node_tmp3 = etree.SubElement(node_tmp2, 'year') + node_tmp3.text = date[2] + + val = next( + (b.value['paragraph'] for b in data_t + if b.block_type == 'paragraph' and b.value.get('label') == ''), + None + ) + + date = extract_date(val) + + if date: + node_tmp2 = etree.SubElement(node_tmp, 'date') + node_tmp2.set('date-type', 'accepted') + + node_tmp3 = etree.SubElement(node_tmp2, 'day') + node_tmp3.text = date[0] + + node_tmp3 = etree.SubElement(node_tmp2, 'month') + node_tmp3.text = date[1] + + node_tmp3 = etree.SubElement(node_tmp2, 'year') + node_tmp3.text = date[2] + + node_tmp = etree.SubElement(node, 'permissions') + + if article_docx.license: + node_tmp2 = etree.SubElement(node_tmp, 'license') + node_tmp2.set('license-type', 'open-access') + node_tmp2.set("{http://www.w3.org/1999/xlink}href", article_docx.license) + node_tmp2.set("{http://www.w3.org/XML/1998/namespace}lang", article_docx.language) + + node_tmp3 = etree.SubElement(node_tmp2, 'license-p') + node_tmp3.text = "Este es un artículo con licencia..." + + vals = [ + b + for b in data_t + if b.block_type == 'paragraph' + and b.value.get('label') == '' + ] + + vals2 = [ + b + for b in data_t + if b.block_type == 'paragraph_with_language' + and b.value.get('label') == '' + ] + + node_tmp = etree.SubElement(node, 'abstract') + + if vals[0]: + node_tmp2 = etree.SubElement(node_tmp, 'title') + append_fragment(node_tmp2, vals[0].value.get('paragraph')) + + if vals2[0]: + + # Encuentra su índice original en article_docx.content + last_index = data_t.index(vals2[0]) + + # Recorre los bloques siguientes + following_paragraphs = [] + for block in data_t[last_index:]: + if (block.block_type == 'paragraph' and block.value.get('label') == '

    ') or (block.block_type == 'paragraph_with_language' and block.value.get('label') == ''): + subsection = extract_subsection(block.value.get('paragraph')) + + if subsection['title']: + node_tmp2 = etree.SubElement(node_tmp, 'sec') + node_tmp3 = etree.SubElement(node_tmp2, 'title') + append_fragment(node_tmp3, subsection['title']) + node_tmp3 = etree.SubElement(node_tmp2, 'p') + append_fragment(node_tmp3, subsection['content']) + else: + node_tmp2 = etree.SubElement(node_tmp, 'p') + append_fragment(node_tmp2, subsection['content']) + else: + break + + for i, val in enumerate(vals[1:], start=1): + node_tmp = etree.SubElement(node, 'trans-abstract') + node_tmp.set("{http://www.w3.org/XML/1998/namespace}lang", vals2[i].value.get('language')) + + node_tmp2 = etree.SubElement(node_tmp, 'title') + append_fragment(node_tmp2, val.value.get('paragraph')) + + last_index = data_t.index(vals2[i]) + + # Recorre los bloques siguientes + following_paragraphs = [] + for block in data_t[last_index:]: + if (block.block_type == 'paragraph' and block.value.get('label') == '

    ') or (block.block_type == 'paragraph_with_language' and block.value.get('label') == ''): + subsection = extract_subsection(block.value.get('paragraph')) + + if subsection['title']: + node_tmp2 = etree.SubElement(node_tmp, 'sec') + node_tmp3 = etree.SubElement(node_tmp2, 'title') + append_fragment(node_tmp3, subsection['title']) + node_tmp3 = etree.SubElement(node_tmp2, 'p') + append_fragment(node_tmp3, subsection['content']) + else: + node_tmp2 = etree.SubElement(node_tmp, 'p') + append_fragment(node_tmp2, subsection['content']) + else: + break + + vals = [ + b + for b in data_t + if b.block_type == 'paragraph' + and b.value.get('label') == '' + ] + + vals2 = [ + b + for b in data_t + if b.block_type == 'paragraph_with_language' + and b.value.get('label') == '' + ] + + for i, val in enumerate(vals): + node_tmp = etree.SubElement(node, 'kwd-group') + node_tmp.set("{http://www.w3.org/XML/1998/namespace}lang", vals2[i].value.get('language')) + + node_tmp2 = etree.SubElement(node_tmp, 'title') + append_fragment(node_tmp2, val.value.get('paragraph')) + #node_tmp2.text = val.value.get('paragraph') + + for kw in vals2[i].value.get('paragraph').split(', '): + node_tmp2 = etree.SubElement(node_tmp, 'kwd') + append_fragment(node_tmp2, kw) + + countFN = 0 + for i, d in enumerate(data): + node = body + + if continue_t: + continue_t = False + continue + + if d['value']['label'] == '': + val_p = d['value']['paragraph'].lower() + attrib={} + if re.search(r"^(intro|sinops|synops)", val_p): + attrib={'sec-type': 'intro'} + elif re.search(r"^(caso|case)", val_p): + attrib={'sec-type': 'cases'} + elif re.search(r"^(conclus|comment|coment)", val_p): + attrib={'sec-type': 'conclusions'} + elif re.search(r"^(discus)", val_p): + attrib={'sec-type': 'discussion'} + elif re.search(r"^(materia)", val_p): + attrib={'sec-type': 'materials'} + elif re.search(r"^(proced|method|métod|metod)", val_p): + attrib={'sec-type': 'methods'} + elif re.search(r"^(result|statement|finding|declara|hallaz)", val_p): + attrib={'sec-type': 'results'} + elif re.search(r"^(subject|participant|patient|pacient|assunt|sujeto)", val_p): + attrib={'sec-type': 'subjects'} + elif re.search(r"^(suplement|material)", val_p): + attrib={'sec-type': 'supplementary-material'} + + node = etree.SubElement(body, 'sec', attrib=attrib) + node_title = etree.SubElement(node, 'title') + append_fragment(node_title, d['value']['paragraph']) + + subsec = False + + if d['value']['label'] == '': + subsec = True + node_sec = etree.SubElement(node, 'sec') + node_title = etree.SubElement(node_sec, 'title') + #if re.search(r'^\[style name="italic"\](.*?)\[/style\]$', d['value']['paragraph']): + if re.search(r'^(.*?)$', d['value']['paragraph']): + #sech = d['value']['paragraph'].replace('[style name="italic"]', '').replace('[/style]', '') + sech = d['value']['paragraph'] + node_subtitle = etree.SubElement(node_title, 'italic') + append_fragment(node_subtitle, sech) + #node_subtitle.text = sech + else: + #node_title.text = d['value']['paragraph'].replace('[style name="italic"]', '').replace('[/style]', '') + pass + + if d['value']['label'] == '': + re_search = re.search(r'list list-type="(.*?)"\]', d['value']['paragraph']) + list_type = re_search.group(1) + attrib={'list-type': list_type} + + if subsec: + node_p = etree.SubElement(node_sec, 'p') + node_list = etree.SubElement(node_p, 'list', attrib=attrib) + else: + node_p = etree.SubElement(node, 'p') + node_list = etree.SubElement(node_p, 'list', attrib=attrib) + + content_list = re.search(r'\[list list-type="[^"]*"\](.*?)\[/list\]', d['value']['paragraph'], re.DOTALL) + content_list = content_list.group(1) + node_list_text = content_list \ + .replace('[list-item]', '

    ') \ + .replace('[/list-item]', '

    ') + #.replace('[style name="italic"]', '').replace('[/style]', '') \ + + node_list_text = etree.fromstring(f"{node_list_text}") + + for child in node_list_text: + node_list.append(child) + + if d['value']['label'] == '' or d['value']['label'] == '': + + attrib={'id': d['value']['tabid']} + + if subsec: + node_p = etree.SubElement(node_sec, 'p') + node_table = etree.SubElement(node_p, 'table-wrap', attrib=attrib) + else: + node_p = etree.SubElement(node, 'p') + node_table = etree.SubElement(node_p, 'table-wrap', attrib=attrib) + + node_label = etree.SubElement(node_table, 'label') + append_fragment(node_label, d.get('value', {}).get('tablabel')) + + node_caption = etree.SubElement(node_table, 'caption') + node_title = etree.SubElement(node_caption, 'title') + append_fragment(node_title, d.get('value', {}).get('title')) + + node_table_text = d['value']['content'] + + # Quitar saltos de línea y espacios extra + node_table_text = re.sub(r"\s*\n\s*", "", node_table_text).replace('
    ','') + + # Parsear la tabla como fragmento XML/HTML + tabla_element = etree.XML(node_table_text) + + # Insertar en el XML principal + node_table.append(tabla_element) + + node_foot = etree.SubElement(node_p, 'table-wrap-foot') + + if d['value']['label'] == '': + countFN += 1 + node_fn = etree.SubElement(node_foot, 'fn', attrib={"id":f"TFN{str(countFN)}"}) + node_fnp = etree.SubElement(node_fn, 'p') + append_fragment(node_fnp, d['value']['paragraph']) + + if d['value']['label'] == '': + + attrib={'id': d['value']['figid']} + + if subsec: + node_p = etree.SubElement(node_sec, 'p') + node_fig = etree.SubElement(node_p, 'fig', attrib=attrib) + else: + node_p = etree.SubElement(node, 'p') + node_fig = etree.SubElement(node_p, 'fig', attrib=attrib) + + etree.SubElement(node_fig, 'label').text = d['value']['figlabel'] + node_caption = etree.SubElement(node_fig, 'caption') + etree.SubElement(node_caption, 'title').text = d['value']['title'] if 'title' in d['value'] else None + + Image = get_image_model() + image_id = d['value']['image'] + image_obj = Image.objects.get(pk=image_id) + file_name = os.path.basename(image_obj.file.name) + original_url = image_obj.get_rendition('original').url + original_filename = os.path.basename(urlparse(original_url).path) + + #node_caption = etree.SubElement(node_fig, 'graphic', attrib={'{http://www.w3.org/1999/xlink}ref': f"{d['value']['figid']}.jpeg"}) + node_caption = etree.SubElement(node_fig, 'graphic', attrib={'{http://www.w3.org/1999/xlink}href': original_filename}) + + if d['value']['label'] == '': + + node_attrib = etree.SubElement(node_fig, 'attrib') + append_fragment(node_attrib, d['value']['paragraph']) + + if d['value']['label'] == '': + attrib={'id': d['value']['eid']} + + if subsec: + node_p = etree.SubElement(node_sec, 'p') + node_f = etree.SubElement(node_p, 'disp-formula', attrib=attrib) + else: + node_p = etree.SubElement(node, 'p') + node_f = etree.SubElement(node_p, 'disp-formula', attrib=attrib) + + + for c in d['value']['content']: + if c['type'] == 'text': + node_t = etree.SubElement(node_f, 'label') + append_fragment(node_t, c['value']) + if c['type'] == 'formula': + append_fragment(node_f, c['value']) + + if d['value']['label'] == '': + attrib={'id': d['value']['eid']} + + if subsec: + node_p = etree.SubElement(node_sec, 'p') + else: + node_p = etree.SubElement(node, 'p') + + content = '' + for c in d['value']['content']: + if c['type'] == 'text': + content += c['value'] + if c['type'] == 'formula': + node_f = etree.Element('inline-formula', attrib=attrib) + append_fragment(node_f, c['value']) + content += etree.tostring(node_f, pretty_print=True, encoding="unicode") + + append_fragment(node_p, content) + + if d['value']['label'] == '

    ': + if subsec: + node_p = etree.SubElement(node_sec, 'p') + else: + node_p = etree.SubElement(node, 'p') + + #refs = extraer_citas_apa(d['value']['paragraph'].replace('[style name="italic"]', '').replace('[/style]', ''), data_back) + #refs = extraer_citas_apa(d['value']['paragraph'].replace('', '').replace('', ''), data_back) + if 'xref' not in d['value']['paragraph']: + refs = proccess_labeled_text(d['value']['paragraph'], data_back) + for r in refs: + #print(f"r in refs: {r}") + d['value']['paragraph'] = d['value']['paragraph'].replace(r['cita'], f"{r['cita']}") + """ + if 'et al' in r['cita']: + et_al_replace = r['cita'].replace('et al', 'et al') + d['value']['paragraph'] = d['value']['paragraph'].replace(et_al_replace, f"{et_al_replace}") + else: + #print(r['cita']) + d['value']['paragraph'] = d['value']['paragraph'].replace(r['cita'], f"{r['cita']}") + """ + + elements = proccess_special_content(d['value']['paragraph'], data) + for e in elements: + d['value']['paragraph'] = d['value']['paragraph'].replace(e['label'], f"{e['label']}") + + append_fragment(node_p, d['value']['paragraph']) + + #if re.search(r'^\[style name="italic"\](.*?)\[/style\]$', d['value']['paragraph']): + #if re.search(r'^(.*?)$', d['value']['paragraph']): + # node_title.text = '' + #ph = d['value']['paragraph'].replace('', '').replace('', '') + #node_subtitle = etree.SubElement(node_title, 'italic') + #node_subtitle.text = ph + #node_subtitle = etree.fromstring(f"{d['value']['paragraph']}") + #for child in node_subtitle: + # node_title.append(child) + #else: + #node_p.text = d['value']['paragraph'].replace('[style name="italic"]', '').replace('[/style]', '') + #p_text = d['value']['paragraph'].replace('[style name="italic"]', '').replace('[/style]', '') + # append_fragment(node_p, d['value']['paragraph']) + #node_p.text = d['value']['paragraph'].replace('[style name="italic"]', '').replace('[/style]', '') + #p_text = d['value']['paragraph'] + #try: + #node_text = etree.fromstring(f"{p_text}") + #for child in node_text: + #node_p.append(child) + #except Exception as e: + #print(p_text) + #print(e) + + if d['value']['label'] == '': + if subsec: + node_p = etree.SubElement(node_sec, 'p') + else: + node_p = etree.SubElement(node, 'p') + + p_text = '' + if 'content' in d['value']: + for val in d['value']['content']: + if val['type'] == 'text': + type_val = 'text' + else: + type_val = 'formula' + + #if re.search(r'^\[style name="italic"\](.*?)\[/style\]$', val['value']): + if re.search(r'^(.*?)$', val['value']): + node_title.text = '' + #ph = val['value'].replace('[style name="italic"]', '').replace('[/style]', '') + ph = val['value'] + node_subtitle = etree.fromstring(f"{ph}") + for child in node_subtitle: + node_title.append(child) + else: + #p_text += val['value'].replace('[style name="italic"]', '').replace('[/style]', '').replace('xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"', '') + p_text += val['value'].replace('xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"', '') + + node_text = etree.fromstring(f"{p_text}") + for child in node_text: + node_p.append(child) + + for i, d in enumerate(data_back): + if d['value']['label'] == '': + node_tit = etree.SubElement(node_reflist, 'title') + append_fragment(node_tit, d['value']['paragraph']) + if d['value']['label'] == '

    ': + values = d['value'] + node_ref = etree.SubElement(node_reflist, 'ref', attrib={"id": values['refid']}) + #node_label = etree.SubElement(node_ref, 'label') + #append_fragment(node_label, values['refid'].replace('B', '')) + node_mix = etree.SubElement(node_ref, 'mixed-citation') + append_fragment(node_mix, values['paragraph']) + + if values['reftype'] == 'journal': + node_elem = etree.SubElement(node_ref, 'element-citation', attrib={"publication-type": values['reftype']}) + node_person = etree.SubElement(node_elem, 'person-group', attrib={"person-group-type": "author"}) + for a in values['authors']: + node_name = etree.SubElement(node_person, 'name') + node_sname = etree.SubElement(node_name, 'surname') + node_gname = etree.SubElement(node_name, 'given-names') + append_fragment(node_sname, a['value']['surname']) + append_fragment(node_gname, a['value']['given_names']) + + append_fragment(etree.SubElement(node_ref, 'article-title'), values['title']) + append_fragment(etree.SubElement(node_ref, 'source'), values['source']) + append_fragment(etree.SubElement(node_ref, 'year'), str(values['date'])) + append_fragment(etree.SubElement(node_ref, 'volume'), str(values['vol'])) + append_fragment(etree.SubElement(node_ref, 'issue'), str(values['issue'])) + + if values['fpage'] and values['fpage'][0] == 'e': + append_fragment(etree.SubElement(node_ref, 'elocation-id'), values['fpage']) + else: + append_fragment(etree.SubElement(node_ref, 'fpage'), str(values['fpage'])) + append_fragment(etree.SubElement(node_ref, 'lpage'), str(values['lpage'])) + + append_fragment(etree.SubElement(node_ref, 'pub-id', attrib={"pub-id-type": "doi"}), values['doi']) + + if values['uri']: + append_fragment(etree.SubElement(node_ref, 'ext-link', + attrib={ + "ext-link-type": "uri", + "{http://www.w3.org/1999/xlink}href": values['uri'] + }), + values['uri']) + + if values['reftype'] == 'book': + node_elem = etree.SubElement(node_ref, 'element-citation', attrib={"publication-type": values['reftype']}) + node_person = etree.SubElement(node_elem, 'person-group', attrib={"person-group-type": "author"}) + for a in values['authors']: + node_name = etree.SubElement(node_person, 'name') + node_sname = etree.SubElement(node_name, 'surname') + node_gname = etree.SubElement(node_name, 'given-names') + append_fragment(node_sname, a['value']['surname']) + append_fragment(node_gname, a['value']['given_names']) + + append_fragment(etree.SubElement(node_ref, 'part-title'), values['chapter']) + append_fragment(etree.SubElement(node_ref, 'source'), values['source']) + append_fragment(etree.SubElement(node_ref, 'edition'), values['edition']) + append_fragment(etree.SubElement(node_ref, 'publisher-loc'), values['location']) + append_fragment(etree.SubElement(node_ref, 'publisher-name'), values['organization']) + append_fragment(etree.SubElement(node_ref, 'year'), str(values['date'])) + append_fragment(etree.SubElement(node_ref, 'fpage'), str(values['fpage'])) + append_fragment(etree.SubElement(node_ref, 'lpage'), str(values['lpage'])) + + + if values['reftype'] == 'data': + node_elem = etree.SubElement(node_ref, 'element-citation', attrib={"publication-type": values['reftype']}) + node_person = etree.SubElement(node_elem, 'person-group', attrib={"person-group-type": "author"}) + for a in values['authors']: + node_name = etree.SubElement(node_person, 'name') + node_sname = etree.SubElement(node_name, 'surname') + node_gname = etree.SubElement(node_name, 'given-names') + append_fragment(node_sname, a['value']['surname']) + append_fragment(node_gname, a['value']['given_names']) + + append_fragment(etree.SubElement(node_ref, 'data-title'), values['title']) + append_fragment(etree.SubElement(node_ref, 'version'), values['version']) + append_fragment(etree.SubElement(node_ref, 'year'), str(values['date'])) + append_fragment(etree.SubElement(node_ref, 'source'), values['source']) + append_fragment(etree.SubElement(node_ref, 'pub-id', attrib={"pub-id-type": "doi"}), values['doi']) + append_fragment(etree.SubElement(node_ref, 'ext-link', + attrib={ + "ext-link-type": "uri", + "{http://www.w3.org/1999/xlink}href": values['uri'] + }), + values['uri']) + + if values['reftype'] == 'webpage': + node_elem = etree.SubElement(node_ref, 'element-citation', attrib={"publication-type": values['reftype']}) + node_person = etree.SubElement(node_elem, 'person-group', attrib={"person-group-type": "author"}) + for a in values['authors']: + node_name = etree.SubElement(node_person, 'name') + node_sname = etree.SubElement(node_name, 'surname') + node_gname = etree.SubElement(node_name, 'given-names') + append_fragment(node_sname, a['value']['surname']) + append_fragment(node_gname, a['value']['given_names']) + + append_fragment(etree.SubElement(node_ref, 'source'), values['source']) + append_fragment(etree.SubElement(node_ref, 'ext-link', + attrib={ + "ext-link-type": "uri", + "{http://www.w3.org/1999/xlink}href": values['uri'] + }), + values['uri']) + append_fragment(etree.SubElement(node_ref, 'access-date'), values['access_date']) + + if values['reftype'] == 'confproc': + node_elem = etree.SubElement(node_ref, 'element-citation', attrib={"publication-type": values['reftype']}) + node_person = etree.SubElement(node_elem, 'person-group', attrib={"person-group-type": "author"}) + for a in values['authors']: + node_name = etree.SubElement(node_person, 'name') + node_sname = etree.SubElement(node_name, 'surname') + node_gname = etree.SubElement(node_name, 'given-names') + append_fragment(node_sname, a['value']['surname']) + append_fragment(node_gname, a['value']['given_names']) + + append_fragment(etree.SubElement(node_ref, 'source'), values['source']) + append_fragment(etree.SubElement(node_ref, 'conf-name'), values['title']) + append_fragment(etree.SubElement(node_ref, 'conf-num'), str(values['issue'])) + append_fragment(etree.SubElement(node_ref, 'conf-date'), str(values['date'])) + append_fragment(etree.SubElement(node_ref, 'conf-loc'), values['location']) + append_fragment(etree.SubElement(node_ref, 'publisher-loc'), values['org_location']) + append_fragment(etree.SubElement(node_ref, 'publisher-name'), values['organization']) + append_fragment(etree.SubElement(node_ref, 'page'), values['pages']) + + if values['reftype'] == 'thesis': + node_elem = etree.SubElement(node_ref, 'element-citation', attrib={"publication-type": values['reftype']}) + node_person = etree.SubElement(node_elem, 'person-group', attrib={"person-group-type": "author"}) + for a in values['authors']: + node_name = etree.SubElement(node_person, 'name') + node_sname = etree.SubElement(node_name, 'surname') + node_gname = etree.SubElement(node_name, 'given-names') + append_fragment(node_sname, a['value']['surname']) + append_fragment(node_gname, a['value']['given_names']) + + append_fragment(etree.SubElement(node_ref, 'source'), values['source']) + append_fragment(etree.SubElement(node_ref, 'publisher-loc'), values['org_location']) + append_fragment(etree.SubElement(node_ref, 'publisher-name'), values['organization']) + append_fragment(etree.SubElement(node_ref, 'year'), str(values['date'])) + append_fragment(etree.SubElement(node_ref, 'page'), values['pages']) + + # Convertir a una cadena XML + xml_como_texto = etree.tostring(root, pretty_print=True, encoding="unicode") + + return xml_como_texto, data \ No newline at end of file From 58cc438eb296abf8c294dc21cf5a2e8e717a29a2 Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:35:24 -0600 Subject: [PATCH 12/43] =?UTF-8?q?Nueva=20librer=C3=ADa=20markuplib:=20func?= =?UTF-8?q?iones=20para=20procesar=20DOCX=20y=20transformaciones=20OMML=20?= =?UTF-8?q?a=20MathML?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- markuplib/__init__.py | 0 markuplib/function_docx.py | 589 ++++++++++ markuplib/omml2mml.xsl | 2068 ++++++++++++++++++++++++++++++++++++ 3 files changed, 2657 insertions(+) create mode 100644 markuplib/__init__.py create mode 100644 markuplib/function_docx.py create mode 100644 markuplib/omml2mml.xsl diff --git a/markuplib/__init__.py b/markuplib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/markuplib/function_docx.py b/markuplib/function_docx.py new file mode 100644 index 0000000..bfdb958 --- /dev/null +++ b/markuplib/function_docx.py @@ -0,0 +1,589 @@ +import docx +from docx.oxml.table import CT_Tbl +from docx.oxml.text.paragraph import CT_P +from docx.oxml.ns import qn +from lxml import etree, objectify +from wagtail.images import get_image_model +from django.core.files.base import ContentFile +import re, zipfile +import os + +ImageModel = get_image_model() + + +class functionsDocx: + + def openDocx(filename): + doc = docx.Document(filename) + return doc + + # Función: solo reemplaza mfenced que NO tengan atributos open/close y que usen | + def replace_mfenced_pipe_only(self, mathml_root): + mml_ns = "http://www.w3.org/1998/Math/MathML" + for mfenced in mathml_root.xpath(".//mml:mfenced", namespaces={"mml": mml_ns}): + has_open = mfenced.get("open") + has_close = mfenced.get("close") + separators = mfenced.get("separators", "") + + # Solo reemplazar si: no tiene open/close y usa barra + if not has_open and not has_close and separators == "|": + mrow = etree.Element(f"{{{mml_ns}}}mrow") + + mo_open = etree.Element(f"{{{mml_ns}}}mo") + mo_open.text = "(" + mo_close = etree.Element(f"{{{mml_ns}}}mo") + mo_close.text = ")" + + mrow.append(mo_open) + for child in list(mfenced): + mrow.append(child) + mrow.append(mo_close) + + parent = mfenced.getparent() + if parent is not None: + parent.replace(mfenced, mrow) + return mathml_root + + + def extract_numbering_info(self, docx_path): + # Diccionario para mapear numId a su tipo (numerada o viñeta) + numbering_map = {} + namespaces = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}' + + # Abrir el archivo DOCX como un archivo ZIP + with zipfile.ZipFile(docx_path, 'r') as docx: + # Verificar si existe el archivo numbering.xml + if 'word/numbering.xml' in docx.namelist(): + # Extraer el archivo numbering.xml + numbering_xml = docx.read('word/numbering.xml') + # Parsear el XML + numbering_tree = etree.fromstring(numbering_xml) + + # Buscar todas las definiciones abstractas de numeración + for abstract_num in numbering_tree.findall('.//w:abstractNum', namespaces=numbering_tree.nsmap): + abstract_num_id = abstract_num.get(namespaces+'abstractNumId') + # Revisar los niveles dentro de la definición abstracta + for lvl in abstract_num.findall('.//w:lvl', namespaces=abstract_num.nsmap): + num_fmt = lvl.find('.//w:numFmt', lvl.nsmap).get(namespaces+'val') + ilvl = lvl.get(namespaces+'ilvl') + + # Asignar el tipo según el valor de numFmt + if abstract_num_id not in numbering_map: + numbering_map[abstract_num_id] = {} + + numbering_map[abstract_num_id][ilvl] = num_fmt + + # Relacionar numId con su abstractNumId + for num in numbering_tree.findall('.//w:num', namespaces=numbering_tree.nsmap): + num_id = num.get(namespaces+'numId') + abstract_num_id = num.find('.//w:abstractNumId', namespaces=num.nsmap).get(namespaces+'val') + if abstract_num_id in numbering_map: + numbering_map[abstract_num_id]['numId'] = num_id + else: + numbering_map = None + + return numbering_map + + + def extract_hiperlinks_info(self, docx_path): + hiperlinks = [] + with zipfile.ZipFile(docx_path, 'r') as docx: + # Leer relaciones del documento + rels_path = 'word/_rels/document.xml.rels' + if rels_path in docx.namelist(): + rels_data = docx.read(rels_path) + rels_root = etree.fromstring(rels_data) + + # Buscar hipervínculos + for rel in rels_root.findall('{http://schemas.openxmlformats.org/package/2006/relationships}Relationship'): + r_id = rel.attrib['Id'] + target = rel.attrib['Target'] + if rel.attrib['Type'].endswith('/hyperlink'): + hiperlinks.append((r_id, target)) + + return dict(hiperlinks) + + + def extract_hiperlink(self, element, rels_map, namespaces): + links = [] + + # 1. Buscar hipervínculos de texto (recursivo con .//) + for hyperlink in element.findall('.//w:hyperlink', namespaces=namespaces): + r_id = hyperlink.attrib.get('{http://schemas.openxmlformats.org/officeDocument/2006/relationships}id') + if r_id and r_id in rels_map: + links.append(rels_map[r_id]) + + # 2. Buscar hipervínculos en imágenes (recursivo con .//) + for hlink in element.findall('.//a:hlinkClick', namespaces=namespaces): + r_id = hlink.attrib.get('{http://schemas.openxmlformats.org/officeDocument/2006/relationships}id') + if r_id and r_id in rels_map: + links.append(rels_map[r_id]) + + print("*********************************") + print(links) + return ' '.join(links) if links else None + + + def extractContent(self, doc, doc_path): + + list_types = self.extract_numbering_info(doc_path) + + hiperlinks_info = self.extract_hiperlinks_info(doc_path) + + found_hiperlinks = True + + # Obtener el directorio actual del archivo .py + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + + # Construir la ruta completa al archivo XSLT + xslt_path = os.path.join(BASE_DIR, "omml2mml.xsl") + + # Cargar XSLT y prepararlo + xslt = etree.parse(xslt_path) + transform = etree.XSLT(xslt) + + def match_paragraph(text): + keywords = r'(?im)^\s*(?:)?\s*(palabra(?:s)?\s*clave|palavras?\s*-?\s*chave|keywords?)\s*(?:)?\s*(?::|\s*:\s*)\s*(.+)$' + #history = r'\d{2}/\d{2}/\d{4}' + #corresp = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' + abstract = r'(?i)^resumen|^resumo|^abstract' + accepted = r'(?i)aceptado|accepted|aceited|aprovado' + received = r'(?i)recibido|received|recebido' + + if re.search(keywords, text): + return '' + #if re.search(history, text): + #return '' + #if re.search(corresp, text): + #return '' + if re.search(abstract, text): + return '' + if re.search(accepted, text): + return '' + if re.search(received, text): + return '' + return False + + def matches_section(a, b): + try: + return ( + a.get('size') == b.get('size') and + a.get('bold') == b.get('bold') and + a.get('isupper') == b.get('isupper') + ) + except Exception as e: + print(f"Error comparando secciones: {e}") + return False + + def section_priority(sections): + return (-sections['size'], not sections['bold'], not sections['isupper']) + + def identify_section(sections, size, bold, text): + if size == 0: + return sections + + isupper = text.isupper() + s_id = {'size': size, 'bold': bold, 'isupper': isupper, 'count': 0} + + if len(sections) == 0: + sections.append(s_id) + return sections + + for section in sections: + if matches_section(s_id, section): + section['count'] += 1 + return sections + + sections.append(s_id) + return sections + + def clean_labels(text): + # Eliminar etiquetas cuadradas tipo [ ... ] con espacios opcionales + extract_label = re.sub(r'\[\s*/?\s*[\w-]+(?:\s+[^\]]+)?\s*\]', '', text) + + # Reemplazar múltiples espacios por uno solo + clean_text = re.sub(r'\s+', ' ', extract_label) + + # Eliminar espacio antes de signos de puntuación + clean_text = re.sub(r'\s+([;:,.])', r'\1', clean_text) + + return clean_text.strip() + + def extrae_Tabla(element, rels_map, namespaces): + # Inicializa la estructura HTML de la tabla + html = "

    \n" + + # Almacena las combinaciones para las celdas + rowspan_dict = {} # {(row, col): rowspan_count} + colspan_dict = {} # {(row, col): colspan_count} + + # Itera sobre las filas de la tabla + for i, row in enumerate(element.xpath('.//w:tr')): + hiperlinks = self.extract_hiperlink(row, rels_map, namespaces) if found_hiperlinks else None + + html += " \n" + # Itera sobre las celdas de cada fila + j = 0 # índice de columna + for cell in row.xpath('.//w:tc'): + # Revisa si la celda está en una posición afectada por rowspan + while (i, j) in rowspan_dict and rowspan_dict[(i, j)] > 0: + # Reduce el contador de rowspan + rowspan_dict[(i, j)] -= 1 + j += 1 # Mueve a la siguiente columna + + # Revisa las propiedades de la celda para rowspan y colspan + cell_props = cell.xpath('.//w:tcPr') + rowspan = 1 + colspan = 1 + + # Procesa rowspan (vMerge) + v_merge_fin = False + v_merge = cell.xpath('.//w:vMerge') + if v_merge: + v_merge_val = v_merge[0].get(qn('w:val')) + if v_merge_val == "restart": + # Es el inicio de una combinación vertical + rowspan = 1 + # Busca el total de filas combinadas contando hacia abajo + k = i + 1 + while k < len(element.xpath('.//w:tr')): + try: + next_cell = element.xpath('.//w:tr')[k].xpath('.//w:tc')[j] + next_merge = next_cell.xpath('.//w:tcPr//w:vMerge') + except: + next_cell = None + next_merge = None + + if next_merge and next_merge[0].get(qn('w:val')) is None: + rowspan += 1 + else: + break + k += 1 + + for k in range(rowspan): + rowspan_dict[(i + k, j)] = rowspan - k - 1 + else: + v_merge_fin = True + + # Procesa colspan (gridSpan) + grid_span = cell.xpath('.//w:gridSpan') + if grid_span: + colspan = int(grid_span[0].get(qn('w:val'))) + for k in range(colspan): + colspan_dict[(i, j + k)] = colspan - k - 1 + + if not v_merge_fin: + # Obtén el contenido del texto de la celda + cell_text = "
    ".join([t.text for t in cell.xpath('.//w:t')]) + cell_text = clean_labels(cell_text) + (f" {hiperlinks}" if hiperlinks else "") + + # Determina el tag a usar (th para el encabezado, td para celdas normales) + tag = "th" if i == 0 else "td" + + # Construye la celda en HTML + cell_html = f" <{tag}" + if rowspan > 1: + cell_html += f' rowspan="{rowspan}"' + if colspan > 1: + cell_html += f' colspan="{colspan}"' + cell_html += f">{cell_text}\n" + + html += cell_html + j += 1 + (colspan - 1) # Avanza las columnas tomando en cuenta el colspan + + html += " \n" + + html += "
    " + return html + + content = [] + sections = [] + images = [] + found_fb = False + review_fb = True + #Palabras a buscar como indicador del primer bloque + start_text = ['introducción', 'introduction', 'introdução'] + + current_list = [] + current_num_id = None + numId = None + namespaces_p = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}' + + for element in doc.element.body: + if isinstance(element, CT_P): + obj = {} + + namespaces = { + 'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main', + 'a': 'http://schemas.openxmlformats.org/drawingml/2006/main', + 'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships' + } + + hiperlinks = self.extract_hiperlink(element, hiperlinks_info, namespaces) if found_hiperlinks else None + + obj_image = False + obj_formula = False + + for drawing in element.findall('.//w:drawing', namespaces=namespaces): + if drawing.find('.//a:blip', namespaces=namespaces) is not None: + blip = drawing.find('.//a:blip', namespaces=namespaces) + if blip is not None: + obj_image = True + + rId = blip.get('{http://schemas.openxmlformats.org/officeDocument/2006/relationships}embed') + image_part = doc.part.related_parts[rId] + image_data = image_part.blob + image_name = image_part.partname.split('/')[-1] + + if image_name not in images: + images.append(image_name) + + # Guardar la imagen en Wagtail + wagtail_image = ImageModel.objects.create( + title=image_name, + file=ContentFile(image_data, name=image_name) + ) + + # Referenciar la imagen guardada en el objeto + obj['type'] = 'image' + obj['image'] = wagtail_image.id + + ns_math = { + 'm': 'http://schemas.openxmlformats.org/officeDocument/2006/math', + 'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main' + } + + for formula in element.findall('.//m:oMathPara', namespaces=ns_math): + obj_formula = True + mathml_result = transform(formula) + mathml_root = etree.fromstring(str(mathml_result)) + mathml_root = self.replace_mfenced_pipe_only(mathml_root) + obj['type'] = 'formula' + obj['formula'] = etree.tostring(mathml_root, pretty_print=True, encoding='unicode') + + + if not obj_image: + paragraph = element + text_paragraph = [] + + # Determina si es parte de una lista + is_numPr = paragraph.find('.//w:numPr', namespaces=paragraph.nsmap) is not None + + # obtiene id y nivel + if is_numPr: + numPr = paragraph.find('.//w:numPr', namespaces=paragraph.nsmap) + numId = numPr.find('.//w:numId', namespaces=paragraph.nsmap).get(namespaces_p + 'val') + type = [(key, objt) for key, objt in list_types.items() if objt['numId'] == numId] + + #Es una lista diferente + if numId != current_num_id: + current_num_id = numId + if len(current_list) > 0: + current_list.append('[/list]') + objl = {} + objl['type'] = 'list' + objl['list'] = '\n'.join(current_list) + current_list = [] + content.append(objl) + list_type = 'bullet' + if type[0][1][str(0)] == 'decimal': + list_type = 'order' + + current_list.append(f'[list list-type="{list_type}"]') + else: + #Se terminaron de agregar elementos a la lista + if len(current_list) > 0: + current_list.append('[/list]') + objl = {} + objl['type'] = 'list' + objl['list'] = '\n'.join(current_list) + current_list = [] + content.append(objl) + + for child in paragraph: + if child.tag == '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}hyperlink': + for r in child.findall('w:r', namespaces=child.nsmap): + t_elem = r.find('w:t', namespaces=child.nsmap) + if t_elem is not None and t_elem.text: + text_paragraph.append(t_elem.text) + + elif child.tag == '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}r': + namespaces = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}' + sz_element = child.find('.//w:sz', namespaces=child.nsmap) + obj['font_size'] = 0 + + if sz_element is None: + p_pr = paragraph.find('.//w:rPr/w:sz', namespaces=child.nsmap) + if p_pr is not None: + sz_element = p_pr.find('.//w:pPr', namespaces=child.nsmap) + + if sz_element is not None: + xml_string = etree.tostring(sz_element, pretty_print=True, encoding='unicode') + size_element = objectify.fromstring(xml_string) + font_size_value = size_element.get(namespaces+'val') + obj['font_size'] = int(font_size_value)/2 + + color_element = child.find('.//w:color', namespaces=child.nsmap) + + if color_element is None: + p_pr = paragraph.find('.//w:pPr', namespaces=child.nsmap) + if p_pr is not None: + color_element = p_pr.find('.//w:rPr/w:color', namespaces=child.nsmap) + + if color_element is not None: + xml_string_color = etree.tostring(color_element, pretty_print=True, encoding='unicode') + object_element = objectify.fromstring(xml_string_color) + color_value = object_element.get(namespaces + 'val') + obj['color'] = color_value + + b_tag = child.find('.//w:b', namespaces=child.nsmap) + + if b_tag is None: + p_pr = paragraph.find('.//w:rPr/w:b', namespaces=child.nsmap) + if p_pr is not None: + b_tag = p_pr.find('.//w:pPr', namespaces=child.nsmap) + + if b_tag is not None: + val = b_tag.get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}val') + obj['bold'] = (val is None or val in ['1', 'true', 'True']) + else: + obj['bold'] = False + + i_tag = child.find('.//w:i', namespaces=child.nsmap) + + if i_tag is None: + p_pr = paragraph.find('.//w:rPr/w:i', namespaces=child.nsmap) + if p_pr is not None: + i_tag = p_pr.find('.//w:pPr', namespaces=child.nsmap) + + if i_tag is not None: + val = i_tag.get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}val') + obj['italic'] = (val is None or val in ['1', 'true', 'True']) + else: + obj['italic'] = False + + s_tag = child.find('.//w:spacing', namespaces=child.nsmap) + + if s_tag is None: + p_pr = paragraph.find('.//w:rPr/w:spacing', namespaces=child.nsmap) + if p_pr is not None: + s_tag = p_pr.find('.//w:pPr', namespaces=child.nsmap) + + if s_tag is not None: + val = s_tag.get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}before') + obj['spacing'] = not (val is None) + else: + obj['spacing'] = False + + clean_text = clean_labels(child.text) + + #identifica sección + sections = identify_section(sections, obj['font_size'], obj['bold'] , clean_text) + + if obj['italic']: + text_paragraph.append('' + clean_text + '' + (f" {hiperlinks}" if hiperlinks else "")) + else: + text_paragraph.append(clean_text + (f" {hiperlinks}" if hiperlinks else "")) + + paraph = match_paragraph(clean_text) + if paraph: + obj['paraph'] = paraph + obj['type'] = paraph + + if review_fb: + found_fb = any(word in clean_text.lower() for word in start_text) + + #Si se encontró alguna palabra, incluye todo lo anterior en un sólo bloque + if found_fb: + found_fb = False + review_fb = False + found_hiperlinks = False + sections = [sections[-1]] + first_block = '' + tmp_content = [] + abstract_mode = False + + for c in content: + if abstract_mode: + if c['text'] == '' or c['spacing'] is True: + abstract_mode = False + else: + tmp_content.append(c) + continue + + if 'paraph' in c: + tmp_content.append(c) + abstract_mode = False + if c['paraph'] == '': + abstract_mode = True + continue + else: + if 'text' in c: + first_block = first_block + "\n" + c["text"] + if 'table' in c: + first_block = first_block + "\n" + c["table"] + + obj_b = {} + obj_b['type'] = 'first_block' + obj_b['text'] = first_block + tmp_content.append(obj_b) + content = tmp_content + start_text = [] + + if child.tag == f"{{{ns_math['m']}}}oMath": + if 'text' not in obj or not isinstance(obj['text'], list): + obj['type'] = 'compound' + obj['text'] = [] + if len(text_paragraph) > 0: + obj2 = {} + obj2['type'] = 'text' + obj2['value'] = ' '.join(text_paragraph) + obj['text'].append(obj2) + text_paragraph = [] + + mathml_result = transform(child) + mathml_root = etree.fromstring(str(mathml_result)) + self.replace_mfenced_pipe_only(mathml_root) + obj2 = {} + obj2['type'] = 'formula' + obj2['value'] = etree.tostring(mathml_root, pretty_print=True, encoding='unicode') + obj['text'].append(obj2) + + if 'text' not in obj: + obj['text'] = (' '.join(text_paragraph)).strip() + clean_text = clean_labels(obj['text']) + obj['text'] = clean_text + + paraph = match_paragraph(obj['text']) + if paraph: + obj['paraph'] = paraph + obj['type'] = paraph + + if is_numPr: + if 'font_size' in obj: + del obj['font_size'] + current_list.append(f'[list-item]{obj["text"]}[/list-item]') + if isinstance(obj['text'], list) and len(text_paragraph) > 0: + obj2 = {} + obj2['type'] = 'text' + obj2['value'] = ' '.join(text_paragraph) + obj['text'].append(obj2) + text_paragraph = [] + + elif isinstance(element, CT_Tbl): + namespaces = { + 'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main', + 'a': 'http://schemas.openxmlformats.org/drawingml/2006/main', + 'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships' + } + + table = element + table_data = extrae_Tabla(element, hiperlinks_info, namespaces) + obj = {} + obj['type'] = 'table' + obj['table'] = table_data + + if not is_numPr: + content.append(obj) + sections.sort(key=section_priority) + return sections, content diff --git a/markuplib/omml2mml.xsl b/markuplib/omml2mml.xsl new file mode 100644 index 0000000..dcd23ee --- /dev/null +++ b/markuplib/omml2mml.xsl @@ -0,0 +1,2068 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ˘ + + ¸ + + ` + + - + + + + . + + ˙ + + ˝ + + ´ + + ~ + + ˜ + + ¨ + + ˇ + + ^ + + ¯ + + _ + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + + + right + + + + + + + + + + + + + + + + 0 + + + + + + + + + + 0 + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0in + + + 0in + + + 0in + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + false + + + + + + + + + + + + + + + + + + + off + + + + + + + + + + + off + + + + + + + + + + + + + + off + + + + + + + + + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + 0pt + + + + right + + + left + + + + + right + + + left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + + + + + + + + + ¯ + + + + + + + + + + _ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + normal + + + + + + + + monospace + sans-serif-italic + bold-sans-serif + sans-serif-bold-italic + sans-serif + bold-fraktur + fraktur + double-struck + bold-script + script + bold + italic + normal + bold-italic + + + + + + bold + normal + + + + + normal + italic + + + + + + + + + + + + + + + + + + + + + + + + italic + + + bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + + + + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + + + + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + box + + + + + + + + + + + + + + + + + left right top bottom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + -1 + + + + + + + + + + + + + 0 + 1 + + + + + + + + + + + + + 1 + 0 + + + \ No newline at end of file From 4944e3bf62ac9d7f6132c5b02a2f7607da73ddbf Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:37:44 -0600 Subject: [PATCH 13/43] =?UTF-8?q?Nueva=20app=20model=5Fai:=20integraci?= =?UTF-8?q?=C3=B3n=20de=20LLaMA,=20funciones=20gen=C3=A9ricas,=20mensajes?= =?UTF-8?q?=20de=20inferencia,=20tareas=20y=20hooks=20de=20Wagtail?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model_ai/__init__.py | 0 model_ai/apps.py | 6 + model_ai/function_llama.py | 21 ++ model_ai/generic_llama.py | 35 ++ model_ai/messages.py | 533 ++++++++++++++++++++++++++++ model_ai/migrations/0001_initial.py | 118 ++++++ model_ai/migrations/__init__.py | 0 model_ai/models.py | 75 ++++ model_ai/tasks.py | 23 ++ model_ai/wagtail_hooks.py | 119 +++++++ 10 files changed, 930 insertions(+) create mode 100644 model_ai/__init__.py create mode 100644 model_ai/apps.py create mode 100644 model_ai/function_llama.py create mode 100644 model_ai/generic_llama.py create mode 100644 model_ai/messages.py create mode 100644 model_ai/migrations/0001_initial.py create mode 100644 model_ai/migrations/__init__.py create mode 100644 model_ai/models.py create mode 100644 model_ai/tasks.py create mode 100644 model_ai/wagtail_hooks.py diff --git a/model_ai/__init__.py b/model_ai/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/model_ai/apps.py b/model_ai/apps.py new file mode 100644 index 0000000..8f15738 --- /dev/null +++ b/model_ai/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ModelIAConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "model_ai" \ No newline at end of file diff --git a/model_ai/function_llama.py b/model_ai/function_llama.py new file mode 100644 index 0000000..f0bdae1 --- /dev/null +++ b/model_ai/function_llama.py @@ -0,0 +1,21 @@ +from llama_cpp import Llama +import os +from model_ai import messages + +class functionsLlama: + + def getFirstMetadata(text): + print(messages.ALL_FIRST_BLOCK.format(text=text)) + return messages.ALL_FIRST_BLOCK.format(text=text) + + def getDoiAndSection(): + return messages.DOI_AND_SECTION_MESSAGES, messages.DOI_AND_SECTION_FORMAT + + def getTitles(): + return messages.TITLE_MESSAGES, messages.TITLE_RESPONSE_FORMAT + + def getAuthorConfig(): + return messages.AUTHOR_MESSAGES, messages.AUTHOR_RESPONSE_FORMAT + + def getAffiliations(): + return messages.AFFILIATION_MESSAGES, messages.AFFILIATION_RESPONSE_FORMAT \ No newline at end of file diff --git a/model_ai/generic_llama.py b/model_ai/generic_llama.py new file mode 100644 index 0000000..2e42415 --- /dev/null +++ b/model_ai/generic_llama.py @@ -0,0 +1,35 @@ +from config.settings.base import LLAMA_MODEL_DIR +from llama_cpp import Llama +import os +import google.generativeai as genai +from model_ai.models import LlamaModel + +class GenericLlama: + + def __init__(self, messages=None, response_format=None, max_tokens=4000, temperature=0.1, top_p=0.1, type='chat'): + model_ai = LlamaModel.objects.first() + self.llm = Llama(model_path = os.path.join(LLAMA_MODEL_DIR, model_ai.name_file), n_threads=2, n_ctx=5000) + self.messages = messages + self.response_format = response_format + self.max_tokens = max_tokens + self.temperature = temperature + self.top_p = top_p + self.type = type + + def run(self, user_input): + if self.type == 'chat': + input = self.messages.copy() + input.append({ + 'role': 'user', + 'content': user_input + }) + return self.llm.create_chat_completion(messages=input, response_format=self.response_format, max_tokens=self.max_tokens, temperature=self.temperature, top_p=self.top_p) + if self.type == 'prompt': + #USO DE GEMINI + model_ai = LlamaModel.objects.first() + if model_ai and model_ai.api_key_gemini: + genai.configure(api_key=model_ai.api_key_gemini) + model = genai.GenerativeModel('models/gemini-2.0-flash') + return model.generate_content(user_input).text + else: + return self.llm(user_input, max_tokens=2000, temperature=self.temperature, stop=["\n\n"]) \ No newline at end of file diff --git a/model_ai/messages.py b/model_ai/messages.py new file mode 100644 index 0000000..bee6756 --- /dev/null +++ b/model_ai/messages.py @@ -0,0 +1,533 @@ +import json + +DOI_AND_SECTION_MESSAGES = [ + { 'role': 'system', + 'content': 'You are an assistant who distinguishes ONLY the DOI and the Section of an initial fragment of an article with output in JSON' + }, + { 'role': 'user', + 'content': """ + Indización automatizada de Revistas + DOI: 10.4025/abm.v4i8.55 + + + + + + + + +
    Edgar Durán
    Ingeniero (Universidade Federal do Ceará – UFC)
    Profesor del Instituto de ingeniería – IFCE
    E-mail: isac.freitas@ifce.edu.br
    Recibido: 22-01-2025Aceptado: 17-05-2022
    + """ + }, + { 'role': 'assistant', + 'content': json.dumps( + { + "doi": "10.4025/abm.v4i8.55", + "section": "", + } + ) + }, + { 'role': 'user', + 'content': """ + 10.3456/jc.4545.740 + SECCION A + Estrategias de gamificación para mejorar la motivación en plataformas de aprendizaje virtual: un estudio de caso en universidades de México + Estratégias de gamificação para melhorar a motivação em plataformas de aprendizagem virtual: um estudo de caso em universidades do México + Laura Fernández Ramos* 0000-0003-2456-8721 + Carlos Méndez Sotelo** 0000-0001-9987-3342 + * Doctora en Sociología. Máster en Estudios de Género. Licenciada en Ciencias Políticas. Profesora titular en la Facultad de Ciencias Sociales de la Universidad de Granada, España. Coordinadora del grupo de investigación Sociedad y Cambio Social. Líneas de investigación: igualdad de género, políticas públicas y análisis de movimientos sociales. Correo electrónico: lfernandez@ugr.es + ** Ingeniero en Informática. Máster en Ciencia de Datos. Consultor en analítica digital en la empresa TecnoSoft Iberia. Colaborador en proyectos de innovación educativa. Líneas de investigación: inteligencia artificial aplicada, minería de datos y visualización de información. Correo electrónico: cmendez@tecnosoft.es + """ + }, + { 'role': 'assistant', + 'content': json.dumps( + { + "doi": "10.3456/jc.4545.740", + "section": "SECCION A", + } + ) + }, +] + +DOI_AND_SECTION_FORMAT = { + 'type': 'json_object', + 'schema':{ + 'type': 'object', + 'properties': { + 'doi': {'type': 'string'}, + 'section': {'type': 'string'} + } + }, + 'required':['doi', 'section'], + } + +AUTHOR_MESSAGES = [ + { 'role': 'system', + 'content': 'You are an assistant who distinguishes all the Authors of an initial fragment of an article with output in JSON' + }, + { 'role': 'user', + 'content': """ + Indización automatizada de Revistas + DOI: 10.4025/abm.v4i8.55 + + + + + + + + +
    Edgar Durán
    Ingeniero (Universidade Federal do Ceará – UFC)
    Profesor del Instituto de ingeniería – IFCE
    E-mail: isac.freitas@ifce.edu.br
    Recibido: 22-01-2025Aceptado: 17-05-2022
    + """ + }, + { 'role': 'assistant', + 'content': json.dumps({ + 'authors': [ + { + "name": "Edgar", + "surname": "Durán", + "orcid": "", + "aff": "1", + "char": "*" + } + ] + }) + }, + { 'role': 'user', + 'content': """ + 10.3456/jc.4545.740 + SECCION A + Estrategias de gamificación para mejorar la motivación en plataformas de aprendizaje virtual: un estudio de caso en universidades de México + Estratégias de gamificação para melhorar a motivação em plataformas de aprendizagem virtual: um estudo de caso em universidades do México + Laura Fernández Ramos* 0000-0003-2456-8721 + Carlos Méndez Sotelo** 0000-0001-9987-3342 + * Doctora en Sociología. Máster en Estudios de Género. Licenciada en Ciencias Políticas. Profesora titular en la Facultad de Ciencias Sociales de la Universidad de Granada, España. Coordinadora del grupo de investigación Sociedad y Cambio Social. Líneas de investigación: igualdad de género, políticas públicas y análisis de movimientos sociales. Correo electrónico: lfernandez@ugr.es + ** Ingeniero en Informática. Máster en Ciencia de Datos. Consultor en analítica digital en la empresa TecnoSoft Iberia. Colaborador en proyectos de innovación educativa. Líneas de investigación: inteligencia artificial aplicada, minería de datos y visualización de información. Correo electrónico: cmendez@tecnosoft.es + """ + }, + { 'role': 'assistant', + 'content': json.dumps({ + 'authors': [ + { + "name": "Laura", + "surname": "Fernández Ramos", + "orcid": "0000-0003-2456-8721", + "aff": "1", + "char": "*" + }, + { + "name": "Carlos", + "surname": "Méndez Sotelo", + "orcid": "0000-0001-9987-3342", + "aff": "2", + "char": "**" + } + ] + }) + } +] + +AUTHOR_RESPONSE_FORMAT = { + 'type': 'json_object', + 'schema':{ + 'type': 'object', + 'properties': { + 'authors': {'type': 'array', + 'items': { + 'type': 'object', + 'properties': { + 'name': {'type': 'string'}, + 'surname': {'type': 'string'}, + 'orcid': {'type': 'string'}, + 'aff': {'type': 'integer'}, + 'char': {'type': 'string'} + }, + 'required': ['name', 'surname', 'orcid', 'aff', 'char'] + } + }, + }, + 'required':['authors'] + } + } + +TITLE_MESSAGES = [ + { 'role': 'system', + 'content': """ + You are an assistant who distinguishes all Titles and their languages of an initial fragment of an article with output in JSON + Use 2-letter language codes (en, pt, es, etc). + """ + }, + { 'role': 'user', + 'content': """ + Indización automatizada de Revistas + DOI: 10.4025/abm.v4i8.55 + + + + + + + + +
    Edgar Durán
    Ingeniero (Universidade Federal do Ceará – UFC)
    Profesor del Instituto de ingeniería – IFCE
    E-mail: isac.freitas@ifce.edu.br
    Recibido: 22-01-2025Aceptado: 17-05-2022
    + """ + }, + { 'role': 'assistant', + 'content': json.dumps({ + 'art_titles': [ + { + "title": "Indización automatizada de Revistas", + "language": "es", + } + ] + }) + }, + { 'role': 'user', + 'content': """ + 10.3456/jc.4545.740 + SECCION A + Estrategias de gamificación para mejorar la motivación en plataformas de aprendizaje virtual: un estudio de caso en universidades de México + Estratégias de gamificação para melhorar a motivação em plataformas de aprendizagem virtual: um estudo de caso em universidades do México + Laura Fernández Ramos* 0000-0003-2456-8721 + Carlos Méndez Sotelo** 0000-0001-9987-3342 + * Doctora en Sociología. Máster en Estudios de Género. Licenciada en Ciencias Políticas. Profesora titular en la Facultad de Ciencias Sociales de la Universidad de Granada, España. Coordinadora del grupo de investigación Sociedad y Cambio Social. Líneas de investigación: igualdad de género, políticas públicas y análisis de movimientos sociales. Correo electrónico: lfernandez@ugr.es + ** Ingeniero en Informática. Máster en Ciencia de Datos. Consultor en analítica digital en la empresa TecnoSoft Iberia. Colaborador en proyectos de innovación educativa. Líneas de investigación: inteligencia artificial aplicada, minería de datos y visualización de información. Correo electrónico: cmendez@tecnosoft.es + """ + }, + { 'role': 'assistant', + 'content': json.dumps({ + 'art_titles': [ + { + "title": "Estrategias de gamificación para mejorar la motivación en plataformas de aprendizaje virtual: un estudio de caso en universidades de México", + "language": "es", + }, + { + "title": "Estratégias de gamificação para melhorar a motivação em plataformas de aprendizagem virtual: um estudo de caso em universidades do México", + "language": "pt", + } + ] + }) + }, +] + +TITLE_RESPONSE_FORMAT = { + 'type': 'json_object', + 'schema':{ + 'type': 'object', + 'properties': { + 'art_titles': {'type': 'array', + 'items': { + 'type': 'object', + 'properties': { + 'title': {'type': 'string'}, + 'language': {'type': 'char(2)'}, + }, + 'required':['title', 'language'] + } + }, + }, + 'required':['art_titles'] + } + } + +AFFILIATION_MESSAGES = [ + { 'role': 'system', + 'content': """You are an assistant who distinguishes all the metadata of Author''s Affiliations of an initial fragment of an article with output in JSON + Rules: + - Each distinct institution must be assigned a distinct "char(s)" symbol. + - Reuse the same "char" only if the affiliation is exactly the same institution. + - Use the following pattern for "char": *, **, ***, ****, etc. + - The "aff" field is a unique identifier (1, 2, 3...) for each distinct institution. + - Always include the original affiliation text in "text_aff". + """ + }, + { 'role': 'user', + 'content': """ + Indización automatizada de Revistas + DOI: 10.4025/abm.v4i8.55 + + + + + + + + +
    Edgar Durán
    Ingeniero (Universidade Federal do Ceará – UFC)
    Profesor del Instituto de ingeniería – IFCE
    E-mail: isac.freitas@ifce.edu.br
    Recibido: 22-01-2025Aceptado: 17-05-2022
    + """ + }, + { 'role': 'assistant', + 'content': json.dumps({ + 'affiliations': [ + { + "aff": "1", + "char": "*", + "orgname": "Universidade Federal do Ceará", + "orgdiv1": "Instituto de ingeniería", + "orgdiv2": "", + "postal": "string", + "city": "", + "state": "", + "code_country": "", + "name_country": "", + "text_aff": "Ingeniero (Universidade Federal do Ceará – UFC)
    Profesor del Instituto de ingeniería – IFCE" + } + ] + }) + }, + { 'role': 'user', + 'content': """ + 10.3456/jc.4545.740 + SECCION A + Estrategias de gamificación para mejorar la motivación en plataformas de aprendizaje virtual: un estudio de caso en universidades de México + Estratégias de gamificação para melhorar a motivação em plataformas de aprendizagem virtual: um estudo de caso em universidades do México + Laura Fernández Ramos* 0000-0003-2456-8721 + Carlos Méndez Sotelo** 0000-0001-9987-3342 + * Doctora en Sociología. Máster en Estudios de Género. Licenciada en Ciencias Políticas. Profesora titular en la Facultad de Ciencias Sociales de la Universidad de Granada, España. Coordinadora del grupo de investigación Sociedad y Cambio Social. Líneas de investigación: igualdad de género, políticas públicas y análisis de movimientos sociales. Correo electrónico: lfernandez@ugr.es + ** Ingeniero en Informática. Máster en Ciencia de Datos. Consultor en analítica digital en la empresa TecnoSoft Iberia. Colaborador en proyectos de innovación educativa. Líneas de investigación: inteligencia artificial aplicada, minería de datos y visualización de información. Correo electrónico: cmendez@tecnosoft.es + """ + }, + { 'role': 'assistant', + 'content': json.dumps({ + 'affiliations': [ + { + "aff": "1", + "char": "*", + "orgname": "Universidad de Granada", + "orgdiv1": "Facultad de Ciencias Sociales", + "orgdiv2": "", + "postal": "", + "city": "", + "state": "", + "code_country": "es", + "name_country": "España", + "text_aff": "Doctora en Sociología. Máster en Estudios de Género. Licenciada en Ciencias Políticas. Profesora titular en la Facultad de Ciencias Sociales de la Universidad de Granada, España. Coordinadora del grupo de investigación Sociedad y Cambio Social. Líneas de investigación: igualdad de género, políticas públicas y análisis de movimientos sociales" + }, + { + "aff": "2", + "char": "**", + "orgname": "TecnoSoft Iberia", + "orgdiv1": "", + "orgdiv2": "", + "postal": "", + "city": "", + "state": "", + "code_country": "", + "name_country": "", + "text_aff": "Ingeniero en Informática. Máster en Ciencia de Datos. Consultor en analítica digital en la empresa TecnoSoft Iberia. Colaborador en proyectos de innovación educativa. Líneas de investigación: inteligencia artificial aplicada, minería de datos y visualización de información" + } + ] + }) + } +] + +AFFILIATION_RESPONSE_FORMAT = { + 'type': 'json_object', + 'schema':{ + 'type': 'object', + 'properties': { + 'affiliations': {'type': 'array', + 'items': { + 'type': 'object', + 'properties': { + 'aff': {'type': 'integer'}, + 'char': {'type': 'string'}, + 'orgname': {'type': 'string'}, + 'orgdiv1': {'type': 'string'}, + 'orgdiv2': {'type': 'string'}, + 'postal': {'type': 'string'}, + 'city': {'type': 'string'}, + 'state': {'type': 'string'}, + 'code_country': {'type': 'string'}, + 'name_country': {'type': 'string'}, + 'text_aff': {'type': 'text'} + }, + "required": [ + "aff", "char", "orgname", "orgdiv1", "orgdiv2", + "postal", "city", "state", "code_country", + "name_country", "text_aff" + ] + } + }, + }, + 'required': ['affiliations'] + } + } + +ALL_FIRST_BLOCK = """ + ### Instruction: + From the provided Text, extract the specified metadata as shown in the Example. + + Specifications: + language: Use 2-letter codes + orgname: Name of Organization, University, Intitution or similar + orgdiv1: Name of Departament, Division or similar + orgdiv2: Name of Subdepartament, Subdivision or similar + name_country: Complete name of Country + code_country: Use 2-letter codes for Country + state: State or province abbreviation in capital letters + char: Characters that link the author with their affiliation + section: If you don't specify a section, choose the word adjacent to the DOI + text_aff: Full text block of affiliation data + orgdiv1, orgdiv2: No street names or neighborhoods + + Notes: + - The text may contain bracket-style tags or markup. + - Return the result in JSON format. + - Return ONLY the JSON result. No explanations, notes, or formatting outside the JSON. + - Only one JSON object must be returned. + - If multiple values exist (e.g. multiple "section" labels), pick the most relevant or the first one. + - Do NOT return multiple JSON objects. + - Include all fields in object JSON even if they are empty. + + Example: + {{ + "doi": "DOI", + "section": "Section", + "titles": [ + {{ + "title": "Title 1", + "language": "Language 1" + }}, + {{ + "title": "Title 2", + "language": "Language 2" + }} + ], + "authors": [ + {{ + "name": "First Name", + "surname": "Last Name", + "orcid": "ORCID", + "aff": 1, + "char": "*" + }}, + {{ + "name": "First Name 2", + "surname": "Last Name 2", + "orcid": "ORCID", + "aff": 2, + "char": "**" + }} + ], + "affiliations": [ + {{ + "aff": 1, + "char": "*", + "orgname": "Organization Name 1", + "orgdiv1": "Department or Division 1", + "orgdiv2": "Subdepartment or Subdivision 1", + "postal": "Postal Code 1", + "city": "City 1", + "state": "ST", + "code_country": "co", + "name_country": "Country 1", + "text_aff": "Block of Text Affiliation 1" + }}, + {{ + "aff": 2, + "char": "**", + "orgname": "Organization Name 2", + "orgdiv1": "Department or Division 2", + "orgdiv2": "Subdepartment or Subdivision 2", + "postal": "Postal Code 2", + "city": "City 2", + "state": "ST", + "code_country": "co", + "name_country": "Country 2", + "text_aff": "Block of Text Affiliation 2" + }} + ] + }} + + ### Text: + {text} + + ### Response: +""" + + +instruction = """ + From the provided Text, extract the metadata and return it as a single JSON object. + + RULES: + 1. Output MUST be ONLY one valid JSON object (no markdown, no notes). + 2. Always include ALL fields in the JSON, even if they are empty. + 3. Use arrays for "titles", "authors", and "affiliations". + 4. If there are multiple options, choose the first or most relevant. + 5. Do NOT invent data; leave empty strings if unknown. + 6. orgdiv1/orgdiv2 must be departments or divisions (no street names). + 7. language must use 2-letter codes. + 8. country must include full name and 2-letter code. + 9. section: if not specified, use the word next to the DOI. + 10. Keep "char" consistent between authors and affiliations. + + OUTPUT FORMAT (strictly follow this): + { + "doi": "string", + "section": "string", + "titles": [ + {"title": "string", "language": "xx"} + ], + "authors": [ + {"name": "string", "surname": "string", "orcid": "string", "aff": number, "char": "string"} + ], + "affiliations": [ + { + "aff": number, + "char": "string", + "orgname": "string", + "orgdiv1": "string", + "orgdiv2": "string", + "postal": "string", + "city": "string", + "state": "string", + "code_country": "xx", + "name_country": "string", + "text_aff": "string" + } + ] + } + + EXAMPLE: + { + "doi": "10.1234/example.doi", + "section": "Article", + "titles": [ + {"title": "Example Title in English", "language": "en"}, + {"title": "Ejemplo de título en Español", "language": "es"} + ], + "authors": [ + {"name": "Alice", "surname": "Smith", "orcid": "0000-0001-2345-6789", "aff": 1, "char": "*"}, + {"name": "Bob", "surname": "Johnson", "orcid": "", "aff": 2, "char": "**"} + ], + "affiliations": [ + { + "aff": 1, + "char": "*", + "orgname": "University of Example", + "orgdiv1": "Department of Biology", + "orgdiv2": "", + "postal": "12345", + "city": "Example City", + "state": "EX", + "code_country": "us", + "name_country": "United States", + "text_aff": "Department of Biology, University of Example, 12345 Example City, EX, United States" + }, + { + "aff": 2, + "char": "**", + "orgname": "Institute of Testing", + "orgdiv1": "Division of Chemistry", + "orgdiv2": "", + "postal": "54321", + "city": "Testville", + "state": "TS", + "code_country": "uk", + "name_country": "United Kingdom", + "text_aff": "Division of Chemistry, Institute of Testing, 54321 Testville, TS, United Kingdom" + } + ] + } + """ \ No newline at end of file diff --git a/model_ai/migrations/0001_initial.py b/model_ai/migrations/0001_initial.py new file mode 100644 index 0000000..01ff28b --- /dev/null +++ b/model_ai/migrations/0001_initial.py @@ -0,0 +1,118 @@ +# Generated by Django 5.0.3 on 2025-09-07 17:04 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="LlamaModel", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created", + models.DateTimeField( + auto_now_add=True, verbose_name="Creation date" + ), + ), + ( + "updated", + models.DateTimeField( + auto_now=True, verbose_name="Last update date" + ), + ), + ( + "name_model", + models.CharField( + blank=True, + max_length=255, + verbose_name="Hugging Face model name", + ), + ), + ( + "name_file", + models.CharField( + blank=True, max_length=255, verbose_name="Model file" + ), + ), + ( + "hf_token", + models.CharField( + blank=True, max_length=255, verbose_name="Hugging Face token" + ), + ), + ( + "download_status", + models.IntegerField( + blank=True, + choices=[ + (1, "No model"), + (2, "Downloading model"), + (3, "Model downloaded"), + (4, "Download error"), + ], + default=1, + verbose_name="Local model estatus", + ), + ), + ( + "api_url", + models.URLField( + blank=True, + help_text="Enter the AI API URL.", + null=True, + verbose_name="URL Markapi", + ), + ), + ( + "api_key_gemini", + models.CharField( + blank=True, max_length=255, verbose_name="API KEY Gemini" + ), + ), + ( + "creator", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_creator", + to=settings.AUTH_USER_MODEL, + verbose_name="Creator", + ), + ), + ( + "updated_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_last_mod_user", + to=settings.AUTH_USER_MODEL, + verbose_name="Updater", + ), + ), + ], + options={ + "abstract": False, + }, + ), + ] diff --git a/model_ai/migrations/__init__.py b/model_ai/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/model_ai/models.py b/model_ai/models.py new file mode 100644 index 0000000..b147e80 --- /dev/null +++ b/model_ai/models.py @@ -0,0 +1,75 @@ +from django.db import models +from django import forms +from django.utils.translation import gettext_lazy as _ +from django.core.exceptions import ValidationError +from wagtail.admin.panels import FieldPanel +from core.models import ( + CommonControlField, +) +from core.forms import CoreAdminModelForm + + +class MaskedPasswordWidget(forms.PasswordInput): + def __init__(self, attrs=None): + super().__init__(attrs=attrs, render_value=True) + + def render(self, name, value, attrs=None, renderer=None): + return super().render(name, value, attrs, renderer) + + +class DownloadStatus(models.IntegerChoices): + NO_MODEL = 1, _("No model") + DOWNLOADING = 2, _("Downloading model") + DOWNLOADED = 3, _("Model downloaded") + ERROR = 4, _("Download error") + + +class DisabledSelect(forms.Select): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.attrs.update({'disabled': 'disabled'}) + + +class LlamaModel(CommonControlField): + #is_local = models.BooleanField(_("Use local model"), default=False) + name_model = models.CharField(_("Hugging Face model name"), blank=True, max_length=255) + name_file = models.CharField(_("Model file"), blank=True, max_length=255) + hf_token = models.CharField(_("Hugging Face token"), blank=True, max_length=255) + download_status = models.IntegerField( + _("Local model estatus"), + choices=DownloadStatus.choices, + blank=True, + default=DownloadStatus.NO_MODEL + ) + api_url = models.URLField( + verbose_name=_("URL Markapi"), + blank=True, + null=True, + help_text="Enter the AI API URL." + ) + #is_gemini = models.BooleanField(_("Use API Gemini"), default=False) + api_key_gemini = models.CharField(_("API KEY Gemini"), blank=True, max_length=255) + + + panels = [ + #FieldPanel("is_local"), + FieldPanel("name_model"), + FieldPanel("name_file"), + FieldPanel("hf_token", widget=MaskedPasswordWidget()), + FieldPanel("download_status", widget=DisabledSelect(choices=DownloadStatus.choices)), + FieldPanel("api_url"), + #FieldPanel("is_gemini"), + FieldPanel("api_key_gemini", widget=MaskedPasswordWidget()), + ] + + base_form_class = CoreAdminModelForm + + def display_name_model(self): + return self.name_model if self.name_model else self.api_url + + def clean(self): + if not self.pk and LlamaModel.objects.exists(): + raise ValidationError(_("Only one instance of LlamaModel is allowed.")) + + def __str__(self): + return self.name_model \ No newline at end of file diff --git a/model_ai/tasks.py b/model_ai/tasks.py new file mode 100644 index 0000000..cd53060 --- /dev/null +++ b/model_ai/tasks.py @@ -0,0 +1,23 @@ +from config import celery_app +from model_ai.models import LlamaModel, DownloadStatus +from config.settings.base import LLAMA_MODEL_DIR + +from huggingface_hub import login +from huggingface_hub import hf_hub_download + + +def get_model(hf_token, name_model, name_file): + login(token=hf_token) + local_dir = LLAMA_MODEL_DIR + downloaded_file = hf_hub_download(repo_id=name_model, filename=name_file, local_dir=local_dir) + + +@celery_app.task() +def download_model(id): + try: + instance = LlamaModel.objects.get(id=id) + get_model(instance.hf_token, instance.name_model, instance.name_file) + instance.download_status = DownloadStatus.DOWNLOADED + except: + instance.download_status = DownloadStatus.ERROR + instance.save() \ No newline at end of file diff --git a/model_ai/wagtail_hooks.py b/model_ai/wagtail_hooks.py new file mode 100644 index 0000000..960cbb4 --- /dev/null +++ b/model_ai/wagtail_hooks.py @@ -0,0 +1,119 @@ +from django.http import HttpResponseRedirect +from django.utils.translation import gettext_lazy as _ +from django.contrib import messages + +from wagtail.snippets.views.snippets import ( + CreateView, + EditView, + SnippetViewSet, + SnippetViewSetGroup +) + +from model_ai.models import ( + LlamaModel, + DownloadStatus, +) + +from wagtail.snippets.models import register_snippet +from model_ai.tasks import download_model + + +class LlamaModelCreateView(CreateView): + def form_valid(self, form): + data = form.cleaned_data + + if data.get("name_model") or data.get("name_file"): + if not data.get("name_model"): # Esto detecta '', None o False + messages.error(self.request, _("Model name is required.")) + return self.form_invalid(form) + + if not data.get("name_file"): + messages.error(self.request, _("Model file is required.")) + return self.form_invalid(form) + + if not data.get("hf_token"): + messages.error(self.request, _("Hugging Face token is required.")) + return self.form_invalid(form) + self.object = form.save_all(self.request.user) + + self.object.download_status = DownloadStatus.DOWNLOADING + self.object.save() + messages.success(self.request, _("Model created and download started.")) + download_model.delay(form.instance.id) + else: + if not data.get("api_url"): + messages.error(self.request, _("API AI URL is required.")) + return self.form_invalid(form) + + self.object = form.save_all(self.request.user) + messages.success(self.request, _("Model created, use API AI.")) + + return HttpResponseRedirect(self.get_success_url()) + + +class LlamaModelEditView(EditView): + def form_valid(self, form): + form.instance.updated_by = self.request.user + form.instance.save() + data = form.cleaned_data + if form.instance.name_model: + if form.instance.download_status != DownloadStatus.DOWNLOADING: + if not data.get("name_model"): + messages.error(self.request, _("Model name is required.")) + return self.form_invalid(form) + + if not data.get("name_file"): + messages.error(self.request, _("Model file is required.")) + return self.form_invalid(form) + + if not data.get("hf_token"): + messages.error(self.request, _("Hugging Face token is required.")) + return self.form_invalid(form) + + form.instance.download_status = DownloadStatus.DOWNLOADING + download_model.delay(form.instance.id) + form.instance.save() + messages.success(self.request, _("Model updated and download started.")) + else: + messages.success(self.request, _("Model updated and already downloaded.")) + else: + if not data.get("api_url"): + messages.error(self.request, _("API AI URL is required.")) + return self.form_invalid(form) + + form.instance.save() + messages.success(self.request, _("Model updated, use API AI.")) + + return HttpResponseRedirect(self.get_success_url()) + + +class LlamaModelViewSet(SnippetViewSet): + model = LlamaModel + add_view_class = LlamaModelCreateView + edit_view_class = LlamaModelEditView + menu_label = _("Llama Model") + menu_icon = "folder" + menu_order = 1 + add_to_settings_menu = False # or True to add your model to the Settings sub-menu + exclude_from_explorer = ( + False # or True to exclude pages of this type from Wagtail's explorer view + ) + list_per_page = 20 + list_display = ( + "display_name_model", + "get_download_status_display" + ) + +""" +class MarkupSnippetViewSetGroup(SnippetViewSetGroup): + menu_name = 'markup_docx' + menu_label = _('Markup Docx') + menu_icon = "folder-open-inverse" + menu_order = get_menu_order('markup_docx') + items = ( + UploadDocxViewSet, + MarkupXMLViewSet, + ) +""" + +register_snippet(LlamaModelViewSet) \ No newline at end of file From 4ecb50a7888ec4427cbde6c2804553326ae9cdb8 Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:38:40 -0600 Subject: [PATCH 14/43] =?UTF-8?q?M=C3=B3dulos=20adicionales=20en=20referen?= =?UTF-8?q?ce:=20configuraci=C3=B3n=20de=20Gemini=20y=20utilidades=20de=20?= =?UTF-8?q?procesamiento=20de=20datos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/config_gemini.py | 292 +++++++++++++++++++++++++++++++++++++ reference/data_utils.py | 120 +++++++++++++++ 2 files changed, 412 insertions(+) create mode 100644 reference/config_gemini.py create mode 100644 reference/data_utils.py diff --git a/reference/config_gemini.py b/reference/config_gemini.py new file mode 100644 index 0000000..a2f0e0a --- /dev/null +++ b/reference/config_gemini.py @@ -0,0 +1,292 @@ +def create_prompt_reference(references): + + prompt_reference = f""" + You are an assistant who distinguishes all the components of all citations in an article with output in JSON + + Rules: + - If a DOI is present in the citation, it must be included in the doi field, and the uri field must be None. If there is no DOI, then a valid persistent URL (e.g., from a repository or publisher) must be provided in the uri field instead. One of these fields — doi or uri — must always be populated. Never leave both empty. + - For references of type journal, the field pages must not be included, even if they appear in the original citation. Instead, the page range should be provided only in the fields fpage and lpage. + - Consider that in book-type references, the source field generally refers to the title of the book, so do not use the title field in this case, only source. + + Specifications of JSON: + + {{ + "type": "json_object", + "schema":{{ + "type": "object", + "properties": {{ + "full_text": {{"type": "string"}}, + "reftype": {{"type": "string", "enum": ["journal", "thesis", "book", "data", "webpage", "software", "confproc"]}}, + "authors": {{"type": "array", + "items": {{ + "type": "object", + "properties": {{ + "surname": {{"type": "string"}}, + "fname": {{"type": "string"}}, + "collab": {{"type": "string"}} + }} + }} + }}, + "date": {{"type": "integer"}}, + "title": {{"type": "string"}}, + "chapter": {{"type": "string"}}, + "edition": {{"type": "string"}}, + "source": {{"type": "string"}}, + "vol": {{"type": "integer"}}, + "num": {{"type": "integer"}}, + "pages": {{"type": "string"}}, + "fpage": {{"type": "string"}}, + "lpage": {{"type": "string"}}, + "doi": {{"type": "string"}}, + "degree": {{"type": "string"}}, + "organization": {{"type": "string"}}, + "location": {{"type": "string"}}, + "org_location": {{"type": "string"}}, + "num_pages": {{"type": "integer"}}, + "uri": {{"type": "string"}}, + "access_id": {{"type": "string"}}, + "access_date": {{"type": "string"}}, + "version": {{"type": "string"}}, + }} + }} + }} + + Example: + + Bachman, S., J. Moat, A. W. Hill, J. de la Torre and B. Scott. 2011. Supporting Red List threat assessments with GeoCAT: geospatial conservation assessment tool. ZooKeys 150: 117-126. DOI: https://doi.org/10.3897/zookeys.150.2109 + + Brunel, J. F. 1987. Sur le genre Phyllanthus L. et quelques genres voisins de la Tribu des Phyllantheae Dumort. (Euphorbiaceae, Phyllantheae) en Afrique intertropicale et à Madagascar. Thèse de doctorat de l’Université L. Pasteur. Strasbourg, France. 760 pp. + + Hernández-López, L. 1995. The endemic flora of Jalisco, Mexico: Centers of endemism and implications for conservation. Tesis de maestría. Universidad de Wisconsin. Madison, USA. 74 pp. + + Jones DL. The role of physical activity on the need for revision total knee arthroplasty in individuals with osteoarthritis of the knee [dissertation]. [Pittsburgh (PA)]: University of Pittsburgh; 2001. 436 p. + + Schimper, A. F. W. 1903. Plant geography upon a physiological basis. Clarendon Press. Oxford, UK. 839 pp. + + Correa, M. D., C. Galdames and M. Stapf. 2004. Catálogo de Plantas Vasculares de Panamá. Smithsonian Tropical Research Institute. Ciudad de Panamá, Panamá. 599 pp. + + Hernández-López, L. 2019. Las especies endémicas de plantas en el estado de Jalisco: su distribución y conservación. Comisión Nacional para el Conocimiento y Uso de la Biodiversidad (CONABIO). Cd. Mx., México. https://doi.org/10.15468/ktvqds (consultado diciembre de 2019). + + Lucas Leão; Perobelli, Fernando Salgueiro; Ribeiro, Hilton Manoel Dias, 2024, Data for: Ação Coletiva Institucional e Consórcio Públicos Intermunicipais no Brasil, DOI: 10.48331/scielodata.5Z4TMP, SciELO Data, V1, UNF:6:Neyjad4du3rFprhupCXizA== [fileUNF]. Disponível em: https://doi.org/10.48331/scielodata + + INAFED. 2010. Enciclopedia de los Municipios y Delegaciones de México: Jalisco. Instituto Nacional para el Federalismo y el Desarrollo Municipal. http://www.inafed.gob.mx/ work/enciclopedia/EMM21puebla/index.html (consultado diciembre de 2018). + + COB - Comitê Olímpico Brasileiro. Desafio para o corpo. Disponível em: http://www.cob.org.br/esportes/esporte.asp?id=39. (Acesso em 10 abr 2010) + + Nikon Corporation. 1991-2006. NIS- Elements, version 2.33. Tokio, Japón. + + Hamric, Ann B.; Spross, Judith A.; Hanson, Charlene M. Advanced practice nursing: an integrative approach. 3rd ed. St. Louis (MO): Elsevier Saunders; c2005. 979 p. + + Calkins BM, Mendeloff AI. The epidemiology of idiopathic inflammatory bowel disease. In: Kirsner JB, Shorter RG, eds. Inflammatory bowel disease, 4th ed. Baltimore: Williams & Wilkins. 1995:31-68. + + Furton EJ, Dort V, editors. Addiction and compulsive behaviors. Proceedings of the 17th Workshop for Bishops; 1999; Dallas, TX. Boston: National Catholic Bioethics Center (US); 2000. 258 p. + + Response: + + [ + {{ + "full_text": "Bachman, S., J. Moat, A. W. Hill, J. de la Torre and B. Scott. 2011. Supporting Red List threat assessments with GeoCAT: geospatial conservation assessment tool. ZooKeys 150: 117-126. DOI: https://doi.org/10.3897/zookeys.150.2109", + "reftype": "journal", + "authors": [ + {{ "surname": "Bachman", "fname": "S." }}, + {{ "surname": "Moat", "fname": "J." }}, + {{ "surname": "Hill", "fname": "A. W." }}, + {{ "surname": "de la Torre", "fname": "J." }}, + {{ "surname": "Scott", "fname": "B." }}, + ], + "date": 2011, + "title": "Supporting Red List threat assessments with GeoCAT: geospatial conservation assessment tool", + "source": "ZooKeys", + "vol": "150", + "num": None, + "fpage": "117", + "lpage": "126", + "doi": "10.3897/zookeys.150.2109", + }}, + {{ + "full_text": "Brunel, J. F. 1987. Sur le genre Phyllanthus L. et quelques genres voisins de la Tribu des Phyllantheae Dumort. (Euphorbiaceae, Phyllantheae) en Afrique intertropicale et à Madagascar. Thèse de doctorat de l’Université L. Pasteur. Strasbourg, France. 760 pp.", + "reftype": "Thesis", + "authors": [ + {{ "surname": "Brunel", "fname": "J. F." }}, + ], + "date": 1987, + "source": "Sur le genre Phyllanthus L. et quelques genres voisins de la Tribu des Phyllantheae Dumort. (Euphorbiaceae, Phyllantheae) en Afrique intertropicale et à Madagascar", + "degree": "doctorat", + "organization": "l’Université L. Pasteur", + "location": "Strasbourg, France", + "num_pages": 760 + }}, + {{ + "full_text": "Hernández-López, L. 1995. The endemic flora of Jalisco, Mexico: Centers of endemism and implications for conservation. Tesis de maestría. Universidad de Wisconsin. Madison, USA. 74 pp.", + "reftype": "Thesis", + "authors": [ + {{ "surname": "Hernández-López", "fname": "L." }}, + ], + "date": 1995, + "source": "The endemic flora of Jalisco, Mexico: Centers of endemism and implications for conservation", + "degree": "maestría", + "organization": "Universidad de Wisconsin", + "location": "Madison, USA", + "num_pages": 74 + }}, + {{ + "full_text": "Jones DL. The role of physical activity on the need for revision total knee arthroplasty in individuals with osteoarthritis of the knee [dissertation]. [Pittsburgh (PA)]: University of Pittsburgh; 2001. 436 p.", + "reftype": "Thesis", + "authors": [ + {{ "surname": "Jones", "fname": "DL" }}, + ], + "date": 2001, + "source": "The role of physical activity on the need for revision total knee arthroplasty in individuals with osteoarthritis of the knee [dissertation]", + "organization": "University of Pittsburgh", + "location": "[Pittsburgh (PA)]", + "num_pages": 436 p + }}, + {{ + "full_text": "Schimper, A. F. W. 1903. Plant geography upon a physiological basis. Clarendon Press. Oxford, UK. 839 pp.", + "reftype": "book", + "authors":[ + {{ "surname": "Schimper", "fname": "A. F. W." }}, + ], + "date": 1903, + "source": "Plant geography upon a physiological basis", + "organization": "Clarendon Press", + "location": "Oxford, UK" + "num_pages": 839 + }}, + {{ + "full_text": "Correa, M. D., C. Galdames and M. Stapf. 2004. Catálogo de Plantas Vasculares de Panamá. Smithsonian Tropical Research Institute. Ciudad de Panamá, Panamá. 599 pp.", + "reftype": "book", + "authors":[ + {{ "surname": "Correa", "fname": "M. D." }}, + {{ "surname": "Galdames", "fname": "C." }}, + {{ "surname": "Stapf", "fname": "M." }}, + ], + "date": 2004, + "source": "Catálogo de Plantas Vasculares de Panamá", + "organization": "Smithsonian Tropical Research Institute", + "location": "Ciudad de Panamá, Panamá", + "num_pages": 599 + }}, + {{ + "full_text": "Hernández-López, L. 2019. Las especies endémicas de plantas en el estado de Jalisco: su distribución y conservación. Comisión Nacional para el Conocimiento y Uso de la Biodiversidad (CONABIO). Cd. Mx., México. https://doi.org/10.15468/ktvqds (consultado diciembre de 2019).", + "reftype": "data", + "authors":[ + {{ "surname": "Hernández-López", "fname": "L." }}, + ], + "date": 2019, + "title": "Las especies endémicas de plantas en el estado de Jalisco: su distribución y conservación", + "source": "Comisión Nacional para el Conocimiento y Uso de la Biodiversidad (CONABIO)", + "location": "Cd. Mx. México", + "doi": "https://doi.org/10.15468/ktvqds ", + "access_date": "diciembre de 2019" + }}, + {{ + "full_text": "Lucas Leão; Perobelli, Fernando Salgueiro; Ribeiro, Hilton Manoel Dias, 2024, Data for: Ação Coletiva Institucional e Consórcio Públicos Intermunicipais no Brasil, DOI: 10.48331/scielodata.5Z4TMP, SciELO Data, V1, UNF:6:Neyjad4du3rFprhupCXizA== [fileUNF]. Disponível em: https://doi.org/10.48331/scielodata", + "reftype": "data", + "authors":[ + {{ "surname": "Leão", "fname": "Lucas" }}, + {{ "surname": "Perobelli", "fname": "Fernando Salgueiro" }}, + {{ "surname": "Ribeiro", "fname": "Hilton Manoel Dias" }} + ], + "date": 2024, + "version": "V1", + "title": "Data for: Ação Coletiva Institucional e Consórcio Públicos Intermunicipais no Brasil", + "source": "SciELO Data", + "doi": "https://doi.org/10.48331/scielodata", + "access_id": "UNF:6:Neyjad4du3rFprhupCXizA== [fileUNF]", + "access_date": "diciembre de 2019" + }}, + {{ + "full_text": "INAFED. 2010. Enciclopedia de los Municipios y Delegaciones de México: Jalisco. Instituto Nacional para el Federalismo y el Desarrollo Municipal. http://www.inafed.gob.mx/ work/enciclopedia/EMM21puebla/index.html (consultado diciembre de 2018).", + "reftype": "webpage", + "authors":[ + {{ "collab": "INAFED" }}, + ], + "date": 2010, + "source": "Enciclopedia de los Municipios y Delegaciones de México: Jalisco", + "organization": "Instituto Nacional para el Federalismo y el Desarrollo Municipal", + "uri": "http://www.inafed.gob.mx/ work/enciclopedia/EMM21puebla/index.html", + "access_date": "diciembre de 2018" + }}, + {{ + "full_text": "COB - Comitê Olímpico Brasileiro. Desafio para o corpo. Disponível em: http://www.cob.org.br/esportes/esporte.asp?id=39. (Acesso em 10 abr 2010)", + "reftype": "webpage", + "authors":[ + {{ "collab": "COB -Comitê Olímpico Brasileiro" }}, + ], + "date": 2010, + "source": "Desafio para o corpo", + "uri": "http://www.cob.org.br/esportes/esporte.asp?id=39", + "access_date": "10 abr 2010" + }}, + {{ + "full_text": "Nikon Corporation. 1991-2006. NIS- Elements, version 2.33. Tokio, Japón.", + "reftype": "software", + "authors":[ + {{ "collab": "Nikon Corporation" }}, + ], + "date": 2006, + "source": "NIS- Elements", + "version": "2.33", + "city": "Tokio", + "country": "Japón", + }}, + {{ + "full_text": "Hamric, Ann B.; Spross, Judith A.; Hanson, Charlene M. Advanced practice nursing: an integrative approach. 3rd ed. St. Louis (MO): Elsevier Saunders; c2005. 979 p.", + "reftype": "book", + "authors":[ + {{ "surname": "Hamric", "fname": "Ann B." }}, + {{ "surname": "Spross", "fname": "Judith A." }}, + {{ "surname": "Hanson", "fname": "Charlene M." }}, + ], + "date": c2005, + "source": "Advanced practice nursing: an integrative approach", + "edition: "3rd ed" + "organization": "Elsevier Saunders", + "location": "St. Louis (MO)", + "num_pages": 979 p + }}, + {{ + "full_text": "Calkins BM, Mendeloff AI. The epidemiology of idiopathic inflammatory bowel disease. In: Kirsner JB, Shorter RG, eds. Inflammatory bowel disease, 4th ed. Baltimore: Williams & Wilkins. 1995:31-68.", + "reftype": "book", + "authors":[ + {{ "surname": "Calkins", "fname": "BM" }}, + {{ "surname": "Mendeloff", "fname": "AI" }}, + ], + "editors":[ + {{ "surname": "Kirsner", "fname": "JB" }}, + {{ "surname": "Shorter", "fname": "RG" }}, + ], + "date": 1995, + "source": "Inflammatory bowel disease", + "chapter": "The epidemiology of idiopathic inflammatory bowel disease.", + "edition: "4th" + "organization": "Williams & Wilkins", + "location": "Baltimore", + "fpage": 31, + "lpage": 68 + }}, + {{ + "full_text": "Furton EJ, Dort V, editors. Addiction and compulsive behaviors. Proceedings of the 17th Workshop for Bishops; 1999; Dallas, TX. Boston: National Catholic Bioethics Center (US); 2000. 258 p.", + "reftype": "confproc", + "authors":[ + {{ "surname": "Furton", "fname": "EJ" }}, + {{ "surname": "Dort", "fname": "V" }}, + ], + "date": 2000, + "source": "Addiction and compulsive behaviors", + "title": "Proceedings of the 17th Workshop for Bishops", + "location": "Dallas, TX", + "num": "17", + "organization": "National Catholic Bioethics Center (US)", + "org_location": "Boston", + "pages": "258 p" + }} + ] + + Citations: + + {references} + """ + + return prompt_reference \ No newline at end of file diff --git a/reference/data_utils.py b/reference/data_utils.py new file mode 100644 index 0000000..b97518f --- /dev/null +++ b/reference/data_utils.py @@ -0,0 +1,120 @@ +from config import celery_app +from reference.marker import mark_references +from reference.models import Reference, ElementCitation, ReferenceStatus +import json +from lxml import etree +import re + +meses = { + "enero": "01", "febrero": "02", "marzo": "03", "abril": "04", "mayo": "05", "junio": "06", + "julio": "07", "agosto": "08", "septiembre": "09", "octubre": "10", "noviembre": "11", "diciembre": "12", + "january": "01", "february": "02", "march": "03", "april": "04", "may": "05", "june": "06", + "july": "07", "august": "08", "september": "09", "october": "10", "november": "11", "december": "12", + "janeiro": "01", "fevereiro": "02", "março": "03", "abril": "04", "maio": "05", "junho": "06", + "julho": "07", "agosto": "08", "setembro": "09", "outubro": "10", "novembro": "11", "dezembro": "12" +} + +def get_number_of_month(texto): + texto = texto.lower() + for mes, numero in meses.items(): + if re.search(rf"\b{mes}\b", texto): + return numero + return None # Si no encuentra un mes + +def get_xml(json_reference): + json_reference = json.loads(json_reference) + root = etree.Element('element-citation', + attrib = { + 'publication-type': json_reference['reftype'], + }) + + if json_reference['reftype'] in ['webpage', 'data']: + NSMAP = {'xlink': 'http://www.w3.org/1999/xlink'} + root = etree.Element('element-citation', + attrib = { + 'publication-type': json_reference['reftype'], + },nsmap=NSMAP) + + if 'authors' in json_reference: + person_group = etree.SubElement(root, "person-group", + attrib = { + 'person-group-type': 'author', + } + ) + for author in json_reference['authors']: + name = etree.Element('name') + if 'fname' in author: + etree.SubElement(name, 'surname').text = author['fname'] + if 'surname' in author: + etree.SubElement(name, 'given-names').text = author['surname'] + if 'collab' in author: + etree.SubElement(name, 'collab').text = author['collab'] + person_group.append(name) + + if json_reference['reftype'] == 'journal': + if 'title' in json_reference: + etree.SubElement(root, 'article-title').text = json_reference['title'] + if 'source' in json_reference: + etree.SubElement(root, 'source').text = json_reference['source'] + if 'vol' in json_reference: + etree.SubElement(root, 'volume').text = str(json_reference['vol']) + if 'num' in json_reference: + etree.SubElement(root, 'issue').text = str(json_reference['num']) + if 'pages' in json_reference and len(str(json_reference['pages']).split('-')) > 0: + etree.SubElement(root, 'fpage').text = str(json_reference['pages']).split('-')[0].strip() + if 'pages' in json_reference and len(str(json_reference['pages']).split('-')) > 1: + etree.SubElement(root, 'lpage').text = str(json_reference['pages']).split('-')[1].strip() + if 'doi' in json_reference: + etree.SubElement(root, 'doi', attrib = { 'pub-id-type': 'doi' }).text = json_reference['doi'] + + if json_reference['reftype'] == 'thesis': + if 'title' in json_reference: + etree.SubElement(root, 'source').text = json_reference['title'] + if 'degree' in json_reference: + etree.SubElement(root, 'comment', attrib = { 'content-type': 'degree' }).text = json_reference['degree'] + if 'organization' in json_reference: + etree.SubElement(root, 'publisher-name').text = json_reference['organization'] + + if json_reference['reftype'] in ['webpage', 'data']: + if 'title' in json_reference: + etree.SubElement(root, 'source').text = json_reference['title'] + if 'uri' in json_reference: + etree.SubElement(root, 'ext-link', attrib = { + 'ext-link-type': 'uri', + '{http://www.w3.org/1999/xlink}href': json_reference['uri'] + }).text = json_reference['uri'] + if 'organization' in json_reference: + etree.SubElement(root, 'publisher-name').text = json_reference['organization'] + if 'country' in json_reference: + etree.SubElement(root, 'publisher-loc').text = json_reference['country'] + if 'doi' in json_reference: + etree.SubElement(root, 'doi', attrib = { 'pub-id-type': 'doi' }).text = json_reference['doi'] + if 'access_date' in json_reference: + match = re.search(r'\b\d{4}\b', json_reference['access_date']) + year = match.group() + month = get_number_of_month(json_reference['access_date']) + etree.SubElement(root, 'date-in-citation', attrib = { + 'content-type': 'access-date', + 'iso-8601-date': year+'-'+month+'-00' + }).text = json_reference['access_date'] + + if 'date' in json_reference: + etree.SubElement(root, 'year').text = str(json_reference['date']) + + + return root + + +#@celery_app.task() +def get_reference(obj_id): + obj_reference = Reference.objects.get(id=obj_id) + marked = mark_references(obj_reference.mixed_citation) + for item in marked: + for i in item['choices']: + ElementCitation.objects.create( + reference=obj_reference, + marked=i, + marked_xml=etree.tostring(get_xml(i), pretty_print=True, encoding='unicode') + ) + obj_reference.estatus = ReferenceStatus.READY + obj_reference.save() From 2ab9bd96286536cd5b9a7373076d2ad315f1161a Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:40:44 -0600 Subject: [PATCH 15/43] =?UTF-8?q?Consolidaci=C3=B3n=20de=20migraciones=20e?= =?UTF-8?q?n=20reference:=20actualizaci=C3=B3n=20de=200001=5Finitial.py=20?= =?UTF-8?q?y=20eliminaci=C3=B3n=20de=20migraciones=20intermedias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/migrations/0001_initial.py | 124 +++++++++++++++--- .../0002_alter_elementcitation_score.py | 19 --- .../0003_elementcitation_marked_xml.py | 18 --- 3 files changed, 106 insertions(+), 55 deletions(-) delete mode 100644 reference/migrations/0002_alter_elementcitation_score.py delete mode 100644 reference/migrations/0003_elementcitation_marked_xml.py diff --git a/reference/migrations/0001_initial.py b/reference/migrations/0001_initial.py index a8bced5..4a10074 100644 --- a/reference/migrations/0001_initial.py +++ b/reference/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.8 on 2025-02-05 08:54 +# Generated by Django 5.0.3 on 2025-07-08 19:16 import django.core.validators import django.db.models.deletion @@ -17,32 +17,120 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='Reference', + name="Reference", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', models.DateTimeField(auto_now_add=True, verbose_name='Creation date')), - ('updated', models.DateTimeField(auto_now=True, verbose_name='Last update date')), - ('mixed_citation', models.TextField(blank=True, verbose_name='Mixed Citation')), - ('estatus', models.IntegerField(default=0)), - ('creator', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_creator', to=settings.AUTH_USER_MODEL, verbose_name='Creator')), - ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Updater')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created", + models.DateTimeField( + auto_now_add=True, verbose_name="Creation date" + ), + ), + ( + "updated", + models.DateTimeField( + auto_now=True, verbose_name="Last update date" + ), + ), + ( + "mixed_citation", + models.TextField(blank=True, verbose_name="Mixed Citation"), + ), + ( + "estatus", + models.IntegerField( + blank=True, + choices=[ + (0, "No reference"), + (1, "Creating reference"), + (2, "Reference ready"), + ], + default=0, + verbose_name="Reference estatus", + ), + ), + ( + "creator", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_creator", + to=settings.AUTH_USER_MODEL, + verbose_name="Creator", + ), + ), + ( + "updated_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_last_mod_user", + to=settings.AUTH_USER_MODEL, + verbose_name="Updater", + ), + ), ], options={ - 'abstract': False, + "abstract": False, }, ), migrations.CreateModel( - name='ElementCitation', + name="ElementCitation", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('sort_order', models.IntegerField(blank=True, editable=False, null=True)), - ('marked', models.JSONField(blank=True, default=dict, verbose_name='Marked')), - ('score', models.IntegerField(blank=True, help_text='Puntuación del 1 al 10', null=True, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(10)])), - ('reference', modelcluster.fields.ParentalKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='element_citation', to='reference.reference')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "sort_order", + models.IntegerField(blank=True, editable=False, null=True), + ), + ( + "marked", + models.JSONField(blank=True, default=dict, verbose_name="Marked"), + ), + ("marked_xml", models.TextField(blank=True, verbose_name="Marked XML")), + ( + "score", + models.IntegerField( + blank=True, + help_text="Rating from 1 to 10", + null=True, + validators=[ + django.core.validators.MinValueValidator(1), + django.core.validators.MaxValueValidator(10), + ], + ), + ), + ( + "reference", + modelcluster.fields.ParentalKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="element_citation", + to="reference.reference", + ), + ), ], options={ - 'ordering': ['sort_order'], - 'abstract': False, + "ordering": ["sort_order"], + "abstract": False, }, ), ] diff --git a/reference/migrations/0002_alter_elementcitation_score.py b/reference/migrations/0002_alter_elementcitation_score.py deleted file mode 100644 index 35b76ce..0000000 --- a/reference/migrations/0002_alter_elementcitation_score.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.0.8 on 2025-02-14 21:02 - -import django.core.validators -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('reference', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='elementcitation', - name='score', - field=models.IntegerField(blank=True, help_text='Rating from 1 to 10', null=True, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(10)]), - ), - ] diff --git a/reference/migrations/0003_elementcitation_marked_xml.py b/reference/migrations/0003_elementcitation_marked_xml.py deleted file mode 100644 index a481f68..0000000 --- a/reference/migrations/0003_elementcitation_marked_xml.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.0.8 on 2025-03-02 07:02 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('reference', '0002_alter_elementcitation_score'), - ] - - operations = [ - migrations.AddField( - model_name='elementcitation', - name='marked_xml', - field=models.TextField(blank=True, verbose_name='Marked XML'), - ), - ] From 3024568adc61035ce98f91513cec646ec537eee6 Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:43:41 -0600 Subject: [PATCH 16/43] =?UTF-8?q?Actualizaci=C3=B3n=20de=20migraci=C3=B3n?= =?UTF-8?q?=20inicial=20en=20core=5Fsettings:=20cambio=20de=20versi=C3=B3n?= =?UTF-8?q?=20de=20Django=20y=20traducci=C3=B3n=20de=20verbose=5Fname=20a?= =?UTF-8?q?=20ingl=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core_settings/migrations/0001_initial.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core_settings/migrations/0001_initial.py b/core_settings/migrations/0001_initial.py index dca718a..3fde275 100644 --- a/core_settings/migrations/0001_initial.py +++ b/core_settings/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.3 on 2024-11-19 03:30 +# Generated by Django 5.0.8 on 2025-09-26 16:41 import django.db.models.deletion import wagtail.fields @@ -29,8 +29,8 @@ class Migration(migrations.Migration): ('site_logo', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image')), ], options={ - 'verbose_name': 'Configuração do site', - 'verbose_name_plural': 'Configuração do site', + 'verbose_name': 'Site configuration', + 'verbose_name_plural': 'Site configuration', }, ), ] From 1e31de7e9ecd54c9d84c3433c29c303c992a0d05 Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:44:25 -0600 Subject: [PATCH 17/43] =?UTF-8?q?Creaci=C3=B3n=20de=20migraci=C3=B3n=20ini?= =?UTF-8?q?cial=20en=20core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/migrations/0001_initial.py | 107 ++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 core/migrations/0001_initial.py diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py new file mode 100644 index 0000000..f698d0f --- /dev/null +++ b/core/migrations/0001_initial.py @@ -0,0 +1,107 @@ +# Generated by Django 5.0.8 on 2025-09-21 23:13 + +import django.db.models.deletion +import wagtail.fields +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='FlexibleDate', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('year', models.IntegerField(blank=True, null=True, verbose_name='Year')), + ('month', models.IntegerField(blank=True, null=True, verbose_name='Month')), + ('day', models.IntegerField(blank=True, null=True, verbose_name='Day')), + ], + ), + migrations.CreateModel( + name='Language', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='Creation date')), + ('updated', models.DateTimeField(auto_now=True, verbose_name='Last update date')), + ('name', models.TextField(blank=True, null=True, verbose_name='Language Name')), + ('code2', models.TextField(blank=True, null=True, verbose_name='Language code 2')), + ('creator', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_creator', to=settings.AUTH_USER_MODEL, verbose_name='Creator')), + ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Updater')), + ], + options={ + 'verbose_name': 'Language', + 'verbose_name_plural': 'Languages', + }, + ), + migrations.CreateModel( + name='License', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='Creation date')), + ('updated', models.DateTimeField(auto_now=True, verbose_name='Last update date')), + ('license_type', models.CharField(blank=True, max_length=255, null=True)), + ('creator', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_creator', to=settings.AUTH_USER_MODEL, verbose_name='Creator')), + ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Updater')), + ], + options={ + 'verbose_name': 'License', + 'verbose_name_plural': 'Licenses', + }, + ), + migrations.CreateModel( + name='LicenseStatement', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='Creation date')), + ('updated', models.DateTimeField(auto_now=True, verbose_name='Last update date')), + ('url', models.CharField(blank=True, max_length=255, null=True)), + ('license_p', wagtail.fields.RichTextField(blank=True, null=True)), + ('creator', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_creator', to=settings.AUTH_USER_MODEL, verbose_name='Creator')), + ('language', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.language')), + ('license', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.license')), + ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Updater')), + ], + options={ + 'verbose_name': 'License', + 'verbose_name_plural': 'Licenses', + }, + ), + migrations.CreateModel( + name='Gender', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='Creation date')), + ('updated', models.DateTimeField(auto_now=True, verbose_name='Last update date')), + ('code', models.CharField(blank=True, max_length=5, null=True, verbose_name='Code')), + ('gender', models.CharField(blank=True, max_length=50, null=True, verbose_name='Sex')), + ('creator', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_creator', to=settings.AUTH_USER_MODEL, verbose_name='Creator')), + ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Updater')), + ], + options={ + 'unique_together': {('code', 'gender')}, + }, + ), + migrations.AddIndex( + model_name='license', + index=models.Index(fields=['license_type'], name='core_licens_license_5d1905_idx'), + ), + migrations.AlterUniqueTogether( + name='license', + unique_together={('license_type',)}, + ), + migrations.AddIndex( + model_name='licensestatement', + index=models.Index(fields=['url'], name='core_licens_url_ec8078_idx'), + ), + migrations.AlterUniqueTogether( + name='licensestatement', + unique_together={('url', 'license_p', 'language')}, + ), + ] From 826800b4f8e638cb5f897e3453c08779b11b8b06 Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 26 Sep 2025 10:53:55 -0600 Subject: [PATCH 18/43] =?UTF-8?q?Eliminaci=C3=B3n=20de=20la=20app=20llama3?= =?UTF-8?q?:=20funcionalidades=20migradas=20a=20model=5Fai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- llama3/__init__.py | 0 llama3/download_model.py | 15 --------------- llama3/generic_llama.py | 22 ---------------------- 3 files changed, 37 deletions(-) delete mode 100644 llama3/__init__.py delete mode 100644 llama3/download_model.py delete mode 100644 llama3/generic_llama.py diff --git a/llama3/__init__.py b/llama3/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/llama3/download_model.py b/llama3/download_model.py deleted file mode 100644 index 0b93f8f..0000000 --- a/llama3/download_model.py +++ /dev/null @@ -1,15 +0,0 @@ -from huggingface_hub import login -from huggingface_hub import hf_hub_download - - -HF_TOKEN = 'INTRODUCE_TOKEN' - -login(token=HF_TOKEN) - -LLAMA_MODEL_DIR = "llama3/llama-3.2" -MODEL_LLAMA = "llama-3.2-3b-instruct-q4_k_m.gguf" -repo_id = 'hugging-quants/Llama-3.2-3B-Instruct-Q4_K_M-GGUF' -filename = MODEL_LLAMA -local_dir = LLAMA_MODEL_DIR - -downloaded_file = hf_hub_download(repo_id=repo_id, filename=filename, local_dir=local_dir) \ No newline at end of file diff --git a/llama3/generic_llama.py b/llama3/generic_llama.py deleted file mode 100644 index 2e56f16..0000000 --- a/llama3/generic_llama.py +++ /dev/null @@ -1,22 +0,0 @@ - -from config.settings.base import LLAMA_MODEL_DIR, MODEL_LLAMA -from llama_cpp import Llama -import os - -class GenericLlama: - - def __init__(self, messages, response_format, max_tokens=4000, temperature=0.5, top_p=0.5): - self. llm = Llama(model_path = os.path.join(LLAMA_MODEL_DIR, MODEL_LLAMA), n_ctx=4000) - self. messages = messages - self.response_format = response_format - self.max_tokens = max_tokens - self.temperature = temperature - self.top_p = top_p - - def run(self, user_input): - input = self.messages.copy() - input.append({ - 'role': 'user', - 'content': user_input - }) - return self.llm.create_chat_completion(messages=input, response_format=self.response_format, max_tokens=self.max_tokens, temperature=self.temperature, top_p=self.top_p) \ No newline at end of file From 76258cd26cdb31f0ca3a5fb21ad0ab1342a5c082 Mon Sep 17 00:00:00 2001 From: Edgar Date: Sun, 5 Oct 2025 13:16:55 -0600 Subject: [PATCH 19/43] fix(markup_doc): capturar ArticleDocxMarkup.DoesNotExist en generate_xml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrige el tipo de excepción para responder 404 cuando el registro no existe. --- markup_doc/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/markup_doc/views.py b/markup_doc/views.py index 037bb80..9c002da 100644 --- a/markup_doc/views.py +++ b/markup_doc/views.py @@ -47,7 +47,7 @@ def generate_xml(request, id_registro): response['Content-Disposition'] = f'attachment; filename="{nombre_archivo}"' return response - except TuModelo.DoesNotExist: + except ArticleDocxMarkup.DoesNotExist: return HttpResponse("El registro solicitado no existe", status=404) except Exception as e: return HttpResponse(f"Error al generar el XML: {str(e)}", status=500) From aff3a394b610dfb056c7e81ac3b3ebe5798158fa Mon Sep 17 00:00:00 2001 From: Edgar Date: Sun, 5 Oct 2025 13:37:21 -0600 Subject: [PATCH 20/43] =?UTF-8?q?refactor(markuplib):=20eliminar=20prints?= =?UTF-8?q?=20de=20depuraci=C3=B3n=20en=20extracci=C3=B3n=20de=20enlaces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reduce ruido en logs y mantiene la función enfocada a su retorno. --- markuplib/function_docx.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/markuplib/function_docx.py b/markuplib/function_docx.py index bfdb958..fb1e930 100644 --- a/markuplib/function_docx.py +++ b/markuplib/function_docx.py @@ -119,8 +119,6 @@ def extract_hiperlink(self, element, rels_map, namespaces): if r_id and r_id in rels_map: links.append(rels_map[r_id]) - print("*********************************") - print(links) return ' '.join(links) if links else None From 6dd1ae2ec526612109d987f76bb3146a5e50eaef Mon Sep 17 00:00:00 2001 From: Edgar Date: Sun, 5 Oct 2025 13:38:01 -0600 Subject: [PATCH 21/43] style(model_ai): reemplazar bare except por Exception en download_model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mejora legibilidad y buenas prácticas de manejo de errores. --- model_ai/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model_ai/tasks.py b/model_ai/tasks.py index cd53060..0af79a2 100644 --- a/model_ai/tasks.py +++ b/model_ai/tasks.py @@ -18,6 +18,6 @@ def download_model(id): instance = LlamaModel.objects.get(id=id) get_model(instance.hf_token, instance.name_model, instance.name_file) instance.download_status = DownloadStatus.DOWNLOADED - except: + except Exception: instance.download_status = DownloadStatus.ERROR instance.save() \ No newline at end of file From 5842054e0cfd7be4e2869d4eb128b6a7332f454a Mon Sep 17 00:00:00 2001 From: Edgar Date: Sun, 5 Oct 2025 13:38:48 -0600 Subject: [PATCH 22/43] fix(reference): corregir literales y separadores en config_gemini para prompt de referencias Se agregan comillas a campos textuales y se corrigen comas/keys para evitar errores de parseo del prompt. --- reference/config_gemini.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reference/config_gemini.py b/reference/config_gemini.py index a2f0e0a..d7fb18f 100644 --- a/reference/config_gemini.py +++ b/reference/config_gemini.py @@ -139,7 +139,7 @@ def create_prompt_reference(references): "source": "The role of physical activity on the need for revision total knee arthroplasty in individuals with osteoarthritis of the knee [dissertation]", "organization": "University of Pittsburgh", "location": "[Pittsburgh (PA)]", - "num_pages": 436 p + "num_pages": "436 p" }}, {{ "full_text": "Schimper, A. F. W. 1903. Plant geography upon a physiological basis. Clarendon Press. Oxford, UK. 839 pp.", @@ -150,7 +150,7 @@ def create_prompt_reference(references): "date": 1903, "source": "Plant geography upon a physiological basis", "organization": "Clarendon Press", - "location": "Oxford, UK" + "location": "Oxford, UK", "num_pages": 839 }}, {{ @@ -241,10 +241,10 @@ def create_prompt_reference(references): ], "date": c2005, "source": "Advanced practice nursing: an integrative approach", - "edition: "3rd ed" + "edition: "3rd ed", "organization": "Elsevier Saunders", "location": "St. Louis (MO)", - "num_pages": 979 p + "num_pages": "979 p" }}, {{ "full_text": "Calkins BM, Mendeloff AI. The epidemiology of idiopathic inflammatory bowel disease. In: Kirsner JB, Shorter RG, eds. Inflammatory bowel disease, 4th ed. Baltimore: Williams & Wilkins. 1995:31-68.", @@ -260,7 +260,7 @@ def create_prompt_reference(references): "date": 1995, "source": "Inflammatory bowel disease", "chapter": "The epidemiology of idiopathic inflammatory bowel disease.", - "edition: "4th" + "edition: "4th", "organization": "Williams & Wilkins", "location": "Baltimore", "fpage": 31, From 6a09911cc336aaf1e41a893c2e8ee849d8ffe31f Mon Sep 17 00:00:00 2001 From: Edgar Date: Sun, 5 Oct 2025 13:39:24 -0600 Subject: [PATCH 23/43] i18n(reference): envolver labels y help_text con gettext_lazy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Permite traducción de 'Mixed Citation' y 'Rating from 1 to 10'. --- reference/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference/models.py b/reference/models.py index 3eccba1..d08841b 100755 --- a/reference/models.py +++ b/reference/models.py @@ -19,7 +19,7 @@ class ReferenceStatus(models.IntegerChoices): # Create your models here class Reference(CommonControlField, ClusterableModel): - mixed_citation = models.TextField(("Mixed Citation"), null=False, blank=True) + mixed_citation = models.TextField(_("Mixed Citation"), null=False, blank=True) estatus = models.IntegerField( _("Reference estatus"), @@ -53,7 +53,7 @@ class ElementCitation(Orderable): MinValueValidator(1), # Mínimo 1 MaxValueValidator(10) # Máximo 10 ], - help_text="Rating from 1 to 10" + help_text=_("Rating from 1 to 10") ) panels = [ From 95e6d31e470d386b3d91ba38d12fcdb3568bd673 Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 17 Oct 2025 12:22:13 -0600 Subject: [PATCH 24/43] model_ai: corrige etiqueta de i18n y refuerza unicidad de LlamaModel en save() --- model_ai/models.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/model_ai/models.py b/model_ai/models.py index b147e80..1498447 100644 --- a/model_ai/models.py +++ b/model_ai/models.py @@ -36,7 +36,7 @@ class LlamaModel(CommonControlField): name_file = models.CharField(_("Model file"), blank=True, max_length=255) hf_token = models.CharField(_("Hugging Face token"), blank=True, max_length=255) download_status = models.IntegerField( - _("Local model estatus"), + _("Local model status"), choices=DownloadStatus.choices, blank=True, default=DownloadStatus.NO_MODEL @@ -70,6 +70,11 @@ def display_name_model(self): def clean(self): if not self.pk and LlamaModel.objects.exists(): raise ValidationError(_("Only one instance of LlamaModel is allowed.")) + + def save(self, *args, **kwargs): + if not self.pk and LlamaModel.objects.exists(): + raise ValidationError(_("Only one instance of LlamaModel is allowed.")) + super().save(*args, **kwargs) def __str__(self): return self.name_model \ No newline at end of file From 192403dccf258e4e8c78c2952e1ec2caf266f27c Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 17 Oct 2025 12:24:30 -0600 Subject: [PATCH 25/43] reference: renombra campo 'estatus' a 'status' y ajusta etiqueta a 'Reference status' (incluye migraciones) --- reference/migrations/0001_initial.py | 125 ++++----------------------- reference/models.py | 4 +- 2 files changed, 21 insertions(+), 108 deletions(-) diff --git a/reference/migrations/0001_initial.py b/reference/migrations/0001_initial.py index 4a10074..8df5170 100644 --- a/reference/migrations/0001_initial.py +++ b/reference/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.3 on 2025-07-08 19:16 +# Generated by Django 5.0.8 on 2025-10-17 18:23 import django.core.validators import django.db.models.deletion @@ -17,120 +17,33 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name="Reference", + name='Reference', fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "created", - models.DateTimeField( - auto_now_add=True, verbose_name="Creation date" - ), - ), - ( - "updated", - models.DateTimeField( - auto_now=True, verbose_name="Last update date" - ), - ), - ( - "mixed_citation", - models.TextField(blank=True, verbose_name="Mixed Citation"), - ), - ( - "estatus", - models.IntegerField( - blank=True, - choices=[ - (0, "No reference"), - (1, "Creating reference"), - (2, "Reference ready"), - ], - default=0, - verbose_name="Reference estatus", - ), - ), - ( - "creator", - models.ForeignKey( - editable=False, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="%(class)s_creator", - to=settings.AUTH_USER_MODEL, - verbose_name="Creator", - ), - ), - ( - "updated_by", - models.ForeignKey( - blank=True, - editable=False, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="%(class)s_last_mod_user", - to=settings.AUTH_USER_MODEL, - verbose_name="Updater", - ), - ), + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='Creation date')), + ('updated', models.DateTimeField(auto_now=True, verbose_name='Last update date')), + ('mixed_citation', models.TextField(blank=True, verbose_name='Mixed Citation')), + ('status', models.IntegerField(blank=True, choices=[(0, 'No reference'), (1, 'Creating reference'), (2, 'Reference ready')], default=0, verbose_name='Reference status')), + ('creator', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_creator', to=settings.AUTH_USER_MODEL, verbose_name='Creator')), + ('updated_by', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_last_mod_user', to=settings.AUTH_USER_MODEL, verbose_name='Updater')), ], options={ - "abstract": False, + 'abstract': False, }, ), migrations.CreateModel( - name="ElementCitation", + name='ElementCitation', fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "sort_order", - models.IntegerField(blank=True, editable=False, null=True), - ), - ( - "marked", - models.JSONField(blank=True, default=dict, verbose_name="Marked"), - ), - ("marked_xml", models.TextField(blank=True, verbose_name="Marked XML")), - ( - "score", - models.IntegerField( - blank=True, - help_text="Rating from 1 to 10", - null=True, - validators=[ - django.core.validators.MinValueValidator(1), - django.core.validators.MaxValueValidator(10), - ], - ), - ), - ( - "reference", - modelcluster.fields.ParentalKey( - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="element_citation", - to="reference.reference", - ), - ), + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sort_order', models.IntegerField(blank=True, editable=False, null=True)), + ('marked', models.JSONField(blank=True, default=dict, verbose_name='Marked')), + ('marked_xml', models.TextField(blank=True, verbose_name='Marked XML')), + ('score', models.IntegerField(blank=True, help_text='Rating from 1 to 10', null=True, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(10)])), + ('reference', modelcluster.fields.ParentalKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='element_citation', to='reference.reference')), ], options={ - "ordering": ["sort_order"], - "abstract": False, + 'ordering': ['sort_order'], + 'abstract': False, }, ), ] diff --git a/reference/models.py b/reference/models.py index d08841b..86f3651 100755 --- a/reference/models.py +++ b/reference/models.py @@ -21,8 +21,8 @@ class ReferenceStatus(models.IntegerChoices): class Reference(CommonControlField, ClusterableModel): mixed_citation = models.TextField(_("Mixed Citation"), null=False, blank=True) - estatus = models.IntegerField( - _("Reference estatus"), + status = models.IntegerField( + _("Reference status"), choices=ReferenceStatus.choices, blank=True, default=ReferenceStatus.NO_REFERENCE From 22fe3d1ce8599bf7bc837675ac1412ef5f5eea58 Mon Sep 17 00:00:00 2001 From: Edgar Date: Fri, 17 Oct 2025 12:24:54 -0600 Subject: [PATCH 26/43] reference: elimina import no utilizado en wagtail_hooks.py --- reference/wagtail_hooks.py | 1 - 1 file changed, 1 deletion(-) diff --git a/reference/wagtail_hooks.py b/reference/wagtail_hooks.py index c6b42c1..22a67c0 100644 --- a/reference/wagtail_hooks.py +++ b/reference/wagtail_hooks.py @@ -5,7 +5,6 @@ ModelAdminGroup, modeladmin_register, ) -from wagtail_modeladmin.views import CreateView from wagtail.admin.menu import MenuItem from reference.data_utils import get_reference From e000258ec6fd434a0f6f5f9af5111468d6efd579 Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 15:49:43 -0300 Subject: [PATCH 27/43] =?UTF-8?q?adiciona=20instru=C3=A7=C3=B5es=20para=20?= =?UTF-8?q?fazer=20build=20com=20suporte=20a=20Llama?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 725b37e..3df0f20 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ Targets: vcs_ref Show last commit ref build_date Show build date build Build app using $(COMPOSE_FILE_DEV) + build_llama Build app using llama.local.yml up Start app using $(COMPOSE_FILE_DEV) logs Show logs using $(COMPOSE_FILE_DEV) stop Stop app using $(COMPOSE_FILE_DEV) @@ -58,7 +59,7 @@ Targets: ### Common Commands -Build the development environment: +Build the development environment without Llama support: ```bash make build compose=local.yml @@ -66,6 +67,11 @@ make build compose=local.yml make ``` +Build the development environment with Llama support: +```bash +make build compose=llama.local.yml +``` + Start the project: ```bash From cbc8509899fd171e8fe853aab974064649f14554 Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 15:50:42 -0300 Subject: [PATCH 28/43] melhora imports --- model_ai/tasks.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/model_ai/tasks.py b/model_ai/tasks.py index 0af79a2..e7c354e 100644 --- a/model_ai/tasks.py +++ b/model_ai/tasks.py @@ -1,9 +1,12 @@ +# Standard library imports from config import celery_app -from model_ai.models import LlamaModel, DownloadStatus from config.settings.base import LLAMA_MODEL_DIR -from huggingface_hub import login -from huggingface_hub import hf_hub_download +# Third party imports +from huggingface_hub import login, hf_hub_download + +# Local application imports +from model_ai.models import LlamaModel, DownloadStatus def get_model(hf_token, name_model, name_file): @@ -20,4 +23,4 @@ def download_model(id): instance.download_status = DownloadStatus.DOWNLOADED except Exception: instance.download_status = DownloadStatus.ERROR - instance.save() \ No newline at end of file + instance.save() From 2c321388b9314613b62baf217af905ac5f766777 Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 17:12:18 -0300 Subject: [PATCH 29/43] Apaga modulo legado llama3 --- llama3/generic_llama.py | 58 ----------------------------------------- 1 file changed, 58 deletions(-) delete mode 100644 llama3/generic_llama.py diff --git a/llama3/generic_llama.py b/llama3/generic_llama.py deleted file mode 100644 index e25d4f9..0000000 --- a/llama3/generic_llama.py +++ /dev/null @@ -1,58 +0,0 @@ -from config.settings.base import LLAMA_ENABLED, LLAMA_MODEL_DIR, MODEL_LLAMA - -import os - - -class LlamaDisabledError(Exception): - pass - -class LlamaModelNotFoundError(FileNotFoundError): - pass - -class LlamaNotInstalledError(ImportError): - pass - -class GenericLlama: - # Singleton pattern to cache the LLaMA model instance - _cached_llm = None - - def __init__(self, messages, response_format, max_tokens=4000, temperature=0.5, top_p=0.5): - self.messages = messages - self.response_format = response_format - self.max_tokens = max_tokens - self.temperature = temperature - self.top_p = top_p - - if not LLAMA_ENABLED: - raise LlamaDisabledError("LLaMA is disabled in settings.") - - if GenericLlama._cached_llm is None: - try: - from llama_cpp import Llama - except ImportError as e: - raise LlamaNotInstalledError("The 'llama-cpp-python' package is not installed. Please use the llama-activated Docker image (Dockerfile.llama).") from e - - model_path = os.path.join(LLAMA_MODEL_DIR, MODEL_LLAMA) - if not os.path.isfile(model_path): - raise LlamaModelNotFoundError(f"LLaMA model file not found at {model_path}. Please ensure the model is downloaded and the path is correct.") - - try: - GenericLlama._cached_llm = Llama(model_path=model_path, n_ctx=max_tokens) - except Exception as e: - raise RuntimeError(f"Failed to initialize LLaMA model: {e}") from e - - self.llm = GenericLlama._cached_llm - - def run(self, user_input): - input = self.messages.copy() - input.append({ - 'role': 'user', - 'content': user_input - }) - return self.llm.create_chat_completion( - messages=input, - response_format=self.response_format, - max_tokens=self.max_tokens, - temperature=self.temperature, - top_p=self.top_p - ) From aa9c6a3c031bb7a2dc2d4d815f2971e8a84f8853 Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 17:13:38 -0300 Subject: [PATCH 30/43] =?UTF-8?q?Resolve=20conflitos=20em=20generic=5Fllam?= =?UTF-8?q?a=20e=20aplica=20corre=C3=A7=C3=B5es=20estruturais:=20-=20funct?= =?UTF-8?q?ion=5Fllama=20passou=20a=20ser=20LlamaInputSettings=20em=20llam?= =?UTF-8?q?a.py=20-=20generic=5Fllama=20passou=20a=20ser=20llama.py=20com?= =?UTF-8?q?=20LlamaService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model_ai/exceptions.py | 8 +++ model_ai/function_llama.py | 21 ------ model_ai/generic_llama.py | 35 ---------- model_ai/llama.py | 130 +++++++++++++++++++++++++++++++++++++ 4 files changed, 138 insertions(+), 56 deletions(-) create mode 100644 model_ai/exceptions.py delete mode 100644 model_ai/function_llama.py delete mode 100644 model_ai/generic_llama.py create mode 100644 model_ai/llama.py diff --git a/model_ai/exceptions.py b/model_ai/exceptions.py new file mode 100644 index 0000000..c1017de --- /dev/null +++ b/model_ai/exceptions.py @@ -0,0 +1,8 @@ +class LlamaDisabledError(Exception): + pass + +class LlamaModelNotFoundError(FileNotFoundError): + pass + +class LlamaNotInstalledError(ImportError): + pass diff --git a/model_ai/function_llama.py b/model_ai/function_llama.py deleted file mode 100644 index f0bdae1..0000000 --- a/model_ai/function_llama.py +++ /dev/null @@ -1,21 +0,0 @@ -from llama_cpp import Llama -import os -from model_ai import messages - -class functionsLlama: - - def getFirstMetadata(text): - print(messages.ALL_FIRST_BLOCK.format(text=text)) - return messages.ALL_FIRST_BLOCK.format(text=text) - - def getDoiAndSection(): - return messages.DOI_AND_SECTION_MESSAGES, messages.DOI_AND_SECTION_FORMAT - - def getTitles(): - return messages.TITLE_MESSAGES, messages.TITLE_RESPONSE_FORMAT - - def getAuthorConfig(): - return messages.AUTHOR_MESSAGES, messages.AUTHOR_RESPONSE_FORMAT - - def getAffiliations(): - return messages.AFFILIATION_MESSAGES, messages.AFFILIATION_RESPONSE_FORMAT \ No newline at end of file diff --git a/model_ai/generic_llama.py b/model_ai/generic_llama.py deleted file mode 100644 index 2e42415..0000000 --- a/model_ai/generic_llama.py +++ /dev/null @@ -1,35 +0,0 @@ -from config.settings.base import LLAMA_MODEL_DIR -from llama_cpp import Llama -import os -import google.generativeai as genai -from model_ai.models import LlamaModel - -class GenericLlama: - - def __init__(self, messages=None, response_format=None, max_tokens=4000, temperature=0.1, top_p=0.1, type='chat'): - model_ai = LlamaModel.objects.first() - self.llm = Llama(model_path = os.path.join(LLAMA_MODEL_DIR, model_ai.name_file), n_threads=2, n_ctx=5000) - self.messages = messages - self.response_format = response_format - self.max_tokens = max_tokens - self.temperature = temperature - self.top_p = top_p - self.type = type - - def run(self, user_input): - if self.type == 'chat': - input = self.messages.copy() - input.append({ - 'role': 'user', - 'content': user_input - }) - return self.llm.create_chat_completion(messages=input, response_format=self.response_format, max_tokens=self.max_tokens, temperature=self.temperature, top_p=self.top_p) - if self.type == 'prompt': - #USO DE GEMINI - model_ai = LlamaModel.objects.first() - if model_ai and model_ai.api_key_gemini: - genai.configure(api_key=model_ai.api_key_gemini) - model = genai.GenerativeModel('models/gemini-2.0-flash') - return model.generate_content(user_input).text - else: - return self.llm(user_input, max_tokens=2000, temperature=self.temperature, stop=["\n\n"]) \ No newline at end of file diff --git a/model_ai/llama.py b/model_ai/llama.py new file mode 100644 index 0000000..29b855e --- /dev/null +++ b/model_ai/llama.py @@ -0,0 +1,130 @@ +# Standard library imports +import logging +import os + +from config.settings.base import ( + LLAMA_ENABLED, + LLAMA_MODEL_DIR, +) + +# Third-party imports +import google.generativeai as genai + +# Local application imports +from model_ai import messages +from model_ai.exceptions import ( + LlamaDisabledError, + LlamaModelNotFoundError, + LlamaNotInstalledError, +) +from model_ai.models import LlamaModel + + +class LlamaService: + # Singleton pattern to cache the LLaMA model instance + _cached_llm = None + + def __init__(self, messages, response_format, max_tokens=4000, temperature=0.1, top_p=0.1, mode='chat', nthreads=2): + self.messages = messages + self.response_format = response_format + self.max_tokens = max_tokens + self.temperature = temperature + self.top_p = top_p + self.mode = mode + + if not LLAMA_ENABLED: + raise LlamaDisabledError("LLaMA is disabled in settings.") + + if LlamaService._cached_llm is None: + try: + from llama_cpp import Llama + except ImportError as e: + raise LlamaNotInstalledError("The 'llama-cpp-python' package is not installed. Please use the llama-activated Docker image (Dockerfile.llama).") from e + + model_ai = LlamaModel.objects.first() + if not model_ai: + raise LlamaModelNotFoundError("No LLaMA model configured in the database. Please add a LLaMA model entry.") + + model_path = os.path.join(LLAMA_MODEL_DIR, model_ai.name_file) + if not os.path.isfile(model_path): + raise LlamaModelNotFoundError(f"LLaMA model file not found at {model_path}. Please ensure the model is downloaded and the path is correct.") + + try: + LlamaService._cached_llm = Llama(model_path=model_path, n_ctx=max_tokens, n_threads=nthreads) + except Exception as e: + raise RuntimeError(f"Failed to initialize LLaMA model: {e}") from e + + self.llm = LlamaService._cached_llm + + def run(self, user_input): + if self.mode == 'chat': + return self._run_as_chat(user_input) + elif self.mode == 'prompt': + return self._run_as_content_generation(user_input) + + def _run_as_chat(self, user_input): + """ Run LLaMA in chat mode.""" + input = self.messages.copy() + input.append({ + 'role': 'user', + 'content': user_input + }) + return self.llm.create_chat_completion( + messages=input, + response_format=self.response_format, + max_tokens=self.max_tokens, + temperature=self.temperature, + top_p=self.top_p + ) + + def _run_as_content_generation(self, user_input): + """ Run LLaMA in completion mode.""" + model_ai = LlamaModel.objects.first() + + # Try to use Gemini if configured + if model_ai and model_ai.api_key_gemini: + + # Setup Gemini API key + genai.configure(api_key=model_ai.api_key_gemini) + + # Fetch the Gemini model + model = genai.GenerativeModel('models/gemini-2.0-flash') + + # Generate content using Gemini + return model.generate_content(user_input).text + + # Gemini not configured, fallback to LLaMA + else: + return self.llm( + user_input, + max_tokens=self.max_tokens, + temperature=self.temperature, + stop=["\n\n"] + ) + +class LlamaInputSettings: + @staticmethod + def get_first_metadata(text): + logging.debug(messages.ALL_FIRST_BLOCK.format(text=text)) + return messages.ALL_FIRST_BLOCK.format(text=text) + + @staticmethod + def get_doi_and_section(): + return messages.DOI_AND_SECTION_MESSAGES, messages.DOI_AND_SECTION_FORMAT + + @staticmethod + def get_titles(): + return messages.TITLE_MESSAGES, messages.TITLE_RESPONSE_FORMAT + + @staticmethod + def get_author_config(): + return messages.AUTHOR_MESSAGES, messages.AUTHOR_RESPONSE_FORMAT + + @staticmethod + def get_affiliations(): + return messages.AFFILIATION_MESSAGES, messages.AFFILIATION_RESPONSE_FORMAT + + @staticmethod + def get_reference(): + return messages.REFERENCE_MESSAGES, messages.REFERENCE_RESPONSE_FORMAT + \ No newline at end of file From dc61b24c2a23654c8890986525a171c1fbb91f6e Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 17:13:50 -0300 Subject: [PATCH 31/43] Cria input settings para references --- model_ai/messages.py | 62 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/model_ai/messages.py b/model_ai/messages.py index bee6756..b21c06d 100644 --- a/model_ai/messages.py +++ b/model_ai/messages.py @@ -354,6 +354,68 @@ } } +REFERENCE_MESSAGES = [ + { 'role': 'system', + 'content': 'You are an assistant who distinguishes the metadata of a bibliographic reference and returns it in JSON format.' + }, + { 'role': 'user', + 'content': """ + Smith, J. (2020). Understanding AI. Journal of Technology, 15(3), 45-60. https://doi.org/10.1234/jtech.2020.015 + """ + }, + { 'role': 'assistant', + 'content': json.dumps({ + 'authors': [ + { + "name": "J.", + "surname": "Smith", + "orcid": "", + "aff": "", + "char": "" + } + ], + 'title': "Understanding AI", + 'journal': "Journal of Technology", + 'year': "2020", + 'volume': "15", + 'issue': "3", + 'pages': "45-60", + 'doi': "10.1234/jtech.2020.015" + }) + }, +] + +REFERENCE_RESPONSE_FORMAT = { + 'type': 'json_object', + 'schema':{ + 'type': 'object', + 'properties': { + 'authors': {'type': 'array', + 'items': { + 'type': 'object', + 'properties': { + 'name': {'type': 'string'}, + 'surname': {'type': 'string'}, + 'orcid': {'type': 'string'}, + 'aff': {'type': 'string'}, + 'char': {'type': 'string'} + }, + 'required': ['name', 'surname', 'orcid', 'aff', 'char'] + } + }, + 'title': {'type': 'string'}, + 'journal': {'type': 'string'}, + 'year': {'type': 'string'}, + 'volume': {'type': 'string'}, + 'issue': {'type': 'string'}, + 'pages': {'type': 'string'}, + 'doi': {'type': 'string'} + }, + 'required':['authors', 'title', 'journal', 'year', 'volume', 'issue', 'pages', 'doi'] + } +} + + ALL_FIRST_BLOCK = """ ### Instruction: From the provided Text, extract the specified metadata as shown in the Example. From e2e696aa92e16fce38d3e37431cadffbb9c9d7a4 Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 17:14:02 -0300 Subject: [PATCH 32/43] Padroniza deps --- requirements/base.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index d4776c9..f8be424 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -44,10 +44,10 @@ git+https://git@github.com/scieloorg/packtools@4.12.6#egg=packtools langdetect~=1.0.9 langid -# Gemini -# +# Google Generative AI +# ------------------------------------------------------------------------------ google-generativeai==0.3.2 # Docx -# +# ------------------------------------------------------------------------------ python-docx==1.1.2 \ No newline at end of file From 3e712af8665bd1c902d79f59bbd2853a7027e7e6 Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 17:15:16 -0300 Subject: [PATCH 33/43] =?UTF-8?q?Padroniza=20imports=20em=20geral=20(al?= =?UTF-8?q?=C3=A9m=20de=20adequar=20=C3=A0=20nova=20nomenclatura)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- markup_doc/marker.py | 7 ++++--- markup_doc/tasks.py | 23 +++++++++++++---------- markup_doc/wagtail_hooks.py | 7 +------ model_ai/wagtail_hooks.py | 7 ++++--- reference/marker.py | 6 +++--- reference/wagtail_hooks.py | 13 ++++++------- 6 files changed, 31 insertions(+), 32 deletions(-) diff --git a/markup_doc/marker.py b/markup_doc/marker.py index a811cbd..ba218e3 100644 --- a/markup_doc/marker.py +++ b/markup_doc/marker.py @@ -1,8 +1,9 @@ -from model_ai.generic_llama import GenericLlama -from model_ai.function_llama import functionsLlama - +# Standard library imports import re +# Local application imports +from model_ai.llama import LlamaService, LlamaInputSettings + def mark_article(text, metadata): if metadata == 'author': diff --git a/markup_doc/tasks.py b/markup_doc/tasks.py index 2eee90f..445e57c 100644 --- a/markup_doc/tasks.py +++ b/markup_doc/tasks.py @@ -1,9 +1,13 @@ +# Standard library imports +import json +import re + +# Third-party imports +import langid + +# Local application imports from config import celery_app -from django.core.files.base import ContentFile -from markup_doc.models import UploadDocx, MarkupXML #ArticleDocx, ArticleDocxMarkup -import re, json, langid, math -from markuplib.function_docx import functionsDocx -from packtools.sps.formats.sps_xml.contrib import build_contrib_author +from markup_doc.models import UploadDocx, MarkupXML from markup_doc.xml import get_xml from markup_doc.labeling_utils import ( split_in_three, @@ -15,14 +19,13 @@ get_data_first_block, getLLM ) -from markup_doc.models import( - ProcessStatus -) +from markup_doc.models import ProcessStatus from markup_doc.sync_api import sync_journals_from_api -from model_ai.generic_llama import GenericLlama -from model_ai.function_llama import functionsLlama +from markuplib.function_docx import functionsDocx +from model_ai.llama import LlamaService, LlamaInputSettings from reference.config_gemini import create_prompt_reference + def clean_labels(text): # Eliminar etiquetas tipo [kwd] o [sectitle], incluso si tienen espacios como [/ doctitle ] text = re.sub(r'\[\s*/?\s*\w+(?:\s+[^\]]+)?\s*\]', '', text) diff --git a/markup_doc/wagtail_hooks.py b/markup_doc/wagtail_hooks.py index 7dbf484..e03e73b 100644 --- a/markup_doc/wagtail_hooks.py +++ b/markup_doc/wagtail_hooks.py @@ -2,11 +2,7 @@ from django.utils.translation import gettext_lazy as _ from django.contrib import messages from django.template.response import TemplateResponse -from wagtail_modeladmin.options import ( - ModelAdmin, - ModelAdminGroup, - modeladmin_register, -) +from wagtail_modeladmin.options import ModelAdmin from wagtail.snippets.views.snippets import ( CreateView, @@ -14,7 +10,6 @@ SnippetViewSet, SnippetViewSetGroup ) -#from wagtail.contrib.modeladmin.views import CreateView, EditView from markup_doc.models import ( ArticleDocx, diff --git a/model_ai/wagtail_hooks.py b/model_ai/wagtail_hooks.py index 960cbb4..2263e23 100644 --- a/model_ai/wagtail_hooks.py +++ b/model_ai/wagtail_hooks.py @@ -1,3 +1,4 @@ +# Third party imports from django.http import HttpResponseRedirect from django.utils.translation import gettext_lazy as _ from django.contrib import messages @@ -6,15 +7,15 @@ CreateView, EditView, SnippetViewSet, - SnippetViewSetGroup ) +from wagtail.snippets.models import register_snippet + +# Local application imports from model_ai.models import ( LlamaModel, DownloadStatus, ) - -from wagtail.snippets.models import register_snippet from model_ai.tasks import download_model diff --git a/reference/marker.py b/reference/marker.py index a2b8296..96a639a 100644 --- a/reference/marker.py +++ b/reference/marker.py @@ -1,7 +1,7 @@ import logging -from model_ai.generic_llama import ( - GenericLlama, +from model_ai.llama import ( + LlamaService, LlamaDisabledError, LlamaNotInstalledError, LlamaModelNotFoundError, @@ -12,7 +12,7 @@ def mark_reference(reference_text): try: - reference_marker = GenericLlama(MESSAGES, RESPONSE_FORMAT) + reference_marker = LlamaService(MESSAGES, RESPONSE_FORMAT) output = reference_marker.run(reference_text) for item in output.get("choices", []): yield item.get("message", {}).get("content", "") diff --git a/reference/wagtail_hooks.py b/reference/wagtail_hooks.py index b55dc00..1df2211 100644 --- a/reference/wagtail_hooks.py +++ b/reference/wagtail_hooks.py @@ -1,17 +1,16 @@ +# Third-party imports from django.http import HttpResponseRedirect from django.utils.translation import gettext_lazy as _ from wagtail.snippets.models import register_snippet - -from reference.models import Reference -from reference.tasks import get_reference - from wagtail.snippets.views.snippets import ( CreateView, - EditView, SnippetViewSet, - SnippetViewSetGroup ) -from model_ai.tasks import download_model + +# Local application imports +from reference.data_utils import get_reference +from reference.models import Reference + class ReferenceCreateView(CreateView): def form_valid(self, form): From dd94a35dfeae9026dd468128573a5738f69b47ec Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 17:15:42 -0300 Subject: [PATCH 34/43] =?UTF-8?q?Adiciona=20m=C3=A9todo=20faltante=20em=20?= =?UTF-8?q?marker=20(por=20causa=20de=20merge)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- markup_doc/marker.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/markup_doc/marker.py b/markup_doc/marker.py index ba218e3..20a49a0 100644 --- a/markup_doc/marker.py +++ b/markup_doc/marker.py @@ -7,15 +7,15 @@ def mark_article(text, metadata): if metadata == 'author': - messages, response_format = functionsLlama.getAuthorConfig() + messages, response_format = LlamaInputSettings.get_author_config() if metadata == 'affiliation': - messages, response_format = functionsLlama.getAffiliations() + messages, response_format = LlamaInputSettings.get_affiliations() if metadata == 'doi': - messages, response_format = functionsLlama.getDoiAndSection() + messages, response_format = LlamaInputSettings.get_doi_and_section() if metadata == 'title': - messages, response_format = functionsLlama.getTitles() + messages, response_format = LlamaInputSettings.get_titles() - gll = GenericLlama(messages, response_format) + gll = LlamaService(messages, response_format) output = gll.run(text) output = output['choices'][0]['message']['content'] if metadata == 'doi': @@ -26,6 +26,15 @@ def mark_article(text, metadata): output = output.group(0) return output +def mark_reference(reference_text): + messages, response_format = LlamaInputSettings.get_messages_and_response_format_for_reference(reference_text) + reference_marker = LlamaService(messages, response_format) + output = reference_marker.run(reference_text) + + for item in output["choices"]: + yield item["message"]["content"] + + def mark_references(reference_block): for ref_row in reference_block.split("\n"): ref_row = ref_row.strip() @@ -35,4 +44,3 @@ def mark_references(reference_block): "reference": ref_row, "choices": list(choices) } - From 3ed8e58148445a3644a7e35e8b2efd2766758043 Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 17:16:06 -0300 Subject: [PATCH 35/43] Remove linhas comentadas --- markup_doc/wagtail_hooks.py | 6 ------ model_ai/models.py | 5 ----- 2 files changed, 11 deletions(-) diff --git a/markup_doc/wagtail_hooks.py b/markup_doc/wagtail_hooks.py index e03e73b..50379a4 100644 --- a/markup_doc/wagtail_hooks.py +++ b/markup_doc/wagtail_hooks.py @@ -124,10 +124,8 @@ class ArticleDocxMarkupAdmin(ModelAdmin): list_per_page = 20 -#class UploadDocxAdmin(ModelAdmin): class UploadDocxViewSet(SnippetViewSet): model = UploadDocx - #create_view_class = ArticleDocxCreateView add_view_class = ArticleDocxCreateView menu_label = _("UploadDocx") menu_icon = "folder" @@ -143,10 +141,8 @@ class UploadDocxViewSet(SnippetViewSet): ) -#class MarkupXMLAdmin(ModelAdmin): class MarkupXMLViewSet(SnippetViewSet): model = MarkupXML - #create_view_class = ArticleDocxMarkupCreateView add_view_class = ArticleDocxMarkupCreateView edit_view_class = ArticleDocxEditView menu_label = _("MarkupXML") @@ -158,8 +154,6 @@ class MarkupXMLViewSet(SnippetViewSet): ) list_display=("title", ) - - list_per_page = 20 """ diff --git a/model_ai/models.py b/model_ai/models.py index 1498447..edcb564 100644 --- a/model_ai/models.py +++ b/model_ai/models.py @@ -31,7 +31,6 @@ def __init__(self, *args, **kwargs): class LlamaModel(CommonControlField): - #is_local = models.BooleanField(_("Use local model"), default=False) name_model = models.CharField(_("Hugging Face model name"), blank=True, max_length=255) name_file = models.CharField(_("Model file"), blank=True, max_length=255) hf_token = models.CharField(_("Hugging Face token"), blank=True, max_length=255) @@ -47,18 +46,14 @@ class LlamaModel(CommonControlField): null=True, help_text="Enter the AI API URL." ) - #is_gemini = models.BooleanField(_("Use API Gemini"), default=False) api_key_gemini = models.CharField(_("API KEY Gemini"), blank=True, max_length=255) - panels = [ - #FieldPanel("is_local"), FieldPanel("name_model"), FieldPanel("name_file"), FieldPanel("hf_token", widget=MaskedPasswordWidget()), FieldPanel("download_status", widget=DisabledSelect(choices=DownloadStatus.choices)), FieldPanel("api_url"), - #FieldPanel("is_gemini"), FieldPanel("api_key_gemini", widget=MaskedPasswordWidget()), ] From 1fbd7d180b3b70432c0e123f0f5c12578ead5f17 Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 17:16:26 -0300 Subject: [PATCH 36/43] Inclui AI Model na interace, para poder registrar modelos --- model_ai/wagtail_hooks.py | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/model_ai/wagtail_hooks.py b/model_ai/wagtail_hooks.py index 2263e23..6ff6edf 100644 --- a/model_ai/wagtail_hooks.py +++ b/model_ai/wagtail_hooks.py @@ -92,29 +92,17 @@ class LlamaModelViewSet(SnippetViewSet): model = LlamaModel add_view_class = LlamaModelCreateView edit_view_class = LlamaModelEditView - menu_label = _("Llama Model") + menu_label = _("AI LLM Model") menu_icon = "folder" - menu_order = 1 - add_to_settings_menu = False # or True to add your model to the Settings sub-menu + menu_order = 100 exclude_from_explorer = ( False # or True to exclude pages of this type from Wagtail's explorer view ) + add_to_admin_menu = True list_per_page = 20 list_display = ( "display_name_model", "get_download_status_display" ) -""" -class MarkupSnippetViewSetGroup(SnippetViewSetGroup): - menu_name = 'markup_docx' - menu_label = _('Markup Docx') - menu_icon = "folder-open-inverse" - menu_order = get_menu_order('markup_docx') - items = ( - UploadDocxViewSet, - MarkupXMLViewSet, - ) -""" - -register_snippet(LlamaModelViewSet) \ No newline at end of file +register_snippet(LlamaModelViewSet) From e22bc7c9d98d2f8764fc58b145b205ea01d28468 Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 17:16:40 -0300 Subject: [PATCH 37/43] =?UTF-8?q?Adequa=20uso=20do=20servi=C3=A7o=20Llama?= =?UTF-8?q?=20em=20tasks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- markup_doc/tasks.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/markup_doc/tasks.py b/markup_doc/tasks.py index 445e57c..29779a1 100644 --- a/markup_doc/tasks.py +++ b/markup_doc/tasks.py @@ -151,10 +151,10 @@ def get_labels(title, user_id): continue if item.get('type') == 'first_block': - first_block = GenericLlama(type='prompt', temperature=0.1) + first_block = LlamaService(type='prompt', temperature=0.1) if getLLM() == 'GEMINI': - output = first_block.run(functionsLlama.getFirstMetadata(clean_labels(item.get('text')))) + output = first_block.run(LlamaInputSettings.get_first_metadata(clean_labels(item.get('text')))) match = re.search(r'\{.*\}', output, re.DOTALL) if match: output = match.group(0) From 79245bdb4f77ac3ccfbc91fecfb9a2e901a2e831 Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 17:16:51 -0300 Subject: [PATCH 38/43] =?UTF-8?q?Adiciona=20migra=C3=A7=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0002_alter_llamamodel_download_status.py | 18 ++++++++++++++++++ .../0006_alter_generalevent_options.py | 17 +++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 model_ai/migrations/0002_alter_llamamodel_download_status.py create mode 100644 tracker/migrations/0006_alter_generalevent_options.py diff --git a/model_ai/migrations/0002_alter_llamamodel_download_status.py b/model_ai/migrations/0002_alter_llamamodel_download_status.py new file mode 100644 index 0000000..2cadd23 --- /dev/null +++ b/model_ai/migrations/0002_alter_llamamodel_download_status.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.8 on 2025-10-20 19:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('model_ai', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='llamamodel', + name='download_status', + field=models.IntegerField(blank=True, choices=[(1, 'No model'), (2, 'Downloading model'), (3, 'Model downloaded'), (4, 'Download error')], default=1, verbose_name='Local model status'), + ), + ] diff --git a/tracker/migrations/0006_alter_generalevent_options.py b/tracker/migrations/0006_alter_generalevent_options.py new file mode 100644 index 0000000..2c1a8b1 --- /dev/null +++ b/tracker/migrations/0006_alter_generalevent_options.py @@ -0,0 +1,17 @@ +# Generated by Django 5.0.8 on 2025-10-20 19:41 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('tracker', '0005_alter_xmldocumentevent_error_type'), + ] + + operations = [ + migrations.AlterModelOptions( + name='generalevent', + options={'ordering': ['-created'], 'verbose_name': 'General Event', 'verbose_name_plural': 'General Events'}, + ), + ] From 5740120fb8fe8ed52e1b0c4f41b4cad7d82e46cd Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 19:26:05 -0300 Subject: [PATCH 39/43] =?UTF-8?q?Corrige=20nome=20de=20par=C3=A2metro=20ty?= =?UTF-8?q?pe=20(deve=20ser=20mode)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- markup_doc/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/markup_doc/tasks.py b/markup_doc/tasks.py index 29779a1..cf41fdf 100644 --- a/markup_doc/tasks.py +++ b/markup_doc/tasks.py @@ -151,7 +151,7 @@ def get_labels(title, user_id): continue if item.get('type') == 'first_block': - first_block = LlamaService(type='prompt', temperature=0.1) + first_block = LlamaService(mode='prompt', temperature=0.1) if getLLM() == 'GEMINI': output = first_block.run(LlamaInputSettings.get_first_metadata(clean_labels(item.get('text')))) From a830fb5996dcbe21427f781fdeb2f83d5003f909 Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 19:46:41 -0300 Subject: [PATCH 40/43] Flexibiliza attrs de LlamaService --- model_ai/llama.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model_ai/llama.py b/model_ai/llama.py index 29b855e..9273731 100644 --- a/model_ai/llama.py +++ b/model_ai/llama.py @@ -24,7 +24,7 @@ class LlamaService: # Singleton pattern to cache the LLaMA model instance _cached_llm = None - def __init__(self, messages, response_format, max_tokens=4000, temperature=0.1, top_p=0.1, mode='chat', nthreads=2): + def __init__(self, messages=None, response_format=None, max_tokens=4000, temperature=0.1, top_p=0.1, mode='chat', nthreads=2): self.messages = messages self.response_format = response_format self.max_tokens = max_tokens From 3bf5c7c9eb8b7103f8a14b95e04bf43eca8f0c3e Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 19:47:30 -0300 Subject: [PATCH 41/43] Adiciona alguns FIXME --- markup_doc/labeling_utils.py | 6 ++++-- model_ai/llama.py | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/markup_doc/labeling_utils.py b/markup_doc/labeling_utils.py index ebd5409..e515417 100644 --- a/markup_doc/labeling_utils.py +++ b/markup_doc/labeling_utils.py @@ -152,6 +152,7 @@ def process_reference(num_ref, obj, user_id): 'reference': obj['value']['paragraph'] } + # FIXME: This function always fetches the first LlamaModel instance. model = LlamaModel.objects.first() if model.name_file: @@ -161,6 +162,8 @@ def process_reference(num_ref, obj, user_id): #url = "http://172.17.0.1:8400/api/v1/mix_citation/reference/" #url = "http://172.17.0.1:8009/api/v1/mix_citation/reference/" + + # FIXME: Hardcoded URL url = "http://django:8000/api/v1/reference/" headers = { @@ -278,6 +281,7 @@ def get_data_first_block(text, metadata, user_id): refresh = RefreshToken.for_user(user) access_token = refresh.access_token + # FIXME: Hardcoded URL url = "http://django:8000/api/v1/first_block/" headers = { @@ -1121,5 +1125,3 @@ def append_fragment(node_dest, val): # 5) Mover cada hijo al destino (sus .tail se conservan) for child in list(wrapper): node_dest.append(child) - - \ No newline at end of file diff --git a/model_ai/llama.py b/model_ai/llama.py index 9273731..366f75b 100644 --- a/model_ai/llama.py +++ b/model_ai/llama.py @@ -88,6 +88,7 @@ def _run_as_content_generation(self, user_input): genai.configure(api_key=model_ai.api_key_gemini) # Fetch the Gemini model + # FIXME: Hardcoded model name model = genai.GenerativeModel('models/gemini-2.0-flash') # Generate content using Gemini From f501379bbc3b06234c57dc54e6ccfd478c7afc1d Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 19:47:49 -0300 Subject: [PATCH 42/43] Melhora imports --- markup_doc/labeling_utils.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/markup_doc/labeling_utils.py b/markup_doc/labeling_utils.py index e515417..fdbbf16 100644 --- a/markup_doc/labeling_utils.py +++ b/markup_doc/labeling_utils.py @@ -1,10 +1,18 @@ -import requests +# Standard library imports import json import re +import requests + from lxml import etree -from .choices import order_labels + +# Third-party imports +from django.contrib.auth import get_user_model from rest_framework_simplejwt.tokens import RefreshToken + +# Local application imports from model_ai.models import LlamaModel +from .choices import order_labels + def getLLM(): @@ -142,8 +150,6 @@ def create_special_content_object(item, stream_data_body, counts): return obj, counts -from django.contrib.auth import get_user_model - User = get_user_model() From cb739b45fce56589c9e222085bf289d17e5977e7 Mon Sep 17 00:00:00 2001 From: Rafael JPD Date: Mon, 20 Oct 2025 19:48:11 -0300 Subject: [PATCH 43/43] Padroniza nome de metodo que obtem tipo de IA (LLAMA ou GEMINI) --- markup_doc/labeling_utils.py | 10 +++++++--- markup_doc/tasks.py | 18 ++++++++++-------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/markup_doc/labeling_utils.py b/markup_doc/labeling_utils.py index fdbbf16..c29d7bd 100644 --- a/markup_doc/labeling_utils.py +++ b/markup_doc/labeling_utils.py @@ -14,14 +14,18 @@ from .choices import order_labels +MODEL_NAME_GEMINI = 'GEMINI' +MODEL_NAME_LLAMA = 'LLAMA' -def getLLM(): + +def get_llm_model_name(): + # FIXME: This function always fetches the first LlamaModel instance. model_ai = LlamaModel.objects.first() if model_ai.api_key_gemini: - return 'GEMINI' + return MODEL_NAME_GEMINI else: - return 'LLAMA' + return MODEL_NAME_LLAMA def split_in_three(obj_reference, chunk_size=15): diff --git a/markup_doc/tasks.py b/markup_doc/tasks.py index cf41fdf..d0c4c12 100644 --- a/markup_doc/tasks.py +++ b/markup_doc/tasks.py @@ -17,15 +17,17 @@ extract_keywords, create_labeled_object2, get_data_first_block, - getLLM + get_llm_model_name ) from markup_doc.models import ProcessStatus +from markup_doc.labeling_utils import MODEL_NAME_GEMINI, MODEL_NAME_LLAMA from markup_doc.sync_api import sync_journals_from_api from markuplib.function_docx import functionsDocx from model_ai.llama import LlamaService, LlamaInputSettings from reference.config_gemini import create_prompt_reference + def clean_labels(text): # Eliminar etiquetas tipo [kwd] o [sectitle], incluso si tienen espacios como [/ doctitle ] text = re.sub(r'\[\s*/?\s*\w+(?:\s+[^\]]+)?\s*\]', '', text) @@ -151,16 +153,16 @@ def get_labels(title, user_id): continue if item.get('type') == 'first_block': - first_block = LlamaService(mode='prompt', temperature=0.1) + llm_first_block = LlamaService(mode='prompt', temperature=0.1) - if getLLM() == 'GEMINI': - output = first_block.run(LlamaInputSettings.get_first_metadata(clean_labels(item.get('text')))) + if get_llm_model_name() == MODEL_NAME_GEMINI: + output = llm_first_block.run(LlamaInputSettings.get_first_metadata(clean_labels(item.get('text')))) match = re.search(r'\{.*\}', output, re.DOTALL) if match: output = match.group(0) output = json.loads(output) - - if getLLM() == 'LLAMA': + + if get_llm_model_name() == MODEL_NAME_LLAMA: output_author = get_data_first_block(clean_labels(item.get('text')), 'author', user_id) @@ -283,7 +285,7 @@ def get_labels(title, user_id): num_refs = [item["num_ref"] for item in obj_reference] - if getLLM() == 'LLAMA': + if get_llm_model_name() == 'LLAMA': for obj_ref in obj_reference: obj = process_reference(obj_ref['num_ref'], obj_ref['obj'], user_id) stream_data_back.append(obj) @@ -297,7 +299,7 @@ def get_labels(title, user_id): text_references = "\n".join([item["text"] for item in chunk]).replace('', '').replace('', '') prompt_reference = create_prompt_reference(text_references) - result = first_block.run(prompt_reference) + result = llm_first_block.run(prompt_reference) match = re.search(r'\[.*\]', result, re.DOTALL) if match: