diff --git a/frontend/.eslintrc.js b/.eslintrc.js similarity index 75% rename from frontend/.eslintrc.js rename to .eslintrc.js index 5cc3e5896..d3a535cbe 100644 --- a/frontend/.eslintrc.js +++ b/.eslintrc.js @@ -11,7 +11,7 @@ module.exports = { ], rules: { 'generator-star-spacing': 'off', - //'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', + // 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', camelcase: 0 }, @@ -20,7 +20,8 @@ module.exports = { 'vue' ], parserOptions: { - parser: 'babel-eslint' + parser: '@babel/eslint-parser' + // requireConfigFile: false }, globals: { diff --git a/CHANGES.md b/CHANGES.md new file mode 100644 index 000000000..cc23cbaee --- /dev/null +++ b/CHANGES.md @@ -0,0 +1,50 @@ + +3.1.163-RC16 / 2023-09-13 +========================= + + * Conserta bug em relatórios com emenda longa. (#3674) + * fix: restring acesso ao prometheus metrics para apenas ips locais/invalidos (#3668) + * feat: adiciona filtro de autor no relatorio de tramitacao com data fim de prazo (#3671) + * fix: verifica se existe dispositivo atualizador ao tentar montar nota alteracao (#3669) + * Revert "Remove redirect de URLs (#3652)" + +3.1.163-RC15 / 2023-08-11 +========================= + + * HOT-FIX: conserta geração de CHANGES.md + * fix: Cria novos campos para o model proposicao para salvar o usuario responsavel por cada acao (#3660) + * Simplificação da tela de pesquisa de Matéria Legislativa (#3662) + * bump pyyaml + * Adiciona controle de visibilidade no módulo de relatorios + * Adiciona coluna de justificativa de ausência (#3657) + * Adiciona coluna de justificativa de ausência + * Conserta lógica para embutir SAPL em iframe (#3653) + * Move relatorios para app de relatorios (#3656) + * Remove redirect de URLs (#3652) + * Hot-fix: endpoint do prometheus endpoint URL + * feat: Adiciona funcionalidade de baixar lista de documentos acessorios de um documento administrativo (#3650) + +3.1.163-RC14 / 2023-06-28 +========================= + + * HOT-FIX: conserta changelog + * feat: Torna o campo Data Nascimento de Parlamentares sensivel (#3648) + * hot-fix: desconecta signal pre_save no migrate + +3.1.163-RC13 / 2023-06-18 +========================= + + * Add options to abort release generation + * Adiciona documentação automática de mudanças + * Adiciona link para texto original em Sessão Plenária (#3644) + * Altera nome completo para nome parlamentar em ata (#3645) + * refactor: altera título do link e descrição de relatório + * feat: Script to find and extract codified images pasted into text fields using the tinyMCE editor (#3643) + * feat: adiciona a coluna assunto na list de correspondencias do expediente do dia (#3640) + * fix: força periodo de busca no relatorio audit log (#3639) + * add migrate de ano novo + * impl: add campo para script do google analytics + * refactor: corrige relatório alinhando a proposta da nomenclatura + * hot-fix: corrige inicialização de variável + * fix: ativa filtro que estava comentado para debug + * impl: captura de assinaturas eletrônicas em matérias diff --git a/README.rst b/README.rst index 816ad3958..5481ba985 100644 --- a/README.rst +++ b/README.rst @@ -6,6 +6,19 @@ SAPL - Sistema de Apoio ao Processo Legislativo *********************************************** +UPDATE! [02/08/2022]: Novas alterações foram realizadas nos containers do SAPL e no docker-compose.yaml. Estas mudanças estarão funcionais a partir do próximo release. Enquanto isso não vem, continuem utilizando as versões antigas do docker-compose.yaml. + +~~**UPDATE! [16/05/2022]: Devido a refatorações recentes no Solr, foi necessårio +adaptar o uso deste pelo SAPL. Para isso foram feitas mudanças no docker-compose.yml +como a adição de um container para o ZooKeeper e upload de arquivo de segurança. +Recomendamos fortemente que para a versão 3.1.162 e superior do SAPL seja feito o backup do +Banco de Dados, limpeza dos containers no host (`sudo docker system prune -a -f --volumes`), +e consequente instalação dos novos containers a partir da execução do docker-compose. É +importante frisar que o comando `docker system prune` irá apagar TODOS os containers E +TODOS os volumes (incluindo o BD) do host. Após o inicio dos novos containers, proceda +com a restauração do BD, pare os containers e reinicie novamente para indexação textual. +Além disso, o docker-compose.yml foi movido para a pasta dist/ na raiz do projeto.**~~ + Esta página reúne informações úteis sobre o desenvolvimento atual do SAPL. Isso significa que toda a informação aqui apresentada aplica-se apenas para a versão 3.1 e superior. @@ -58,6 +71,9 @@ Orientações gerais sobre o GitHub =================================== `Instruções para GitHub `_ +Suporte ao utilizadores +=================================== + `Sala do Discord "Somos Interlegis" sobre SAPL `_ Perguntas Frequentes diff --git a/frontend/babel.config.js b/babel.config.js similarity index 100% rename from frontend/babel.config.js rename to babel.config.js diff --git a/dist/bin/upload_configset.sh b/dist/bin/upload_configset.sh new file mode 100755 index 000000000..68559c56e --- /dev/null +++ b/dist/bin/upload_configset.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +SOLR_USER=solr +SOLR_PASSWORD=SolrRocks +SOLR_HOST=localhost +SOLR_PORT=8983 + +CONFIGSET_NAME=sapl_configset +CONFIGSET_FILE=sapl_configset.zip + +export SOLR_URL="http://$SOLR_USER:$SOLR_PASSWORD@$SOLR_HOST:$SOLR_PORT/solr/admin/configs?action=UPLOAD&name=$CONFIGSET_NAME&wt=json" +curl -X POST -L -F "file=@$CONFIGSET_FILE;type=application/zip" $SOLR_URL diff --git a/dist/docker-compose.yml b/dist/docker-compose.yml new file mode 100644 index 000000000..e2fad5a38 --- /dev/null +++ b/dist/docker-compose.yml @@ -0,0 +1,111 @@ +version: "3.7" +services: + sapldb: + image: postgres:10.5-alpine + restart: always + container_name: postgres + labels: + NAME: "postgres" + environment: + POSTGRES_PASSWORD: sapl + POSTGRES_USER: sapl + POSTGRES_DB: sapl + PGDATA : /var/lib/postgresql/data/ + volumes: + - sapldb_data:/var/lib/postgresql/data/ + ports: + - "5433:5432" + networks: + - sapl-net + solr1: + image: solr:8.11 + restart: unless-stopped + command: bash -c "docker-entrypoint.sh solr zk cp file:/var/security.json zk:security.json && exec solr-foreground" + container_name: solr + labels: + NAME: "solr" + ports: + - "8983:8983" + environment: + - ZK_HOST=zoo1:2181 + - SOLR_HEAP=1g + - SOLR_OPTS=-Djute.maxbuffer=50000000 + networks: + - sapl-net + depends_on: + - zoo1 + volumes: + - type: bind + source: ./solr_cloud/security.json + target: /var/security.json + - solr_data:/opt/solr/server/solr + - solr_configsets:/opt/solr/server/solr/configsets + + sapl: + image: interlegis/sapl:3.1.163-RC2 +# build: +# context: ../ +# dockerfile: ./docker/Dockerfile + container_name: sapl + labels: + NAME: "sapl" + restart: always + environment: + ADMIN_PASSWORD: interlegis + ADMIN_EMAIL: email@dominio.net + DEBUG: 'False' + EMAIL_PORT: 587 + EMAIL_USE_TLS: 'False' + EMAIL_HOST: smtp.dominio.net + EMAIL_HOST_USER: usuariosmtp + EMAIL_SEND_USER: usuariosmtp + EMAIL_HOST_PASSWORD: senhasmtp + USE_SOLR: 'True' + SOLR_COLLECTION: sapl + SOLR_URL: http://solr:SolrRocks@solr1:8983 + TZ: America/Sao_Paulo + volumes: + - sapl_data:/var/interlegis/sapl/data + - sapl_media:/var/interlegis/sapl/media + depends_on: + - sapldb + - solr1 + ports: + - "80:80" + networks: + - sapl-net + zoo1: + image: zookeeper:3.8 + container_name: zoo1 + hostname: zoo1 + restart: unless-stopped + ports: + - 2181:2181 + - 7001:7000 + environment: + ZOO_MY_ID: 1 + ZOOKEEPER_TICK_TIME: 2000 + ZOOKEEPER_CLIENT_PORT: 2181 + JVMFLAGS: "-Xmx1024m -Djute.maxbuffer=50000000" + ZOO_SERVERS: server.1=zoo1:2888:3888;2181 + ZOO_LOG4J_PROP: "INFO,ROLLINGFILE" + ZOO_4LW_COMMANDS_WHITELIST: mntr, conf, ruok + ZOO_CFG_EXTRA: "metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider metricsProvider.httpPort=7000 metricsProvider.exportJvmInfo=true" + volumes: + - zoo_data:/data + - zoo_log:/datalog + networks: + - sapl-net +networks: + sapl-net: + name: sapl-net + driver: bridge +volumes: + sapldb_data: + sapl_data: + sapl_media: + solr_data: + solr_home: + solr_configsets: + zoo_data: + zoo_log: diff --git a/dist/solr_cloud/security.json b/dist/solr_cloud/security.json new file mode 100644 index 000000000..e0b8697dd --- /dev/null +++ b/dist/solr_cloud/security.json @@ -0,0 +1,13 @@ +{ +"authentication":{ + "blockUnknown": true, + "class":"solr.BasicAuthPlugin", + "credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}, + "forwardCredentials": false, + "realm": "Solr Login" +}, +"authorization":{ + "class":"solr.RuleBasedAuthorizationPlugin", + "permissions":[{"name":"security-edit", "role":"admin"}], + "user-role":{"solr":"admin"} +}} diff --git a/docker/Dockerfile b/docker/Dockerfile index 460422def..a40bd91fe 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,12 +1,10 @@ -FROM python:3.7-slim-buster +FROM python:3.9-slim-buster # Setup env ENV LANG C.UTF-8 ENV LC_ALL C.UTF-8 ENV PYTHONDONTWRITEBYTECODE 1 - -#ENV PYTHONFAULTHANDLER 1 - +ENV PYTHONUNBUFFERED=1 ENV DEBIAN_FRONTEND noninteractive ENV BUILD_PACKAGES apt-utils apt-file libpq-dev graphviz-dev build-essential git pkg-config \ @@ -34,12 +32,13 @@ RUN apt-get update && \ SUDO_FORCE_REMOVE=yes apt-get purge -y --auto-remove $BUILD_PACKAGES && \ apt-get autoremove && apt-get clean && rm -rf /var/lib/apt/lists/* -ENV HOME=/var/interlegis/sapl +WORKDIR /var/interlegis/sapl/ +ADD . /var/interlegis/sapl/ COPY docker/start.sh $HOME -COPY docker/check_solr.sh $HOME -COPY docker/solr_api.py $HOME -COPY docker/busy-wait.sh $HOME +COPY docker/solr_cli.py $HOME +COPY docker/wait-for-pg.sh $HOME +COPY docker/wait-for-solr.sh $HOME COPY docker/create_admin.py $HOME COPY docker/genkey.py $HOME COPY docker/gunicorn_start.sh $HOME @@ -55,7 +54,8 @@ RUN rm -rf /var/interlegis/sapl/sapl/.env && \ rm -rf /var/interlegis/sapl/sapl.db RUN chmod +x /var/interlegis/sapl/start.sh && \ - chmod +x /var/interlegis/sapl/check_solr.sh && \ + chmod +x /var/interlegis/sapl/wait-for-solr.sh && \ + chmod +x /var/interlegis/sapl/wait-for-pg.sh && \ ln -sf /dev/stdout /var/log/nginx/access.log && \ ln -sf /dev/stderr /var/log/nginx/error.log && \ mkdir /var/log/sapl/ && touch /var/interlegis/sapl/sapl.log && \ diff --git a/docker/docker-compose.yml b/docker/docker-compose.yaml similarity index 90% rename from docker/docker-compose.yml rename to docker/docker-compose.yaml index c45e463b8..5bae23442 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yaml @@ -18,21 +18,21 @@ services: networks: - sapl-net saplsolr: - image: solr:8.9 + image: solr:8.11 restart: always command: bin/solr start -c -f container_name: solr labels: NAME: "solr" volumes: - - solr_data:/opt/solr/server/solr + - solr_data:/var/solr - solr_configsets:/opt/solr/server/solr/configsets ports: - "8983:8983" networks: - sapl-net sapl: - image: interlegis/sapl:3.1.162 + image: interlegis/sapl:3.1.163-RC16 # build: # context: ../ # dockerfile: ./docker/Dockerfile @@ -52,7 +52,8 @@ services: EMAIL_HOST_PASSWORD: senhasmtp USE_SOLR: 'True' SOLR_COLLECTION: sapl - SOLR_URL: http://saplsolr:8983 + SOLR_URL: http://solr:solr@saplsolr:8983 + IS_ZK_EMBEDDED: 'True' TZ: America/Sao_Paulo volumes: - sapl_data:/var/interlegis/sapl/data diff --git a/docker/solr_api.py b/docker/solr_cli.py similarity index 69% rename from docker/solr_api.py rename to docker/solr_cli.py index 3ca06bba7..d452d1fe9 100755 --- a/docker/solr_api.py +++ b/docker/solr_cli.py @@ -1,18 +1,102 @@ -from io import BytesIO +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- import argparse -import os -import requests +import logging +import re +import secrets import subprocess import sys import zipfile +from base64 import b64encode, b64decode +from hashlib import sha256 +from io import BytesIO from pathlib import Path -## -## Este módulo deve ser executado na raiz do projeto -## +import requests +from kazoo.client import KazooClient + +# +# Este módulo deve ser executado na raiz do projeto +# + +logging.basicConfig() + +SECURITY_FILE_TEMPLATE = """ + { + "authentication":{ + "blockUnknown": true, + "class":"solr.BasicAuthPlugin", + "credentials":{"%s":"%s %s"}, + "forwardCredentials": false, + "realm": "Solr Login" + }, + "authorization":{ + "class":"solr.RuleBasedAuthorizationPlugin", + "permissions":[{"name":"security-edit", "role":"admin"}], + "user-role":{"%s":"admin"} + } + } +""" + +URL_PATTERN = 'https?://(([a-zA-Z0-9]+):([a-zA-Z0-9]+)@)?([a-zA-Z0-9.-]+)(:[0-9]{4})?' + + +def solr_hash_password(password: str, salt: str = None): + """ + Generates a password and salt to be used in Basic Auth Solr + + password: clean text password string + salt (optional): base64 salt string + returns: sha256 hash of password and salt (both base64 strings) + """ + m = sha256() + if salt is None: + salt = secrets.token_bytes(32) + else: + salt = b64decode(salt) + m.update(salt + password.encode('utf-8')) + digest = m.digest() -class SolrClient: + m = sha256() + m.update(digest) + digest = m.digest() + + cypher = b64encode(digest).decode('utf-8') + salt = b64encode(salt).decode('utf-8') + return cypher, salt + + +def create_security_file(username, password): + print("Creating security.json file...") + with open("security.json", "w") as f: + cypher, salt = solr_hash_password(password) + f.write(SECURITY_FILE_TEMPLATE % (username, cypher, salt, username)) + print("file created!") + + +def upload_security_file(zk_host): + zk_port = 9983 # embedded ZK port + print(f"Uploading security file to Solr, ZK server={zk_host}:{zk_port}...") + try: + with open('security.json', 'r') as f: + data = f.read() + zk = KazooClient(hosts=f"{zk_host}:{zk_port}") + zk.start() + print("Uploading security.json file...") + if zk.exists('/security.json'): + zk.set("/security.json", str.encode(data)) + else: + zk.create("/security.json", str.encode(data)) + data, stat = zk.get('/security.json') + print("file uploaded!") + print(data.decode('utf-8')) + zk.stop() + except Exception as e: + print(e) + sys.exit(-1) + +class SolrClient: LIST_CONFIGSETS = "{}/solr/admin/configs?action=LIST&omitHeader=true&wt=json" UPLOAD_CONFIGSET = "{}/solr/admin/configs?action=UPLOAD&name={}&wt=json" LIST_COLLECTIONS = "{}/solr/admin/collections?action=LIST&wt=json" @@ -129,7 +213,7 @@ class SolrClient: print(res.content) return False return True - + def delete_collection(self, collection_name): if collection_name == '*': collections = self.list_collections() @@ -160,6 +244,22 @@ class SolrClient: print("Num docs: %s" % num_docs) +def setup_embedded_zk(solr_url): + match = re.match(URL_PATTERN, solr_url) + if match: + _, solr_user, solr_pwd, solr_host, solr_port = match.groups() + + if solr_user and solr_pwd and solr_host: + create_security_file(solr_user, solr_pwd) + upload_security_file(solr_host) + else: + print(f"Missing Solr's username, password, and host: {solr_user}/{solr_pwd}/{solr_host}") + sys.exit(-1) + else: + print(f"Solr URL path doesn't match the required format: {solr_url}") + sys.exit(-1) + + if __name__ == '__main__': parser = argparse.ArgumentParser(description='Cria uma collection no Solr') @@ -178,6 +278,9 @@ if __name__ == '__main__': parser.add_argument('-ms', type=int, dest='max_shards_per_node', nargs='?', help='Max shards per node (default=1)', default=1) + parser.add_argument("--embedded_zk", default=False, action="store_true", + help="Embedded ZooKeeper") + try: args = parser.parse_args() except IOError as msg: @@ -185,10 +288,17 @@ if __name__ == '__main__': sys.exit(-1) url = args.url.pop() - collection = args.collection.pop() + if args.embedded_zk: + print("Setup embedded ZooKeeper...") + setup_embedded_zk(url) + + collection = args.collection.pop() client = SolrClient(url=url) + ## Add --force to force upload security.json, configset upload and collection recreation + ## it will clean the solr server before proceeding + ## Add --clean option to clean uploadconfig and collection if not client.exists_collection(collection): print("Collection '%s' doesn't exists. Creating a new one..." % collection) created = client.create_collection(collection, @@ -200,6 +310,7 @@ if __name__ == '__main__': else: print("Collection '%s' exists." % collection) + ## Add --disable-index to disable auto index num_docs = client.get_num_docs(collection) if num_docs == 0: print("Performing a full reindex of '%s' collection..." % collection) diff --git a/docker/start.sh b/docker/start.sh index 868942bfd..558b7d7b5 100755 --- a/docker/start.sh +++ b/docker/start.sh @@ -22,7 +22,6 @@ create_env() { touch $FILENAME - # explicitly use '>' to erase any previous content echo "SECRET_KEY="$KEY > $FILENAME # now only appends @@ -39,14 +38,14 @@ create_env() { echo "USE_SOLR = ""${USE_SOLR-False}" >> $FILENAME echo "SOLR_COLLECTION = ""${SOLR_COLLECTION-sapl}" >> $FILENAME echo "SOLR_URL = ""${SOLR_URL-http://localhost:8983}" >> $FILENAME + echo "IS_ZK_EMBEDDED = ""${IS_ZK_EMBEDDED-False}" >> $FILENAME - echo "[ENV FILE] done." } create_env -/bin/bash busy-wait.sh $DATABASE_URL +/bin/bash wait-for-pg.sh $DATABASE_URL yes yes | python3 manage.py migrate @@ -55,39 +54,46 @@ yes yes | python3 manage.py migrate USE_SOLR="${USE_SOLR:=False}" SOLR_URL="${SOLR_URL:=http://localhost:8983}" SOLR_COLLECTION="${SOLR_COLLECTION:=sapl}" - NUM_SHARDS=${NUM_SHARDS:=1} RF=${RF:=1} MAX_SHARDS_PER_NODE=${MAX_SHARDS_PER_NODE:=1} +IS_ZK_EMBEDDED="${IS_ZK_EMBEDDED:=False}" if [ "${USE_SOLR-False}" == "True" ] || [ "${USE_SOLR-False}" == "true" ]; then - echo "SOLR configurations" + echo "Solr configurations" echo "===================" echo "URL: $SOLR_URL" echo "COLLECTION: $SOLR_COLLECTION" echo "NUM_SHARDS: $NUM_SHARDS" echo "REPLICATION FACTOR: $RF" echo "MAX SHARDS PER NODE: $MAX_SHARDS_PER_NODE" + echo "ASSUME ZK EMBEDDED: $IS_ZK_EMBEDDED" echo "=========================================" - echo "running solr script" - /bin/bash check_solr.sh $SOLR_URL + echo "running Solr script" + /bin/bash wait-for-solr.sh $SOLR_URL CHECK_SOLR_RETURN=$? if [ $CHECK_SOLR_RETURN == 1 ]; then - echo "Connecting to solr..." - python3 solr_api.py -u $SOLR_URL -c $SOLR_COLLECTION -s $NUM_SHARDS -rf $RF -ms $MAX_SHARDS_PER_NODE & - # python3 manage.py rebuild_index --noinput & + echo "Connecting to Solr..." + + + if [ "${IS_ZK_EMBEDDED-False}" == "True" ] || [ "${IS_ZK_EMBEDDED-False}" == "true" ]; then + ZK_EMBEDDED="--embedded_zk" + echo "Assuming embedded ZooKeeper instalation..." + fi + + python3 solr_cli.py -u $SOLR_URL -c $SOLR_COLLECTION -s $NUM_SHARDS -rf $RF -ms $MAX_SHARDS_PER_NODE $ZK_EMBEDDED & else echo "Solr is offline, not possible to connect." fi else - echo "Suporte a SOLR não inicializado." + echo "Solr support is not initialized." fi -echo "Criando usuário admin..." +echo "Creating admin user..." user_created=$(python3 create_admin.py 2>&1) @@ -108,6 +114,9 @@ if [ $lack_pwd -eq 0 ]; then # return -1 fi +# Backfilling AuditLog's JSON field +time ./manage.py backfill_auditlog & + echo "-------------------------------------" echo "| ███████╗ █████╗ ██████╗ ██╗ |" echo "| ██╔════╝██╔══██╗██╔══██╗██║ |" diff --git a/docker/busy-wait.sh b/docker/wait-for-pg.sh similarity index 100% rename from docker/busy-wait.sh rename to docker/wait-for-pg.sh diff --git a/docker/check_solr.sh b/docker/wait-for-solr.sh similarity index 82% rename from docker/check_solr.sh rename to docker/wait-for-solr.sh index 370b4adcf..df1fab5bb 100644 --- a/docker/check_solr.sh +++ b/docker/wait-for-solr.sh @@ -4,10 +4,10 @@ SOLR_URL=$1 -RETRY_COUNT=1 -RETRY_LIMIT=4 +RETRY_COUNT=0 +RETRY_LIMIT=60 # wait until 1 min -echo "Waiting for solr connection at $SOLR_URL ..." +echo "Waiting for Solr connection at $SOLR_URL ..." while [[ $RETRY_COUNT < $RETRY_LIMIT ]]; do echo "Attempt to connect to solr: $RETRY_COUNT of $RETRY_LIMIT" let RETRY_COUNT=RETRY_COUNT+1; @@ -18,7 +18,7 @@ while [[ $RETRY_COUNT < $RETRY_LIMIT ]]; do echo "Solr server is up!" exit 1 else - sleep 3 + sleep 1 fi done echo "Solr connection failed." diff --git a/docs/solr.rst b/docs/solr.rst index 13bdbf02c..159b4211d 100644 --- a/docs/solr.rst +++ b/docs/solr.rst @@ -7,7 +7,7 @@ Instruções para instalar o Solr Solr é uma plataforma open source de indexação e busca textual utilizada pelo SAPL 3.1 para indexar documentos (normas jurídicas, matérias legislativas e documentos acessórios). Observação: Se a execução do SAPL for mediante containers Docker então use o arquivo *docker-compose.yml* disponível em -*https://github.com/interlegis/sapl/blob/3.1.x/solr/docker-compose.yml* (verifique os mapeamentos de volume estão corretos, a verso do SAPL referenciada no arquivo docker-compose.yml, e realize o backup de seu BD **antes** de qualquer tentativa de substituição do arquivo *docker-compose.yml* em uso corrente); +*https://github.com/interlegis/sapl/blob/3.1.x/dist/docker-compose.yml* (verifique os mapeamentos de volume estão corretos, a verso do SAPL referenciada no arquivo docker-compose.yml, e realize o backup de seu BD **antes** de qualquer tentativa de substituição do arquivo *docker-compose.yml* em uso corrente); 1) Faça o download da distribuição *binária* do Apache Solr do site oficial do projeto **http://lucene.apache.org/solr** diff --git a/drfautoapi/__init__.py b/drfautoapi/__init__.py new file mode 100644 index 000000000..14c50cc00 --- /dev/null +++ b/drfautoapi/__init__.py @@ -0,0 +1 @@ +# Transformar em projeto externo instalável para uso geral diff --git a/drfautoapi/drfautoapi.py b/drfautoapi/drfautoapi.py new file mode 100644 index 000000000..e0fd0c348 --- /dev/null +++ b/drfautoapi/drfautoapi.py @@ -0,0 +1,409 @@ +from collections import OrderedDict +import importlib +import inspect +import logging +import re + +from django.apps.config import AppConfig +from django.apps.registry import apps +from django.conf import settings +from django.contrib.postgres.fields.jsonb import JSONField +from django.db.models.base import ModelBase +from django.db.models.fields import TextField, CharField +from django.db.models.fields.files import FileField +from django.template.defaultfilters import capfirst +from django.utils.translation import ugettext_lazy as _ +import django_filters +from django_filters.constants import ALL_FIELDS, EMPTY_VALUES +from django_filters.filters import CharFilter +from django_filters.filterset import FilterSet +from django_filters.rest_framework.backends import DjangoFilterBackend +from django_filters.utils import resolve_field, get_all_model_fields +from rest_framework import serializers as rest_serializers +from rest_framework.response import Response +from rest_framework.routers import DefaultRouter +from rest_framework.viewsets import ModelViewSet + + +logger = logging.getLogger(__name__) + + +class SplitStringCharFilter(django_filters.CharFilter): + _re = re.compile(r'("[^"]+"| +|[^"]+)') + + def filter(self, qs, value): + if value in EMPTY_VALUES: + return qs + if self.distinct: + qs = qs.distinct() + lookup = '%s__%s' % (self.field_name, self.lookup_expr) + + values = [value] + if self.lookup_expr == 'icontains': + if not '"' in value: + values = value.split(' ') + else: + values = list( + filter( + lambda x: x and x != ' ' and x[0] != '"', + self._re.findall(value) + ) + ) + list( + map( + lambda x: x[1:-1], + filter( + lambda x: x and x[0] == '"', + self._re.findall(value) + ) + ) + ) + + if not isinstance(values, list): + values = [values] + for v in values: + qs = self.get_method(qs)(**{lookup: v}) + return qs + + +class ApiFilterSetMixin(FilterSet): + + o = CharFilter(method='filter_o') + + class Meta: + fields = '__all__' + filter_overrides = { + FileField: { + 'filter_class': django_filters.CharFilter, + 'extra': lambda f: { + 'lookup_expr': 'exact', + }, + }, + CharField: { + 'filter_class': SplitStringCharFilter, + }, + TextField: { + 'filter_class': SplitStringCharFilter, + }, + JSONField: { + 'filter_class': django_filters.CharFilter, + 'extra': lambda f: { + 'lookup_expr': 'exact', + }, + }, + } + + def filter_o(self, queryset, name, value): + try: + return queryset.order_by( + *map(str.strip, value.split(','))) + except: + return queryset + + @classmethod + def get_fields(cls): + model = cls._meta.model + fields_model = get_all_model_fields(model) + fields_filter = cls._meta.fields + exclude = cls._meta.exclude + + if exclude is not None and fields_filter is None: + fields_filter = ALL_FIELDS + + fields = fields_filter if isinstance(fields_filter, dict) else {} + + for f_str in fields_model: + if f_str not in fields: + + f = model._meta.get_field(f_str) + + if f.many_to_many: + fields[f_str] = ['exact'] + continue + + fields[f_str] = ['exact'] + + def get_keys_lookups(cl, sub_f): + r = [] + for lk, lv in cl.items(): + + if lk in ('contained_by', 'trigram_similar', 'unaccent', 'search'): + continue + + sflk = f'{sub_f}{"__" if sub_f else ""}{lk}' + r.append(sflk) + + if hasattr(lv, 'get_lookups'): + r += get_keys_lookups(lv.get_lookups(), sflk) + + if hasattr(lv, 'output_field') and hasattr(lv, 'output_field.get_lookups'): + r.append(f'{sflk}{"__" if sflk else ""}range') + + r += get_keys_lookups(lv.output_field.class_lookups, sflk) + + return r + + fields[f_str] = list( + set(fields[f_str] + get_keys_lookups(f.get_lookups(), ''))) + + # Remove excluded fields + exclude = exclude or [] + + fields = [(f, lookups) + for f, lookups in fields.items() if f not in exclude] + + return OrderedDict(fields) + + @classmethod + def filter_for_field(cls, f, name, lookup_expr='exact'): + # Redefine método estático para ignorar filtro para + # fields que não possuam lookup_expr informado + + f, lookup_type = resolve_field(f, lookup_expr) + + default = { + 'field_name': name, + 'label': capfirst(f.verbose_name), + 'lookup_expr': lookup_expr + } + + filter_class, params = cls.filter_for_lookup( + f, lookup_type) + default.update(params) + if filter_class is not None: + return filter_class(**default) + return None + + +class BusinessRulesNotImplementedMixin: + http_method_names = ['get', 'head', 'options', 'trace'] + + def create(self, request, *args, **kwargs): + raise Exception(_("POST Create não implementado")) + + def update(self, request, *args, **kwargs): + raise Exception(_("PUT and PATCH não implementado")) + + def delete(self, request, *args, **kwargs): + raise Exception(_("DELETE Delete não implementado")) + + +class ApiViewSetConstrutor(): + + _built_sets = {} + + class ApiViewSet(ModelViewSet): + filter_backends = (DjangoFilterBackend,) + + @classmethod + def get_viewset_for_model(cls, model): + return cls._built_sets[model._meta.app_config][model] + + @classmethod + def update(cls, other): + cls._built_sets.update(other._built_sets) + + @classmethod + def import_modules(cls, modules): + for m in modules: + importlib.import_module(m) + + @classmethod + def router(cls, router_class=DefaultRouter): + router = router_class() + for app, built_sets in cls._built_sets.items(): + for model, viewset in built_sets.items(): + router.register( + f'{app.label}/{model._meta.model_name}', viewset) + return router + + @classmethod + def build_class(cls, apps_or_models): + + DRFAUTOAPI = settings.DRFAUTOAPI + + serializers_classes = {} + filters_classes = {} + + global_serializer_mixin = rest_serializers.ModelSerializer + global_filter_class = ApiFilterSetMixin + + try: + if DRFAUTOAPI: + if 'DEFAULT_SERIALIZER_MODULE' in DRFAUTOAPI: + serializers = importlib.import_module( + DRFAUTOAPI['DEFAULT_SERIALIZER_MODULE'] + ) + serializers_classes = inspect.getmembers(serializers) + serializers_classes = {i[0]: i[1] for i in filter( + lambda x: x[0].endswith('Serializer'), + serializers_classes + )} + + if 'DEFAULT_FILTER_MODULE' in DRFAUTOAPI: + filters = importlib.import_module( + DRFAUTOAPI['DEFAULT_FILTER_MODULE'] + ) + filters_classes = inspect.getmembers(filters) + filters_classes = {i[0]: i[1] for i in filter( + lambda x: x[0].endswith('FilterSet'), + filters_classes + )} + + if 'GLOBAL_SERIALIZER_MIXIN' in DRFAUTOAPI: + cs = DRFAUTOAPI['GLOBAL_SERIALIZER_MIXIN'].split('.') + module = importlib.import_module( + '.'.join(cs[0:-1])) + global_serializer_mixin = getattr(module, cs[-1]) + + if 'GLOBAL_FILTERSET_MIXIN' in DRFAUTOAPI: + cs = DRFAUTOAPI['GLOBAL_FILTERSET_MIXIN'].split('.') + m = importlib.import_module('.'.join(cs[0:-1])) + global_filter_class = getattr(m, cs[-1]) + + except Exception as e: + logger.error(e) + + built_sets = {} + + def build(_model): + object_name = _model._meta.object_name + + serializer_name = f'{object_name}Serializer' + _serializer_class = serializers_classes.get( + serializer_name, global_serializer_mixin) + + filter_name = f'{object_name}FilterSet' + _filterset_class = filters_classes.get( + filter_name, global_filter_class) + + def create_class(): + + _meta_serializer = object if not hasattr( + _serializer_class, 'Meta') else _serializer_class.Meta + + class ApiSerializer(_serializer_class): + + class Meta(_meta_serializer): + if not hasattr(_meta_serializer, 'ref_name'): + ref_name = f'{object_name}Serializer' + + if not hasattr(_meta_serializer, 'model'): + model = _model + + if hasattr(_meta_serializer, 'exclude'): + exclude = _meta_serializer.exclude + else: + if not hasattr(_meta_serializer, 'fields'): + fields = '__all__' + elif _meta_serializer.fields != '__all__': + fields = list(_meta_serializer.fields) + else: + fields = _meta_serializer.fields + + _meta_filterset = object if not hasattr( + _filterset_class, 'Meta') else _filterset_class.Meta + + class ApiFilterSet(_filterset_class): + + class Meta(_meta_filterset, ): + if not hasattr(_meta_filterset, 'model'): + model = _model + + class ModelApiViewSet(ApiViewSetConstrutor.ApiViewSet): + queryset = _model.objects.all() + filterset_class = ApiFilterSet + serializer_class = ApiSerializer + + return ModelApiViewSet + + viewset = create_class() + viewset.__name__ = '%sModelViewSet' % _model.__name__ + return viewset + + for am in apps_or_models: + + if isinstance(am, ModelBase): + app = am._meta.app_config + else: + app = am + + if app not in cls._built_sets: + cls._built_sets[app] = {} + + if am != app: + cls._built_sets[app][am] = build(am) + continue + + for model in app.get_models(): + cls._built_sets[app][model] = build(model) + + return cls + + +# Toda Classe construida acima, pode ser redefinida e aplicado quaisquer +# das possibilidades para uma classe normal criada a partir de +# rest_framework.viewsets.ModelViewSet conforme exemplo para a classe autor + +# decorator que processa um endpoint detail trivial com base no model passado, +# Um endpoint detail geralmente é um conteúdo baseado numa FK com outros possíveis filtros +# e os passados pelo proprio cliente, além de o serializer e o filterset +# ser desse model passado + + +class wrapper_queryset_response_for_drf_action(object): + + def __init__(self, model): + self.model = model + + def __call__(self, cls): + + def wrapper(instance_view, *args, **kwargs): + # recupera a viewset do model anotado + iv = instance_view + viewset_from_model = ApiViewSetConstrutor._built_sets[ + self.model._meta.app_config][self.model] + + # apossa da instancia da viewset mae do action + # em uma viewset que processa dados do model passado no decorator + iv.queryset = viewset_from_model.queryset + iv.serializer_class = viewset_from_model.serializer_class + iv.filterset_class = viewset_from_model.filterset_class + + iv.queryset = instance_view.filter_queryset( + iv.get_queryset()) + + # chama efetivamente o metodo anotado que deve devolver um queryset + # com os filtros específicos definido pelo programador customizador + qs = cls(instance_view, *args, **kwargs) + + page = iv.paginate_queryset(qs) + data = iv.get_serializer( + page if page is not None else qs, many=True).data + + return iv.get_paginated_response( + data) if page is not None else Response(data) + + return wrapper + + +# decorator para recuperar e transformar o default +class customize(object): + + def __init__(self, model): + self.model = model + + def __call__(self, cls): + + class _ApiViewSet( + cls, + ApiViewSetConstrutor._built_sets[ + self.model._meta.app_config][self.model] + ): + pass + + if hasattr(_ApiViewSet, 'build'): + _ApiViewSet = _ApiViewSet.build() + + ApiViewSetConstrutor._built_sets[ + self.model._meta.app_config][self.model] = _ApiViewSet + return _ApiViewSet diff --git a/frontend/public/img/arrow.png b/frontend/public/img/arrow.png deleted file mode 100644 index 1f1a6e5a1..000000000 Binary files a/frontend/public/img/arrow.png and /dev/null differ diff --git a/frontend/public/img/authenticated.png b/frontend/public/img/authenticated.png deleted file mode 100644 index 872718490..000000000 Binary files a/frontend/public/img/authenticated.png and /dev/null differ diff --git a/frontend/public/img/avatar.png b/frontend/public/img/avatar.png deleted file mode 100644 index 959c168a5..000000000 Binary files a/frontend/public/img/avatar.png and /dev/null differ diff --git a/frontend/public/img/beta.png b/frontend/public/img/beta.png deleted file mode 100644 index fe23d0e6d..000000000 Binary files a/frontend/public/img/beta.png and /dev/null differ diff --git a/frontend/public/img/brasao_transp.gif b/frontend/public/img/brasao_transp.gif deleted file mode 100644 index 2d9ac82c6..000000000 Binary files a/frontend/public/img/brasao_transp.gif and /dev/null differ diff --git a/frontend/public/img/down_arrow_select.jpg b/frontend/public/img/down_arrow_select.jpg deleted file mode 100644 index a3a75352d..000000000 Binary files a/frontend/public/img/down_arrow_select.jpg and /dev/null differ diff --git a/frontend/public/img/etiqueta.png b/frontend/public/img/etiqueta.png deleted file mode 100644 index 28db5a89e..000000000 Binary files a/frontend/public/img/etiqueta.png and /dev/null differ diff --git a/frontend/public/img/favicon.ico b/frontend/public/img/favicon.ico deleted file mode 100644 index b81629808..000000000 Binary files a/frontend/public/img/favicon.ico and /dev/null differ diff --git a/frontend/public/img/file.png b/frontend/public/img/file.png deleted file mode 100644 index 9bcae6c88..000000000 Binary files a/frontend/public/img/file.png and /dev/null differ diff --git a/frontend/public/img/hand-note.png b/frontend/public/img/hand-note.png deleted file mode 100644 index 43c757bf1..000000000 Binary files a/frontend/public/img/hand-note.png and /dev/null differ diff --git a/frontend/public/img/icon_comissoes.png b/frontend/public/img/icon_comissoes.png deleted file mode 100644 index 8ec70e7e1..000000000 Binary files a/frontend/public/img/icon_comissoes.png and /dev/null differ diff --git a/frontend/public/img/icon_delete_white.png b/frontend/public/img/icon_delete_white.png deleted file mode 100644 index f06892bff..000000000 Binary files a/frontend/public/img/icon_delete_white.png and /dev/null differ diff --git a/frontend/public/img/icon_materia_legislativa.png b/frontend/public/img/icon_materia_legislativa.png deleted file mode 100644 index 18cdd81f9..000000000 Binary files a/frontend/public/img/icon_materia_legislativa.png and /dev/null differ diff --git a/frontend/public/img/icon_mesa_diretora.png b/frontend/public/img/icon_mesa_diretora.png deleted file mode 100644 index 12a1b9f13..000000000 Binary files a/frontend/public/img/icon_mesa_diretora.png and /dev/null differ diff --git a/frontend/public/img/icon_normas_juridicas.png b/frontend/public/img/icon_normas_juridicas.png deleted file mode 100644 index 147681ef8..000000000 Binary files a/frontend/public/img/icon_normas_juridicas.png and /dev/null differ diff --git a/frontend/public/img/icon_parlamentares.png b/frontend/public/img/icon_parlamentares.png deleted file mode 100644 index fe9f91ac7..000000000 Binary files a/frontend/public/img/icon_parlamentares.png and /dev/null differ diff --git a/frontend/public/img/icon_pautas.png b/frontend/public/img/icon_pautas.png deleted file mode 100644 index 8d554f4e4..000000000 Binary files a/frontend/public/img/icon_pautas.png and /dev/null differ diff --git a/frontend/public/img/icon_plenarias.png b/frontend/public/img/icon_plenarias.png deleted file mode 100644 index b5fdaa97d..000000000 Binary files a/frontend/public/img/icon_plenarias.png and /dev/null differ diff --git a/frontend/public/img/icon_relatorios.png b/frontend/public/img/icon_relatorios.png deleted file mode 100644 index 3bd71c94d..000000000 Binary files a/frontend/public/img/icon_relatorios.png and /dev/null differ diff --git a/frontend/public/img/icon_save_white.png b/frontend/public/img/icon_save_white.png deleted file mode 100644 index 8f9ccbbf1..000000000 Binary files a/frontend/public/img/icon_save_white.png and /dev/null differ diff --git a/frontend/public/img/lexml.gif b/frontend/public/img/lexml.gif deleted file mode 100644 index 193f9cb55..000000000 Binary files a/frontend/public/img/lexml.gif and /dev/null differ diff --git a/frontend/public/img/logo.png b/frontend/public/img/logo.png deleted file mode 100644 index cc8619f2f..000000000 Binary files a/frontend/public/img/logo.png and /dev/null differ diff --git a/frontend/public/img/logo_cc.png b/frontend/public/img/logo_cc.png deleted file mode 100644 index 7301d05b1..000000000 Binary files a/frontend/public/img/logo_cc.png and /dev/null differ diff --git a/frontend/public/img/logo_interlegis.png b/frontend/public/img/logo_interlegis.png deleted file mode 100644 index 19591933c..000000000 Binary files a/frontend/public/img/logo_interlegis.png and /dev/null differ diff --git a/frontend/public/img/manual.png b/frontend/public/img/manual.png deleted file mode 100644 index 27a2d87c1..000000000 Binary files a/frontend/public/img/manual.png and /dev/null differ diff --git a/frontend/public/img/pdflogo.png b/frontend/public/img/pdflogo.png deleted file mode 100644 index ae28bf428..000000000 Binary files a/frontend/public/img/pdflogo.png and /dev/null differ diff --git a/frontend/public/img/perfil.png b/frontend/public/img/perfil.png deleted file mode 100644 index d1c4b77ed..000000000 Binary files a/frontend/public/img/perfil.png and /dev/null differ diff --git a/frontend/public/img/search-gray.png b/frontend/public/img/search-gray.png deleted file mode 100644 index 1f1c1c6c9..000000000 Binary files a/frontend/public/img/search-gray.png and /dev/null differ diff --git a/frontend/public/img/search.png b/frontend/public/img/search.png deleted file mode 100644 index 442814ed8..000000000 Binary files a/frontend/public/img/search.png and /dev/null differ diff --git a/frontend/public/img/user.png b/frontend/public/img/user.png deleted file mode 100644 index e8811bcb4..000000000 Binary files a/frontend/public/img/user.png and /dev/null differ diff --git a/frontend/src/__apps/compilacao/js/old/compilacao_edit.js b/frontend/src/__apps/compilacao/js/old/compilacao_edit.js index 13c5aa331..8ab884033 100644 --- a/frontend/src/__apps/compilacao/js/old/compilacao_edit.js +++ b/frontend/src/__apps/compilacao/js/old/compilacao_edit.js @@ -62,8 +62,8 @@ window.DispositivoEdit = function () { const obj_click = (event.target.classList.contains('dpt-link') ? event.target : (event.target.parentElement.classList.contains('dpt-link') - ? event.target.parentElement - : null)) + ? event.target.parentElement + : null)) if (obj_click && obj_click.getAttribute('href') && obj_click.getAttribute('href').length > 0) { return } @@ -245,7 +245,7 @@ window.DispositivoEdit = function () { if (editortype !== 'construct') { dpt_form.html(data) if (editortype === 'tinymce') { - window.initTextRichEditor() + window.initTextRichEditor(null, false, false) } // OptionalCustomFrontEnd().init() } @@ -431,9 +431,9 @@ window.DispositivoEdit = function () { const form_data = { csrfmiddlewaretoken: this.csrfmiddlewaretoken.value, - texto: texto, - texto_atualizador: texto_atualizador, - visibilidade: visibilidade, + texto, + texto_atualizador, + visibilidade, formtype: 'get_form_base' } diff --git a/frontend/src/__apps/compilacao/scss/compilacao.scss b/frontend/src/__apps/compilacao/scss/compilacao.scss index 668de7383..82c52f7f6 100644 --- a/frontend/src/__apps/compilacao/scss/compilacao.scss +++ b/frontend/src/__apps/compilacao/scss/compilacao.scss @@ -367,6 +367,14 @@ a:link:after, a:visited:after { max-width: 100%; } } + + .dtxt { + display: inline; + & > :not(table):first-child { + display: inline !important; + } + } + .ementa { padding: 2em 0em 2em 35%; font-weight: bold; @@ -424,6 +432,7 @@ a:link:after, a:visited:after { float:left; .dptt { position: relative; + } } @@ -435,6 +444,14 @@ a:link:after, a:visited:after { .texto_n_estruturado{ margin-top: 0.3333em; font-size: 1.15em; + + .dtxt { + display: inline; + + & > :not(table):first-child { + display: inline !important; + } + } } @@ -490,7 +507,6 @@ a:link:after, a:visited:after { } } } - .card-header { font-size: 1.7rem; } @@ -672,6 +688,9 @@ a:link:after, a:visited:after { } } } + + + } /* and dpt */ .tipo-vigencias { @@ -1381,7 +1400,7 @@ a:link:after, a:visited:after { &::before { z-index: 20; position: absolute; - background: url(/static/img/icon_delete_white.png) no-repeat 50% 50%; + background: url(@/assets/img/icon_delete_white.png) no-repeat 50% 50%; content:""; top: 0; left: 0; @@ -1403,7 +1422,7 @@ a:link:after, a:visited:after { color: white; } &::before { - background: url(/static/img/icon_save_white.png) no-repeat 50% 50%; + background: url(@/assets/img/icon_save_white.png) no-repeat 50% 50%; } } span { diff --git a/frontend/src/__global/js/functions.js b/frontend/src/__global/js/functions.js index f4e86d0b4..1f9b44a6a 100644 --- a/frontend/src/__global/js/functions.js +++ b/frontend/src/__global/js/functions.js @@ -10,11 +10,11 @@ window.refreshDatePicker = function () { } window.getCookie = function (name) { - var cookieValue = null + let cookieValue = null if (document.cookie && document.cookie !== '') { - var cookies = document.cookie.split(';') - for (var i = 0; i < cookies.length; i++) { - var cookie = $.trim(cookies[i]) + const cookies = document.cookie.split(';') + for (let i = 0; i < cookies.length; i++) { + const cookie = $.trim(cookies[i]) if (cookie.substring(0, name.length + 1) === name + '=') { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)) break @@ -26,7 +26,7 @@ window.getCookie = function (name) { window.autorModal = function () { $(function () { - var dialog = $('#modal_autor').dialog({ + const dialog = $('#modal_autor').dialog({ autoOpen: false, modal: true, width: 500, @@ -65,12 +65,11 @@ window.autorModal = function () { }) $('#pesquisar').click(function () { - var name_in_query = $('#q').val() - // var q_0 = "q_0=nome__icontains" - // var q_1 = name_in_query - // query = q_1 - - $.get('/api/autor?q=' + name_in_query, function (data) { + const json_data = { + q: $('#q').val() + // get_all: true + } + $.get('/api/base/autor', json_data, function (data) { $('#div-resultado') .children() .remove() @@ -82,15 +81,15 @@ window.autorModal = function () { return } - var select = $( + const select = $( ' - - - ''') - ], - Submit('pesquisar', _('Pesquisar'), css_class='float-right', - onclick='return true;'), - css_class='form-group row justify-content-between', - ) - - self.form.helper = SaplFormHelper() - self.form.helper.form_method = 'GET' - self.form.helper.layout = Layout( - Fieldset(_('Pesquisa'), - row0, row1, - buttons) - ) - - -class RelatorioAtasFilterSet(django_filters.FilterSet): - - class Meta(FilterOverridesMetaMixin): - model = SessaoPlenaria - fields = ['data_inicio'] - - @property - def qs(self): - parent = super(RelatorioAtasFilterSet, self).qs - return parent.distinct().prefetch_related('tipo').exclude( - upload_ata='').order_by('-data_inicio', 'tipo', 'numero') - - def __init__(self, *args, **kwargs): - super(RelatorioAtasFilterSet, self).__init__( - *args, **kwargs) - - self.filters['data_inicio'].label = 'Período de Abertura (Inicial - Final)' - self.form.fields['data_inicio'].required = False - - row1 = to_row([('data_inicio', 12)]) - - buttons = FormActions( - *[ - HTML(''' -
- - -
- ''') - ], - Submit('pesquisar', _('Pesquisar'), css_class='float-right', - onclick='return true;'), - css_class='form-group row justify-content-between', - ) - - self.form.helper = SaplFormHelper() - self.form.helper.form_method = 'GET' - self.form.helper.layout = Layout( - Fieldset(_('Atas das Sessões Plenárias'), - row1, buttons, ) - ) - - -def ultimo_ano_com_norma(): - anos_normas = choice_anos_com_normas() - - if anos_normas: - return anos_normas[0] - return '' - - -class RelatorioNormasMesFilterSet(django_filters.FilterSet): - - ano = django_filters.ChoiceFilter(required=True, - label='Ano da Norma', - choices=choice_anos_com_normas, - initial=ultimo_ano_com_norma) - - tipo = django_filters.ChoiceFilter(required=False, - label='Tipo Norma', - choices=choice_tipos_normas, - initial=0) - - class Meta: - model = NormaJuridica - fields = ['ano'] - - def __init__(self, *args, **kwargs): - super(RelatorioNormasMesFilterSet, self).__init__( - *args, **kwargs) - - self.filters['ano'].label = 'Ano' - self.form.fields['ano'].required = True - - row1 = to_row([('ano', 6), ('tipo', 6)]) - - buttons = FormActions( - *[ - HTML(''' -
- - -
- ''') - ], - Submit('pesquisar', _('Pesquisar'), css_class='float-right', - onclick='return true;'), - css_class='form-group row justify-content-between', - ) - - self.form.helper = SaplFormHelper() - self.form.helper.form_method = 'GET' - self.form.helper.layout = Layout( - Fieldset(_('Normas por mês do ano.'), - row1, buttons, ) - ) - - @property - def qs(self): - parent = super(RelatorioNormasMesFilterSet, self).qs - return parent.distinct().order_by('data') - - class EstatisticasAcessoNormasForm(Form): - ano = forms.ChoiceField(required=True, label='Ano de acesso', choices=RANGE_ANOS, initial=timezone.now().year) + mes = forms.ChoiceField(required=False, + label='Mês de acesso', + choices=[('', 'Todos os Meses')] + RANGE_MESES, + initial='') + + mais_acessadas = forms.ChoiceField(required=False, + label='Mais Acessadas', + choices=[ + (5, '005 mais acessadas'), + (10, '010 mais acessadas'), + (50, '050 mais acessadas'), + (100, '100 mais acessadas'), + (500, '500 mais acessadas'), + (1000, '1000 mais acessadas'), + ], + initial=5) + class Meta: - fields = ['ano'] + fields = ['ano', 'mes', 'mais_acessadas'] def __init__(self, *args, **kwargs): super(EstatisticasAcessoNormasForm, self).__init__( *args, **kwargs) - row1 = to_row([('ano', 12)]) + row1 = to_row([('ano', 3), ('mes', 6), ('mais_acessadas', 3), ]) buttons = FormActions( *[ @@ -962,6 +871,10 @@ class EstatisticasAcessoNormasForm(Form): Fieldset(_('Normas por acessos nos meses do ano.'), row1, buttons) ) + self.fields['ano'].choices = NormaEstatisticas.objects.order_by( + '-ano').distinct().values_list('ano', 'ano') or [ + (timezone.now().year, timezone.now().year) + ] def clean(self): super(EstatisticasAcessoNormasForm, self).clean() @@ -969,509 +882,7 @@ class EstatisticasAcessoNormasForm(Form): return self.cleaned_data -class RelatorioNormasVigenciaFilterSet(django_filters.FilterSet): - - ano = django_filters.ChoiceFilter(required=True, - label='Ano da Norma', - choices=choice_anos_com_normas, - initial=ultimo_ano_com_norma) - - tipo = django_filters.ChoiceFilter(required=False, - label='Tipo Norma', - choices=choice_tipos_normas, - initial=0) - - vigencia = forms.ChoiceField( - label=_('Vigência'), - choices=[(True, "Vigente"), (False, "Não vigente")], - widget=forms.RadioSelect(), - required=True, - initial=True) - - def __init__(self, *args, **kwargs): - super(RelatorioNormasVigenciaFilterSet, self).__init__( - *args, **kwargs) - - self.filters['ano'].label = 'Ano' - self.form.fields['ano'].required = True - self.form.fields['vigencia'] = self.vigencia - - row1 = to_row([('ano', 6), ('tipo', 6)]) - row2 = to_row([('vigencia', 12)]) - - buttons = FormActions( - *[ - HTML(''' -
- - -
- ''') - ], - Submit('pesquisar', _('Pesquisar'), css_class='float-right', - onclick='return true;'), - css_class='form-group row justify-content-between', - ) - - self.form.helper = SaplFormHelper() - self.form.helper.form_method = 'GET' - self.form.helper.layout = Layout( - Fieldset(_('Normas por vigência.'), - row1, row2, - buttons, ) - ) - - @property - def qs(self): - return qs_override_django_filter(self) - - -class RelatorioPresencaSessaoFilterSet(django_filters.FilterSet): - - class Meta(FilterOverridesMetaMixin): - model = SessaoPlenaria - fields = ['data_inicio', - 'sessao_legislativa', - 'tipo', - 'legislatura'] - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - self.form.fields['exibir_ordem_dia'] = forms.BooleanField( - required=False, label='Exibir presença das Ordens do Dia') - self.form.initial['exibir_ordem_dia'] = True - - self.form.fields['exibir_somente_titular'] = forms.BooleanField( - required=False, label='Exibir somente parlamentares titulares') - self.form.initial['exibir_somente_titular'] = False - - self.form.fields['exibir_somente_ativo'] = forms.BooleanField( - required=False, label='Exibir somente parlamentares ativos') - self.form.initial['exibir_somente_ativo'] = False - - self.form.fields['legislatura'].required = True - - self.filters['data_inicio'].label = 'Período (Inicial - Final)' - - tipo_sessao_ordinaria = self.filters['tipo'].queryset.filter( - nome='Ordinária') - if tipo_sessao_ordinaria: - self.form.initial['tipo'] = tipo_sessao_ordinaria.first() - - row1 = to_row([('legislatura', 4), - ('sessao_legislativa', 4), - ('tipo', 4)]) - row2 = to_row([('exibir_ordem_dia', 12), - ('exibir_somente_titular', 12), - ('exibir_somente_ativo', 12)]) - row3 = to_row([('data_inicio', 12)]) - - buttons = FormActions( - *[ - HTML(''' -
- - -
- ''') - ], - Submit('pesquisar', _('Pesquisar'), css_class='float-right', - onclick='return true;'), - css_class='form-group row justify-content-between', - ) - - self.form.helper = SaplFormHelper() - self.form.helper.form_method = 'GET' - self.form.helper.layout = Layout( - Fieldset(_('Presença dos parlamentares nas sessões plenárias'), - row1, row2, row3, buttons, ) - ) - - @property - def qs(self): - return qs_override_django_filter(self) - - -class RelatorioHistoricoTramitacaoFilterSet(django_filters.FilterSet): - - autoria__autor = django_filters.CharFilter(widget=forms.HiddenInput()) - - @property - def qs(self): - parent = super(RelatorioHistoricoTramitacaoFilterSet, self).qs - return parent.distinct().prefetch_related('tipo').order_by('-ano', 'tipo', 'numero') - - class Meta(FilterOverridesMetaMixin): - model = MateriaLegislativa - fields = ['tipo', 'tramitacao__status', 'tramitacao__data_tramitacao', - 'tramitacao__unidade_tramitacao_local', 'tramitacao__unidade_tramitacao_destino'] - - def __init__(self, *args, **kwargs): - super(RelatorioHistoricoTramitacaoFilterSet, self).__init__( - *args, **kwargs) - - self.filters['tipo'].label = 'Tipo de Matéria' - self.filters['tramitacao__status'].label = _('Status') - self.filters['tramitacao__unidade_tramitacao_local'].label = _( - 'Unidade Local (Origem)') - self.filters['tramitacao__unidade_tramitacao_destino'].label = _( - 'Unidade Destino') - - row1 = to_row([('tramitacao__data_tramitacao', 12)]) - row2 = to_row([('tramitacao__unidade_tramitacao_local', 6), - ('tramitacao__unidade_tramitacao_destino', 6)]) - row3 = to_row( - [('tipo', 6), - ('tramitacao__status', 6)]) - - row4 = to_row([ - ('autoria__autor', 0), - (Button('pesquisar', - 'Pesquisar Autor', - css_class='btn btn-primary btn-sm'), 2), - (Button('limpar', - 'Limpar Autor', - css_class='btn btn-primary btn-sm'), 2) - ]) - - buttons = FormActions( - *[ - HTML(''' -
- - -
- ''') - ], - Submit('pesquisar', _('Pesquisar'), css_class='float-right', - onclick='return true;'), - css_class='form-group row justify-content-between', - ) - - self.form.helper = SaplFormHelper() - self.form.helper.form_method = 'GET' - self.form.helper.layout = Layout( - Fieldset(_('Pesquisar'), - row1, row2, row3, row4, - HTML(autor_label), - HTML(autor_modal), - buttons, ) - ) - - -class RelatorioDataFimPrazoTramitacaoFilterSet(django_filters.FilterSet): - - ano = django_filters.ChoiceFilter(required=False, - label='Ano da Matéria', - choices=choice_anos_com_materias) - - @property - def qs(self): - parent = super(RelatorioDataFimPrazoTramitacaoFilterSet, self).qs - return parent.distinct().prefetch_related('tipo').order_by('-ano', 'tipo', 'numero') - - class Meta(FilterOverridesMetaMixin): - model = MateriaLegislativa - fields = ['tipo', 'tramitacao__unidade_tramitacao_local', - 'tramitacao__unidade_tramitacao_destino', - 'tramitacao__status', 'tramitacao__data_fim_prazo'] - - def __init__(self, *args, **kwargs): - super(RelatorioDataFimPrazoTramitacaoFilterSet, self).__init__( - *args, **kwargs) - - self.filters['tipo'].label = 'Tipo de Matéria' - self.filters[ - 'tramitacao__unidade_tramitacao_local'].label = 'Unidade Local (Origem)' - self.filters['tramitacao__unidade_tramitacao_destino'].label = 'Unidade Destino' - self.filters['tramitacao__status'].label = 'Status de tramitação' - - row1 = to_row([('ano', 12)]) - row2 = to_row([('tramitacao__data_fim_prazo', 12)]) - row3 = to_row([('tramitacao__unidade_tramitacao_local', 6), - ('tramitacao__unidade_tramitacao_destino', 6)]) - row4 = to_row( - [('tipo', 6), - ('tramitacao__status', 6)]) - - buttons = FormActions( - *[ - HTML(''' -
- - -
- ''') - ], - Submit('pesquisar', _('Pesquisar'), css_class='float-right', - onclick='return true;'), - css_class='form-group row justify-content-between', - ) - - self.form.helper = SaplFormHelper() - self.form.helper.form_method = 'GET' - self.form.helper.layout = Layout( - Fieldset(_('Tramitações'), - row1, row2, row3, row4, - buttons, ) - ) - - -class RelatorioReuniaoFilterSet(django_filters.FilterSet): - - @property - def qs(self): - parent = super(RelatorioReuniaoFilterSet, self).qs - return parent.distinct().order_by('-data', 'comissao') - - class Meta: - model = Reuniao - fields = ['comissao', 'data', - 'nome', 'tema'] - - def __init__(self, *args, **kwargs): - super(RelatorioReuniaoFilterSet, self).__init__( - *args, **kwargs) - - row1 = to_row([('data', 12)]) - row2 = to_row( - [('comissao', 4), - ('nome', 4), - ('tema', 4)]) - - buttons = FormActions( - *[ - HTML(''' -
- - -
- ''') - ], - Submit('pesquisar', _('Pesquisar'), css_class='float-right', - onclick='return true;'), - css_class='form-group row justify-content-between', - ) - - self.form.helper = SaplFormHelper() - self.form.helper.form_method = 'GET' - self.form.helper.layout = Layout( - Fieldset(_('Reunião de Comissão'), - row1, row2, - buttons, ) - ) - - -class RelatorioAudienciaFilterSet(django_filters.FilterSet): - - @property - def qs(self): - parent = super(RelatorioAudienciaFilterSet, self).qs - return parent.distinct().order_by('-data', 'tipo') - - class Meta: - model = AudienciaPublica - fields = ['tipo', 'data', - 'nome'] - - def __init__(self, *args, **kwargs): - super(RelatorioAudienciaFilterSet, self).__init__( - *args, **kwargs) - - row1 = to_row([('data', 12)]) - row2 = to_row( - [('tipo', 4), - ('nome', 4)]) - - buttons = FormActions( - *[ - HTML(''' -
- - -
- ''') - ], - Submit('pesquisar', _('Pesquisar'), css_class='float-right', - onclick='return true;'), - css_class='form-group row justify-content-between', - ) - - self.form.helper = SaplFormHelper() - self.form.helper.form_method = 'GET' - self.form.helper.layout = Layout( - Fieldset(_('Audiência Pública'), - row1, row2, - buttons, ) - ) - - -class RelatorioMateriasTramitacaoFilterSet(django_filters.FilterSet): - - materia__ano = django_filters.ChoiceFilter(required=True, - label='Ano da Matéria', - choices=choice_anos_com_materias) - - tramitacao__unidade_tramitacao_destino = django_filters.ModelChoiceFilter( - queryset=UnidadeTramitacao.objects.all(), - label=_('Unidade Atual')) - - tramitacao__status = django_filters.ModelChoiceFilter( - queryset=StatusTramitacao.objects.all(), - label=_('Status Atual')) - - materia__autores = django_filters.ModelChoiceFilter( - label='Autor da Matéria', - queryset=Autor.objects.all()) - - @property - def qs(self): - parent = super(RelatorioMateriasTramitacaoFilterSet, self).qs - return parent.distinct().order_by( - '-materia__ano', 'materia__tipo', '-materia__numero' - ) - - class Meta: - model = MateriaEmTramitacao - fields = ['materia__ano', 'materia__tipo', - 'tramitacao__unidade_tramitacao_destino', - 'tramitacao__status', 'materia__autores'] - - def __init__(self, *args, **kwargs): - super(RelatorioMateriasTramitacaoFilterSet, self).__init__( - *args, **kwargs) - - self.filters['materia__tipo'].label = 'Tipo de Matéria' - - row1 = to_row([('materia__ano', 12)]) - row2 = to_row([('materia__tipo', 12)]) - row3 = to_row([('tramitacao__unidade_tramitacao_destino', 12)]) - row4 = to_row([('tramitacao__status', 12)]) - row5 = to_row([('materia__autores', 12)]) - - buttons = FormActions( - *[ - HTML(''' -
- - -
- ''') - ], - Submit('pesquisar', _('Pesquisar'), css_class='float-right', - onclick='return true;'), - css_class='form-group row justify-content-between', - ) - - self.form.helper = SaplFormHelper() - self.form.helper.form_method = 'GET' - self.form.helper.layout = Layout( - Fieldset(_('Pesquisa de Matéria em Tramitação'), - row1, row2, row3, row4, row5, - buttons,) - ) - - -class RelatorioMateriasPorAnoAutorTipoFilterSet(django_filters.FilterSet): - - ano = django_filters.ChoiceFilter(required=True, - label='Ano da Matéria', - choices=choice_anos_com_materias) - - class Meta: - model = MateriaLegislativa - fields = ['ano'] - - def __init__(self, *args, **kwargs): - super(RelatorioMateriasPorAnoAutorTipoFilterSet, self).__init__( - *args, **kwargs) - - row1 = to_row( - [('ano', 12)]) - - buttons = FormActions( - *[ - HTML(''' -
- - -
- ''') - ], - Submit('pesquisar', _('Pesquisar'), css_class='float-right', - onclick='return true;'), - css_class='form-group row justify-content-between', - ) - - self.form.helper = SaplFormHelper() - self.form.helper.form_method = 'GET' - self.form.helper.layout = Layout( - Fieldset(_('Pesquisa de Matéria por Ano Autor Tipo'), - row1, - buttons, ) - ) - - -class RelatorioMateriasPorAutorFilterSet(django_filters.FilterSet): - - autoria__autor = django_filters.CharFilter(widget=forms.HiddenInput()) - - @property - def qs(self): - parent = super().qs - return parent.distinct().order_by('-ano', '-numero', 'tipo', 'autoria__autor', '-autoria__primeiro_autor') - - class Meta(FilterOverridesMetaMixin): - model = MateriaLegislativa - fields = ['tipo', 'data_apresentacao'] - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - self.filters['tipo'].label = 'Tipo de Matéria' - - row1 = to_row( - [('tipo', 12)]) - row2 = to_row( - [('data_apresentacao', 12)]) - row3 = to_row( - [('autoria__autor', 0), - (Button('pesquisar', - 'Pesquisar Autor', - css_class='btn btn-primary btn-sm'), 2), - (Button('limpar', - 'Limpar Autor', - css_class='btn btn-primary btn-sm'), 10)]) - - buttons = FormActions( - *[ - HTML(''' -
- - -
- ''') - ], - Submit('pesquisar', _('Pesquisar'), css_class='float-right', - onclick='return true;'), - css_class='form-group row justify-content-between', - ) - - self.form.helper = SaplFormHelper() - self.form.helper.form_method = 'GET' - self.form.helper.layout = Layout( - Fieldset(_('Pesquisa de Matéria por Autor'), - row1, row2, - HTML(autor_label), - HTML(autor_modal), - row3, - buttons, ) - ) - - class CasaLegislativaForm(FileFieldCheckMixin, ModelForm): - class Meta: model = CasaLegislativa @@ -1496,7 +907,7 @@ class CasaLegislativaForm(FileFieldCheckMixin, ModelForm): # O campo fax foi ocultado porque não é utilizado. 'fax': forms.HiddenInput(), # 'fax': forms.TextInput(attrs={'class': 'telefone'}), - 'logotipo': ImageThumbnailFileInput, + 'logotipo': ImageThumbnailFileInput, 'informacao_geral': forms.Textarea( attrs={'id': 'texto-rico'}) } @@ -1535,6 +946,12 @@ class ConfiguracoesAppForm(ModelForm): label=_('Mostrar brasão da Casa no painel?'), required=False) + mostrar_voto = forms.BooleanField( + help_text=_('Se selecionado, exibe qual é o voto, e não apenas a indicação de que já votou, ' + 'com a votação ainda aberta.'), + label=_('Mostrar voto do Parlamentar no painel durante a votação?'), + required=False) + google_recaptcha_site_key = forms.CharField( label=AppConfig._meta.get_field( 'google_recaptcha_site_key').verbose_name, @@ -1556,6 +973,12 @@ class ConfiguracoesAppForm(ModelForm): max_length=256, required=False) + google_analytics_id_metrica = forms.CharField( + label=AppConfig._meta.get_field( + 'google_analytics_id_metrica').verbose_name, + max_length=256, + required=False) + class Meta: model = AppConfig fields = ['documentos_administrativos', @@ -1574,15 +997,20 @@ class ConfiguracoesAppForm(ModelForm): 'cronometro_ordem', 'cronometro_consideracoes', 'mostrar_brasao_painel', + 'mostrar_voto', 'receber_recibo_proposicao', 'assinatura_ata', 'estatisticas_acesso_normas', 'escolher_numero_materia_proposicao', + 'tramitacao_origem_fixa', 'tramitacao_materia', 'tramitacao_documento', 'google_recaptcha_site_key', 'google_recaptcha_secret_key', - 'sapl_as_sapn'] + 'google_analytics_id_metrica', + 'sapl_as_sapn', + 'identificacao_de_documentos', + ] def __init__(self, *args, **kwargs): super(ConfiguracoesAppForm, self).__init__(*args, **kwargs) @@ -1617,18 +1045,15 @@ class ConfiguracoesAppForm(ModelForm): class RecuperarSenhaForm(GoogleRecapthaMixin, PasswordResetForm): - logger = logging.getLogger(__name__) def __init__(self, *args, **kwargs): - kwargs['title_label'] = _('Insira o e-mail cadastrado com a sua conta') kwargs['action_label'] = _('Enviar') super().__init__(*args, **kwargs) def clean(self): - super(RecuperarSenhaForm, self).clean() email_existente = get_user_model().objects.filter( @@ -1752,7 +1177,6 @@ class AlterarSenhaForm(Form): class PartidoForm(FileFieldCheckMixin, ModelForm): - class Meta: model = Partido exclude = [] @@ -1795,118 +1219,6 @@ class PartidoForm(FileFieldCheckMixin, ModelForm): return cleaned_data -class RelatorioHistoricoTramitacaoAdmFilterSet(django_filters.FilterSet): - - @property - def qs(self): - parent = super(RelatorioHistoricoTramitacaoAdmFilterSet, self).qs - return parent.distinct().prefetch_related('tipo').order_by('-ano', 'tipo', 'numero') - - class Meta(FilterOverridesMetaMixin): - model = DocumentoAdministrativo - fields = ['tipo', 'tramitacaoadministrativo__status', - 'tramitacaoadministrativo__data_tramitacao', - 'tramitacaoadministrativo__unidade_tramitacao_local', - 'tramitacaoadministrativo__unidade_tramitacao_destino'] - - def __init__(self, *args, **kwargs): - super(RelatorioHistoricoTramitacaoAdmFilterSet, self).__init__( - *args, **kwargs) - - self.filters['tipo'].label = 'Tipo de Documento' - self.filters['tramitacaoadministrativo__status'].label = _('Status') - self.filters['tramitacaoadministrativo__unidade_tramitacao_local'].label = _( - 'Unidade Local (Origem)') - self.filters['tramitacaoadministrativo__unidade_tramitacao_destino'].label = _( - 'Unidade Destino') - - row1 = to_row([('tramitacaoadministrativo__data_tramitacao', 12)]) - row2 = to_row([('tramitacaoadministrativo__unidade_tramitacao_local', 6), - ('tramitacaoadministrativo__unidade_tramitacao_destino', 6)]) - row3 = to_row( - [('tipo', 6), - ('tramitacaoadministrativo__status', 6)]) - - buttons = FormActions( - *[ - HTML(''' -
- - -
- ''') - ], - Submit('pesquisar', _('Pesquisar'), css_class='float-right', - onclick='return true;'), - css_class='form-group row justify-content-between', - ) - - self.form.helper = SaplFormHelper() - self.form.helper.form_method = 'GET' - self.form.helper.layout = Layout( - Fieldset(_(''), - row1, row2, row3, - buttons, ) - ) - - -class RelatorioNormasPorAutorFilterSet(django_filters.FilterSet): - - autorianorma__autor = django_filters.CharFilter(widget=forms.HiddenInput()) - - @property - def qs(self): - parent = super().qs - return parent.distinct().filter(autorianorma__primeiro_autor=True)\ - .order_by('autorianorma__autor', '-autorianorma__primeiro_autor', 'tipo', '-ano', '-numero') - - class Meta(FilterOverridesMetaMixin): - model = NormaJuridica - fields = ['tipo', 'data'] - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - self.filters['tipo'].label = 'Tipo de Norma' - - row1 = to_row( - [('tipo', 12)]) - row2 = to_row( - [('data', 12)]) - row3 = to_row( - [('autorianorma__autor', 0), - (Button('pesquisar', - 'Pesquisar Autor', - css_class='btn btn-primary btn-sm'), 2), - (Button('limpar', - 'Limpar Autor', - css_class='btn btn-primary btn-sm'), 10)]) - buttons = FormActions( - *[ - HTML(''' -
- - -
- ''') - ], - Submit('pesquisar', _('Pesquisar'), css_class='float-right', - onclick='return true;'), - css_class='form-group row justify-content-between', - ) - - self.form.helper = SaplFormHelper() - self.form.helper.form_method = 'GET' - self.form.helper.layout = Layout( - Fieldset(_('Pesquisar'), - row1, row2, - HTML(autor_label), - HTML(autor_modal), - row3, - form_actions(label='Pesquisar')) - ) - - class SaplSearchForm(ModelSearchForm): def search(self): diff --git a/sapl/base/legacy.yaml b/sapl/base/legacy.yaml deleted file mode 100644 index 2d866226e..000000000 --- a/sapl/base/legacy.yaml +++ /dev/null @@ -1,7 +0,0 @@ -TipoAutor: - descricao: des_tipo_autor - -Autor: - nome: nom_autor - cargo: des_cargo - tipo: tip_autor diff --git a/sapl/base/management/commands/backfill_auditlog.py b/sapl/base/management/commands/backfill_auditlog.py new file mode 100644 index 000000000..ba8bb6037 --- /dev/null +++ b/sapl/base/management/commands/backfill_auditlog.py @@ -0,0 +1,38 @@ +import json +import logging + +from django.core.management.base import BaseCommand +from sapl.base.models import AuditLog + +logger = logging.getLogger(__name__) + + +class Command(BaseCommand): + def handle(self, **options): + print("Backfilling AuditLog JSON Field...") + logs = AuditLog.objects.filter(data__isnull=True) + error_counter = 0 + if logs: + update_list = [] + for log in logs: + try: + obj = log.object[1:-1] \ + if log.object.startswith('[') else log.object + data = json.loads(obj) + log.data = data + except Exception as e: + error_counter += 1 + logging.error(e) + log.data = None + else: + update_list.append(log) + if len(update_list) == 1000: + AuditLog.objects.bulk_update(update_list, ['data']) + update_list = [] + if update_list: + AuditLog.objects.bulk_update(update_list, ['data']) + print(f"Logs backfilled: {len(logs) - error_counter}") + print(f"Logs with errors: {error_counter}") + print("Finished backfilling") + + diff --git a/sapl/base/migrations/0048_appconfig_tramitacao_origem_fixa.py b/sapl/base/migrations/0048_appconfig_tramitacao_origem_fixa.py new file mode 100644 index 000000000..933d42a84 --- /dev/null +++ b/sapl/base/migrations/0048_appconfig_tramitacao_origem_fixa.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.28 on 2022-06-27 11:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0047_auto_20210315_1522'), + ] + + operations = [ + migrations.AddField( + model_name='appconfig', + name='tramitacao_origem_fixa', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=True, + verbose_name='Fixar Origem das tramitações como sendo a tramitação de destino da última tramitação?'), + ), + ] diff --git a/sapl/base/migrations/0049_auto_20220728_2029.py b/sapl/base/migrations/0049_auto_20220728_2029.py new file mode 100644 index 000000000..92794a4be --- /dev/null +++ b/sapl/base/migrations/0049_auto_20220728_2029.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.20 on 2022-07-28 23:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0048_appconfig_tramitacao_origem_fixa'), + ] + + operations = [ + migrations.AlterField( + model_name='appconfig', + name='tramitacao_origem_fixa', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=True, help_text='Ao utilizar a opção NÂO, você compreende que os controles de origem e destino das tramitações são anulados, podendo seu operador registrar quaisquer origem e destino para as tramitações. Se você colocar Não, fizer tramitações aleatórias e voltar para SIM, o destino da tramitação mais recente será utilizado para a origem de uma nova inserção!', verbose_name='Fixar origem de novas tramitações como sendo a tramitação de destino da última tramitação?'), + ), + ] diff --git a/sapl/base/migrations/0050_metadata.py b/sapl/base/migrations/0050_metadata.py new file mode 100644 index 000000000..ec2f7435f --- /dev/null +++ b/sapl/base/migrations/0050_metadata.py @@ -0,0 +1,31 @@ +# Generated by Django 2.2.20 on 2022-07-29 01:02 + +import django.contrib.postgres.fields.jsonb +import django.core.serializers.json +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('base', '0049_auto_20220728_2029'), + ] + + operations = [ + migrations.CreateModel( + name='Metadata', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('object_id', models.PositiveIntegerField(blank=True, default=None, null=True)), + ('metadata', django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=None, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True, verbose_name='Metadados')), + ('content_type', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.PROTECT, to='contenttypes.ContentType')), + ], + options={ + 'verbose_name': 'Metadado', + 'verbose_name_plural': 'Metadados', + 'unique_together': {('content_type', 'object_id')}, + }, + ), + ] diff --git a/sapl/base/migrations/0051_auto_20220814_2138.py b/sapl/base/migrations/0051_auto_20220814_2138.py new file mode 100644 index 000000000..39f98c00f --- /dev/null +++ b/sapl/base/migrations/0051_auto_20220814_2138.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.28 on 2022-08-15 00:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0050_metadata'), + ] + + operations = [ + migrations.AddField( + model_name='appconfig', + name='identificacao_de_documentos', + field=models.CharField(default='{sigla} Nº {numero}/{ano}{-}{complemento} - {nome}', help_text='\n Como mostrar a identificação dos documentos administrativos?\n Você pode usar um conjunto de combinações que pretender.\n Ao fazer sua edição, será mostrado logo abaixo o último documento cadastrado, como exemplo de resultado de sua edição.\n Em caso de erro, nenhum documento será mostrado e aparecerá apenas o formato padrão mínimo, que é este: "{sigla} Nº {numero}/{ano}{-}{complemento} - {nome}".\n Muito importante, use as chaves "{}", sem elas, você estará inserindo um texto qualquer e não o valor de um campo.\n Você pode combinar as seguintes campos: {sigla} {nome} {numero} {ano} {complemento} {assunto}\n Ainda pode ser usado {/}, {-}, {.} se você quiser que uma barra, traço, ou ponto\n seja adicionado apenas se o próximo campo que será usado tenha algum conteúdo\n (não use dois destes destes condicionais em sequência, somente o último será considerado).\n ', max_length=254, verbose_name='Formato da identificação dos documentos'), + ), + migrations.AlterField( + model_name='appconfig', + name='protocolo_manual', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Permitir informe manual de data e hora de protocolo?'), + ), + ] diff --git a/sapl/base/migrations/0052_auto_20220914_1125.py b/sapl/base/migrations/0052_auto_20220914_1125.py new file mode 100644 index 000000000..734391dbc --- /dev/null +++ b/sapl/base/migrations/0052_auto_20220914_1125.py @@ -0,0 +1,15 @@ +# Generated by Django 2.2.28 on 2022-09-14 14:25 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0051_auto_20220814_2138'), + ] + + operations = [ + migrations.RunSQL("DROP TABLE IF EXISTS reversion_version"), + migrations.RunSQL("DROP TABLE IF EXISTS reversion_revision"), + ] diff --git a/sapl/base/migrations/0053_auto_20220919_1705.py b/sapl/base/migrations/0053_auto_20220919_1705.py new file mode 100644 index 000000000..590f064c8 --- /dev/null +++ b/sapl/base/migrations/0053_auto_20220919_1705.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.28 on 2022-09-19 20:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0052_auto_20220914_1125'), + ] + + operations = [ + migrations.AlterField( + model_name='appconfig', + name='sapl_as_sapn', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Utilizar SAPL apenas como SAPL-Normas?'), + ), + ] diff --git a/sapl/base/migrations/0054_auto_20220921_1217.py b/sapl/base/migrations/0054_auto_20220921_1217.py new file mode 100644 index 000000000..c728c9e03 --- /dev/null +++ b/sapl/base/migrations/0054_auto_20220921_1217.py @@ -0,0 +1,14 @@ +# Generated by Django 2.2.28 on 2022-09-21 15:17 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0053_auto_20220919_1705'), + ] + + operations = [ + migrations.RunSQL("DROP TABLE IF EXISTS speedinfo_viewprofiler"), + ] diff --git a/sapl/base/migrations/0055_appconfig_mostrar_voto.py b/sapl/base/migrations/0055_appconfig_mostrar_voto.py new file mode 100644 index 000000000..1d4527639 --- /dev/null +++ b/sapl/base/migrations/0055_appconfig_mostrar_voto.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.28 on 2022-10-05 18:33 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0054_auto_20220921_1217'), + ] + + operations = [ + migrations.AddField( + model_name='appconfig', + name='mostrar_voto', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Exibir voto do Parlamentar antes de encerrar a votação?'), + ), + ] diff --git a/sapl/base/migrations/0056_auto_20221118_1330.py b/sapl/base/migrations/0056_auto_20221118_1330.py new file mode 100644 index 000000000..d1d6d0036 --- /dev/null +++ b/sapl/base/migrations/0056_auto_20221118_1330.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.28 on 2022-11-18 16:30 + +import django.contrib.postgres.fields.jsonb +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0055_appconfig_mostrar_voto'), + ] + + operations = [ + migrations.AlterModelOptions( + name='auditlog', + options={'ordering': ('-id', '-timestamp'), 'verbose_name': 'AuditLog', 'verbose_name_plural': 'AuditLogs'}, + ), + migrations.AddField( + model_name='auditlog', + name='data', + field=django.contrib.postgres.fields.jsonb.JSONField(null=True, verbose_name='data'), + ), + ] diff --git a/sapl/base/migrations/0057_appconfig_google_analytics_id_metrica.py b/sapl/base/migrations/0057_appconfig_google_analytics_id_metrica.py new file mode 100644 index 000000000..7f6623fc6 --- /dev/null +++ b/sapl/base/migrations/0057_appconfig_google_analytics_id_metrica.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.28 on 2023-05-29 19:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0056_auto_20221118_1330'), + ] + + operations = [ + migrations.AddField( + model_name='appconfig', + name='google_analytics_id_metrica', + field=models.CharField(default='', max_length=256, verbose_name='ID da Métrica do Google Analytics'), + ), + ] diff --git a/sapl/base/models.py b/sapl/base/models.py index fb2a3bd66..43b8ab349 100644 --- a/sapl/base/models.py +++ b/sapl/base/models.py @@ -1,11 +1,13 @@ from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType +from django.contrib.postgres.fields.jsonb import JSONField +from django.core.cache import cache +from django.core.serializers.json import DjangoJSONEncoder from django.db import models from django.db.models.deletion import CASCADE from django.db.models.signals import post_migrate from django.db.utils import DEFAULT_DB_ALIAS from django.utils.translation import ugettext_lazy as _ -import reversion from sapl.utils import (LISTA_DE_UFS, YES_NO_CHOICES, get_settings_auth_user_model, models_with_gr_for_model) @@ -39,7 +41,6 @@ ASSINATURA_ATA_CHOICES = ( ) -@reversion.register() class CasaLegislativa(models.Model): # TODO ajustar todos os max_length !!!! # cod_casa => id (pk) @@ -82,7 +83,6 @@ class CasaLegislativa(models.Model): 'municipio': self.municipio} -@reversion.register() class AppConfig(models.Model): POLITICA_PROTOCOLO_CHOICES = ( @@ -91,63 +91,124 @@ class AppConfig(models.Model): ('N', _('Nunca Protocolar ao incorporar uma proposição')), ) - documentos_administrativos = models.CharField( - max_length=1, - verbose_name=_('Visibilidade dos Documentos Administrativos'), - choices=TIPO_DOCUMENTO_ADMINISTRATIVO, default='O') + # MANTENHA A SEQUÊNCIA EQUIVALENTE COM /sapl/templates/base/layout.yaml + # AppConfig: - estatisticas_acesso_normas = models.CharField( + # CONFIGURAÇÕES GERAIS + # Linha 1 ------------ + esfera_federacao = models.CharField( max_length=1, - verbose_name=_('Estatísticas de acesso a normas'), - choices=RELATORIO_ATOS_ACESSADOS, default='N') + blank=True, + default="", + verbose_name=_('Esfera Federação'), + choices=ESFERA_FEDERACAO_CHOICES) + sapl_as_sapn = models.BooleanField( + verbose_name=_( + 'Utilizar SAPL apenas como SAPL-Normas?'), + choices=YES_NO_CHOICES, default=False) - sequencia_numeracao_proposicao = models.CharField( - max_length=1, - verbose_name=_('Sequência de numeração de proposições'), - choices=SEQUENCIA_NUMERACAO_PROPOSICAO, default='A') + # MÓDULO PARLAMENTARES + + # MÓDULO MESA DIRETORA + # MÓDULO COMISSÕES + + # MÓDULO BANCADAS PARLAMENTARES + + # MÓDULO DOCUMENTOS ADMINISTRATIVOS + # Linha 1 ------------------------- + documentos_administrativos = models.CharField( + max_length=1, + verbose_name=_('Visibilidade dos Documentos Administrativos'), + choices=TIPO_DOCUMENTO_ADMINISTRATIVO, default='O') + tramitacao_documento = models.BooleanField( + verbose_name=_( + 'Tramitar documentos anexados junto com os documentos principais?'), + choices=YES_NO_CHOICES, default=True) + # Linha 2 ------------------------- + protocolo_manual = models.BooleanField( + verbose_name=_('Permitir informe manual de data e hora de protocolo?'), + choices=YES_NO_CHOICES, default=False) sequencia_numeracao_protocolo = models.CharField( max_length=1, verbose_name=_('Sequência de numeração de protocolos'), choices=SEQUENCIA_NUMERACAO_PROTOCOLO, default='A') - inicio_numeracao_protocolo = models.PositiveIntegerField( verbose_name=_('Início da numeração de protocolo'), default=1 ) + # Linha 3 ------------------------- + identificacao_de_documentos = models.CharField( + max_length=254, + verbose_name=_('Formato da identificação dos documentos'), + default='{sigla} Nº {numero}/{ano}{-}{complemento} - {nome}', + help_text=""" + Como mostrar a identificação dos documentos administrativos? + Você pode usar um conjunto de combinações que pretender. + Ao fazer sua edição, será mostrado logo abaixo o último documento cadastrado, como exemplo de resultado de sua edição. + Em caso de erro, nenhum documento será mostrado e aparecerá apenas o formato padrão mínimo, que é este: "{sigla} Nº {numero}/{ano}{-}{complemento} - {nome}". + Muito importante, use as chaves "{}", sem elas, você estará inserindo um texto qualquer e não o valor de um campo. + Você pode combinar as seguintes campos: {sigla} {nome} {numero} {ano} {complemento} {assunto} + Ainda pode ser usado {/}, {-}, {.} se você quiser que uma barra, traço, ou ponto + seja adicionado apenas se o próximo campo que será usado tenha algum conteúdo + (não use dois destes destes condicionais em sequência, somente o último será considerado). + """ + ) - esfera_federacao = models.CharField( + # MÓDULO PROPOSIÇÕES + # Linha 1 ---------- + sequencia_numeracao_proposicao = models.CharField( max_length=1, - blank=True, - default="", - verbose_name=_('Esfera Federação'), - choices=ESFERA_FEDERACAO_CHOICES) + verbose_name=_('Sequência de numeração de proposições'), + choices=SEQUENCIA_NUMERACAO_PROPOSICAO, default='A') + receber_recibo_proposicao = models.BooleanField( + verbose_name=_('Protocolar proposição somente com recibo?'), + choices=YES_NO_CHOICES, default=True) + proposicao_incorporacao_obrigatoria = models.CharField( + verbose_name=_('Regra de incorporação de proposições e protocolo'), + max_length=1, choices=POLITICA_PROTOCOLO_CHOICES, default='O') + escolher_numero_materia_proposicao = models.BooleanField( + verbose_name=_( + 'Indicar número da matéria a ser gerada na proposição?'), + choices=YES_NO_CHOICES, default=False) - # TODO: a ser implementado na versão 3.2 - # painel_aberto = models.BooleanField( - # verbose_name=_('Painel aberto para usuário anônimo'), - # choices=YES_NO_CHOICES, default=False) + # MÓDULO MATÉRIA LEGISLATIVA + # Linha 1 ------------------ + tramitacao_origem_fixa = models.BooleanField( + verbose_name=_( + 'Fixar origem de novas tramitações como sendo a tramitação de destino da última tramitação?'), + choices=YES_NO_CHOICES, + default=True, + help_text=_('Ao utilizar a opção NÂO, você compreende que os controles ' + 'de origem e destino das tramitações são anulados, ' + 'podendo seu operador registrar quaisquer origem e ' + 'destino para as tramitações. Se você colocar Não, ' + 'fizer tramitações aleatórias e voltar para SIM, ' + 'o destino da tramitação mais recente será utilizado ' + 'para a origem de uma nova inserção!')) + tramitacao_materia = models.BooleanField( + verbose_name=_( + 'Tramitar matérias anexadas junto com as matérias principais?'), + choices=YES_NO_CHOICES, default=True) + # MÓDULO NORMAS JURÍDICAS + # MÓDULO TEXTOS ARTICULADOS + # Linha 1 ----------------- texto_articulado_proposicao = models.BooleanField( verbose_name=_('Usar Textos Articulados para Proposições'), choices=YES_NO_CHOICES, default=False) - texto_articulado_materia = models.BooleanField( verbose_name=_('Usar Textos Articulados para Matérias'), choices=YES_NO_CHOICES, default=False) - texto_articulado_norma = models.BooleanField( verbose_name=_('Usar Textos Articulados para Normas'), choices=YES_NO_CHOICES, default=True) - proposicao_incorporacao_obrigatoria = models.CharField( - verbose_name=_('Regra de incorporação de proposições e protocolo'), - max_length=1, choices=POLITICA_PROTOCOLO_CHOICES, default='O') - + # MÓDULO SESSÃO PLENÁRIA assinatura_ata = models.CharField( verbose_name=_('Quem deve assinar a ata'), max_length=1, choices=ASSINATURA_ATA_CHOICES, default='T') - + # MÓDULO PAINEL cronometro_discurso = models.DurationField( verbose_name=_('Cronômetro do Discurso'), blank=True, @@ -172,28 +233,25 @@ class AppConfig(models.Model): default=False, verbose_name=_('Mostrar brasão da Casa no painel?')) - receber_recibo_proposicao = models.BooleanField( - verbose_name=_('Protocolar proposição somente com recibo?'), - choices=YES_NO_CHOICES, default=True) - - protocolo_manual = models.BooleanField( - verbose_name=_('Informar data e hora de protocolo?'), - choices=YES_NO_CHOICES, default=False) - - escolher_numero_materia_proposicao = models.BooleanField( + mostrar_voto = models.BooleanField( verbose_name=_( - 'Indicar número da matéria a ser gerada na proposição?'), + 'Exibir voto do Parlamentar antes de encerrar a votação?'), choices=YES_NO_CHOICES, default=False) - tramitacao_materia = models.BooleanField( - verbose_name=_( - 'Tramitar matérias anexadas junto com as matérias principais?'), - choices=YES_NO_CHOICES, default=True) + # MÓDULO ESTATÍSTICAS DE ACESSO + estatisticas_acesso_normas = models.CharField( + max_length=1, + verbose_name=_('Estatísticas de acesso a normas'), + choices=RELATORIO_ATOS_ACESSADOS, default='N') - tramitacao_documento = models.BooleanField( - verbose_name=_( - 'Tramitar documentos anexados junto com os documentos principais?'), - choices=YES_NO_CHOICES, default=True) + # MÓDULO SEGURANÇA + + # MÓDULO LEXML + + # TODO: a ser implementado na versão 3.2 + # painel_aberto = models.BooleanField( + # verbose_name=_('Painel aberto para usuário anônimo'), + # choices=YES_NO_CHOICES, default=False) google_recaptcha_site_key = models.CharField( verbose_name=_('Chave pública gerada pelo Google Recaptcha'), @@ -202,10 +260,9 @@ class AppConfig(models.Model): verbose_name=_('Chave privada gerada pelo Google Recaptcha'), max_length=256, default='') - sapl_as_sapn = models.BooleanField( - verbose_name=_( - 'Utilizar SAPL como SAPN?'), - choices=YES_NO_CHOICES, default=False) + google_analytics_id_metrica = models.CharField( + verbose_name=_('ID da Métrica do Google Analytics'), + max_length=256, default='') class Meta: verbose_name = _('Configurações da Aplicação') @@ -216,22 +273,37 @@ class AppConfig(models.Model): ) ordering = ('-id',) + def save(self, force_insert=False, force_update=False, using=None, + update_fields=None): + fields = self._meta.get_fields() + for f in fields: + if f.name != 'id' and not cache.get(f'sapl_{f.name}') is None: + cache.set(f'sapl_{f.name}', getattr(self, f.name), 600) + + return models.Model.save(self, force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields) + @classmethod def attr(cls, attr): + value = cache.get(f'sapl_{attr}') + if not value is None: + return value + config = AppConfig.objects.first() if not config: config = AppConfig() config.save() - return getattr(config, attr) + value = getattr(config, attr) + cache.set(f'sapl_{attr}', value, 600) + + return value def __str__(self): return _('Configurações da Aplicação - %(id)s') % { 'id': self.id} -@reversion.register() class TipoAutor(models.Model): descricao = models.CharField( max_length=50, @@ -256,7 +328,6 @@ class TipoAutor(models.Model): return self.descricao -@reversion.register() class Autor(models.Model): operadores = models.ManyToManyField( get_settings_auth_user_model(), @@ -353,12 +424,15 @@ class AuditLog(models.Model): db_index=True) timestamp = models.DateTimeField(verbose_name=_('timestamp'), db_index=True) + # DEPRECATED FIELD! TO BE REMOVED (EVENTUALLY) object = models.CharField(max_length=MAX_DATA_LENGTH, blank=True, verbose_name=_('object')) + data = JSONField(null=True, verbose_name=_('data')) object_id = models.PositiveIntegerField(verbose_name=_('object_id'), db_index=True) - model_name = models.CharField(max_length=100, verbose_name=_('model'), + model_name = models.CharField(max_length=100, + verbose_name=_('model'), db_index=True) app_name = models.CharField(max_length=100, verbose_name=_('app'), @@ -367,7 +441,7 @@ class AuditLog(models.Model): class Meta: verbose_name = _('AuditLog') verbose_name_plural = _('AuditLogs') - ordering = ('-id',) + ordering = ('-id', '-timestamp') def __str__(self): return "[%s] %s %s.%s %s" % (self.timestamp, @@ -376,3 +450,29 @@ class AuditLog(models.Model): self.model_name, self.username, ) + + +class Metadata(models.Model): + content_type = models.ForeignKey( + ContentType, + blank=True, + null=True, + default=None, + on_delete=models.PROTECT) + object_id = models.PositiveIntegerField( + blank=True, + null=True, + default=None) + content_object = GenericForeignKey('content_type', 'object_id') + + metadata = JSONField( + verbose_name=_('Metadados'), + blank=True, null=True, default=None, encoder=DjangoJSONEncoder) + + class Meta: + verbose_name = _('Metadado') + verbose_name_plural = _('Metadados') + unique_together = (('content_type', 'object_id'), ) + + def __str__(self): + return f'Metadata de {self.content_object}' diff --git a/sapl/base/receivers.py b/sapl/base/receivers.py index 0813ccf9a..4f5c052f5 100644 --- a/sapl/base/receivers.py +++ b/sapl/base/receivers.py @@ -1,23 +1,30 @@ +from datetime import datetime import inspect import logging +from PyPDF4.pdf import PdfFileReader +from asn1crypto import cms from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.core import serializers +from django.core.files.uploadedfile import InMemoryUploadedFile, UploadedFile +from django.db.models.fields.files import FileField from django.db.models.signals import post_delete, post_save, \ - post_migrate + post_migrate, pre_save, pre_migrate from django.db.utils import DEFAULT_DB_ALIAS from django.dispatch import receiver from django.utils import timezone from django.utils.translation import ugettext_lazy as _ from sapl.base.email_utils import do_envia_email_tramitacao -from sapl.base.models import AuditLog, TipoAutor, Autor +from sapl.base.models import AuditLog, TipoAutor, Autor, Metadata from sapl.decorators import receiver_multi_senders from sapl.materia.models import Tramitacao +from sapl.parlamentares.models import Parlamentar from sapl.protocoloadm.models import TramitacaoAdministrativo from sapl.utils import get_base_url, models_with_gr_for_model + models_with_gr_for_autor = models_with_gr_for_model(Autor) @@ -120,10 +127,15 @@ def audit_log_function(sender, **kwargs): model_name = instance.__class__.__name__ app_name = instance._meta.app_label object_id = instance.id - data = serializers.serialize('json', [instance]) - - if len(data) > AuditLog.MAX_DATA_LENGTH: - data = data[:AuditLog.MAX_DATA_LENGTH] + try: + import json + # [1:-1] below removes the surrounding square brackets + str_data = serializers.serialize('json', [instance])[1:-1] + data = json.loads(str_data) + except: + # old version capped string at AuditLog.MAX_DATA_LENGTH + # so there can be invalid json fields in Prod. + data = None if user: username = user.username @@ -136,7 +148,8 @@ def audit_log_function(sender, **kwargs): app_name=app_name, timestamp=timezone.now(), object_id=object_id, - object=data) + object='', + data=data) except Exception as e: logger.error('Error saving auditing log object') logger.error(e) @@ -186,3 +199,274 @@ def cria_models_tipo_autor(app_config=None, verbosity=2, interactive=True, post_migrate.connect(receiver=cria_models_tipo_autor) + + +def signed_files_extraction_function(sender, instance, **kwargs): + + def run_signed_name_and_date_via_fields(fields): + signs = [] + + for key, field in fields.items(): + + if '/FT' not in field and field['/FT'] != '/Sig': + continue + if '/V' not in field: + continue + + content_sign = field['/V']['/Contents'] + nome = 'Nome do assinante não localizado.' + oname = '' + try: + info = cms.ContentInfo.load(content_sign) + signed_data = info['content'] + oun_old = [] + for cert in signed_data['certificates']: + subject = cert.native['tbs_certificate']['subject'] + issuer = cert.native['tbs_certificate']['issuer'] + oname = issuer.get('organization_name', '') + + if oname == 'Gov-Br': + nome = subject['common_name'].split(':')[0] + continue + + oun = subject['organizational_unit_name'] + + if isinstance(oun, str): + continue + + if len(oun) > len(oun_old): + oun_old = oun + nome = subject['common_name'].split(':')[0] + + if oun and isinstance(oun, list) and len(oun) == 4: + oname += ' - ' + oun[3] + break + + except: + if '/Name' in field['/V']: + nome = field['/V']['/Name'] + + fd = None + try: + data = str(field['/V']['/M']) + + if 'D:' not in data: + data = None + else: + if not data.endswith('Z'): + data = data.replace('Z', '+') + data = data.replace("'", '') + + fd = datetime.strptime(data[2:], '%Y%m%d%H%M%S%z') + except: + pass + + signs.append((nome, [fd, oname])) + + return signs + + def run_signed_name_and_date_extract(file): + signs = [] + fields = {} + pdfdata = file.read() + + # se não tem byterange então não é assinado + byterange = [] + n = -1 + while True: + n = pdfdata.find(b"/ByteRange", n + 1) + if n == -1: + break + byterange.append(n) + + if not byterange: + return signs + + # tenta extrair via /Fields + try: + pdf = PdfFileReader(file) + fields = pdf.getFields() + except Exception as e: + try: + pdf = PdfFileReader(file, strict=False) + fields = pdf.getFields() + except Exception as ee: + fields = ee + + try: + # se a extração via /Fields ocorrer sem erros e forem capturadas + # tantas assinaturas quanto byteranges + if isinstance(fields, dict): + signs = run_signed_name_and_date_via_fields(fields) + if len(signs) == len(byterange): + return signs + + for n in byterange: + + start = pdfdata.find(b"[", n) + stop = pdfdata.find(b"]", start) + assert n != -1 and start != -1 and stop != -1 + n += 1 + + br = [int(i, 10) for i in pdfdata[start + 1: stop].split()] + contents = pdfdata[br[0] + br[1] + 1: br[2] - 1] + bcontents = bytes.fromhex(contents.decode("utf8")) + data1 = pdfdata[br[0]: br[0] + br[1]] + data2 = pdfdata[br[2]: br[2] + br[3]] + #signedData = data1 + data2 + + nome = 'Nome do assinante não localizado.' + oname = '' + try: + info = cms.ContentInfo.load(bcontents) + signed_data = info['content'] + + oun_old = [] + for cert in signed_data['certificates']: + subject = cert.native['tbs_certificate']['subject'] + issuer = cert.native['tbs_certificate']['issuer'] + oname = issuer.get('organization_name', '') + + if oname == 'Gov-Br': + nome = subject['common_name'].split(':')[0] + continue + + oun = subject['organizational_unit_name'] + + if isinstance(oun, str): + continue + + if len(oun) > len(oun_old): + oun_old = oun + nome = subject['common_name'].split(':')[0] + + if oun and isinstance(oun, list) and len(oun) == 4: + oname += ' - ' + oun[3] + break + + except Exception as e: + pass + + fd = None + signs.append((nome, [fd, oname])) + + except Exception as e: + pass + + return signs + + def signed_name_and_date_extract(file): + + try: + signs = run_signed_name_and_date_extract(file) + except: + return {} + + signs = sorted(signs, key=lambda sign: ( + sign[0], sign[1][1], sign[1][0])) + + signs_dict = {} + + for s in signs: + if s[0] not in signs_dict or 'ICP' in s[1][1] and 'ICP' not in signs_dict[s[0]][1]: + signs_dict[s[0]] = s[1] + + signs = sorted(signs_dict.items(), key=lambda sign: ( + sign[0], sign[1][1], sign[1][0])) + + sr = [] + + for s in signs: + tt = s[0].title().split(' ') + for idx, t in enumerate(tt): + if t in ('Dos', 'De', 'Da', 'Do', 'Das', 'E'): + tt[idx] = t.lower() + sr.append((' '.join(tt), s[1])) + + signs = sr + + meta_signs = { + 'autores': [], + 'admin': [] + } + + for s in signs: + # cn = # settings.CERT_PRIVATE_KEY_NAME + #meta_signs['admin' if s[0] == cn else 'autores'].append(s) + meta_signs['autores'].append(s) + return meta_signs + + def filefield_from_model(m): + fields = m._meta.get_fields() + fields = tuple(map(lambda f: f.name, filter( + lambda x: isinstance(x, FileField), fields))) + return fields + + FIELDFILE_NAME = filefield_from_model(instance) + + if not FIELDFILE_NAME: + return + + try: + md = Metadata.objects.get( + content_type=ContentType.objects.get_for_model( + instance._meta.model), + object_id=instance.id,).metadata + except: + md = {} + + for fn in FIELDFILE_NAME: # fn -> field_name + ff = getattr(instance, fn) # ff -> file_field + + if md and 'signs' in md and \ + fn in md['signs'] and\ + md['signs'][fn]: + md['signs'][fn] = {} + + if not ff: + continue + + try: + file = ff.file.file + meta_signs = {} + if not isinstance(ff.file, UploadedFile): + absolute_path = ff.path + with open(absolute_path, "rb") as file: + meta_signs = signed_name_and_date_extract(file) + file.close() + else: + file.seek(0) + meta_signs = signed_name_and_date_extract(file) + + if not meta_signs or not meta_signs['autores'] and not meta_signs['admin']: + continue + + if not md: + md = {'signs': {}} + + if 'signs' not in md: + md['signs'] = {} + + md['signs'][fn] = meta_signs + except Exception as e: + # print(e) + pass + + if md: + metadata = Metadata.objects.get_or_create( + content_type=ContentType.objects.get_for_model( + instance._meta.model), + object_id=instance.id,) + metadata[0].metadata = md + metadata[0].save() + + +@receiver(pre_save, dispatch_uid='signed_files_extraction_pre_save_signal') +def signed_files_extraction_pre_save_signal(sender, instance, **kwargs): + + signed_files_extraction_function(sender, instance, **kwargs) + + +@receiver(pre_migrate, dispatch_uid='disconnect_signals_pre_migrate') +def disconnect_signals_pre_migrate(*args, **kwargs): + pre_save.disconnect(dispatch_uid='signed_files_extraction_pre_save_signal') diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index f5b9c2c36..7cd751d1d 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -2,6 +2,7 @@ import re from django import template from django.template.defaultfilters import stringfilter +from django.utils.dateparse import parse_datetime as django_parse_datetime from django.utils.safestring import mark_safe from webpack_loader import utils @@ -10,7 +11,7 @@ from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa, Proposic from sapl.norma.models import NormaJuridica from sapl.parlamentares.models import Filiacao from sapl.sessao.models import SessaoPlenaria -from sapl.utils import filiacao_data, SEPARADOR_HASH_PROPOSICAO +from sapl.utils import filiacao_data, SEPARADOR_HASH_PROPOSICAO, is_report_allowed register = template.Library() @@ -29,6 +30,17 @@ def define(arg): return arg +@register.simple_tag +def describe_operation(value): + if value == "C": + return "Criar" + elif value == "D": + return "Apagar" + elif value == "U": + return "Atualizar" + return "" + + @register.simple_tag def field_verbose_name(instance, field_name): return instance._meta.get_field(field_name).verbose_name @@ -51,6 +63,25 @@ def model_verbose_name_plural(class_name): model = get_class(class_name) return model._meta.verbose_name_plural + +@register.filter +def obfuscate_value(value, key): + if key in ["hash", "google_recaptcha_secret_key", "password", "google_recaptcha_site_key", "hash_code"]: + return "***************" + return value + + +@register.filter +def desc_operation(value): + if value == "C": + return "Criado" + elif value == "D": + return "Excluido" + elif value == "U": + return "Atualizado" + return "" + + @register.filter def format_user(user): if user.first_name: @@ -58,6 +89,7 @@ def format_user(user): else: return user.username + @register.filter def meta_model_value(instance, attr): try: @@ -368,3 +400,12 @@ def dont_break_out(value): _safe = mark_safe(_safe) return _safe + +@register.filter(expects_localtime=True) +def parse_datetime(value): + return django_parse_datetime(value) + + +@register.filter +def is_report_visible(request, url_path=None): + return is_report_allowed(request, url_path) \ No newline at end of file diff --git a/sapl/base/urls.py b/sapl/base/urls.py index 058264049..6733a25ec 100644 --- a/sapl/base/urls.py +++ b/sapl/base/urls.py @@ -3,31 +3,22 @@ import os from django.conf.urls import include, url from django.contrib.auth import views from django.contrib.auth.decorators import permission_required - from django.views.generic.base import RedirectView, TemplateView from sapl.base.views import (AutorCrud, ConfirmarEmailView, TipoAutorCrud, get_estatistica, RecuperarSenhaEmailView, RecuperarSenhaFinalizadoView, - RecuperarSenhaConfirmaView, RecuperarSenhaCompletoView, RelatorioMateriaAnoAssuntoView, - IndexView, UserCrud) + RecuperarSenhaConfirmaView, RecuperarSenhaCompletoView, IndexView, UserCrud) from sapl.settings import MEDIA_URL, LOGOUT_REDIRECT_URL - from .apps import AppConfig -from .forms import LoginForm from .views import (LoginSapl, AlterarSenha, AppConfigCrud, CasaLegislativaCrud, - HelpTopicView, LogotipoView, RelatorioAtasView, - RelatorioAudienciaView, RelatorioDataFimPrazoTramitacaoView, RelatorioHistoricoTramitacaoView, - RelatorioMateriasPorAnoAutorTipoView, RelatorioMateriasPorAutorView, - RelatorioMateriasTramitacaoView, RelatorioPresencaSessaoView, RelatorioReuniaoView, SaplSearchView, - RelatorioNormasPublicadasMesView, RelatorioNormasVigenciaView, - EstatisticasAcessoNormas, RelatoriosListView, ListarInconsistenciasView, + HelpTopicView, LogotipoView, PesquisarAuditLogView, + SaplSearchView, + ListarInconsistenciasView, ListarProtocolosDuplicadosView, ListarProtocolosComMateriasView, ListarMatProtocoloInexistenteView, ListarParlamentaresDuplicadosView, ListarFiliacoesSemDataFiliacaoView, ListarMandatoSemDataInicioView, ListarParlMandatosIntersecaoView, ListarParlFiliacoesIntersecaoView, ListarAutoresDuplicadosView, ListarBancadaComissaoAutorExternoView, ListarLegislaturaInfindavelView, - ListarAnexadasCiclicasView, ListarAnexadosCiclicosView, pesquisa_textual, - RelatorioHistoricoTramitacaoAdmView, RelatorioDocumentosAcessoriosView, RelatorioNormasPorAutorView) - + ListarAnexadasCiclicasView, ListarAnexadosCiclicosView, pesquisa_textual) app_name = AppConfig.name @@ -68,53 +59,6 @@ urlpatterns = [ name="casa_legislativa"), url(r'^sistema/app-config/', include(AppConfigCrud.get_urls())), - # TODO mover estas telas para a app 'relatorios' - url(r'^sistema/relatorios/$', - RelatoriosListView.as_view(), name='relatorios_list'), - url(r'^sistema/relatorios/materia-por-autor$', - RelatorioMateriasPorAutorView.as_view(), name='materia_por_autor'), - url(r'^sistema/relatorios/relatorio-por-mes$', - RelatorioNormasPublicadasMesView.as_view(), name='normas_por_mes'), - url(r'^sistema/relatorios/relatorio-por-vigencia$', - RelatorioNormasVigenciaView.as_view(), name='normas_por_vigencia'), - url(r'^sistema/relatorios/estatisticas-acesso$', - EstatisticasAcessoNormas.as_view(), name='estatisticas_acesso'), - url(r'^sistema/relatorios/materia-por-ano-autor-tipo$', - RelatorioMateriasPorAnoAutorTipoView.as_view(), - name='materia_por_ano_autor_tipo'), - url(r'^sistema/relatorios/materia-por-tramitacao$', - RelatorioMateriasTramitacaoView.as_view(), - name='materia_por_tramitacao'), - url(r'^sistema/relatorios/materia-por-assunto$', - RelatorioMateriaAnoAssuntoView.as_view(), - name='materia_por_ano_assunto'), - url(r'^sistema/relatorios/historico-tramitacoes$', - RelatorioHistoricoTramitacaoView.as_view(), - name='historico_tramitacoes'), - url(r'^sistema/relatorios/data-fim-prazo-tramitacoes$', - RelatorioDataFimPrazoTramitacaoView.as_view(), - name='data_fim_prazo_tramitacoes'), - url(r'^sistema/relatorios/presenca$', - RelatorioPresencaSessaoView.as_view(), - name='presenca_sessao'), - url(r'^sistema/relatorios/atas$', - RelatorioAtasView.as_view(), - name='atas'), - url(r'^sistema/relatorios/reuniao$', - RelatorioReuniaoView.as_view(), - name='reuniao'), - url(r'^sistema/relatorios/audiencia$', - RelatorioAudienciaView.as_view(), - name='audiencia'), - url(r'^sistema/relatorios/historico-tramitacoesadm$', - RelatorioHistoricoTramitacaoAdmView.as_view(), - name='historico_tramitacoes_adm'), - url(r'^sistema/relatorios/documentos_acessorios$', - RelatorioDocumentosAcessoriosView.as_view(), - name='relatorio_documentos_acessorios'), - url(r'^sistema/relatorios/normas-por-autor$', - RelatorioNormasPorAutorView.as_view(), name='normas_por_autor'), - url(r'^email/validate/(?P[0-9A-Za-z_\-]+)/' '(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})$', ConfirmarEmailView.as_view(), name='confirmar_email'), @@ -179,6 +123,8 @@ urlpatterns = [ url(r'^sistema/search/', SaplSearchView(), name='haystack_search'), + url(r'^sistema/auditlog/$', PesquisarAuditLogView.as_view(), name='pesquisar_auditlog'), + # Folhas XSLT e extras referenciadas por documentos migrados do sapl 2.5 url(r'^(sapl/)?XSLT/HTML/(?P.*)$', RedirectView.as_view( url=os.path.join(MEDIA_URL, 'sapl/public/XSLT/HTML/%(path)s'), diff --git a/sapl/base/views.py b/sapl/base/views.py index 38301f531..dd8f7ef27 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -1,10 +1,10 @@ -from collections import OrderedDict import collections -import datetime +import collections import itertools import logging import os +from django.apps.registry import apps from django.contrib import messages from django.contrib.auth import get_user_model, views from django.contrib.auth.mixins import PermissionRequiredMixin @@ -12,11 +12,9 @@ from django.contrib.auth.models import Group from django.contrib.auth.tokens import default_token_generator from django.contrib.auth.views import (PasswordResetView, PasswordResetConfirmView, PasswordResetCompleteView, PasswordResetDoneView) -from django.core.exceptions import ObjectDoesNotExist, PermissionDenied, ValidationError +from django.core.exceptions import PermissionDenied, ValidationError from django.core.mail import send_mail -from django.db import connection -from django.db.models import Count, Q, Max, F -from django.forms.utils import ErrorList +from django.db.models import Count, Q, Max from django.http import Http404, HttpResponseRedirect, JsonResponse from django.shortcuts import redirect from django.template import TemplateDoesNotExist @@ -32,48 +30,29 @@ from django.views.generic.base import RedirectView, TemplateView from django_filters.views import FilterView from haystack.query import SearchQuerySet from haystack.views import SearchView - from ratelimit.decorators import ratelimit + from sapl import settings -from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica -from sapl.base.forms import (AutorForm, TipoAutorForm, AutorFilterSet, RecuperarSenhaForm, - NovaSenhaForm, UserAdminForm, - OperadorAutorForm, LoginForm, SaplSearchForm) -from sapl.base.models import Autor, TipoAutor, OperadorAutor -from sapl.comissoes.models import Comissao, Reuniao -from sapl.crud.base import CrudAux, make_pagination, Crud,\ - ListWithSearchForm, MasterDetailCrud -from sapl.materia.models import (Anexada, Autoria, DocumentoAcessorio, MateriaEmTramitacao, MateriaLegislativa, - Proposicao, StatusTramitacao, TipoDocumento, TipoMateriaLegislativa, UnidadeTramitacao, - MateriaAssunto) -from sapl.norma.models import NormaJuridica, TipoNormaJuridica +from sapl.base.forms import (AutorForm, TipoAutorForm, RecuperarSenhaForm, + NovaSenhaForm, UserAdminForm, AuditLogFilterSet, + LoginForm, SaplSearchForm) +from sapl.base.models import AuditLog, Autor, TipoAutor +from sapl.comissoes.models import Comissao +from sapl.crud.base import CrudAux, make_pagination, Crud, \ + ListWithSearchForm +from sapl.materia.models import (Anexada, MateriaLegislativa, + Proposicao) +from sapl.norma.models import NormaJuridica, ViewNormasEstatisticas from sapl.parlamentares.models import ( - Filiacao, Legislatura, Mandato, Parlamentar, SessaoLegislativa) -from sapl.protocoloadm.models import (Anexado, DocumentoAdministrativo, Protocolo, StatusTramitacaoAdministrativo, - TipoDocumentoAdministrativo) -from sapl.relatorios.views import (relatorio_materia_em_tramitacao, relatorio_materia_por_autor, - relatorio_materia_por_ano_autor, relatorio_presenca_sessao, - relatorio_historico_tramitacao, relatorio_fim_prazo_tramitacao, relatorio_atas, - relatorio_audiencia, relatorio_normas_mes, relatorio_normas_vigencia, - relatorio_historico_tramitacao_adm, relatorio_reuniao, - relatorio_estatisticas_acesso_normas, relatorio_normas_por_autor, - relatorio_documento_acessorio) -from sapl.sessao.models import ( - Bancada, PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, TipoSessaoPlenaria) + Filiacao, Legislatura, Mandato, Parlamentar) +from sapl.protocoloadm.models import (Anexado, Protocolo) +from sapl.relatorios.views import (relatorio_estatisticas_acesso_normas) +from sapl.sessao.models import (Bancada, SessaoPlenaria) from sapl.settings import EMAIL_SEND_USER -from sapl.utils import (gerar_hash_arquivo, intervalos_tem_intersecao, mail_service_configured, parlamentares_ativos, - SEPARADOR_HASH_PROPOSICAO, show_results_filter_set, num_materias_por_tipo, - google_recaptcha_configured, sapl_as_sapn, - groups_remove_user, groups_add_user, get_client_ip) - -from .forms import (AlterarSenhaForm, CasaLegislativaForm, ConfiguracoesAppForm, RelatorioAtasFilterSet, - RelatorioAudienciaFilterSet, RelatorioDataFimPrazoTramitacaoFilterSet, - RelatorioHistoricoTramitacaoFilterSet, RelatorioMateriasPorAnoAutorTipoFilterSet, - RelatorioMateriasPorAutorFilterSet, RelatorioMateriasTramitacaoFilterSet, - RelatorioPresencaSessaoFilterSet, RelatorioReuniaoFilterSet, - RelatorioNormasMesFilterSet, RelatorioNormasVigenciaFilterSet, EstatisticasAcessoNormasForm, - RelatorioHistoricoTramitacaoAdmFilterSet, RelatorioDocumentosAcessoriosFilterSet, - RelatorioNormasPorAutorFilterSet) +from sapl.utils import (gerar_hash_arquivo, intervalos_tem_intersecao, mail_service_configured, + SEPARADOR_HASH_PROPOSICAO, show_results_filter_set, google_recaptcha_configured, sapl_as_sapn, + get_client_ip) +from .forms import (AlterarSenhaForm, CasaLegislativaForm, ConfiguracoesAppForm, EstatisticasAcessoNormasForm) from .models import AppConfig, CasaLegislativa @@ -237,15 +216,15 @@ class AutorCrud(CrudAux): url_base = full_url[:full_url.find('sistema') - 1] mensagem = ( - "Este e-mail foi utilizado para fazer cadastro no " + - "SAPL com o perfil de Autor. Agora você pode " + - "criar/editar/enviar Proposições.\n" + - "Seu nome de usuário é: " + - self.request.POST['username'] + "\n" - "Caso você não tenha feito este cadastro, por favor " + - "ignore esta mensagem. Caso tenha, clique " + - "no link abaixo\n" + url_base + - reverse('sapl.base:confirmar_email', kwargs=kwargs)) + "Este e-mail foi utilizado para fazer cadastro no " + + "SAPL com o perfil de Autor. Agora você pode " + + "criar/editar/enviar Proposições.\n" + + "Seu nome de usuário é: " + + self.request.POST['username'] + "\n" + "Caso você não tenha feito este cadastro, por favor " + + "ignore esta mensagem. Caso tenha, clique " + + "no link abaixo\n" + url_base + + reverse('sapl.base:confirmar_email', kwargs=kwargs)) remetente = settings.EMAIL_SEND_USER destinatario = [user.email] send_mail(assunto, mensagem, remetente, destinatario, @@ -334,862 +313,13 @@ class AutorCrud(CrudAux): return qs.distinct('nome', 'id').order_by('nome', 'id') -class RelatoriosListView(TemplateView): - template_name = 'base/relatorios_list.html' - - def get_context_data(self, **kwargs): - context = super(TemplateView, self).get_context_data(**kwargs) - estatisticas_acesso_normas = AppConfig.objects.first().estatisticas_acesso_normas - context['estatisticas_acesso_normas'] = True if estatisticas_acesso_normas == 'S' else False - - return context - - -class RelatorioMixin: - def get(self, request, *args, **kwargs): - super(RelatorioMixin, self).get(request) - - is_relatorio = request.GET.get('relatorio') - context = self.get_context_data(filter=self.filterset) - - if is_relatorio: - return self.relatorio(request, context) - else: - return self.render_to_response(context) - - -class RelatorioDocumentosAcessoriosView(RelatorioMixin, FilterView): - model = DocumentoAcessorio - filterset_class = RelatorioDocumentosAcessoriosFilterSet - template_name = 'base/RelatorioDocumentosAcessorios_filter.html' - relatorio = relatorio_documento_acessorio - - def get_context_data(self, **kwargs): - context = super( - RelatorioDocumentosAcessoriosView, self - ).get_context_data(**kwargs) - - context['title'] = _('Documentos Acessórios das Matérias Legislativas') - - if not self.filterset.form.is_valid(): - return context - - query_dict = self.request.GET.copy() - context['show_results'] = show_results_filter_set(query_dict) - - context['tipo_documento'] = str( - TipoDocumento.objects.get(pk=self.request.GET['tipo']) - ) - - tipo_materia = self.request.GET['materia__tipo'] - if tipo_materia: - context['tipo_materia'] = str( - TipoMateriaLegislativa.objects.get(pk=tipo_materia) - ) - else: - context['tipo_materia'] = "Não selecionado" - - data_inicial = self.request.GET['data_0'] - data_final = self.request.GET['data_1'] - if not data_inicial: - data_inicial = "Data Inicial não definida" - if not data_final: - data_final = "Data Final não definida" - context['periodo'] = ( - data_inicial + ' - ' + data_final - ) - - return context - - -class RelatorioAtasView(RelatorioMixin, FilterView): - model = SessaoPlenaria - filterset_class = RelatorioAtasFilterSet - template_name = 'base/RelatorioAtas_filter.html' - relatorio = relatorio_atas - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context['title'] = _('Atas das Sessões Plenárias') - - # Verifica se os campos foram preenchidos - if not self.filterset.form.is_valid(): - return context - - qr = self.request.GET.copy() - context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' - - context['show_results'] = show_results_filter_set(qr) - context['periodo'] = ( - self.request.GET['data_inicio_0'] + - ' - ' + self.request.GET['data_inicio_1']) - - return context - - -class RelatorioPresencaSessaoView(RelatorioMixin, FilterView): - logger = logging.getLogger(__name__) - model = SessaoPlenaria - filterset_class = RelatorioPresencaSessaoFilterSet - template_name = 'base/RelatorioPresencaSessao_filter.html' - relatorio = relatorio_presenca_sessao - - def get_context_data(self, **kwargs): - - context = super().get_context_data(**kwargs) - context['title'] = _('Presença dos parlamentares nas sessões') - - # Verifica se os campos foram preenchidos - if not self.filterset.form.is_valid(): - return context - - cd = self.filterset.form.cleaned_data - if not cd['data_inicio'] and not cd['sessao_legislativa'] \ - and not cd['legislatura']: - msg = _( - "Formulário inválido! Preencha pelo menos algum dos campos Período, Legislatura ou Sessão Legislativa.") - messages.error(self.request, msg) - return context - - # Caso a data tenha sido preenchida, verifica se foi preenchida - # corretamente - if self.request.GET.get('data_inicio_0') and not self.request.GET.get('data_inicio_1'): - msg = _("Formulário inválido! Preencha a data do Período Final.") - messages.error(self.request, msg) - return context - - if not self.request.GET.get('data_inicio_0') and self.request.GET.get('data_inicio_1'): - msg = _("Formulário inválido! Preencha a data do Período Inicial.") - messages.error(self.request, msg) - return context - - param0 = {} - - legislatura_pk = self.request.GET.get('legislatura') - if legislatura_pk: - param0['sessao_plenaria__legislatura_id'] = legislatura_pk - legislatura = Legislatura.objects.get(id=legislatura_pk) - context['legislatura'] = legislatura - - sessao_legislativa_pk = self.request.GET.get('sessao_legislativa') - if sessao_legislativa_pk: - param0['sessao_plenaria__sessao_legislativa_id'] = sessao_legislativa_pk - sessao_legislativa = SessaoLegislativa.objects.get( - id=sessao_legislativa_pk) - context['sessao_legislativa'] = sessao_legislativa - - tipo_sessao_plenaria_pk = self.request.GET.get('tipo') - context['tipo'] = '' - if tipo_sessao_plenaria_pk: - param0['sessao_plenaria__tipo_id'] = tipo_sessao_plenaria_pk - context['tipo'] = TipoSessaoPlenaria.objects.get( - id=tipo_sessao_plenaria_pk) - - _range = [] - - if ('data_inicio_0' in self.request.GET) and self.request.GET['data_inicio_0'] and \ - ('data_inicio_1' in self.request.GET) and self.request.GET['data_inicio_1']: - where = context['object_list'].query.where - _range = where.children[0].rhs - - elif legislatura_pk and not sessao_legislativa_pk: - _range = [legislatura.data_inicio, legislatura.data_fim] - - elif sessao_legislativa_pk: - _range = [sessao_legislativa.data_inicio, - sessao_legislativa.data_fim] - - param0.update({'sessao_plenaria__data_inicio__range': _range}) - - # Parlamentares com Mandato no intervalo de tempo (Ativos) - parlamentares_qs = parlamentares_ativos( - _range[0], _range[1]).order_by('nome_parlamentar') - parlamentares_id = parlamentares_qs.values_list('id', flat=True) - - # Presenças de cada Parlamentar em Sessões - presenca_sessao = SessaoPlenariaPresenca.objects.filter( - **param0).values_list('parlamentar_id').annotate(sessao_count=Count('id')) - - # Presenças de cada Ordem do Dia - presenca_ordem = PresencaOrdemDia.objects.filter( - **param0).values_list('parlamentar_id').annotate(sessao_count=Count('id')) - - total_ordemdia = PresencaOrdemDia.objects.filter( - **param0).distinct('sessao_plenaria__id').order_by('sessao_plenaria__id').count() - - total_sessao = context['object_list'].count() - - username = self.request.user.username - - context['exibir_somente_titular'] = self.request.GET.get( - 'exibir_somente_titular') == 'on' - context['exibir_somente_ativo'] = self.request.GET.get( - 'exibir_somente_ativo') == 'on' - - # Completa o dicionario as informacoes parlamentar/sessao/ordem - parlamentares_presencas = [] - for p in parlamentares_qs: - parlamentar = {} - m = p.mandato_set.filter(Q(data_inicio_mandato__lte=_range[0], data_fim_mandato__gte=_range[1]) | - Q(data_inicio_mandato__lte=_range[0], data_fim_mandato__isnull=True) | - Q(data_inicio_mandato__gte=_range[0], data_fim_mandato__lte=_range[1]) | - # mandato suplente - Q(data_inicio_mandato__gte=_range[0], data_fim_mandato__lte=_range[1])) - - m = m.last() - - if not context['exibir_somente_titular'] and not context['exibir_somente_ativo']: - parlamentar = { - 'parlamentar': p, - 'titular': m.titular if m else False, - 'sessao_porc': 0, - 'ordemdia_porc': 0 - } - elif context['exibir_somente_titular'] and not context['exibir_somente_ativo']: - if m and m.titular: - parlamentar = { - 'parlamentar': p, - 'titular': m.titular if m else False, - 'sessao_porc': 0, - 'ordemdia_porc': 0 - } - else: - continue - elif not context['exibir_somente_titular'] and context['exibir_somente_ativo']: - if p.ativo: - parlamentar = { - 'parlamentar': p, - 'titular': m.titular if m else False, - 'sessao_porc': 0, - 'ordemdia_porc': 0 - } - else: - continue - elif context['exibir_somente_titular'] and context['exibir_somente_ativo']: - if m and m.titular and p.ativo: - parlamentar = { - 'parlamentar': p, - 'titular': m.titular if m else False, - 'sessao_porc': 0, - 'ordemdia_porc': 0 - } - else: - continue - else: - continue - - try: - self.logger.debug( - F'user={username}. Tentando obter presença do parlamentar (pk={p.id}).') - sessao_count = presenca_sessao.get(parlamentar_id=p.id)[1] - except ObjectDoesNotExist as e: - self.logger.error( - F'user={username}. Erro ao obter presença do parlamentar (pk={p.id}). Definido como 0. {str(e)}') - sessao_count = 0 - try: - # Presenças de cada Ordem do Dia - self.logger.info( - F'user={username}. Tentando obter PresencaOrdemDia para o parlamentar pk={p.id}.') - ordemdia_count = presenca_ordem.get(parlamentar_id=p.id)[1] - except ObjectDoesNotExist: - self.logger.error( - F'user={username}. Erro ao obter PresencaOrdemDia para o parlamentar pk={p.id}. Definido como 0.') - ordemdia_count = 0 - - parlamentar.update({ - 'sessao_count': sessao_count, - 'ordemdia_count': ordemdia_count - }) - - if total_sessao != 0: - parlamentar.update({'sessao_porc': round( - sessao_count * 100 / total_sessao, 2)}) - if total_ordemdia != 0: - parlamentar.update({'ordemdia_porc': round( - ordemdia_count * 100 / total_ordemdia, 2)}) - - parlamentares_presencas.append(parlamentar) - - context['date_range'] = _range - context['total_ordemdia'] = total_ordemdia - context['total_sessao'] = context['object_list'].count() - context['parlamentares'] = parlamentares_presencas - context['periodo'] = f"{self.request.GET['data_inicio_0']} - {self.request.GET['data_inicio_1']}" - context['sessao_legislativa'] = '' - context['legislatura'] = '' - context['exibir_ordem'] = self.request.GET.get( - 'exibir_ordem_dia') == 'on' - - if sessao_legislativa_pk: - context['sessao_legislativa'] = SessaoLegislativa.objects.get( - id=sessao_legislativa_pk) - if legislatura_pk: - context['legislatura'] = Legislatura.objects.get(id=legislatura_pk) - # ===================================================================== - qr = self.request.GET.copy() - context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' - - context['show_results'] = show_results_filter_set(qr) - - return context - - -class RelatorioHistoricoTramitacaoView(RelatorioMixin, FilterView): - model = MateriaLegislativa - filterset_class = RelatorioHistoricoTramitacaoFilterSet - template_name = 'base/RelatorioHistoricoTramitacao_filter.html' - relatorio = relatorio_historico_tramitacao - - def get_context_data(self, **kwargs): - context = super(RelatorioHistoricoTramitacaoView, - self).get_context_data(**kwargs) - context['title'] = _( - 'Histórico de Tramitações de Matérias Legislativas') - if not self.filterset.form.is_valid(): - return context - qr = self.request.GET.copy() - context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' - - context['show_results'] = show_results_filter_set(qr) - context['data_tramitacao'] = (self.request.GET['tramitacao__data_tramitacao_0'] + ' - ' + - self.request.GET['tramitacao__data_tramitacao_1']) - if self.request.GET['tipo']: - tipo = self.request.GET['tipo'] - context['tipo'] = ( - str(TipoMateriaLegislativa.objects.get(id=tipo))) - else: - context['tipo'] = '' - - if self.request.GET['tramitacao__status']: - tramitacao_status = self.request.GET['tramitacao__status'] - context['tramitacao__status'] = ( - str(StatusTramitacao.objects.get(id=tramitacao_status))) - else: - context['tramitacao__status'] = '' - - if self.request.GET['tramitacao__unidade_tramitacao_local']: - context['tramitacao__unidade_tramitacao_local'] = \ - (str(UnidadeTramitacao.objects.get( - id=self.request.GET['tramitacao__unidade_tramitacao_local']))) - else: - context['tramitacao__unidade_tramitacao_local'] = '' - - if self.request.GET['tramitacao__unidade_tramitacao_destino']: - context['tramitacao__unidade_tramitacao_destino'] = \ - (str(UnidadeTramitacao.objects.get( - id=self.request.GET['tramitacao__unidade_tramitacao_destino']))) - else: - context['tramitacao__unidade_tramitacao_destino'] = '' - - if self.request.GET['autoria__autor']: - context['autoria__autor'] = \ - (str(Autor.objects.get( - id=self.request.GET['autoria__autor']))) - else: - context['autoria__autor'] = '' - - return context - - -class RelatorioDataFimPrazoTramitacaoView(RelatorioMixin, FilterView): - model = MateriaLegislativa - filterset_class = RelatorioDataFimPrazoTramitacaoFilterSet - template_name = 'base/RelatorioDataFimPrazoTramitacao_filter.html' - relatorio = relatorio_fim_prazo_tramitacao - - def get_context_data(self, **kwargs): - context = super(RelatorioDataFimPrazoTramitacaoView, - self).get_context_data(**kwargs) - context['title'] = _('Relatório de Tramitações') - if not self.filterset.form.is_valid(): - return context - qr = self.request.GET.copy() - context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' - - context['show_results'] = show_results_filter_set(qr) - - context['data_tramitacao'] = (self.request.GET['tramitacao__data_fim_prazo_0'] + ' - ' + - self.request.GET['tramitacao__data_fim_prazo_1']) - - if self.request.GET['ano']: - context['ano'] = self.request.GET['ano'] - else: - context['ano'] = '' - - if self.request.GET['tipo']: - tipo = self.request.GET['tipo'] - context['tipo'] = ( - str(TipoMateriaLegislativa.objects.get(id=tipo))) - else: - context['tipo'] = '' - - if self.request.GET['tramitacao__status']: - tramitacao_status = self.request.GET['tramitacao__status'] - context['tramitacao__status'] = ( - str(StatusTramitacao.objects.get(id=tramitacao_status))) - else: - context['tramitacao__status'] = '' - - if self.request.GET['tramitacao__unidade_tramitacao_local']: - context['tramitacao__unidade_tramitacao_local'] = \ - (str(UnidadeTramitacao.objects.get( - id=self.request.GET['tramitacao__unidade_tramitacao_local']))) - else: - context['tramitacao__unidade_tramitacao_local'] = '' - - if self.request.GET['tramitacao__unidade_tramitacao_destino']: - context['tramitacao__unidade_tramitacao_destino'] = \ - (str(UnidadeTramitacao.objects.get( - id=self.request.GET['tramitacao__unidade_tramitacao_destino']))) - else: - context['tramitacao__unidade_tramitacao_destino'] = '' - - return context - - -class RelatorioReuniaoView(RelatorioMixin, FilterView): - model = Reuniao - filterset_class = RelatorioReuniaoFilterSet - template_name = 'base/RelatorioReuniao_filter.html' - relatorio = relatorio_reuniao - - def get_filterset_kwargs(self, filterset_class): - super(RelatorioReuniaoView, - self).get_filterset_kwargs(filterset_class) - - kwargs = {'data': self.request.GET or None} - return kwargs - - def get_context_data(self, **kwargs): - context = super(RelatorioReuniaoView, - self).get_context_data(**kwargs) - context['title'] = _('Reunião de Comissão') - if not self.filterset.form.is_valid(): - return context - qr = self.request.GET.copy() - - context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' - - context['show_results'] = show_results_filter_set(qr) - - if self.request.GET['comissao']: - comissao = self.request.GET['comissao'] - context['comissao'] = (str(Comissao.objects.get(id=comissao))) - else: - context['comissao'] = '' - - return context - - -class RelatorioAudienciaView(RelatorioMixin, FilterView): - model = AudienciaPublica - filterset_class = RelatorioAudienciaFilterSet - template_name = 'base/RelatorioAudiencia_filter.html' - relatorio = relatorio_audiencia - - def get_filterset_kwargs(self, filterset_class): - super(RelatorioAudienciaView, - self).get_filterset_kwargs(filterset_class) - - kwargs = {'data': self.request.GET or None} - return kwargs - - def get_context_data(self, **kwargs): - context = super(RelatorioAudienciaView, - self).get_context_data(**kwargs) - context['title'] = _('Audiência Pública') - if not self.filterset.form.is_valid(): - return context - - qr = self.request.GET.copy() - context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' - - context['show_results'] = show_results_filter_set(qr) - - if self.request.GET['tipo']: - tipo = self.request.GET['tipo'] - context['tipo'] = (str(TipoAudienciaPublica.objects.get(id=tipo))) - else: - context['tipo'] = '' - - return context - - -class RelatorioMateriasTramitacaoView(RelatorioMixin, FilterView): - model = MateriaEmTramitacao - filterset_class = RelatorioMateriasTramitacaoFilterSet - template_name = 'base/RelatorioMateriasPorTramitacao_filter.html' - relatorio = relatorio_materia_em_tramitacao - - paginate_by = 100 - - total_resultados_tipos = {} - - def get_filterset_kwargs(self, filterset_class): - data = super().get_filterset_kwargs(filterset_class) - - if data['data']: - qs = data['queryset'] - - ano_materia = data['data']['materia__ano'] - tipo_materia = data['data']['materia__tipo'] - unidade_tramitacao_destino = data['data']['tramitacao__unidade_tramitacao_destino'] - status_tramitacao = data['data']['tramitacao__status'] - autor = data['data']['materia__autores'] - - kwargs = {} - if ano_materia: - kwargs['materia__ano'] = ano_materia - if tipo_materia: - kwargs['materia__tipo'] = tipo_materia - if unidade_tramitacao_destino: - kwargs['tramitacao__unidade_tramitacao_destino'] = unidade_tramitacao_destino - if status_tramitacao: - kwargs['tramitacao__status'] = status_tramitacao - if autor: - kwargs['materia__autores'] = autor - - qs = qs.filter(**kwargs) - data['queryset'] = qs - - self.total_resultados_tipos = num_materias_por_tipo( - qs, "materia__tipo") - - return data - - def get_queryset(self): - qs = super().get_queryset() - qs = qs.select_related('materia__tipo').filter( - materia__em_tramitacao=True - ).exclude( - tramitacao__status__indicador='F' - ).order_by('-materia__ano', '-materia__numero') - return qs - - def get_context_data(self, **kwargs): - context = super( - RelatorioMateriasTramitacaoView, self - ).get_context_data(**kwargs) - - context['title'] = _('Matérias em Tramitação') - - if not self.filterset.form.is_valid(): - return context - - qr = self.request.GET.copy() - - context['qtdes'] = self.total_resultados_tipos - context['ano'] = (self.request.GET['materia__ano']) - - if self.request.GET['materia__tipo']: - tipo = self.request.GET['materia__tipo'] - context['tipo'] = ( - str(TipoMateriaLegislativa.objects.get(id=tipo)) - ) - else: - context['tipo'] = '' - - if self.request.GET['tramitacao__status']: - tramitacao_status = self.request.GET['tramitacao__status'] - context['tramitacao__status'] = ( - str(StatusTramitacao.objects.get(id=tramitacao_status)) - ) - else: - context['tramitacao__status'] = '' - - if self.request.GET['tramitacao__unidade_tramitacao_destino']: - context['tramitacao__unidade_tramitacao_destino'] = ( - str(UnidadeTramitacao.objects.get( - id=self.request.GET['tramitacao__unidade_tramitacao_destino'] - )) - ) - else: - context['tramitacao__unidade_tramitacao_destino'] = '' - - if self.request.GET['materia__autores']: - autor = self.request.GET['materia__autores'] - context['materia__autor'] = ( - str(Autor.objects.get(id=autor)) - ) - else: - context['materia__autor'] = '' - if 'page' in qr: - del qr['page'] - context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' - context['show_results'] = show_results_filter_set(qr) - - paginator = context['paginator'] - page_obj = context['page_obj'] - - context['page_range'] = make_pagination( - page_obj.number, paginator.num_pages - ) - context['NO_ENTRIES_MSG'] = 'Nenhum encontrado.' - - return context - - -class RelatorioMateriasPorAnoAutorTipoView(RelatorioMixin, FilterView): - model = MateriaLegislativa - filterset_class = RelatorioMateriasPorAnoAutorTipoFilterSet - template_name = 'base/RelatorioMateriasPorAnoAutorTipo_filter.html' - relatorio = relatorio_materia_por_ano_autor - - def get_materias_autor_ano(self, ano, primeiro_autor): - - autorias = Autoria.objects.filter(materia__ano=ano, primeiro_autor=primeiro_autor).values( - 'autor', - 'materia__tipo__sigla', - 'materia__tipo__descricao').annotate( - total=Count('materia__tipo')).order_by( - 'autor', - 'materia__tipo') - - autores_ids = set([i['autor'] for i in autorias]) - - autores = dict((a.id, a) for a in Autor.objects.filter( - id__in=autores_ids)) - - relatorio = [] - visitados = set() - curr = None - - for a in autorias: - # se mudou autor, salva atual, caso existente, e reinicia `curr` - if a['autor'] not in visitados: - if curr: - relatorio.append(curr) - - curr = {} - curr['autor'] = autores[a['autor']] - curr['materia'] = [] - curr['total'] = 0 - - visitados.add(a['autor']) - - # atualiza valores - curr['materia'].append((a['materia__tipo__descricao'], a['total'])) - curr['total'] += a['total'] - # adiciona o ultimo - relatorio.append(curr) - - return relatorio - - def get_filterset_kwargs(self, filterset_class): - super(RelatorioMateriasPorAnoAutorTipoView, - self).get_filterset_kwargs(filterset_class) - - kwargs = {'data': self.request.GET or None} - return kwargs - - def get_context_data(self, **kwargs): - context = super(RelatorioMateriasPorAnoAutorTipoView, - self).get_context_data(**kwargs) - - context['title'] = _('Matérias por Ano, Autor e Tipo') - if not self.filterset.form.is_valid(): - return context - qs = context['object_list'] - context['qtdes'] = num_materias_por_tipo(qs) - - qr = self.request.GET.copy() - context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' - - context['show_results'] = show_results_filter_set(qr) - context['ano'] = self.request.GET['ano'] - - if 'ano' in self.request.GET and self.request.GET['ano']: - ano = int(self.request.GET['ano']) - context['relatorio'] = self.get_materias_autor_ano(ano, True) - context['corelatorio'] = self.get_materias_autor_ano(ano, False) - else: - context['relatorio'] = [] - - return context - - -class RelatorioMateriasPorAutorView(RelatorioMixin, FilterView): - model = MateriaLegislativa - filterset_class = RelatorioMateriasPorAutorFilterSet - template_name = 'base/RelatorioMateriasPorAutor_filter.html' - relatorio = relatorio_materia_por_autor - - def get_filterset_kwargs(self, filterset_class): - super().get_filterset_kwargs(filterset_class) - kwargs = {'data': self.request.GET or None} - return kwargs - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - - context['title'] = _('Matérias por Autor') - if not self.filterset.form.is_valid(): - return context - - qs = context['object_list'] - context['materias_resultado'] = list(OrderedDict.fromkeys(qs)) - context['qtdes'] = num_materias_por_tipo(qs) - - qr = self.request.GET.copy() - context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' - - context['show_results'] = show_results_filter_set(qr) - if self.request.GET['tipo']: - tipo = int(self.request.GET['tipo']) - context['tipo'] = ( - str(TipoMateriaLegislativa.objects.get(id=tipo))) - else: - context['tipo'] = '' - if self.request.GET['autoria__autor']: - autor = int(self.request.GET['autoria__autor']) - context['autor'] = (str(Autor.objects.get(id=autor))) - else: - context['autor'] = '' - context['periodo'] = ( - self.request.GET['data_apresentacao_0'] + - ' - ' + self.request.GET['data_apresentacao_1']) - - return context - - -class RelatorioMateriaAnoAssuntoView(ListView): - template_name = 'base/RelatorioMateriasAnoAssunto.html' - - def get_queryset(self): - return MateriaAssunto.objects.all().values( - 'assunto_id', - assunto_materia=F('assunto__assunto'), - ano=F('materia__ano')).annotate( - total=Count('assunto_id')).order_by('-materia__ano', 'assunto_id') - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context['title'] = _('Matérias por Ano e Assunto') - - # In[10]: MateriaAssunto.objects.all().values( - # ...: 'materia__ano').annotate( - # ...: total = Count('materia__ano')).order_by('-materia__ano') - - mat = MateriaLegislativa.objects.filter( - materiaassunto__isnull=True).values( - 'ano').annotate( - total=Count('ano')).order_by('-ano') - - context.update({"materias_sem_assunto": mat}) - return context - - -class RelatorioNormasPublicadasMesView(RelatorioMixin, FilterView): - model = NormaJuridica - filterset_class = RelatorioNormasMesFilterSet - template_name = 'base/RelatorioNormaMes_filter.html' - relatorio = relatorio_normas_mes - - def get_context_data(self, **kwargs): - context = super(RelatorioNormasPublicadasMesView, - self).get_context_data(**kwargs) - context['title'] = _('Normas') - - # Verifica se os campos foram preenchidos - if not self.filterset.form.is_valid(): - return context - - qr = self.request.GET.copy() - context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' - - context['show_results'] = show_results_filter_set(qr) - context['ano'] = self.request.GET['ano'] - - normas_mes = collections.OrderedDict() - meses = {1: 'Janeiro', 2: 'Fevereiro', 3: 'Março', 4: 'Abril', 5: 'Maio', 6: 'Junho', - 7: 'Julho', 8: 'Agosto', 9: 'Setembro', 10: 'Outubro', 11: 'Novembro', 12: 'Dezembro'} - for norma in context['object_list']: - if not meses[norma.data.month] in normas_mes: - normas_mes[meses[norma.data.month]] = [] - normas_mes[meses[norma.data.month]].append(norma) - - context['normas_mes'] = normas_mes - - quant_normas_mes = {} - for key in normas_mes.keys(): - quant_normas_mes[key] = len(normas_mes[key]) - - context['quant_normas_mes'] = quant_normas_mes - - return context - - -class RelatorioNormasVigenciaView(RelatorioMixin, FilterView): - model = NormaJuridica - filterset_class = RelatorioNormasVigenciaFilterSet - template_name = 'base/RelatorioNormasVigencia_filter.html' - relatorio = relatorio_normas_vigencia - - def get_filterset_kwargs(self, filterset_class): - super(RelatorioNormasVigenciaView, - self).get_filterset_kwargs(filterset_class) - - kwargs = {'data': self.request.GET or None} - qs = self.get_queryset().order_by('data').distinct() - if kwargs['data']: - ano = kwargs['data']['ano'] - vigencia = kwargs['data']['vigencia'] - if ano: - qs = qs.filter(ano=ano) - - if vigencia == 'True': - qs_dt_not_null = qs.filter(data_vigencia__isnull=True) - qs = (qs_dt_not_null | qs.filter( - data_vigencia__gte=datetime.datetime.now().date())).distinct() - else: - qs = qs.filter( - data_vigencia__lt=datetime.datetime.now().date()) - - kwargs.update({ - 'queryset': qs - }) - return kwargs - - def get_context_data(self, **kwargs): - context = super(RelatorioNormasVigenciaView, - self).get_context_data(**kwargs) - context['title'] = _('Normas por vigência') - - # Verifica se os campos foram preenchidos - if not self.filterset.form.is_valid(): - return context - - normas_totais = NormaJuridica.objects.filter( - ano=self.request.GET['ano']) - - context['quant_total'] = len(normas_totais) - if self.request.GET['vigencia'] == 'True': - context['vigencia'] = 'Vigente' - context['quant_vigente'] = len(context['object_list']) - context['quant_nao_vigente'] = context['quant_total'] - \ - context['quant_vigente'] - else: - context['vigencia'] = 'Não vigente' - context['quant_nao_vigente'] = len(context['object_list']) - context['quant_vigente'] = context['quant_total'] - \ - context['quant_nao_vigente'] - - qr = self.request.GET.copy() - context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' - - context['show_results'] = show_results_filter_set(qr) - context['ano'] = self.request.GET['ano'] - - return context - - class EstatisticasAcessoNormas(TemplateView): template_name = 'base/EstatisticasAcessoNormas_filter.html' def get(self, request, *args, **kwargs): context = super(EstatisticasAcessoNormas, self).get_context_data(**kwargs) - context['title'] = _('Normas') + context['title'] = _('Estatísticas de Acesso às Normas Jurídicas') form = EstatisticasAcessoNormasForm(request.GET or None) context['form'] = form @@ -1198,36 +328,41 @@ class EstatisticasAcessoNormas(TemplateView): return self.render_to_response(context) context['ano'] = self.request.GET['ano'] + context['mes'] = self.request.GET.get('mes', '') + context['mais_acessadas'] = int( + self.request.GET.get('mais_acessadas', 5)) + + if not context['mes'] and context['mais_acessadas'] > 10: + context['mais_acessadas'] = 10 + + params = { + 'ano_est': context['ano'], + 'mais_acessadas__lte': context['mais_acessadas'] + } + if context['mes']: + params['mes_est'] = context['mes'] + + estatisticas = ViewNormasEstatisticas.objects.filter( + **params + ) - query = ''' - select norma_id, ano, extract(month from horario_acesso) as mes, count(*) - from norma_normaestatisticas - where ano = {} - group by mes, ano, norma_id - order by mes desc; - '''.format(context['ano']) - cursor = connection.cursor() - cursor.execute(query) - rows = cursor.fetchall() - + normas_count_mes = collections.OrderedDict() normas_mes = collections.OrderedDict() meses = {1: 'Janeiro', 2: 'Fevereiro', 3: 'Março', 4: 'Abril', 5: 'Maio', 6: 'Junho', 7: 'Julho', 8: 'Agosto', 9: 'Setembro', 10: 'Outubro', 11: 'Novembro', 12: 'Dezembro'} - for row in rows: - if not meses[int(row[2])] in normas_mes: - normas_mes[meses[int(row[2])]] = [] - norma_est = [NormaJuridica.objects.get(id=row[0]), row[3]] - normas_mes[meses[int(row[2])]].append(norma_est) + for norma in estatisticas: + if not meses[norma.mes_est] in normas_mes: + normas_mes[meses[norma.mes_est]] = [] + normas_count_mes[meses[norma.mes_est]] = 0 - # Ordena por acesso e limita em 5 - for n in normas_mes: - sorted_by_value = sorted( - normas_mes[n], key=lambda kv: kv[1], reverse=True) - normas_mes[n] = sorted_by_value[0:5] + normas_count_mes[meses[norma.mes_est]] += norma.norma_count + normas_mes[meses[norma.mes_est]].append(norma) context['normas_mes'] = normas_mes + context['normas_count_mes'] = normas_count_mes + is_relatorio = request.GET.get('relatorio') context['show_results'] = show_results_filter_set( @@ -1678,7 +813,7 @@ class ListarParlMandatosIntersecaoView(PermissionRequiredMixin, ListView): def parlamentares_duplicados(): return [parlamentar for parlamentar in Parlamentar.objects.values( 'nome_parlamentar').order_by('nome_parlamentar').annotate(count=Count( - 'nome_parlamentar')).filter(count__gt=1)] + 'nome_parlamentar')).filter(count__gt=1)] class ListarParlamentaresDuplicadosView(PermissionRequiredMixin, ListView): @@ -1715,10 +850,10 @@ def get_estatistica(request): datas = [ materias.order_by( '-data_ultima_atualizacao').values_list('data_ultima_atualizacao', flat=True) - .exclude(data_ultima_atualizacao__isnull=True).first(), + .exclude(data_ultima_atualizacao__isnull=True).first(), normas.order_by( '-data_ultima_atualizacao').values_list('data_ultima_atualizacao', flat=True) - .exclude(data_ultima_atualizacao__isnull=True).first() + .exclude(data_ultima_atualizacao__isnull=True).first() ] max_data = max(datas) if datas[0] and datas[1] else next( @@ -1894,6 +1029,9 @@ class UserCrud(Crud): 'usuario', 'groups', 'is_active' ] + def openapi_url(self): + return '' + def resolve_url(self, suffix, args=None): return reverse('sapl.base:%s' % self.url_name(suffix), args=args) @@ -1932,7 +1070,7 @@ class UserCrud(Crud): ) def hook_auth_token(self, obj): - return 'Token', str(obj.auth_token) + return 'Token', str(obj.auth_token) if hasattr(obj, 'auth_token') else ' ' def hook_username(self, obj): return 'username', obj.username @@ -2064,7 +1202,8 @@ class AppConfigCrud(CrudAux): except ValidationError as e: form.add_error('receber_recibo_proposicao', e) msg = _( - "Não foi possível mudar a configuração porque a Proposição {} não possui texto original vinculado!".format(prop)) + "Não foi possível mudar a configuração porque a Proposição {} não possui texto original vinculado!".format( + prop)) messages.error(self.request, msg) return super().form_invalid(form) return super().form_valid(form) @@ -2097,10 +1236,45 @@ class AppConfigCrud(CrudAux): kwargs={'pk': app_config.pk})) class UpdateView(CrudAux.UpdateView): - - template_name = 'base/AppConfig.html' form_class = ConfiguracoesAppForm + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['title'] = self.model._meta.verbose_name + return context + + def get(self, request, *args, **kwargs): + if 'jsidd' in request.GET: + return self.json_simular_identificacao_de_documentos(request, *args, **kwargs) + + return super().get(request, *args, **kwargs) + + def json_simular_identificacao_de_documentos(self, request, *args, **kwargs): + + DocumentoAdministrativo = apps.get_model( + 'protocoloadm', + 'DocumentoAdministrativo' + ) + + d = DocumentoAdministrativo.objects.order_by('-id').first() + + jsidd = request.GET.get('jsidd', '') + values = { + '{sigla}': d.tipo.sigla if d else 'OF', + '{nome}': d.tipo.descricao if d else 'Ofício', + '{numero}': f'{d.numero:0>3}' if d else '001', + '{ano}': f'{d.ano}' if d else str(timezone.now().year), + '{complemento}': d.complemento if d else 'GAB', + '{assunto}': d.assunto if d else 'Simulação de Identificação de Documentos' + } + + result = DocumentoAdministrativo.mask_to_str(values, jsidd) + + return JsonResponse({ + 'jsidd': result[0], + 'error': list(result[1]) + }) + def form_valid(self, form): numeracao = AppConfig.objects.last().sequencia_numeracao_protocolo numeracao_antiga = AppConfig.objects.last().inicio_numeracao_protocolo @@ -2190,7 +1364,7 @@ class SaplSearchView(SearchView): models = [] context['models'] = '' - context['is_paginated'] = True + context['is_paginated'] = True page_obj = context['page'] context['page_obj'] = page_obj @@ -2210,6 +1384,84 @@ class SaplSearchView(SearchView): return context +class PesquisarAuditLogView(PermissionRequiredMixin, FilterView): + model = AuditLog + filterset_class = AuditLogFilterSet + paginate_by = 20 + + permission_required = ('base.list_appconfig',) + + def get_filterset_kwargs(self, filterset_class): + super(PesquisarAuditLogView, self).get_filterset_kwargs( + filterset_class + ) + + return ({ + "data": self.request.GET or None, + "queryset": self.get_queryset().order_by("-id") + }) + + def get_context_data(self, **kwargs): + context = super(PesquisarAuditLogView, self).get_context_data( + **kwargs + ) + + paginator = context["paginator"] + page_obj = context["page_obj"] + + qr = self.request.GET.copy() + if 'page' in qr: + del qr['page'] + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + context['show_results'] = show_results_filter_set(qr) + + context.update({ + "page_range": make_pagination( + page_obj.number, paginator.num_pages + ), + "NO_ENTRIES_MSG": "Nenhum registro de log encontrado!", + "title": _("Pesquisar Logs de Auditoria") + }) + + return context + + def get(self, request, *args, **kwargs): + timefilter = request.GET.get('timestamp', None) + + if not timefilter: + newgetrequest = request.GET.copy() + newgetrequest['timestamp'] = 'week' + request.GET = newgetrequest + + super(PesquisarAuditLogView, self).get(request) + + data = self.filterset.data + + url = '' + + if data: + url = '&' + str(self.request.META["QUERY_STRING"]) + if url.startswith("&page"): + url = '' + + resultados = self.object_list + # if 'page' in self.request.META['QUERY_STRING']: + # resultados = self.object_list + # else: + # resultados = [] + + context = self.get_context_data(filter=self.filterset, + object_list=resultados, + filter_url=url, + numero_res=len(resultados) + ) + + context['show_results'] = show_results_filter_set( + self.request.GET.copy()) + + return self.render_to_response(context) + + class AlterarSenha(FormView): from sapl.settings import LOGIN_URL @@ -2244,7 +1496,6 @@ class LogotipoView(RedirectView): def filtro_campos(dicionario): - chaves_desejadas = ['ementa', 'ano', 'numero', @@ -2267,7 +1518,6 @@ def filtro_campos(dicionario): def pesquisa_textual(request): - if 'q' not in request.GET: return JsonResponse({'total': 0, 'resultados': []}) @@ -2297,102 +1547,3 @@ def pesquisa_textual(request): json_dict['resultados'].append(sec_dict) return JsonResponse(json_dict) - - -class RelatorioHistoricoTramitacaoAdmView(RelatorioMixin, FilterView): - model = DocumentoAdministrativo - filterset_class = RelatorioHistoricoTramitacaoAdmFilterSet - template_name = 'base/RelatorioHistoricoTramitacaoAdm_filter.html' - relatorio = relatorio_historico_tramitacao_adm - - def get_context_data(self, **kwargs): - context = super(RelatorioHistoricoTramitacaoAdmView, - self).get_context_data(**kwargs) - context['title'] = _( - 'Histórico de Tramitações de Documento Administrativo') - if not self.filterset.form.is_valid(): - return context - qr = self.request.GET.copy() - context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' - - context['show_results'] = show_results_filter_set(qr) - context['data_tramitacao'] = (self.request.GET['tramitacaoadministrativo__data_tramitacao_0'] + ' - ' + - self.request.GET['tramitacaoadministrativo__data_tramitacao_1']) - if self.request.GET['tipo']: - tipo = self.request.GET['tipo'] - context['tipo'] = ( - str(TipoDocumentoAdministrativo.objects.get(id=tipo))) - else: - context['tipo'] = '' - - if self.request.GET['tramitacaoadministrativo__status']: - tramitacao_status = self.request.GET['tramitacaoadministrativo__status'] - context['tramitacaoadministrativo__status'] = ( - str(StatusTramitacaoAdministrativo.objects.get(id=tramitacao_status))) - else: - context['tramitacaoadministrativo__status'] = '' - - if self.request.GET['tramitacaoadministrativo__unidade_tramitacao_local']: - context['tramitacaoadministrativo__unidade_tramitacao_local'] = \ - (str(UnidadeTramitacao.objects.get( - id=self.request.GET['tramitacaoadministrativo__unidade_tramitacao_local']))) - else: - context['tramitacaoadministrativo__unidade_tramitacao_local'] = '' - - if self.request.GET['tramitacaoadministrativo__unidade_tramitacao_destino']: - context['tramitacaoadministrativo__unidade_tramitacao_destino'] = \ - (str(UnidadeTramitacao.objects.get( - id=self.request.GET['tramitacaoadministrativo__unidade_tramitacao_destino']))) - else: - context['tramitacaoadministrativo__unidade_tramitacao_destino'] = '' - - return context - - -class RelatorioNormasPorAutorView(RelatorioMixin, FilterView): - model = NormaJuridica - filterset_class = RelatorioNormasPorAutorFilterSet - template_name = 'base/RelatorioNormasPorAutor_filter.html' - relatorio = relatorio_normas_por_autor - - def get_filterset_kwargs(self, filterset_class): - super().get_filterset_kwargs(filterset_class) - kwargs = {'data': self.request.GET or None} - return kwargs - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - - context['title'] = _('Normas por Autor') - if not self.filterset.form.is_valid(): - return context - - qtdes = {} - for tipo in TipoNormaJuridica.objects.all(): - qs = context['object_list'] - qtde = len(qs.filter(tipo_id=tipo.id)) - if qtde > 0: - qtdes[tipo] = qtde - context['qtdes'] = qtdes - - qr = self.request.GET.copy() - context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' - - context['show_results'] = show_results_filter_set(qr) - if self.request.GET['tipo']: - tipo = int(self.request.GET['tipo']) - context['tipo'] = ( - str(TipoNormaJuridica.objects.get(id=tipo))) - else: - context['tipo'] = '' - - if self.request.GET['autorianorma__autor']: - autor = int(self.request.GET['autorianorma__autor']) - context['autor'] = (str(Autor.objects.get(id=autor))) - else: - context['autor'] = '' - context['periodo'] = ( - self.request.GET['data_0'] + - ' - ' + self.request.GET['data_1']) - - return context diff --git a/sapl/comissoes/legacy.yaml b/sapl/comissoes/legacy.yaml deleted file mode 100644 index 8e1040510..000000000 --- a/sapl/comissoes/legacy.yaml +++ /dev/null @@ -1,51 +0,0 @@ -TipoComissao: - dispositivo_regimental: des_dispositivo_regimental - natureza: sgl_natureza_comissao - nome: nom_tipo_comissao - sigla: sgl_tipo_comissao - -Comissao: - agenda_reuniao: des_agenda_reuniao - apelido_temp: nom_apelido_temp - data_criacao: dat_criacao - data_extincao: dat_extincao - data_fim_comissao: dat_fim_comissao - data_final_prevista_temp: dat_final_prevista_temp - data_instalacao_temp: dat_instalacao_temp - data_prorrogada_temp: dat_prorrogada_temp - email: end_email - endereco_secretaria: end_secretaria - fax_secretaria: num_fax_secretaria - finalidade: txt_finalidade - local_reuniao: loc_reuniao - nome: nom_comissao - secretario: nom_secretario - sigla: sgl_comissao - telefone_reuniao: num_tel_reuniao - telefone_secretaria: num_tel_secretaria - tipo: tip_comissao - unidade_deliberativa: ind_unid_deliberativa - -Periodo (PeriodoCompComissao): - data_fim: dat_fim_periodo - data_inicio: dat_inicio_periodo - -CargoComissao: - nome: des_cargo - unico: ind_unico - -Participacao (ComposicaoComissao): - cargo: cod_cargo - data_designacao: dat_designacao - data_desligamento: dat_desligamento - motivo_desligamento: des_motivo_desligamento - observacao: obs_composicao - parlamentar: cod_parlamentar - titular: ind_titular - -Reuniao (ReuniaoComissao): - comissao: cod_comissao - numero: num_reuniao - data: dat_inicio_reuniao - observacao: txt_observacao - diff --git a/sapl/comissoes/migrations/0028_auto_20220807_2257.py b/sapl/comissoes/migrations/0028_auto_20220807_2257.py new file mode 100644 index 000000000..5c405165a --- /dev/null +++ b/sapl/comissoes/migrations/0028_auto_20220807_2257.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.28 on 2022-08-08 01:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('comissoes', '0027_auto_20210209_1047'), + ] + + operations = [ + migrations.AlterField( + model_name='participacao', + name='motivo_desligamento', + field=models.TextField(blank=True, verbose_name='Motivo Desligamento'), + ), + migrations.AlterField( + model_name='participacao', + name='observacao', + field=models.TextField(blank=True, verbose_name='Observação'), + ), + ] diff --git a/sapl/comissoes/migrations/0029_auto_20221019_2041.py b/sapl/comissoes/migrations/0029_auto_20221019_2041.py new file mode 100644 index 000000000..abd175497 --- /dev/null +++ b/sapl/comissoes/migrations/0029_auto_20221019_2041.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.28 on 2022-10-19 23:41 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('comissoes', '0028_auto_20220807_2257'), + ] + + operations = [ + migrations.AlterModelOptions( + name='reuniao', + options={'ordering': ('-data', '-nome'), 'verbose_name': 'Reunião de Comissão', 'verbose_name_plural': 'Reuniões de Comissão'}, + ), + ] diff --git a/sapl/comissoes/models.py b/sapl/comissoes/models.py index 4bb1aa535..75381e3a2 100644 --- a/sapl/comissoes/models.py +++ b/sapl/comissoes/models.py @@ -1,4 +1,3 @@ -import reversion from django.db import models from django.utils.translation import ugettext_lazy as _ from model_utils import Choices @@ -10,7 +9,6 @@ from sapl.utils import (YES_NO_CHOICES, SaplGenericRelation, OverwriteStorage) -@reversion.register() class TipoComissao(models.Model): NATUREZA_CHOICES = Choices(('T', 'temporaria', _('Temporária')), ('P', 'permanente', _('Permanente'))) @@ -32,7 +30,6 @@ class TipoComissao(models.Model): return self.nome -@reversion.register() class Comissao(models.Model): tipo = models.ForeignKey(TipoComissao, on_delete=models.PROTECT, @@ -99,7 +96,6 @@ class Comissao(models.Model): return self.sigla + ' - ' + self.nome -@reversion.register() class Periodo(models.Model): # PeriodoCompComissao data_inicio = models.DateField(verbose_name=_('Data Início')) data_fim = models.DateField( @@ -120,7 +116,6 @@ class Periodo(models.Model): # PeriodoCompComissao return '-' -@reversion.register() class CargoComissao(models.Model): id_ordenacao = models.PositiveIntegerField( blank=True, null=True, verbose_name=_('Posição na Ordenação'), @@ -139,7 +134,6 @@ class CargoComissao(models.Model): return self.nome -@reversion.register() class Composicao(models.Model): # IGNORE comissao = models.ForeignKey(Comissao, on_delete=models.CASCADE, @@ -157,7 +151,6 @@ class Composicao(models.Model): # IGNORE return '%s: %s' % (self.comissao.sigla, self.periodo) -@reversion.register() class Participacao(models.Model): # ComposicaoComissao composicao = models.ForeignKey(Composicao, related_name='participacao_set', @@ -177,11 +170,10 @@ class Participacao(models.Model): # ComposicaoComissao data_desligamento = models.DateField(blank=True, null=True, verbose_name=_('Data Desligamento')) - motivo_desligamento = models.CharField( - max_length=150, blank=True, - verbose_name=_('Motivo Desligamento')) - observacao = models.CharField( - max_length=150, blank=True, verbose_name=_('Observação')) + motivo_desligamento = models.TextField( + blank=True, verbose_name=_('Motivo Desligamento')) + observacao = models.TextField( + blank=True, verbose_name=_('Observação')) class Meta: verbose_name = _('Participação em Comissão') @@ -266,7 +258,7 @@ class Reuniao(models.Model): class Meta: verbose_name = _('Reunião de Comissão') verbose_name_plural = _('Reuniões de Comissão') - ordering = ('numero', 'comissao') + ordering = ('-data', '-nome') def __str__(self): return self.nome @@ -315,7 +307,6 @@ class Reuniao(models.Model): update_fields=update_fields) -@reversion.register() class DocumentoAcessorio(models.Model): reuniao = models.ForeignKey(Reuniao, related_name='documentoacessorio_set', diff --git a/sapl/comissoes/views.py b/sapl/comissoes/views.py index 0c9329f05..5d3e450c2 100644 --- a/sapl/comissoes/views.py +++ b/sapl/comissoes/views.py @@ -212,7 +212,6 @@ class ReuniaoCrud(MasterDetailCrud): class BaseMixin(MasterDetailCrud.BaseMixin): list_field_names = ['data', 'nome', 'tema', 'upload_ata'] - ordering = '-data' class DetailView(MasterDetailCrud.DetailView): template_name = "comissoes/reuniao_detail.html" diff --git a/sapl/compilacao/migrations/0019_auto_20220630_1420.py b/sapl/compilacao/migrations/0019_auto_20220630_1420.py new file mode 100644 index 000000000..8de4dcce3 --- /dev/null +++ b/sapl/compilacao/migrations/0019_auto_20220630_1420.py @@ -0,0 +1,44 @@ +# Generated by Django 2.2.24 on 2022-06-30 17:20 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0018_auto_20210227_2152'), + ] + + operations = [ + migrations.AlterField( + model_name='dispositivo', + name='dispositivo_atualizador', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dispositivos_alterados_set', to='compilacao.Dispositivo', verbose_name='Dispositivo Atualizador'), + ), + migrations.AlterField( + model_name='dispositivo', + name='dispositivo_pai', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispositivos_filhos_set', to='compilacao.Dispositivo', verbose_name='Dispositivo Pai'), + ), + migrations.AlterField( + model_name='dispositivo', + name='dispositivo_raiz', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='nodes', to='compilacao.Dispositivo', verbose_name='Dispositivo Raiz'), + ), + migrations.AlterField( + model_name='dispositivo', + name='publicacao', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='compilacao.Publicacao', verbose_name='Publicação'), + ), + migrations.AlterField( + model_name='dispositivo', + name='ta_publicado', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dispositivos_alterados_pelo_ta_set', to='compilacao.TextoArticulado', verbose_name='Texto Articulado Publicado'), + ), + migrations.AlterField( + model_name='publicacao', + name='ta', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='compilacao.TextoArticulado', verbose_name='Texto Articulado'), + ), + ] diff --git a/sapl/compilacao/models.py b/sapl/compilacao/models.py index 452d2a494..783e28ce0 100644 --- a/sapl/compilacao/models.py +++ b/sapl/compilacao/models.py @@ -1,7 +1,7 @@ from django.contrib import messages from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType -from django.db import models +from django.db import models, transaction from django.db.models import F, Q from django.db.models.aggregates import Max from django.db.models.deletion import PROTECT @@ -12,7 +12,6 @@ from django.utils.decorators import classonlymethod from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from image_cropping.fields import ImageCropField, ImageRatioField -import reversion from sapl.compilacao.utils import (get_integrations_view_names, int_to_letter, int_to_roman) @@ -20,7 +19,6 @@ from sapl.utils import YES_NO_CHOICES, get_settings_auth_user_model,\ texto_upload_path, restringe_tipos_de_arquivo_img -@reversion.register() class TimestampedMixin(models.Model): created = models.DateTimeField( verbose_name=_('created'), @@ -32,7 +30,6 @@ class TimestampedMixin(models.Model): abstract = True -@reversion.register() class BaseModel(models.Model): class Meta: @@ -87,7 +84,6 @@ class BaseModel(models.Model): update_fields=update_fields) -@reversion.register() class PerfilEstruturalTextoArticulado(BaseModel): sigla = models.CharField( max_length=10, unique=True, verbose_name=_('Sigla')) @@ -121,7 +117,6 @@ class PerfilEstruturalTextoArticulado(BaseModel): return parents -@reversion.register() class TipoTextoArticulado(models.Model): sigla = models.CharField(max_length=3, verbose_name=_('Sigla')) descricao = models.CharField(max_length=50, verbose_name=_('Descrição')) @@ -190,7 +185,6 @@ PRIVACIDADE_STATUS = ( ) -@reversion.register() class TextoArticulado(TimestampedMixin): data = models.DateField( blank=True, @@ -475,48 +469,44 @@ class TextoArticulado(TimestampedMixin): view_integracao = view_integracao[0] - ta = TextoArticulado.update_or_create(view_integracao, obj) + origem = self + destino = TextoArticulado.update_or_create(view_integracao, obj) - dispositivos = Dispositivo.objects.filter(ta=self).order_by('ordem') + dispositivos = Dispositivo.objects.filter(ta=origem).order_by('ordem') - map_ids = {} - for d in dispositivos: - id_old = d.id + with transaction.atomic(): + map_ids = {} + for d in dispositivos: + id_old = d.id - # TODO - # validar isso: é o suficiente para pegar apenas o texto válido? - # exemplo: - # quando uma matéria for alterada por uma emenda - # ao usar esta função para gerar uma norma deve vir apenas - # o texto válido, compilado... - if d.dispositivo_subsequente: - continue + if d.dispositivo_subsequente: + continue - d.id = None - d.inicio_vigencia = ta.data - d.fim_vigencia = None - d.inicio_eficacia = ta.data - d.fim_eficacia = None - d.publicacao = None - d.ta = ta - d.ta_publicado = None - d.dispositivo_subsequente = None - d.dispositivo_substituido = None - d.dispositivo_vigencia = None - d.dispositivo_atualizador = None - d.save() - map_ids[id_old] = d.id - - dispositivos = Dispositivo.objects.filter(ta=ta).order_by('ordem') - - for d in dispositivos: - if not d.dispositivo_pai: - continue + d.id = None + d.inicio_vigencia = destino.data + d.fim_vigencia = None + d.inicio_eficacia = destino.data + d.fim_eficacia = None + d.publicacao = None + d.ta = destino + d.ta_publicado = None + d.dispositivo_subsequente = None + d.dispositivo_substituido = None + d.dispositivo_vigencia = None + d.dispositivo_atualizador = None + d.save() + map_ids[id_old] = d.id + + dispositivos = Dispositivo.objects.filter( + ta=destino).order_by('ordem') + + for d in dispositivos: + if not d.dispositivo_pai: + continue - d.dispositivo_pai_id = map_ids[d.dispositivo_pai_id] - d.save() - - return ta + d.dispositivo_pai_id = map_ids[d.dispositivo_pai_id] + d.save() + return destino def reagrupar_ordem_de_dispositivos(self): @@ -568,7 +558,6 @@ class TextoArticulado(TimestampedMixin): update(dpk) -@reversion.register() class TipoNota(models.Model): sigla = models.CharField( max_length=10, unique=True, verbose_name=_('Sigla')) @@ -585,7 +574,6 @@ class TipoNota(models.Model): return '%s: %s' % (self.sigla, self.nome) -@reversion.register() class TipoVide(models.Model): sigla = models.CharField( max_length=10, unique=True, verbose_name=_('Sigla')) @@ -600,7 +588,6 @@ class TipoVide(models.Model): return '%s: %s' % (self.sigla, self.nome) -@reversion.register() class TipoDispositivo(BaseModel): """ - no attributo rotulo_prefixo_texto, caso haja um ';' (ponto e vírgula), e @@ -810,7 +797,6 @@ class TipoDispositivo(BaseModel): return False -@reversion.register() class TipoDispositivoRelationship(BaseModel): pai = models.ForeignKey( TipoDispositivo, @@ -859,7 +845,6 @@ class TipoDispositivoRelationship(BaseModel): self.filho_permitido.nome if self.filho_permitido else '') -@reversion.register() class TipoPublicacao(models.Model): sigla = models.CharField( max_length=10, unique=True, verbose_name=_('Sigla')) @@ -874,7 +859,6 @@ class TipoPublicacao(models.Model): return self.nome -@reversion.register() class VeiculoPublicacao(models.Model): sigla = models.CharField( max_length=10, unique=True, verbose_name=_('Sigla')) @@ -889,12 +873,11 @@ class VeiculoPublicacao(models.Model): return '%s: %s' % (self.sigla, self.nome) -@reversion.register() class Publicacao(TimestampedMixin): ta = models.ForeignKey( TextoArticulado, verbose_name=_('Texto Articulado'), - on_delete=models.PROTECT + on_delete=models.CASCADE ) veiculo_publicacao = models.ForeignKey( @@ -969,7 +952,6 @@ def imagem_upload_path(instance, filename): return texto_upload_path(instance, filename, subpath='') -@reversion.register() class Dispositivo(BaseModel, TimestampedMixin): TEXTO_PADRAO_DISPOSITIVO_REVOGADO = force_text(_('(Revogado)')) INTERVALO_ORDEM = 1000 @@ -1104,7 +1086,7 @@ class Dispositivo(BaseModel, TimestampedMixin): null=True, default=None, verbose_name=_('Publicação'), - on_delete=models.PROTECT + on_delete=models.SET_NULL, ) ta = models.ForeignKey( @@ -1116,7 +1098,7 @@ class Dispositivo(BaseModel, TimestampedMixin): ta_publicado = models.ForeignKey( TextoArticulado, - on_delete=models.PROTECT, + on_delete=models.CASCADE, blank=True, null=True, default=None, @@ -1151,7 +1133,7 @@ class Dispositivo(BaseModel, TimestampedMixin): default=None, related_name='dispositivos_filhos_set', verbose_name=_('Dispositivo Pai'), - on_delete=models.PROTECT + on_delete=models.CASCADE, ) dispositivo_raiz = models.ForeignKey( @@ -1161,7 +1143,7 @@ class Dispositivo(BaseModel, TimestampedMixin): default=None, related_name='nodes', verbose_name=_('Dispositivo Raiz'), - on_delete=models.PROTECT + on_delete=models.CASCADE, ) dispositivo_vigencia = models.ForeignKey( @@ -1181,7 +1163,7 @@ class Dispositivo(BaseModel, TimestampedMixin): default=None, related_name='dispositivos_alterados_set', verbose_name=_('Dispositivo Atualizador'), - on_delete=models.PROTECT + on_delete=models.SET_NULL, ) contagem_continua = models.BooleanField( @@ -1911,7 +1893,6 @@ class Dispositivo(BaseModel, TimestampedMixin): ordem_bloco_atualizador=count) -@reversion.register() class Vide(TimestampedMixin): texto = models.TextField(verbose_name=_('Texto do Vide')) @@ -1958,7 +1939,6 @@ NOTAS_PUBLICIDADE_CHOICES = ( ) -@reversion.register() class Nota(TimestampedMixin): NPRIV = 1 diff --git a/sapl/compilacao/templatetags/compilacao_filters.py b/sapl/compilacao/templatetags/compilacao_filters.py index 201e0d62c..cc21b8eb7 100644 --- a/sapl/compilacao/templatetags/compilacao_filters.py +++ b/sapl/compilacao/templatetags/compilacao_filters.py @@ -82,7 +82,7 @@ def dispositivo_desativado(dispositivo, inicio_vigencia, fim_vigencia): @register.simple_tag def nota_automatica(dispositivo, ta_pub_list): - if dispositivo.ta_publicado: + if dispositivo.ta_publicado and dispositivo.dispositivo_atualizador is not None and dispositivo.dispositivo_atualizador.dispositivo_pai is not None: d = dispositivo.dispositivo_atualizador.dispositivo_pai if d.auto_inserido: diff --git a/sapl/compilacao/urls.py b/sapl/compilacao/urls.py index 9364985aa..7ca2ad463 100644 --- a/sapl/compilacao/urls.py +++ b/sapl/compilacao/urls.py @@ -116,5 +116,9 @@ urlpatterns = [ include(VeiculoPublicacaoCrud.get_urls())), url(r'^sistema/ta/config/tipo/', include(TipoTextoArticuladoCrud.get_urls())), + url(r'^sistema/ta/config/tipodispositivo/', + include(TipoDispositivoCrud.get_urls())), + + ] diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 70186cbc9..9afbe3201 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -6,6 +6,7 @@ import sys from braces.views import FormMessagesMixin from bs4 import BeautifulSoup from django import forms +from django.apps.registry import apps from django.conf import settings from django.contrib import messages from django.contrib.auth.mixins import PermissionRequiredMixin @@ -58,8 +59,35 @@ TipoNotaCrud = CrudAux.build(TipoNota, 'tipo_nota') TipoVideCrud = CrudAux.build(TipoVide, 'tipo_vide') TipoPublicacaoCrud = CrudAux.build(TipoPublicacao, 'tipo_publicacao') VeiculoPublicacaoCrud = CrudAux.build(VeiculoPublicacao, 'veiculo_publicacao') -TipoDispositivoCrud = CrudAux.build( - TipoDispositivo, 'tipo_dispositivo') + + +class TipoDispositivoCrud(CrudAux): + model = TipoDispositivo + + class BaseMixin(CrudAux.BaseMixin): + list_field_names = ('nome', ) + + @property + def delete_url(self): + return '' + + @property + def create_url(self): + return '' + + class CreateView(CrudAux.CreateView): + def has_permission(self): + return False + + class DeleteView(CrudAux.DeleteView): + def has_permission(self): + return False + + class UpdateView(CrudAux.UpdateView): + layout_key = 'TipoDispositivoUpdate' + + class ListView(CrudAux.ListView): + paginate_by = 100 def choice_models_in_extenal_views(): @@ -1110,8 +1138,45 @@ class TextEditView(CompMixin, TemplateView): self.object = self.ta return self.object.has_edit_permission(self.request) + def importar_texto_materia(self, request, *args, **kwargs): + rd = redirect(to=reverse_lazy( + 'sapl.compilacao:ta_text_edit', kwargs={ + 'ta_id': self.object.id})) + + if self.object.dispositivos_set.count() > 1: + messages.error( + request, + _('Este Texto Articulado possui conteúdo, ' + 'para fazer a importação você deve deixar ' + 'apenas uma única Articulação inicial.')) + return rd + + materia = self.materia_da_norma_deste_texto_articulado() + if not materia: + messages.error( + request, + _('A Norma [{}] não está vinculada a nenhuma matéria.'.format(self.object.content_object))) + return rd + + self.object.dispositivos_set.all().delete() + + ta_materia = materia.texto_articulado.first() + + try: + ta_materia.clone_for(self.object.content_object) + #TextoArticulado.clone(ta_materia, self.object) + except Exception as e: + messages.error( + request, + _('Ocorreu erro na importação e o procedimento foi cancelado!')) + + return rd + def get(self, request, *args, **kwargs): + if 'importar_texto_materia' in request.GET: + return self.importar_texto_materia(request, *args, **kwargs) + if self.object.editing_locked: if 'unlock' not in request.GET: messages.error( @@ -1327,7 +1392,7 @@ class TextEditView(CompMixin, TemplateView): return r def nota_alteracao(self, dispositivo, lista_ta_publicado): - if dispositivo.ta_publicado_id: + if dispositivo.ta_publicado_id and dispositivo.dispositivo_atualizador: d = dispositivo.dispositivo_atualizador.dispositivo_pai if d.auto_inserido: @@ -1348,6 +1413,16 @@ class TextEditView(CompMixin, TemplateView): return '' + def materia_da_norma_deste_texto_articulado(self): + NormaJuridica = apps.get_model( + 'norma', 'NormaJuridica') + ta = self.ta + + if isinstance(ta.content_object, NormaJuridica) and\ + ta.content_object.materia: + return ta.content_object.materia + return None + def runBase(self): result = Dispositivo.objects.filter(ta_id=self.kwargs['ta_id']) diff --git a/sapl/context_processors.py b/sapl/context_processors.py index 046cd8ab0..86110cd4f 100644 --- a/sapl/context_processors.py +++ b/sapl/context_processors.py @@ -41,5 +41,5 @@ def sapl_as_sapn(request): 'sapl_as_sapn': sapl_as_sapn_utils(), 'nome_sistema': _('Sistema de Apoio ao Processo Legislativo') if not sapl_as_sapn_utils() - else _('Sistema de Apoio a Publicação de Normas') + else _('Sistema de Apoio à Publicação de Leis e Normas') } diff --git a/sapl/crispy_layout_mixin.py b/sapl/crispy_layout_mixin.py index 8c9763eef..b131623b9 100644 --- a/sapl/crispy_layout_mixin.py +++ b/sapl/crispy_layout_mixin.py @@ -4,8 +4,10 @@ from crispy_forms.bootstrap import FormActions from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Div, Fieldset, Layout, Submit from django import template +from django.contrib.contenttypes.models import ContentType from django.urls import reverse, reverse_lazy from django.utils import formats +from django.utils.encoding import force_text from django.utils.translation import ugettext as _ import yaml @@ -38,7 +40,7 @@ def form_actions(more=[Div(css_class='clearfix')], label=_('Salvar'), name='salvar', css_class='float-right', disabled=True): - if disabled: + if disabled and force_text(label) != 'Pesquisar': doubleclick = 'this.form.submit();this.disabled=true;' else: doubleclick = 'return true;' @@ -169,7 +171,7 @@ def get_field_display(obj, fieldname): display = '
{}
'.format(display) else: display = str(value) - return verbose_name, display + return verbose_name, display or ' ' class CrispyLayoutFormMixin: @@ -256,21 +258,30 @@ class CrispyLayoutFormMixin: if '|' in fieldname: fieldname, func = tuple(fieldname.split('|')) + try: + verbose_name, field_display = get_field_display(obj, fieldname) + except: + verbose_name, field_display = '', '' + if func: - verbose_name, text = getattr(self, func)(obj, fieldname) - else: - hook_fieldname = 'hook_%s' % fieldname - if hasattr(self, hook_fieldname): - verbose_name, text = getattr( + verbose_name, field_display = getattr(self, func)(obj, fieldname) + + hook_fieldname = 'hook_%s' % fieldname + if hasattr(self, hook_fieldname): + try: + verbose_name, field_display = getattr( + self, hook_fieldname)(obj, verbose_name=verbose_name, field_display=field_display) + except: + verbose_name, field_display = getattr( self, hook_fieldname)(obj) - else: - verbose_name, text = get_field_display(obj, fieldname) + elif not func: + verbose_name, field_display = get_field_display(obj, fieldname) return { 'id': fieldname, 'span': span, 'verbose_name': verbose_name, - 'text': text, + 'text': field_display, } def fk_urlize_for_detail(self, obj, fieldname): @@ -319,6 +330,21 @@ class CrispyLayoutFormMixin: return verbose_name, display + def widget__signs(self, obj, fieldname): + from sapl.base.models import Metadata + try: + md = Metadata.objects.get( + content_type=ContentType.objects.get_for_model( + obj._meta.model), + object_id=obj.id,) + autores = md.metadata['signs'][fieldname]['autores'] + t = template.loader.get_template('base/widget__signs.html') + rendered = str(t.render(context={'signs': autores})) + except Exception as e: + return '', '' + + return 'Assinaturas Eletrônicas', rendered + @property def layout_display(self): diff --git a/sapl/crud/base.py b/sapl/crud/base.py index 5f080758e..5d6d8a3c1 100644 --- a/sapl/crud/base.py +++ b/sapl/crud/base.py @@ -25,7 +25,7 @@ from django.views.generic.list import MultipleObjectMixin from sapl.crispy_layout_mixin import CrispyLayoutFormMixin, get_field_display from sapl.crispy_layout_mixin import SaplFormHelper from sapl.rules import (RP_ADD, RP_CHANGE, RP_DELETE, RP_DETAIL, - RP_LIST) + RP_LIST) from sapl.utils import normalize logger = logging.getLogger(settings.BASE_DIR.name) @@ -78,6 +78,7 @@ def make_pagination(index, num_pages): head = from_to(1, PAGINATION_LENGTH - len(tail) - 1) return head + [None] + tail + """ variáveis do crud: help_topic @@ -360,6 +361,13 @@ class CrudBaseMixin(CrispyLayoutFormMixin): if self.request.user.has_perm( self.permission(RP_DELETE)) else '' + @property + def openapi_url(self): + obj = self.crud if hasattr(self, 'crud') else self + o = self.object + url = f'/api/{o._meta.app_label}/{o._meta.model_name}/{o.id}' + return url + def get_template_names(self): names = super(CrudBaseMixin, self).get_template_names() names.append("crud/%s.html" % @@ -421,14 +429,20 @@ class CrudListView(PermissionRequiredContainerCrudMixin, ListView): m = f.related_model except: f = None - hook = 'hook_header_{}'.format(''.join(fn)) - if hasattr(self, hook): - header = getattr(self, hook)() - s.append(header) - elif f: - s.append(force_text(f.verbose_name)) - - s = ' / '.join(s) + if f: + hook = 'hook_header_{}'.format(''.join(fn)) + if hasattr(self, hook): + header = getattr(self, hook)() + s.append(force_text(header)) + else: + s.append(force_text(f.verbose_name)) + else: + hook = 'hook_header_{}'.format(''.join(fn)) + if hasattr(self, hook): + header = getattr(self, hook)() + s.append(header) + + s = ' / '.join(filter(lambda x: x, s)) r.append(s) return r @@ -1111,12 +1125,15 @@ class MasterDetailCrud(Crud): root_pk = self.kwargs['pk'] if 'pkk' not in self.request.GET\ else self.request.GET['pkk'] kwargs.setdefault('root_pk', root_pk) - context = super(CrudBaseMixin, self).get_context_data(**kwargs) - if parent_object: - context['title'] = '%s (%s)' % ( - self.object, parent_object) + title = '%s (%s)' % ( + self.object, + parent_object + ) if parent_object else '' + context = super(CrudBaseMixin, self).get_context_data(**kwargs) + if 'title' not in context and title: + context['title'] = title return context class ListView(Crud.ListView): diff --git a/sapl/endpoint_restriction_middleware.py b/sapl/endpoint_restriction_middleware.py new file mode 100644 index 000000000..b815b4a2e --- /dev/null +++ b/sapl/endpoint_restriction_middleware.py @@ -0,0 +1,38 @@ +from django.http import HttpResponseForbidden +import logging + +# lista de IPs permitidos (localhost, redes locais, etc) +# https://en.wikipedia.org/wiki/Reserved_IP_addresses +ALLOWED_IPS = [ + '127.0.0.1', + '::1', + '10.0.0.0/8', + '172.16.0.0/12', + '192.168.0.0/16', + 'fc00::/7', + '::1', + 'fe80::/10', + '192.0.2.0/24', + '2001:db8::/32', + '224.0.0.0/4', + 'ff00::/8' +] + +RESTRICTED_ENDPOINTS = ['/metrics'] + + +class EndpointRestrictionMiddleware: + logging.getLogger(__name__) + + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + # IP do cliente + client_ip = request.META.get('REMOTE_ADDR') + + # bloqueia acesso a endpoints restritos para IPs nao permitidos + if request.path in RESTRICTED_ENDPOINTS and client_ip not in ALLOWED_IPS: + return HttpResponseForbidden('Acesso proibido') + + return self.get_response(request) diff --git a/sapl/legacy/Docs/verificação verbose names.txt b/sapl/legacy/Docs/verificação verbose names.txt deleted file mode 100644 index 6ee51676f..000000000 --- a/sapl/legacy/Docs/verificação verbose names.txt +++ /dev/null @@ -1,68 +0,0 @@ --> /sapl/comissoes/models.py - #1 - class ComposicaoComissao: Verificar comissao e periodo_comp. - --> /sapl/lexml/models.py - #1 - Na classe 'LexmlRegistroProvedor', 'sigla_provedor' e 'tipo' não tem no html - #2 - Na classe 'LexmlRegistroProvedor' falta o campo 'Endereço do provedor OAI' - #3 - Na classe 'LexmlRegistroPublicador' 'tipo' não tem no html - --> /sapl/norma/models.py - ## html's faltando: - VinculoNormaJuridica - - #1 - Na classe 'LegislacaoCitada' falta 'Tipo Norma', 'Número' e 'Ano' - #2 - Na classe 'NormaJuridica' falta os campos 'Matéria Legislativa', 'Texto original (PDF)' e 'Situação de Vigência' - --> /sapl/parlamentares/models.py - ## html's faltando: - Localidade(Não tem html mesmo) - ComposicaoMesa - ComposicaoColigacao(Talvez seja http://sapl3.interlegis.leg.br/cadastros/auxiliares/coligacao/coligacao_index_html) - - #1 - Classe 'Legislatura' falta 'Nº Legislatura' - #2 - Na classe 'Parlamentar' faltam os campos 'Observação', 'UF' e 'Login' - #3 - Na classe 'Mandato' eu não tenho certeza se os campos 'tipo_afastamento' e 'tipo_causa_fim_mandato' - # correspondem aos campos 'Natureza do Mandato' e 'Expedição do Diploma', então naõ adicionei os verbose_name - --> /sapl/protocoloadm/models.py - #1 - Na classe 'DocumentoAdministrativo' não possui o campo 'Autor' no html por isso está sem verbose_name e falta o - campo 'Texto Integral' na classe. - #2 - Na classe 'StatusTramitacaoAdministrativo' falta o campo 'Indicador de Tramitação' - #3 - A classe protocolo tá bastante diferente do html - - Ver depois - --> /sapl/materia/models.py - ## html's faltando: - AcompMateria - AssuntoMateria - DespachoInicial - MateriaAssunto - Parecer - - #1 - Na classe 'MateriaLegislativa' falta o campo 'cep' - #2 - Na classe 'Anexada' faltam os campos 'Tipo', 'Número' e 'Ano' - #3 - Na classe 'TipoAutor' falta o campo 'Tipo' - #4 - Classe 'Autor' com campos a mais - #5 - Na classe 'Autoria' faltam os campos 'Tipo de Autor' e 'Nome Autor' - #6 - Na classe 'DocumentoAcessorio' faltam os campos 'Texto digitalizado (PDF)' e 'Obeservação' - #7 - Classe 'Proposicao' muito diferente do html - #8 - Na classe 'StatusTramitacao', 'fim_tramitacao' e 'retorno_tramitacao' não deveriam tá separados - #9 - Na classe 'UnidadeTramitacao' falta o campo 'Correspondente SPDO' - --> /sapl/sessao/models.py - ## html's faltando: - SessaoPlenariaPresenca - RegistroVotacaoParlamentar - OrdemDiaPresenca - MesaSessaoPlenaria - ExpedienteSessaoPlenaria - - #1 - Na classe 'SessaoPlenaria' faltam os campos de arquivos indexados - #2 - Na classe 'ExpedienteMateria' faltam os campos 'Tipo da Sessão', 'Tipo Matéria', 'Núm. Matéria' e 'Ano Matéria' - #3 - Na Classe 'Oradores' faltam os campos 'Parlamentar' e 'Discurso' - #4 - Na Classe 'OradoresExpediente' faltam os campos 'Parlamentar' e 'Discurso' - ***** As páginas 'Oradores' e 'OradoresExpediente' são iguas - #5 - Na classe 'OrdemDia' faltam os campos 'Tipo da Sessão', 'Tipo Matéria', 'Núm. Matéria' e 'Ano Matéria' - ***** As páginas 'ExpedienteMateria' e 'OrdemDia' são iguas - #6 - Na classe 'RegistroVotacao' faltam os campos 'Não Votou:', 'Anular Votação' e - 'A totalização inclui o voto do Presidente?' diff --git a/sapl/legacy/admin.py b/sapl/legacy/admin.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/sapl/legacy/management/__init__.py b/sapl/legacy/management/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/sapl/legacy/management/commands/__init__.py b/sapl/legacy/management/commands/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/sapl/legacy/management/commands/migracao_25_31.py b/sapl/legacy/management/commands/migracao_25_31.py deleted file mode 100644 index ba9a80224..000000000 --- a/sapl/legacy/management/commands/migracao_25_31.py +++ /dev/null @@ -1,20 +0,0 @@ -from django.core.management.base import BaseCommand - -from sapl.legacy.migracao import migrar - - -class Command(BaseCommand): - - help = 'Migração de dados do SAPL 2.5 para o SAPL 3.1' - - def add_arguments(self, parser): - parser.add_argument( - '-a', - action='store_true', - default=False, - dest='apagar_do_legado', - help='Apagar entradas migradas do legado', - ) - - def handle(self, *args, **options): - migrar(apagar_do_legado=options['apagar_do_legado']) diff --git a/sapl/legacy/management/commands/migracao_documentos.py b/sapl/legacy/management/commands/migracao_documentos.py deleted file mode 100644 index 7cba09d5a..000000000 --- a/sapl/legacy/management/commands/migracao_documentos.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.core.management.base import BaseCommand - -from sapl.legacy.migracao_documentos import migrar_documentos - - -class Command(BaseCommand): - - help = 'Migração documentos do SAPL 2.5 para o SAPL 3.1' - - def handle(self, *args, **options): - migrar_documentos() diff --git a/sapl/legacy/management/commands/ressuscitar_deps.py b/sapl/legacy/management/commands/ressuscitar_deps.py deleted file mode 100644 index ea219330c..000000000 --- a/sapl/legacy/management/commands/ressuscitar_deps.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.core.management.base import BaseCommand - -from sapl.legacy.scripts.ressuscita_dependencias import adiciona_ressuscitar - - -class Command(BaseCommand): - - help = 'Ressuscita dependências apagadas ' \ - 'que são necessárias para migrar outros registros' - - def handle(self, *args, **options): - adiciona_ressuscitar() diff --git a/sapl/legacy/migracao.py b/sapl/legacy/migracao.py deleted file mode 100644 index 94fd25930..000000000 --- a/sapl/legacy/migracao.py +++ /dev/null @@ -1,82 +0,0 @@ -import subprocess -from getpass import getpass - -import requests -from django.core import management -from unipath import Path - -from sapl.legacy.migracao_dados import (REPO, TAG_MARCO, gravar_marco, info, - migrar_dados) -from sapl.legacy.migracao_documentos import migrar_documentos -from sapl.legacy.migracao_usuarios import migrar_usuarios -from sapl.legacy.scripts.exporta_zope.variaveis_comuns import TAG_ZOPE -from sapl.legacy_migration_settings import DIR_REPO, NOME_BANCO_LEGADO -from sapl.materia.models import Proposicao - - -def adornar_msg(msg): - return '\n{1}\n{0}\n{1}'.format(msg, '#' * len(msg)) - - -def migrar(apagar_do_legado=False): - if TAG_MARCO in REPO.tags: - info('A migração já está feita.') - return - assert TAG_ZOPE in REPO.tags, adornar_msg( - 'Antes de migrar ' - 'é necessário fazer a exportação de documentos do zope') - management.call_command('migrate') - migrar_dados(apagar_do_legado) - migrar_usuarios(REPO.working_dir) - migrar_documentos(REPO) - gravar_marco() - # compactar_media() - - -def compactar_media(): - - # tar de media/sapl - print('Criando tar de media... ', end='', flush=True) - arq_tar = DIR_REPO.child('{}.media.tar'.format(NOME_BANCO_LEGADO)) - arq_tar.remove() - subprocess.check_output(['tar', 'cfh', arq_tar, '-C', DIR_REPO, 'sapl']) - print('SUCESSO') - - -PROPOSICAO_UPLOAD_TO = Proposicao._meta.get_field('texto_original').upload_to - - -def salva_conteudo_do_sde(proposicao, conteudo): - caminho_relativo = PROPOSICAO_UPLOAD_TO( - proposicao, 'proposicao_sde_{}.xml'.format(proposicao.pk)) - caminho_absoluto = Path(REPO.working_dir, caminho_relativo) - caminho_absoluto.parent.mkdir(parents=True) - # ajusta caminhos para folhas de estilo - conteudo = conteudo.replace(b'"XSLT/HTML', b'"/XSLT/HTML') - conteudo = conteudo.replace(b"'XSLT/HTML", b"'/XSLT/HTML") - with open(caminho_absoluto, 'wb') as arq: - arq.write(conteudo) - proposicao.texto_original = caminho_relativo - proposicao.save() - - -def scrap_sde(url, usuario, senha=None): - if not senha: - senha = getpass() - - # login - session = requests.session() - res = session.post('{}?retry=1'.format(url), - {'__ac_name': usuario, '__ac_password': senha}) - assert res.status_code == 200 - - url_proposicao_tmpl = '{}/sapl_documentos/proposicao/{}/renderXML?xsl=__default__' # noqa - total = Proposicao.objects.count() - for num, proposicao in enumerate(Proposicao.objects.all()): - pk = proposicao.pk - url_proposicao = url_proposicao_tmpl.format(url, pk) - res = session.get(url_proposicao) - print("pk: {} status: {} {} (progresso: {:.2%})".format( - pk, res.status_code, url_proposicao, num / total)) - if res.status_code == 200: - salva_conteudo_do_sde(proposicao, res.content) diff --git a/sapl/legacy/migracao_dados.py b/sapl/legacy/migracao_dados.py deleted file mode 100644 index 46e1fa7cf..000000000 --- a/sapl/legacy/migracao_dados.py +++ /dev/null @@ -1,1473 +0,0 @@ -import datetime -import os -import re -import subprocess -import traceback -from collections import OrderedDict, defaultdict, namedtuple -from datetime import date -from functools import lru_cache, partial -from itertools import groupby -from operator import xor - -import git -import pkg_resources -import pyaml -import pytz -import reversion -import yaml -from bs4 import BeautifulSoup -from django.apps import apps -from django.contrib.auth import get_user_model -from django.contrib.auth.models import Group -from django.contrib.contenttypes.models import ContentType -from django.core.exceptions import ObjectDoesNotExist -from django.core.management.commands.flush import Command as FlushCommand -from django.db import connections, transaction -from django.db.models import Max, Q -from pyaml import UnsafePrettyYAMLDumper -from unipath import Path - -from sapl.base.models import AppConfig as AppConf -from sapl.base.models import Autor, TipoAutor, cria_models_tipo_autor -from sapl.comissoes.models import Comissao, Composicao, Participacao, Reuniao -from sapl.legacy.models import NormaJuridica as OldNormaJuridica -from sapl.legacy.models import TipoNumeracaoProtocolo -from sapl.legacy_migration_settings import (DIR_DADOS_MIGRACAO, DIR_REPO, - NOME_BANCO_LEGADO, PYTZ_TIMEZONE, - SIGLA_CASA) -from sapl.materia.models import (AcompanhamentoMateria, DocumentoAcessorio, - MateriaLegislativa, Proposicao, - StatusTramitacao, TipoDocumento, - TipoMateriaLegislativa, TipoProposicao, - Tramitacao) -from sapl.norma.models import (AssuntoNorma, NormaJuridica, NormaRelacionada, - TipoVinculoNormaJuridica) -from sapl.parlamentares.models import (Legislatura, Mandato, Parlamentar, - Partido, TipoAfastamento) -from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo, - StatusTramitacaoAdministrativo) -from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao, OrdemDia, - RegistroVotacao, TipoResultadoVotacao) -from sapl.utils import normalize - -from .scripts.normaliza_dump_mysql import normaliza_dump_mysql - - -# YAML SETUP ############################################################### -def dict_representer(dumper, data): - return dumper.represent_dict(data.items()) - -yaml.add_representer(OrderedDict, dict_representer) - - -# importante para preservar a ordem ao ler yaml no python 3.5 -def dict_constructor(loader, node): - return OrderedDict(loader.construct_pairs(node)) - -yaml.add_constructor(yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, - dict_constructor) - -# BASE ###################################################################### -# apps to be migrated, in app dependency order (very important) -appconfs = [apps.get_app_config(n) for n in [ - 'parlamentares', - 'comissoes', - # base precisa vir depois dos apps parlamentares e comissoes - # pois Autor os referencia - 'base', - 'materia', - 'norma', - 'sessao', - 'lexml', - 'protocoloadm', ]] - -unique_constraints = [] -one_to_one_constraints = [] -primeira_vez = [] - -# apps quase não têm interseção -name_sets = [(ac.label, set(m.__name__ for m in ac.get_models())) - for ac in appconfs] -for a1, s1 in name_sets: - for a2, s2 in name_sets: - if a1 is not a2: - # existe uma interseção de nomes entre comissoes e materia - if {a1, a2} == {'comissoes', 'materia'}: - assert s1.intersection(s2) == {'DocumentoAcessorio'} - else: - assert not s1.intersection(s2) - - -# RENAMES ################################################################### - -MODEL_RENAME_PATTERN = re.compile('(.+) \((.+)\)') -MODEL_RENAME_INCLUDE_PATTERN = re.compile('<(.+)>') - - -def get_renames(): - field_renames = {} - model_renames = {} - includes = {} - for app in appconfs: - app_rename_data = yaml.load( - pkg_resources.resource_string(app.module.__name__, 'legacy.yaml'), - yaml.Loader - ) - for model_name, renames in app_rename_data.items(): - # armazena ou substitui includes - if MODEL_RENAME_INCLUDE_PATTERN.match(model_name): - includes[model_name] = renames - continue - elif isinstance(renames, str): - renames = includes[renames] - # detecta mudança de nome - match = MODEL_RENAME_PATTERN.match(model_name) - if match: - model_name, old_name = match.groups() - else: - old_name = None - model = app.get_model(model_name) - if old_name: - model_renames[model] = old_name - field_renames[model] = renames - - return field_renames, model_renames - - -field_renames, model_renames = get_renames() -legacy_app = apps.get_app_config('legacy') -models_novos_para_antigos = { - model: legacy_app.get_model(model_renames.get(model, model.__name__)) - for model in field_renames} -models_novos_para_antigos[Composicao] = models_novos_para_antigos[Participacao] - -campos_novos_para_antigos = { - model._meta.get_field(nome_novo): nome_antigo - for model, renames in field_renames.items() - for nome_novo, nome_antigo in renames.items()} - -# campos de Composicao (de Comissao) -for nome_novo, nome_antigo in (('comissao', 'cod_comissao'), - ('periodo', 'cod_periodo_comp')): - campos_novos_para_antigos[ - Composicao._meta.get_field(nome_novo)] = nome_antigo - - -# campos virtuais de Proposicao para funcionar com get_fk_related -class CampoVirtual(namedtuple('CampoVirtual', 'model related_model')): - null = True - - -CAMPOS_VIRTUAIS_PROPOSICAO = { - TipoMateriaLegislativa: CampoVirtual(Proposicao, MateriaLegislativa), - TipoDocumento: CampoVirtual(Proposicao, DocumentoAcessorio) -} -for campo_virtual in CAMPOS_VIRTUAIS_PROPOSICAO.values(): - campos_novos_para_antigos[campo_virtual] = 'cod_mat_ou_doc' - - -CAMPOS_VIRTUAIS_TIPO_PROPOSICAO = { - 'M': CampoVirtual(TipoProposicao, TipoMateriaLegislativa), - 'D': CampoVirtual(TipoProposicao, TipoDocumento) -} -for campo_virtual in CAMPOS_VIRTUAIS_TIPO_PROPOSICAO.values(): - campos_novos_para_antigos[campo_virtual] = 'tip_mat_ou_doc' - - -# campos virtuais de Autor para funcionar com get_fk_related -CAMPOS_VIRTUAIS_AUTOR = {related: CampoVirtual(Autor, related) - for related in (Parlamentar, Comissao, Partido)} -for related, campo_antigo in [(Parlamentar, 'cod_parlamentar'), - (Comissao, 'cod_comissao'), - (Partido, 'cod_partido')]: - campo_virtual = CAMPOS_VIRTUAIS_AUTOR[related] - campos_novos_para_antigos[campo_virtual] = campo_antigo - - -# MIGRATION ################################################################# - - -def info(msg): - print('INFO: ' + msg) - - -ocorrencias = defaultdict(list) - - -def warn(tipo, msg, dados): - ocorrencias[tipo].append(dados) - print('CUIDADO! ' + msg.format(**dados)) - - -@lru_cache() -def get_pk_legado(tabela): - if tabela == 'despacho_inicial': - # adaptação para deleção correta no mysql ao final de migrar_model - # acompanha o agrupamento de despacho_inicial feito em iter_sql_records - return 'cod_materia', 'cod_comissao' - res = exec_legado( - 'show index from {} WHERE Key_name = "PRIMARY"'.format(tabela)) - return [r[4] for r in res] - - -@lru_cache() -def get_estrutura_legado(model): - model_legado = models_novos_para_antigos[model] - tabela_legado = model_legado._meta.db_table - campos_pk_legado = get_pk_legado(tabela_legado) - return model_legado, tabela_legado, campos_pk_legado - - -def com_aspas_se_necessario(valor): - if isinstance(valor, int): - return valor - else: - return '"{}"'.format(valor) - - -class ForeignKeyFaltando(ObjectDoesNotExist): - 'Uma FK aponta para um registro inexistente' - - def __init__(self, field, valor, old): - self.field = field - self.valor = valor - self.old = old - - msg = 'FK não encontrada para [{campo} = {valor}] (em {tabela} / pk = {pk})' # noqa - - @property - def dados(self): - campo = campos_novos_para_antigos[self.field] - _, tabela, campos_pk = get_estrutura_legado(self.field.model) - pk = {c: getattr(self.old, c) for c in campos_pk} - sql = 'select * from {} where {};'.format( - tabela, - ' and '.join([ - '{} = {}'.format(k, com_aspas_se_necessario(v)) - for k, v in pk.items()])) - return OrderedDict((('campo', campo), - ('valor', self.valor), - ('tabela', tabela), - ('pk', pk), - ('sql', sql))) - - -@lru_cache() -def _get_all_ids_from_model(model): - # esta função para uso apenas em get_fk_related - return set(model.objects.values_list('id', flat=True)) - - -def get_fk_related(field, old): - valor = getattr(old, campos_novos_para_antigos[field]) - if valor is None and field.null: - return None - if valor in _get_all_ids_from_model(field.related_model): - return valor - elif valor == 0 and field.null: - # consideramos zeros como nulos, se não está entre os ids anteriores - return None - else: - raise ForeignKeyFaltando(field=field, valor=valor, old=old) - - -def exec_sql(sql, db='default'): - cursor = connections[db].cursor() - cursor.execute(sql) - return cursor - - -exec_legado = partial(exec_sql, db='legacy') - - -def _formatar_lista_para_sql(iteravel): - lista = list(iteravel) - if lista: - return '({})'.format(str(lista)[1:-1]) # transforma "[...]" em "(...)" - else: - return None - - -def exec_legado_em_subconjunto(sql, ids): - """Executa uma query sql no legado no formato '.... in {}' - interpolando `ids`, se houver ids""" - - lista_sql = _formatar_lista_para_sql(ids) - if lista_sql: - return exec_legado(sql.format(lista_sql)) - else: - return [] - - -def primeira_coluna(cursor): - return (r[0] for r in cursor) - - -# UNIFORMIZAÇÃO DO BANCO ANTES DA MIGRAÇÃO ############################### - -SQL_NAO_TEM_TABELA = ''' - SELECT count(*) - FROM information_schema.columns - WHERE table_schema=database() - AND TABLE_NAME="{}" -''' - - -def existe_tabela_no_legado(tabela): - sql = SQL_NAO_TEM_TABELA.format(tabela) - return list(primeira_coluna(exec_legado(sql)))[0] - - -def existe_coluna_no_legado(tabela, coluna): - sql_nao_tem_coluna = SQL_NAO_TEM_TABELA + ' AND COLUMN_NAME="{}"' - sql = sql_nao_tem_coluna.format(tabela, coluna) - return list(primeira_coluna(exec_legado(sql)))[0] > 0 - - -def garante_coluna_no_legado(tabela, spec_coluna): - coluna = spec_coluna.split()[0] - if not existe_coluna_no_legado(tabela, coluna): - exec_legado('ALTER TABLE {} ADD COLUMN {}'.format(tabela, spec_coluna)) - assert existe_coluna_no_legado(tabela, coluna) - - -def garante_tabela_no_legado(create_table): - tabela = create_table.strip().splitlines()[0].split()[2] - if not existe_tabela_no_legado(tabela): - exec_legado(create_table) - assert existe_tabela_no_legado(tabela) - - -TABELAS_REFERENCIANDO_AUTOR = [ - # , - ('autoria', True), - ('documento_administrativo', True), - ('proposicao', True), - ('protocolo', False)] - - -def reverte_exclusao_de_autores_referenciados_no_legado(): - """Reverte a exclusão de autores que sejam referenciados de alguma forma - na base legada""" - - def get_autores_referenciados(tabela, tem_ind_excluido): - sql = '''select distinct cod_autor from {} - where cod_autor is not null - '''.format(tabela) - if tem_ind_excluido: - sql += ' and ind_excluido != 1' - return primeira_coluna(exec_legado(sql)) - - # reverte exclusões de autores referenciados por outras tabelas - autores_referenciados = { - cod - for tabela, tem_ind_excluido in TABELAS_REFERENCIANDO_AUTOR - for cod in get_autores_referenciados(tabela, tem_ind_excluido)} - exec_legado_em_subconjunto( - 'update autor set ind_excluido = 0 where cod_autor in {}', - autores_referenciados) - - # propaga exclusões para autores não referenciados - for tabela, fk in [('parlamentar', 'cod_parlamentar'), - ('comissao', 'cod_comissao')]: - sql = ''' - update autor set ind_excluido = 1 - where {cod_parlamentar} is not null - and {cod_parlamentar} not in ( - select {cod_parlamentar} from {parlamentar} - where ind_excluido <> 1) - '''.format(parlamentar=tabela, cod_parlamentar=fk) - if autores_referenciados: - sql += ' and cod_autor not in ({})'.format( - ', '.join(map(str, autores_referenciados))) - exec_legado(sql) - - -def get_reapontamento_de_autores_repetidos(autores): - """ Dada uma lista ordenada de pares (cod_zzz, cod_autor) retorna: - - * a lista de grupos de cod_autor'es repetidos - (quando há mais de um cod_autor para um mesmo cod_zzz) - - * a lista de cod_autor'es a serem apagados (todos além do 1o de cada grupo) - """ - grupos_de_repetidos = [ - [cod_autor for _, cod_autor in grupo] - for cod_zzz, grupo in groupby(autores, lambda r: r[0])] - # mantém apenas os grupos com mais de um autor por cod_zzz - grupos_de_repetidos = [g for g in grupos_de_repetidos if len(g) > 1] - # aponta cada autor de cada grupo de repetidos para o 1o do seu grupo - reapontamento = {autor: grupo[0] - for grupo in grupos_de_repetidos - for autor in grupo} - # apagaremos todos menos o primeiro - apagar = [k for k, v in reapontamento.items() if k != v] - return reapontamento, apagar - - -def get_autorias_sem_repeticoes(autoria, reapontamento): - "Autorias sem repetições de autores e com ind_primeiro_autor ajustado" - - # substitui cada autor repetido pelo 1o de seu grupo - autoria = sorted((reapontamento[a], m, i) for a, m, i in autoria) - # agrupa por [autor (1o do grupo de repetidos), materia], com - # ind_primeiro_autor == 1 se isso acontece em qualquer autor do grupo - autoria = [(a, m, max(i for a, m, i in grupo)) - for (a, m), grupo in groupby(autoria, lambda x: x[:2])] - return autoria - - -def unifica_autores_repetidos_no_legado(campo_agregador): - "Reúne autores repetidos em um único, antes da migracão" - - # enumeramos a repeticoes segundo o campo relevante - # (p. ex. cod_parlamentar ou cod_comissao) - # a ordenação prioriza, as entradas: - # - não excluidas, - # - em seguida as que têm col_username, - # - em seguida as que têm des_cargo - autores = exec_legado(''' - select {cod_parlamentar}, cod_autor from autor - where {cod_parlamentar} is not null - order by {cod_parlamentar}, - ind_excluido, col_username desc, des_cargo desc'''.format( - cod_parlamentar=campo_agregador)) - - reapontamento, apagar = get_reapontamento_de_autores_repetidos(autores) - - # se não houver autores repetidos encerramos por aqui - if not reapontamento: - return - - # Reaponta AUTORIA (many-to-many) - - # simplificamos retirando inicialmente as autorias excluidas - exec_legado('delete from autoria where ind_excluido = 1') - - # selecionamos as autorias envolvidas em repetições de autores - from_autoria = ' from autoria where cod_autor in {}' - autoria = exec_legado_em_subconjunto( - 'select cod_autor, cod_materia, ind_primeiro_autor' + from_autoria, - reapontamento) - - # apagamos todas as autorias envolvidas - exec_legado_em_subconjunto('delete ' + from_autoria, reapontamento) - # e depois inserimos apenas as sem repetições c ind_primeiro_autor ajustado - nova_autoria = get_autorias_sem_repeticoes(autoria, reapontamento) - if nova_autoria: - exec_legado(''' - insert into autoria - (cod_autor, cod_materia, ind_primeiro_autor, ind_excluido) - values {}'''.format(', '.join([str((a, m, i, 0)) - for a, m, i in nova_autoria]))) - - # Reaponta outras tabelas que referenciam autor - for tabela, _ in TABELAS_REFERENCIANDO_AUTOR: - for antigo, novo in reapontamento.items(): - if antigo != novo: - exec_legado(''' - update {} set cod_autor = {} where cod_autor = {} - '''.format(tabela, novo, antigo)) - - # Finalmente excluimos os autores redundantes, - # cujas referências foram todas substituídas a essa altura - exec_legado_em_subconjunto('delete from autor where cod_autor in {}', - apagar) - - -def anula_tipos_origem_externa_invalidos(): - """Anula tipos de origem externa inválidos - para que não impeçam a migração da matéria""" - - tipos_validos = primeira_coluna(exec_legado(''' - select tip_materia - from tipo_materia_legislativa - where ind_excluido <> 1;''')) - - exec_legado_em_subconjunto(''' - update materia_legislativa - set tip_origem_externa = NULL - where tip_origem_externa not in {};''', tipos_validos) - - -def get_ids_registros_votacao_para(tabela): - sql = ''' - select r.cod_votacao from {} o - inner join registro_votacao r on - o.cod_ordem = r.cod_ordem and o.cod_materia = r.cod_materia - where o.ind_excluido != 1 and r.ind_excluido != 1 - order by o.cod_sessao_plen, num_ordem - '''.format(tabela) - return set(primeira_coluna(exec_legado(sql))) - - -def checa_registros_votacao_ambiguos_e_remove_nao_usados(): - """Interrompe a migração caso restem registros de votação - que apontam para uma ordem_dia e um expediente_materia ao mesmo tempo. - - Remove do legado registros de votação que não têm - nem ordem_dia nem expediente_materia associados.""" - - ordem, expediente = [ - get_ids_registros_votacao_para(tabela) - for tabela in ('ordem_dia', 'expediente_materia')] - - # interrompe migração se houver registros ambíguos - ambiguos = ordem.intersection(expediente) - como_resolver = get_como_resolver_registro_votacao_ambiguo() - ambiguos = ambiguos - set(como_resolver) - - if ambiguos: - warn('registro_votacao_ambiguos', - 'Existe(m) RegistroVotacao ambíguo(s): {cod_votacao}', - {'cod_votacao': ambiguos}) - - # exclui registros não usados (zumbis) - todos = set(primeira_coluna(exec_legado( - 'select cod_votacao from registro_votacao'))) - nao_usados = todos - ordem.union(expediente) - exec_legado_em_subconjunto(''' - update registro_votacao set ind_excluido = 1 - where cod_votacao in {}''', nao_usados) - - -PROPAGACOES_DE_EXCLUSAO = [ - # sessao_legislativa - ('sessao_legislativa', 'composicao_mesa', 'cod_sessao_leg'), - - # parlamentar - ('parlamentar', 'dependente', 'cod_parlamentar'), - ('parlamentar', 'filiacao', 'cod_parlamentar'), - ('parlamentar', 'mandato', 'cod_parlamentar'), - ('parlamentar', 'composicao_mesa', 'cod_parlamentar'), - ('parlamentar', 'composicao_comissao', 'cod_parlamentar'), - # no 2.5 os parlamentares excluídos não são listados na presença da sessão - ('parlamentar', 'sessao_plenaria_presenca', 'cod_parlamentar'), - # ... nem na presença da ordem do dia - ('parlamentar', 'ordem_dia_presenca', 'cod_parlamentar'), - # ... nem na mesa da sessão - ('parlamentar', 'mesa_sessao_plenaria', 'cod_parlamentar'), - - # coligacao - ('coligacao', 'composicao_coligacao', 'cod_coligacao'), - - # comissao - ('comissao', 'composicao_comissao', 'cod_comissao'), - ('periodo_comp_comissao', 'composicao_comissao', 'cod_periodo_comp'), - - # sessao - ('sessao_plenaria', 'ordem_dia', 'cod_sessao_plen'), - ('sessao_plenaria', 'expediente_materia', 'cod_sessao_plen'), - ('sessao_plenaria', 'expediente_sessao_plenaria', 'cod_sessao_plen'), - ('sessao_plenaria', 'sessao_plenaria_presenca', 'cod_sessao_plen'), - ('sessao_plenaria', 'ordem_dia_presenca', 'cod_sessao_plen'), - ('sessao_plenaria', 'mesa_sessao_plenaria', 'cod_sessao_plen'), - ('sessao_plenaria', 'oradores', 'cod_sessao_plen'), - ('sessao_plenaria', 'oradores_expediente', 'cod_sessao_plen'), - - # as consultas no código do sapl 2.5 - # votacao_ordem_dia_obter_zsql e votacao_expediente_materia_obter_zsql - # indicam que os registros de votação de matérias excluídas não são - # exibidos... - ('materia_legislativa', 'registro_votacao', 'cod_materia'), - # as exclusões de registro_votacao sem referência - # nem a ordem_dia nem a expediente_materia são feitas num método à parte - - # materia - ('materia_legislativa', 'tramitacao', 'cod_materia'), - ('materia_legislativa', 'autoria', 'cod_materia'), - ('materia_legislativa', 'anexada', 'cod_materia_principal'), - ('materia_legislativa', 'anexada', 'cod_materia_anexada'), - ('materia_legislativa', 'documento_acessorio', 'cod_materia'), - ('materia_legislativa', 'numeracao', 'cod_materia'), - ('materia_legislativa', 'expediente_materia', 'cod_materia'), - ('materia_legislativa', 'ordem_dia', 'cod_materia'), - ('materia_legislativa', 'acomp_materia', 'cod_materia'), - ('materia_legislativa', 'despacho_inicial', 'cod_materia'), - ('materia_legislativa', 'legislacao_citada', 'cod_materia'), - ('materia_legislativa', 'relatoria', 'cod_materia'), - ('materia_legislativa', 'materia_assunto', 'cod_materia'), - - - # norma - ('norma_juridica', 'vinculo_norma_juridica', 'cod_norma_referente'), - ('norma_juridica', 'vinculo_norma_juridica', 'cod_norma_referida'), - ('norma_juridica', 'legislacao_citada', 'cod_norma'), - - # documento administrativo - ('documento_administrativo', 'tramitacao_administrativo', 'cod_documento'), -] - -PROPAGACOES_DE_EXCLUSAO_REGISTROS_VOTACAO = [ - ('registro_votacao', 'registro_votacao_parlamentar', 'cod_votacao'), -] - - -def propaga_exclusoes(propagacoes): - for tabela_pai, tabela_filha, fk in propagacoes: - [pk_pai] = get_pk_legado(tabela_pai) - sql = ''' - update {} set ind_excluido = 1 where {} not in ( - select {} from {} where ind_excluido != 1) - '''.format(tabela_filha, fk, pk_pai, tabela_pai) - exec_legado(sql) - - -def corrige_unidades_tramitacao_destino_vazia_como_anterior(): - """Se uma unidade de tramitação estiver vazia no legado a configura - como a anterior""" - - for tabela_tramitacao in ['tramitacao', 'tramitacao_administrativo']: - exec_legado(''' - update {} - set cod_unid_tram_dest = cod_unid_tram_local - where cod_unid_tram_dest is null; - '''.format(tabela_tramitacao)) - - -def apaga_ref_a_mats_e_docs_inexistentes_em_proposicoes(): - # as referencias a matérias e documentos apagados não aparecem no 3.1 - # além do que, se ressuscitássemos essas matérias e docs, - # não seria possível apagá-los, - # pois é impossível para um usuário não autor acessar as proposicões - # para apagar a referências antes - exec_legado(''' - update proposicao set cod_materia = NULL where cod_materia not in ( - select cod_materia from materia_legislativa - where ind_excluido <> 1); - ''') - props_sem_mats = list(primeira_coluna(exec_legado(''' - select cod_proposicao from proposicao p inner join tipo_proposicao t - on p.tip_proposicao = t.tip_proposicao - where t.ind_mat_ou_doc = 'M' and cod_mat_ou_doc not in ( - select cod_materia from materia_legislativa - where ind_excluido <> 1) - '''))) - props_sem_docs = list(primeira_coluna(exec_legado(''' - select cod_proposicao from proposicao p inner join tipo_proposicao t - on p.tip_proposicao = t.tip_proposicao - where t.ind_mat_ou_doc = 'D' and cod_mat_ou_doc not in ( - select cod_documento from documento_acessorio - where ind_excluido <> 1); - '''))) - exec_legado_em_subconjunto(''' - update proposicao set cod_mat_ou_doc = NULL - where cod_proposicao in {}''', props_sem_mats + props_sem_docs) - - -def uniformiza_banco(): - propaga_exclusoes(PROPAGACOES_DE_EXCLUSAO) - checa_registros_votacao_ambiguos_e_remove_nao_usados() - propaga_exclusoes(PROPAGACOES_DE_EXCLUSAO_REGISTROS_VOTACAO) - - garante_coluna_no_legado('proposicao', - 'num_proposicao int(11) NULL') - - garante_coluna_no_legado('tipo_materia_legislativa', - 'ind_num_automatica BOOLEAN NULL DEFAULT FALSE') - - garante_coluna_no_legado('tipo_materia_legislativa', - 'quorum_minimo_votacao int(11) NULL') - - garante_coluna_no_legado('materia_legislativa', - 'txt_resultado TEXT NULL') - - # Cria campos cod_presenca_sessao (sendo a nova PK da tabela) - # e dat_sessao em sessao_plenaria_presenca - if not existe_coluna_no_legado('sessao_plenaria_presenca', - 'cod_presenca_sessao'): - exec_legado(''' - ALTER TABLE sessao_plenaria_presenca - DROP PRIMARY KEY, - ADD cod_presenca_sessao INT auto_increment PRIMARY KEY FIRST; - ''') - assert existe_coluna_no_legado('sessao_plenaria_presenca', - 'cod_presenca_sessao') - - garante_coluna_no_legado('sessao_plenaria_presenca', - 'dat_sessao DATE NULL') - - garante_tabela_no_legado(''' - CREATE TABLE lexml_registro_publicador ( - cod_publicador INT auto_increment NOT NULL, - id_publicador INT, nom_publicador varchar(255), - adm_email varchar(50), - sigla varchar(255), - nom_responsavel varchar(255), - tipo varchar(50), - id_responsavel INT, PRIMARY KEY (cod_publicador)); - ''') - - garante_tabela_no_legado(''' - CREATE TABLE lexml_registro_provedor ( - cod_provedor INT auto_increment NOT NULL, - id_provedor INT, nom_provedor varchar(255), - sgl_provedor varchar(15), - adm_email varchar(50), - nom_responsavel varchar(255), - tipo varchar(50), - id_responsavel INT, xml_provedor longtext, - PRIMARY KEY (cod_provedor)); - ''') - - garante_tabela_no_legado(''' - CREATE TABLE tipo_situacao_militar ( - tip_situacao_militar INT auto_increment NOT NULL, - des_tipo_situacao varchar(50), - ind_excluido INT, PRIMARY KEY (tip_situacao_militar)); - ''') - - update_specs = ''' -vinculo_norma_juridica | ind_excluido = '' | trim(ind_excluido) = '0' -unidade_tramitacao | cod_parlamentar = NULL | cod_parlamentar = 0 -parlamentar | cod_nivel_instrucao = NULL | cod_nivel_instrucao = 0 -parlamentar | tip_situacao_militar = NULL | tip_situacao_militar = 0 -mandato | tip_afastamento = NULL | tip_afastamento = 0 -relatoria | tip_fim_relatoria = NULL | tip_fim_relatoria = 0 -sessao_plenaria_presenca | dat_sessao = NULL | dat_sessao = 0 - '''.strip().splitlines() - - for spec in update_specs: - spec = spec.split('|') - exec_legado('UPDATE {} SET {} WHERE {}'.format(*spec)) - - # retira apontamentos de materia para assunto inexistente - exec_legado('delete from materia_assunto where cod_assunto = 0') - - # corrige string "None" em autor - exec_legado('update autor set des_cargo = NULL where des_cargo = "None"') - - unifica_autores_repetidos_no_legado('cod_parlamentar') - unifica_autores_repetidos_no_legado('cod_comissao') - unifica_autores_repetidos_no_legado('col_username') - - # é importante reverter a exclusão de autores somente depois, para que a - # unificação possa dar prioridade às informações dos autores não excluídos - reverte_exclusao_de_autores_referenciados_no_legado() - - anula_tipos_origem_externa_invalidos() - corrige_unidades_tramitacao_destino_vazia_como_anterior() - - # matérias inexistentes não são mostradas em norma jurídica => apagamos - exec_legado('''update norma_juridica set cod_materia = NULL - where cod_materia not in ( - select cod_materia from materia_legislativa - where ind_excluido <> 1);''') - - apaga_ref_a_mats_e_docs_inexistentes_em_proposicoes() - - -class Record: - pass - - -def iter_sql_records(tabela): - if tabela == 'despacho_inicial': - sql = ''' select cod_materia, cod_comissao from despacho_inicial - where ind_excluido <> 1 - group by cod_materia, cod_comissao - order by cod_materia, min(num_ordem) - ''' - else: - sql = 'select * from ' + tabela - if existe_coluna_no_legado(tabela, 'ind_excluido'): - sql += ' where ind_excluido <> 1' - cursor = exec_legado(sql) - fieldnames = [name[0] for name in cursor.description] - for row in cursor.fetchall(): - record = Record() - record.__dict__.update(zip(fieldnames, row)) - yield record - - -def fill_vinculo_norma_juridica(): - lista = [('A', 'Altera o(a)', - 'Alterado(a) pelo(a)'), - ('R', 'Revoga integralmente o(a)', - 'Revogado(a) integralmente pelo(a)'), - ('P', 'Revoga parcialmente o(a)', - 'Revogado(a) parcialmente pelo(a)'), - ('T', 'Revoga integralmente por consolidação', - 'Revogado(a) integralmente por consolidação'), - ('C', 'Norma correlata', - 'Norma correlata'), - ('S', 'Ressalva o(a)', - 'Ressalvada pelo(a)'), - ('E', 'Reedita o(a)', - 'Reeditada pelo(a)'), - ('I', 'Reedita com alteração o(a)', - 'Reeditada com alteração pelo(a)'), - ('G', 'Regulamenta o(a)', - 'Regulamentada pelo(a)'), - ('K', 'Suspende parcialmente o(a)', - 'Suspenso(a) parcialmente pelo(a)'), - ('L', 'Suspende integralmente o(a)', - 'Suspenso(a) integralmente pelo(a)'), - ('N', 'Julga integralmente inconstitucional', - 'Julgada integralmente inconstitucional'), - ('O', 'Julga parcialmente inconstitucional', - 'Julgada parcialmente inconstitucional')] - lista_objs = [TipoVinculoNormaJuridica( - sigla=item[0], descricao_ativa=item[1], descricao_passiva=item[2]) - for item in lista] - TipoVinculoNormaJuridica.objects.bulk_create(lista_objs) - - -def fill_dados_basicos(): - # Ajusta sequencia numérica de protocolo e cria base.AppConfig - if (TipoNumeracaoProtocolo._meta.db_table in TABELAS_LEGADO - and TipoNumeracaoProtocolo.objects.exists()): - # se este banco legado tem a a configuração de numeração de protocolo - tipo = TipoNumeracaoProtocolo.objects.latest('dat_inicial_protocolo') - descricao = tipo.des_numeracao_protocolo - if 'POR ANO' in descricao: - sequencia_numeracao = 'A' - elif 'POR LEGISLATURA' in descricao: - sequencia_numeracao = 'L' - elif 'CONSECUTIVO' in descricao: - sequencia_numeracao = 'U' - else: - sequencia_numeracao = 'A' - appconf = AppConf(sequencia_numeracao=sequencia_numeracao) - appconf.save() - - -def reinicia_sequence(model, id): - sequence_name = '%s_id_seq' % model._meta.db_table - exec_sql('ALTER SEQUENCE %s RESTART WITH %s MINVALUE -1;' % ( - sequence_name, id)) - - -REPO = git.Repo.init(DIR_REPO) - - -def populate_renamed_fields(new, old): - renames = field_renames[type(new)] - - for field in new._meta.fields: - old_field_name = renames.get(field.name) - if old_field_name: - field_type = field.get_internal_type() - - if field_type == 'ForeignKey': - fk_field_name = '{}_id'.format(field.name) - value = get_fk_related(field, old) - setattr(new, fk_field_name, value) - else: - value = getattr(old, old_field_name) - - if (field_type in ['CharField', 'TextField'] - and value in [None, 'None']): - value = '' - - # ajusta tempos segundo timezone - # os campos TIMESTAMP do mysql são gravados em UTC - # os DATETIME e TIME não têm timezone - - if field_type == 'DateTimeField' and value: - # as datas armazenadas no legado na verdade são naive - sem_tz = value.replace(tzinfo=None) - value = PYTZ_TIMEZONE.localize(sem_tz).astimezone(pytz.utc) - - if field_type == 'TimeField' and value: - value = value.replace(tzinfo=PYTZ_TIMEZONE) - - setattr(new, field.name, value) - - -def roda_comando_shell(cmd): - res = os.system(cmd) - assert res == 0, 'O comando falhou: {}'.format(cmd) - - -def get_arquivo_ajustes_pre_migracao(): - return DIR_DADOS_MIGRACAO.child( - 'ajustes_pre_migracao', '{}.sql'.format(SIGLA_CASA)) - - -def migrar_dados(apagar_do_legado=False): - try: - ocorrencias.clear() - ocorrencias.default_factory = list - - # restaura dump - arq_dump = Path(DIR_DADOS_MIGRACAO.child( - 'dumps_mysql', '{}.sql'.format(NOME_BANCO_LEGADO))) - assert arq_dump.exists(), 'Dump do mysql faltando: {}'.format(arq_dump) - info('Restaurando dump mysql de [{}]'.format(arq_dump)) - normaliza_dump_mysql(arq_dump) - roda_comando_shell('mysql -uroot < {}'.format(arq_dump)) - - # desliga checagens do mysql - # e possibilita inserir valor zero em campos de autoincremento - exec_legado('SET SESSION sql_mode = "NO_AUTO_VALUE_ON_ZERO";') - - # executa ajustes pré-migração, se existirem - arq_ajustes_pre_migracao = get_arquivo_ajustes_pre_migracao() - if arq_ajustes_pre_migracao.exists(): - exec_legado(arq_ajustes_pre_migracao.read_file()) - - uniformiza_banco() - - # excluindo database antigo. - info('Excluindo entradas antigas do banco destino.') - flush = FlushCommand() - flush.handle(database='default', interactive=False, verbosity=0) - - # apaga tipos de autor padrão (criados no flush acima) - TipoAutor.objects.all().delete() - - fill_vinculo_norma_juridica() - fill_dados_basicos() - info('Começando migração: ...') - migrar_todos_os_models(apagar_do_legado) - except Exception as e: - ocorrencias['traceback'] = str(traceback.format_exc()) - raise e - finally: - # congela e grava ocorrências - ocorrencias.default_factory = None - arq_ocorrencias = Path(REPO.working_dir, 'ocorrencias.yaml') - with open(arq_ocorrencias, 'w') as arq: - pyaml.dump(ocorrencias, arq, vspacing=1, width=200) - REPO.git.add([arq_ocorrencias.name]) - info('Ocorrências salvas em\n {}'.format(arq_ocorrencias)) - if not ocorrencias: - info('NÃO HOUVE OCORRÊNCIAS !!!') - - # recria tipos de autor padrão que não foram criados pela migração - cria_models_tipo_autor() - - -def move_para_depois_de(lista, movido, referencias): - indice_inicial = lista.index(movido) - lista.remove(movido) - indice_apos_refs = max(lista.index(r) for r in referencias) + 1 - lista.insert(max(indice_inicial, indice_apos_refs), movido) - return lista - - -TABELAS_LEGADO = [t for (t,) in exec_legado('show tables')] -EXISTE_REUNIAO_NO_LEGADO = 'reuniao_comissao' in TABELAS_LEGADO - - -def get_models_a_migrar(): - models = [model for app in appconfs for model in app.models.values() - if model in field_renames] - # retira reuniões quando não existe na base legada - # (só existe no sapl 3.0) - if not EXISTE_REUNIAO_NO_LEGADO: - models.remove(Reuniao) - # Devido à referência TipoProposicao.tipo_conteudo_related - # a migração de TipoProposicao precisa ser feita - # após TipoMateriaLegislativa e TipoDocumento - # (porém antes de Proposicao) - move_para_depois_de(models, TipoProposicao, - [TipoMateriaLegislativa, TipoDocumento]) - assert models.index(TipoProposicao) < models.index(Proposicao) - move_para_depois_de(models, Proposicao, - [MateriaLegislativa, DocumentoAcessorio]) - - return models - - -def migrar_todos_os_models(apagar_do_legado): - for model in get_models_a_migrar(): - migrar_model(model, apagar_do_legado) - - -def migrar_model(model, apagar_do_legado): - print('Migrando %s...' % model.__name__) - - model_legado, tabela_legado, campos_pk_legado = \ - get_estrutura_legado(model) - - if len(campos_pk_legado) == 1: - # a pk no legado tem um único campo - nome_pk = model_legado._meta.pk.name - if 'ind_excluido' in {f.name for f in model_legado._meta.fields}: - # se o model legado tem o campo ind_excluido - # enumera apenas os não excluídos - old_records = model_legado.objects.filter(~Q(ind_excluido=1)) - else: - old_records = model_legado.objects.all() - old_records = old_records.order_by(nome_pk) - - def get_id_do_legado(old): - return getattr(old, nome_pk) - - ultima_pk_legado = model_legado.objects.all().aggregate( - Max('pk'))['pk__max'] or 0 - else: - # a pk no legado tem mais de um campo - old_records = iter_sql_records(tabela_legado) - get_id_do_legado = None - ultima_pk_legado = model_legado.objects.count() - - ajuste_antes_salvar = AJUSTE_ANTES_SALVAR.get(model) - ajuste_depois_salvar = AJUSTE_DEPOIS_SALVAR.get(model) - - # convert old records to new ones - with transaction.atomic(): - novos = [] - sql_delete_legado = '' - for old in old_records: - new = model() - if get_id_do_legado: - new.id = get_id_do_legado(old) - try: - populate_renamed_fields(new, old) - if ajuste_antes_salvar: - ajuste_antes_salvar(new, old) - except ForeignKeyFaltando as e: - # tentamos preencher uma FK e o ojeto relacionado - # não existe - # então este é um objeo órfão: simplesmente ignoramos - warn('fk', e.msg, e.dados) - continue - else: - new.clean() # valida model - novos.append(new) # guarda para salvar - - # acumula deleção do registro no legado - if apagar_do_legado: - sql_delete_legado += 'delete from {} where {};\n'.format( - tabela_legado, - ' and '.join( - '{} = "{}"'.format(campo, - getattr(old, campo)) - for campo in campos_pk_legado)) - - # salva novos registros - with reversion.create_revision(): - model.objects.bulk_create(novos) - reversion.set_comment('Objetos criados pela migração') - - if ajuste_depois_salvar: - ajuste_depois_salvar() - - # reiniciamos a sequence logo após a última pk do legado - # - # É importante que seja do legado (e não da nova base), - # pois numa nova versão da migração podemos inserir registros - # não migrados antes sem conflito com pks criadas até lá - if get_id_do_legado: - reinicia_sequence(model, ultima_pk_legado + 1) - - # apaga registros migrados do legado - if apagar_do_legado and sql_delete_legado: - exec_legado(sql_delete_legado) - - -# MIGRATION_ADJUSTMENTS ##################################################### - -def adjust_acompanhamentomateria(new, old): - new.confirmado = True - - -def adjust_documentoadministrativo(new, old): - if old.num_protocolo: - numero, ano = old.num_protocolo, new.ano - # False < True => o primeiro será o protocolo não anulado - protocolos = Protocolo.objects.filter( - numero=numero, ano=ano).order_by('anulado') - if protocolos: - new.protocolo = protocolos[0] - else: - # Se não achamos o protocolo registramos no número externo - new.numero_externo = numero - - nota = ''' -## NOTA DE MIGRAÇÃO DE DADOS DO SAPL 2.5 ## -O número de protocolo original deste documento era [{numero}], ano [{ano}]. - -Não existe no sistema nenhum protocolo com estes dados -e portanto nenhum protocolo foi vinculado a este documento. - -Colocamos então o número de protocolo no campo "número externo". -''' - nota = nota.strip().format(numero=numero, ano=ano) - msg = 'Protocolo {numero} faltando (referenciado ' \ - 'no documento administrativo {cod_documento})' - warn('protocolo_faltando', msg, - {'numero': numero, - 'cod_documento': old.cod_documento, - 'nota': nota}) - new.observacao += ('\n\n' if new.observacao else '') + nota - - -def adjust_mandato(new, old): - if old.dat_fim_mandato: - new.data_fim_mandato = old.dat_fim_mandato - if not new.data_fim_mandato: - legislatura = Legislatura.objects.latest('data_fim') - new.data_fim_mandato = legislatura.data_fim - new.data_expedicao_diploma = legislatura.data_inicio - if not new.data_inicio_mandato: - new.data_inicio_mandato = new.legislatura.data_inicio - new.data_fim_mandato = new.legislatura.data_fim - - -def adjust_ordemdia_antes_salvar(new, old): - new.votacao_aberta = False - - if not old.tip_votacao: - new.tipo_votacao = 1 - - if old.num_ordem is None: - new.numero_ordem = 999999999 - warn('ordem_dia_num_ordem_nulo', - 'OrdemDia de PK {pk} tinha numero ordem nulo. ' - 'O valor %s foi colocado no lugar.' % new.numero_ordem, - {'pk': old.pk}) - - -def adjust_parlamentar(new, old): - if old.ind_unid_deliberativa: - value = new.unidade_deliberativa - # Field is defined as not null in legacy db, - # but data includes null values - # => transform None to False - if value is None: - warn('unidade_deliberativa_nulo_p_false', - 'nulo convertido para falso na unidade_deliberativa ' - 'do parlamentar {pk_parlamentar}', - {'pk_parlamentar': old.cod_parlamentar}) - new.unidade_deliberativa = False - # migra município de residência - if old.cod_localidade_resid: - municipio_uf = list(exec_legado(''' - select nom_localidade, sgl_uf from localidade - where cod_localidade = {}'''.format(old.cod_localidade_resid))) - if municipio_uf: - new.municipio_residencia, new.uf_residencia = municipio_uf[0] - - -def adjust_participacao(new, old): - comissao_id, periodo_id = [ - get_fk_related(Composicao._meta.get_field(name), old) - for name in ('comissao', 'periodo')] - with reversion.create_revision(): - composicao, _ = Composicao.objects.get_or_create( - comissao_id=comissao_id, periodo_id=periodo_id) - reversion.set_comment('Objeto criado pela migração') - new.composicao = composicao - - -def adjust_normarelacionada(new, old): - new.tipo_vinculo = TipoVinculoNormaJuridica.objects.get( - sigla=old.tip_vinculo) - - -def adjust_protocolo_antes_salvar(new, old): - if new.numero is None: - new.numero = old.cod_protocolo - warn('num_protocolo_nulo', - 'Número do protocolo de PK {cod_protocolo} era nulo ' - 'e foi alterado para sua pk ({cod_protocolo})', - {'cod_protocolo': old.cod_protocolo}) - - -def get_arquivo_resolve_registro_votacao(): - return DIR_DADOS_MIGRACAO.child( - 'ajustes_pre_migracao', - '{}_resolve_registro_votacao_ambiguo.yaml'.format(SIGLA_CASA)) - - -def get_como_resolver_registro_votacao_ambiguo(): - path = get_arquivo_resolve_registro_votacao() - if path.exists(): - return yaml.load(path.read_file(), yaml.Loader) - else: - return {} - - -def adjust_registrovotacao_antes_salvar(new, old): - ordem_dia = OrdemDia.objects.filter( - pk=old.cod_ordem, materia=old.cod_materia) - expediente_materia = ExpedienteMateria.objects.filter( - pk=old.cod_ordem, materia=old.cod_materia) - - if ordem_dia and not expediente_materia: - new.ordem = ordem_dia[0] - if not ordem_dia and expediente_materia: - new.expediente = expediente_materia[0] - # registro de votação ambíguo - if ordem_dia and expediente_materia: - como_resolver = get_como_resolver_registro_votacao_ambiguo() - campo = como_resolver[new.id] - if campo.startswith('ordem'): - new.ordem = ordem_dia[0] - elif campo.startswith('expediente'): - new.expediente = expediente_materia[0] - else: - raise Exception(''' - Registro de Votação ambíguo: {} - Resolva criando o arquivo {}'''.format( - new.id, get_arquivo_resolve_registro_votacao())) - - -def adjust_tipoafastamento(new, old): - assert xor(old.ind_afastamento, old.ind_fim_mandato) - if old.ind_afastamento: - new.indicador = 'A' - elif old.ind_fim_mandato: - new.indicador = 'F' - - -def set_generic_fk(new, campo_virtual, old): - model = campo_virtual.related_model - new.content_type = ContentType.objects.get( - app_label=model._meta.app_label, model=model._meta.model_name) - new.object_id = get_fk_related(campo_virtual, old) - - -def adjust_tipoproposicao(new, old): - "Aponta para o tipo relacionado de matéria ou documento" - if old.tip_mat_ou_doc is not None: - campo_virtual = CAMPOS_VIRTUAIS_TIPO_PROPOSICAO[old.ind_mat_ou_doc] - set_generic_fk(new, campo_virtual, old) - - -def adjust_proposicao_antes_salvar(new, old): - if new.data_envio: - new.ano = new.data_envio.year - if old.cod_mat_ou_doc is not None: - tipo_mat_ou_doc = type(new.tipo.tipo_conteudo_related) - campo_virtual = CAMPOS_VIRTUAIS_PROPOSICAO[tipo_mat_ou_doc] - set_generic_fk(new, campo_virtual, old) - - -def adjust_statustramitacao(new, old): - if old.ind_fim_tramitacao: - new.indicador = 'F' - elif old.ind_retorno_tramitacao: - new.indicador = 'R' - else: - new.indicador = '' - - -def adjust_statustramitacaoadm(new, old): - adjust_statustramitacao(new, old) - - -def adjust_tramitacao(new, old): - if old.sgl_turno == 'Ú': - new.turno = 'U' - - -def adjust_tipo_autor(new, old): - model_apontado = normalize(new.descricao.lower()).replace(' ', '') - content_types = ContentType.objects.filter( - model=model_apontado).exclude(app_label='legacy') - assert len(content_types) <= 1 - new.content_type = content_types[0] if content_types else None - - -def adjust_normajuridica_antes_salvar(new, old): - # Ajusta choice de esfera_federacao - # O 'S' vem de 'Selecionar'. Na versão antiga do SAPL, quando uma opção do - # combobox era selecionada, o sistema pegava a primeira letra da seleção, - # sendo F para Federal, E para Estadual, M para Municipal e o S para - # Selecionar, que era a primeira opção quando nada era selecionado. - if old.tip_esfera_federacao == 'S': - new.esfera_federacao = '' - - -def adjust_normajuridica_depois_salvar(): - # Ajusta relação M2M - ligacao = NormaJuridica.assuntos.through - - assuntos_migrados, normas_migradas = [ - set(model.objects.values_list('id', flat=True)) - for model in [AssuntoNorma, NormaJuridica]] - - def filtra_assuntos_migrados(cod_assunto): - if not cod_assunto: - return [] - cods = {int(a) for a in cod_assunto.split(',') if a} - return sorted(cods.intersection(assuntos_migrados)) - - norma_para_assuntos = [ - (norma, filtra_assuntos_migrados(cod_assunto)) - for norma, cod_assunto in OldNormaJuridica.objects.filter( - pk__in=normas_migradas).values_list('pk', 'cod_assunto')] - - ligacao.objects.bulk_create( - ligacao(normajuridica_id=norma, assuntonorma_id=assunto) - for norma, assuntos in norma_para_assuntos - for assunto in assuntos) - - -def adjust_autor(new, old): - # vincula autor com o objeto relacionado, tentando os três campos antigos - # o primeiro campo preenchido será usado, podendo lançar ForeignKeyFaltando - for model_relacionado, campo_nome in [(Parlamentar, 'nome_parlamentar'), - (Comissao, 'nome'), - (Partido, 'nome')]: - field = CAMPOS_VIRTUAIS_AUTOR[model_relacionado] - fk_encontrada = get_fk_related(field, old) - if fk_encontrada: - new.autor_related = model_relacionado.objects.get(id=fk_encontrada) - new.nome = getattr(new.autor_related, campo_nome) - break - - if old.col_username: - user, created = get_user_model().objects.get_or_create( - username=old.col_username) - if created: - # gera uma senha inutilizável, que precisará ser trocada - user.set_password(None) - with reversion.create_revision(): - user.save() - reversion.set_comment( - 'Usuário criado pela migração para o autor {}'.format( - old.cod_autor)) - grupo_autor = Group.objects.get(name="Autor") - user.groups.add(grupo_autor) - new.user = user - - -def adjust_comissao(new, old): - if not old.dat_extincao and not old.dat_fim_comissao: - new.ativa = True - elif (old.dat_extincao and date.today() < new.data_extincao or - old.dat_fim_comissao and date.today() < new.data_fim_comissao): - new.ativa = True - else: - new.ativa = False - - -def adjust_tiporesultadovotacao(new, old): - if 'aprova' in new.nome.lower(): - new.natureza = TipoResultadoVotacao.NATUREZA_CHOICES.aprovado - elif 'rejeita' in new.nome.lower(): - new.natureza = TipoResultadoVotacao.NATUREZA_CHOICES.rejeitado - elif 'retirado' in new.nome.lower(): - new.natureza = TipoResultadoVotacao.NATUREZA_CHOICES.rejeitado - else: - if new.nome != 'DESCONHECIDO': - # ignoramos a natureza de item criado pela migração - warn('natureza_desconhecida_tipo_resultadovotacao', - 'Não foi possível identificar a natureza do ' - 'tipo de resultado de votação [{pk}: "{nome}"]', - {'pk': new.pk, 'nome': new.nome}) - - -def str_to_time(fonte): - if not fonte.strip(): - return None - tempo = datetime.datetime.strptime(fonte, '%H:%M') - return tempo.time() if tempo else None - - -def adjust_reuniao_comissao(new, old): - new.hora_inicio = str_to_time(old.hr_inicio_reuniao) - - -def remove_style(conteudo): - if 'style' not in conteudo: - return conteudo # atalho que acelera muito os casos sem style - - soup = BeautifulSoup(conteudo, 'html.parser') - for tag in soup.recursiveChildGenerator(): - if hasattr(tag, 'attrs'): - tag.attrs = {k: v for k, v in tag.attrs.items() if k != 'style'} - return str(soup) - - -def adjust_expediente_sessao(new, old): - new.conteudo = remove_style(new.conteudo) - - -AJUSTE_ANTES_SALVAR = { - Autor: adjust_autor, - TipoAutor: adjust_tipo_autor, - AcompanhamentoMateria: adjust_acompanhamentomateria, - Comissao: adjust_comissao, - DocumentoAdministrativo: adjust_documentoadministrativo, - Mandato: adjust_mandato, - NormaJuridica: adjust_normajuridica_antes_salvar, - NormaRelacionada: adjust_normarelacionada, - OrdemDia: adjust_ordemdia_antes_salvar, - Parlamentar: adjust_parlamentar, - Participacao: adjust_participacao, - Proposicao: adjust_proposicao_antes_salvar, - Protocolo: adjust_protocolo_antes_salvar, - RegistroVotacao: adjust_registrovotacao_antes_salvar, - TipoAfastamento: adjust_tipoafastamento, - TipoProposicao: adjust_tipoproposicao, - StatusTramitacao: adjust_statustramitacao, - StatusTramitacaoAdministrativo: adjust_statustramitacaoadm, - Tramitacao: adjust_tramitacao, - TipoResultadoVotacao: adjust_tiporesultadovotacao, - ExpedienteSessao: adjust_expediente_sessao, - Reuniao: adjust_reuniao_comissao, -} - -AJUSTE_DEPOIS_SALVAR = { - NormaJuridica: adjust_normajuridica_depois_salvar, -} - - -# MARCO ###################################################################### - -TIME_FORMAT = '%H:%M:%S' - - -# permite a gravação de tempos puros pelo pretty-yaml -def time_representer(dumper, data): - return dumper.represent_scalar('!time', data.strftime(TIME_FORMAT)) - - -UnsafePrettyYAMLDumper.add_representer(datetime.time, time_representer) - - -# permite a leitura de tempos puros pelo pyyaml (no padrão gravado acima) -def time_constructor(loader, node): - value = loader.construct_scalar(node) - return datetime.datetime.strptime(value, TIME_FORMAT).time() - - -yaml.add_constructor(u'!time', time_constructor) - -TAG_MARCO = 'marco' - - -def gravar_marco(): - """Grava um dump de todos os dados como arquivos yaml no repo de marco - """ - # prepara ou localiza repositorio - dir_dados = Path(REPO.working_dir, 'dados') - - # exporta dados como arquivos yaml - user_model = get_user_model() - models = get_models_a_migrar() + [ - Composicao, user_model, Group, ContentType] - for model in models: - info('Gravando marco de [{}]'.format(model.__name__)) - dir_model = dir_dados.child(model._meta.app_label, model.__name__) - dir_model.mkdir(parents=True) - for data in model.objects.all().values(): - nome_arq = Path(dir_model, '{}.yaml'.format(data['id'])) - with open(nome_arq, 'w') as arq: - pyaml.dump(data, arq) - - # backup do banco - print('Gerando backup do banco... ', end='', flush=True) - arq_backup = DIR_REPO.child('{}.backup'.format(NOME_BANCO_LEGADO)) - arq_backup.remove() - backup_cmd = ''' - pg_dump --host localhost --port 5432 --username postgres --no-password - --format custom --blobs --verbose --file {} {}'''.format( - arq_backup, NOME_BANCO_LEGADO) - subprocess.check_output(backup_cmd.split(), stderr=subprocess.DEVNULL) - print('SUCESSO') - - # salva mudanças - REPO.git.add([dir_dados.name]) - REPO.git.add([arq_backup.name]) - if 'master' not in REPO.heads or REPO.index.diff('HEAD'): - # se de fato existe mudança - REPO.index.commit('Grava marco') - REPO.git.execute('git tag -f'.split() + [TAG_MARCO]) diff --git a/sapl/legacy/migracao_documentos.py b/sapl/legacy/migracao_documentos.py deleted file mode 100644 index 23c6f05f7..000000000 --- a/sapl/legacy/migracao_documentos.py +++ /dev/null @@ -1,215 +0,0 @@ -import os -import re -import shutil -from glob import glob -from os.path import join - -import yaml -from django.db import transaction -from image_cropping.fields import ImageCropField - -from sapl.base.models import CasaLegislativa -from sapl.comissoes.models import Reuniao -from sapl.legacy.migracao_dados import EXISTE_REUNIAO_NO_LEGADO, exec_legado -from sapl.materia.models import (DocumentoAcessorio, MateriaLegislativa, - Proposicao) -from sapl.norma.models import NormaJuridica -from sapl.parlamentares.models import Parlamentar -from sapl.protocoloadm.models import (DocumentoAcessorioAdministrativo, - DocumentoAdministrativo) -from sapl.sessao.models import SessaoPlenaria - -# MIGRAÇÃO DE DOCUMENTOS ################################################### - - -DOCS = { - Parlamentar: [('fotografia', 'parlamentar/fotos/{}_foto_parlamentar')], - MateriaLegislativa: [('texto_original', 'materia/{}_texto_integral')], - DocumentoAcessorio: [('arquivo', 'materia/{}')], - NormaJuridica: [('texto_integral', 'norma_juridica/{}_texto_integral')], - SessaoPlenaria: [('upload_pauta', 'pauta_sessao/{}_pauta_sessao'), - ('upload_ata', 'ata_sessao/{}_ata_sessao'), - ('upload_anexo', 'anexo_sessao/{}_texto_anexado')], - Proposicao: [('texto_original', 'proposicao/{}')], - DocumentoAdministrativo: [('texto_integral', - 'administrativo/{}_texto_integral')], - DocumentoAcessorioAdministrativo: [('arquivo', 'administrativo/{}')], -} - -# acrescenta reuniões (que só existem no sapl 3.0) -if EXISTE_REUNIAO_NO_LEGADO: - DOCS[Reuniao] = [('upload_pauta', 'reuniao_comissao/{}_pauta'), - ('upload_ata', 'reuniao_comissao/{}_ata')] - - -DOCS = {model: [(campo, join('sapl_documentos', origem)) - for campo, origem in campos] - for model, campos in DOCS.items()} - - -def mover_documento(repo, origem, destino, ignora_origem_ausente=False): - origem, destino = [join(repo.working_dir, c) if not os.path.isabs(c) else c - for c in (origem, destino)] - if ignora_origem_ausente and not os.path.exists(origem): - print('Origem ignorada ao mover documento: {}'.format(origem)) - return - # apaga destino, se houver, e renomeia origem para destino - if os.path.exists(destino): - if os.path.isdir(destino): - shutil.rmtree(destino) - else: - os.remove(destino) - os.makedirs(os.path.dirname(destino), exist_ok=True) - os.rename(origem, destino) - - -def migrar_logotipo(repo, casa, propriedades): - print('.... Migrando logotipo da casa ....') - campo, origem = 'logotipo', 'sapl_documentos/props_sapl/{}.*' - # a extensão do logo pode ter sido ajustada pelo tipo real do arquivo - nome_nas_propriedades = os.path.splitext(propriedades['id_logo'])[0] - arquivos = glob( - join(repo.working_dir, origem.format(nome_nas_propriedades))) - if arquivos: - assert len(arquivos) == 1, 'Há mais de um logotipo para a casa' - [logo] = arquivos - destino = join(CasaLegislativa._meta.get_field(campo).upload_to, - os.path.basename(logo)) - mover_documento(repo, logo, destino) - casa.logotipo = destino - - -def migrar_propriedades_da_casa(repo): - print('#### Migrando propriedades da casa ####') - caminho = join(repo.working_dir, 'sapl_documentos/propriedades.yaml') - repo.git.execute('git annex get'.split() + [caminho]) - with open(caminho, 'r') as arquivo: - propriedades = yaml.safe_load(arquivo) - casa = CasaLegislativa.objects.first() - if not casa: - casa = CasaLegislativa() - campos_para_propriedades = [('codigo', 'cod_casa'), - ('nome', 'nom_casa'), - ('sigla', 'sgl_casa'), - ('endereco', 'end_casa'), - ('cep', 'num_cep'), - ('telefone', 'num_tel'), - ('fax', 'num_fax'), - ('endereco_web', 'end_web_casa'), - ('email', 'end_email_casa'), - ('sigla', 'sgl_casa'), - ('informacao_geral', 'txt_informacao_geral')] - for campo, prop in campos_para_propriedades: - setattr(casa, campo, propriedades[prop]) - - # localidade - sql_localidade = ''' - select nom_localidade, sgl_uf from localidade - where cod_localidade = {}'''.format(propriedades['cod_localidade']) - [(casa.municipio, casa.uf)] = exec_legado(sql_localidade) - - # logotipo - migrar_logotipo(repo, casa, propriedades) - - casa.save() - - -def migrar_docs_por_ids(repo, model): - - for campo, base_origem in DOCS[model]: - print('#### Migrando {} de {} ####'.format(campo, model.__name__)) - - dir_origem, nome_origem = os.path.split( - join(repo.working_dir, base_origem)) - nome_origem = nome_origem.format('(\d+)') - pat = re.compile('^{}\.\w+$'.format(nome_origem)) - if not os.path.isdir(dir_origem): - print(' >>> O diretório {} não existe! Abortado.'.format( - dir_origem)) - continue - - matches = [pat.match(arq) for arq in os.listdir(dir_origem)] - ids_origens = [(int(m.group(1)), - join(dir_origem, m.group(0))) - for m in matches if m] - objetos = {obj.id: obj for obj in model.objects.all()} - upload_to = model._meta.get_field(campo).upload_to - tem_cropping = isinstance(model._meta.get_field(campo), ImageCropField) - - with transaction.atomic(): - for id, origem in ids_origens: - # associa documento ao objeto - obj = objetos.get(id) - if obj: - destino = upload_to(obj, os.path.basename(origem)) - mover_documento(repo, origem, destino) - setattr(obj, campo, destino) - if tem_cropping: - # conserta link do git annex (antes do commit) - # pois o conteúdo das imagens é acessado pelo cropping - repo.git.add(destino) - repo.git.execute('git annex fix'.split() + [destino]) - obj.save() - else: - msg = ' {} (pk={}) não encontrado para documento em [{}]' - print(msg.format(model.__name__, id, origem)) - - -def migrar_documentos(repo): - # aqui supomos que as pastas XSLT e sapl_documentos estão em - # com o conteúdo exportado do zope - # Os arquivos das pastas serão (git) MOVIDOS para a nova estrutura! - # - # Isto significa que para rodar novamente esta função é preciso - # restaurar o repo ao estado anterior - - mover_documento(repo, 'XSLT', 'sapl/public/XSLT', - ignora_origem_ausente=True) - - migrar_propriedades_da_casa(repo) - - # garante que o conteúdo das fotos dos parlamentares esteja presente - # (necessário para o cropping de imagem) - if os.path.exists( - os.path.join(repo.working_dir, 'sapl_documentos/parlamentar')): - repo.git.execute('git annex get sapl_documentos/parlamentar'.split()) - - for model in DOCS: - migrar_docs_por_ids(repo, model) - - # versiona modificações - repo.git.add('-A', '.') - repo.index.commit('Migração dos documentos completa') - - sobrando = [join(dir, file) - for (dir, _, files) in os.walk(join(repo.working_dir, - 'sapl_documentos')) - for file in files] - if sobrando: - print('\n#### Encerrado ####\n\n' - '{} documentos sobraram sem ser migrados!!!'.format( - len(sobrando))) - - -def corrigir_documentos_para_existentes(repo): - - for model, campos_bases in DOCS.items(): - if model == Parlamentar: - continue - for campo, base_origem in campos_bases: - print('#### Corrigindo {} de {} ####'.format(campo, - model.__name__)) - upload_to = model._meta.get_field(campo).upload_to - for obj in model.objects.all(): - if getattr(obj, campo): - continue - dir_upload_to = os.path.join( - repo.working_dir, upload_to(obj, '')) - achados = glob(dir_upload_to + '*') - if achados: - assert len(achados) == 1, 'Mais de um doc achado' - [achado] = achados - destino = upload_to(obj, os.path.basename(achado)) - print('-- {}'.format(destino)) - setattr(obj, campo, destino) - obj.save() diff --git a/sapl/legacy/migracao_usuarios.py b/sapl/legacy/migracao_usuarios.py deleted file mode 100644 index 6fa9cc7ea..000000000 --- a/sapl/legacy/migracao_usuarios.py +++ /dev/null @@ -1,109 +0,0 @@ -import yaml -from django.contrib.auth.models import Group, User -from unipath import Path - -from sapl.hashers import zope_encoded_password_to_django - -PERFIL_LEGADO_PARA_NOVO = {legado: Group.objects.get(name=novo) - for legado, novo in [ - ('Autor', 'Autor'), - ('Operador', 'Operador Geral'), - ('Operador Comissao', 'Operador de Comissões'), - ('Operador Materia', 'Operador de Matéria'), - ('Operador Modulo Administrativo', 'Operador Administrativo'), - ('Operador Norma', 'Operador de Norma Jurídica'), - ('Operador Parlamentar', 'Parlamentar'), - ('Operador Protocolo', 'Operador de Protocolo Administrativo'), - ('Operador Sessao Plenaria', 'Operador de Sessão Plenária'), - ('Parlamentar', 'Votante'), - ('Operador Painel', 'Operador de Painel Eletrônico'), -] -} - -ADMINISTRADORES = {'Administrador', 'Manager'} - -IGNORADOS = { - # sem significado fora do zope - 'Alterar Senha', 'Authenticated', 'Owner', - - # obsoletos (vide docs a seguir) - 'Operador Mesa Diretora', - 'Operador Ordem Dia', - 'Operador Tabela Auxiliar', - 'Operador Lexml', -} - - -def decode_nome(nome): - if isinstance(nome, bytes): - try: - return nome.decode('utf-8') - except UnicodeDecodeError: - return nome.decode('iso8859-1') - else: - assert isinstance(nome, str) - return nome - - -def migrar_usuarios(dir_repo): - """ - Lê o arquivo /usuarios.yaml e importa os usuários nele listados, - com senhas e perfis. - Os usuários são criados se necessário e seus perfis ajustados. - - Os seguintes perfis no legado não correspondem a nenhum no código atual - e estão sendo **ignorados**: - - * Operador Mesa Diretora - Apenas **8 usuários**, em todas as bases, têm esse perfil - e não têm nem "Operador" nem "Operador Sessao Plenaria" - - * Operador Ordem Dia - Apenas **16 usuários**, em todas as bases, têm esse perfil - e não têm nem "Operador" nem "Operador Sessao Plenaria" - - * Operador Tabela Auxiliar - A edição das tabelas auxiliares deve ser feita por um administrador - - * Operador Lexml - Também podemos assumir que essa é uma tarefa de um administrador - """ - - ARQUIVO_USUARIOS = Path(dir_repo).child('usuarios.yaml') - with open(ARQUIVO_USUARIOS, 'r') as f: - usuarios = yaml.load(f, yaml.Loader) - # conferimos de que só há um nome de usuário - assert all(nome == dados['name'] for nome, dados in usuarios.items()) - usuarios = [ - (decode_nome(nome), - # troca senha "inicial" (que existe em alguns zopes) - # por uma inutilizável - dados['__'] if dados['__'] != 'inicial' else None, - # filtra perfis ignorados - set(dados['roles']) - IGNORADOS) - for nome, dados in usuarios.items()] - - admins = [] - for nome, senha, perfis in usuarios: - usuario = User.objects.get_or_create(username=nome)[0] - usuario.password = zope_encoded_password_to_django(senha) - for perfil in perfis: - if perfil in ADMINISTRADORES: - # todos os administradores ganham perfil "Operador Geral" - usuario.groups.add(PERFIL_LEGADO_PARA_NOVO['Operador']) - admins.append(usuario) - else: - usuario.groups.add(PERFIL_LEGADO_PARA_NOVO[perfil]) - usuario.save() - - # configura administradores - for admin in admins: - admin.is_superuser = True - admin.save() - - print('Usuários migrados com sucesso.') - print('#' * 100) - print('Uusários administradores:') - for admin in admins: - print(admin.username) - print('#' * 100) diff --git a/sapl/legacy/models.py b/sapl/legacy/models.py deleted file mode 100644 index cd6d433df..000000000 --- a/sapl/legacy/models.py +++ /dev/null @@ -1,1101 +0,0 @@ -# This is an auto-generated Django model module. -# DO NOT EDIT THIS FILE !!! - -from django.db import models - - -class AcompMateria(models.Model): - cod_cadastro = models.AutoField(primary_key=True) - cod_materia = models.IntegerField() - end_email = models.CharField(max_length=100) - txt_hash = models.CharField(max_length=8) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'acomp_materia' - unique_together = (('cod_materia', 'end_email'),) - - -class Anexada(models.Model): - cod_materia_principal = models.IntegerField() - cod_materia_anexada = models.IntegerField() - dat_anexacao = models.DateField() - dat_desanexacao = models.DateField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'anexada' - unique_together = (('cod_materia_principal', 'cod_materia_anexada'),) - - -class AssuntoMateria(models.Model): - cod_assunto = models.IntegerField(primary_key=True) - des_assunto = models.CharField(max_length=200) - des_dispositivo = models.CharField(max_length=50) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'assunto_materia' - - -class AssuntoNorma(models.Model): - cod_assunto = models.AutoField(primary_key=True) - des_assunto = models.CharField(max_length=50) - des_estendida = models.CharField(max_length=250, blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'assunto_norma' - - -class Autor(models.Model): - cod_autor = models.AutoField(primary_key=True) - cod_partido = models.IntegerField(blank=True, null=True) - cod_comissao = models.IntegerField(blank=True, null=True) - cod_parlamentar = models.IntegerField(blank=True, null=True) - tip_autor = models.IntegerField() - nom_autor = models.CharField(max_length=50, blank=True, null=True) - des_cargo = models.CharField(max_length=50, blank=True, null=True) - col_username = models.CharField(max_length=50, blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'autor' - - -class Autoria(models.Model): - cod_autor = models.IntegerField() - cod_materia = models.IntegerField() - ind_primeiro_autor = models.IntegerField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'autoria' - unique_together = (('cod_autor', 'cod_materia'),) - - -class CargoComissao(models.Model): - cod_cargo = models.AutoField(primary_key=True) - des_cargo = models.CharField(max_length=50) - ind_unico = models.IntegerField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'cargo_comissao' - - -class CargoMesa(models.Model): - cod_cargo = models.AutoField(primary_key=True) - des_cargo = models.CharField(max_length=50) - ind_unico = models.IntegerField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'cargo_mesa' - - -class Coligacao(models.Model): - cod_coligacao = models.AutoField(primary_key=True) - num_legislatura = models.IntegerField() - nom_coligacao = models.CharField(max_length=50) - num_votos_coligacao = models.IntegerField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'coligacao' - - -class Comissao(models.Model): - cod_comissao = models.AutoField(primary_key=True) - tip_comissao = models.IntegerField() - nom_comissao = models.CharField(max_length=60) - sgl_comissao = models.CharField(max_length=10) - dat_criacao = models.DateField() - dat_extincao = models.DateField(blank=True, null=True) - nom_apelido_temp = models.CharField(max_length=100, blank=True, null=True) - dat_instalacao_temp = models.DateField(blank=True, null=True) - dat_final_prevista_temp = models.DateField(blank=True, null=True) - dat_prorrogada_temp = models.DateField(blank=True, null=True) - dat_fim_comissao = models.DateField(blank=True, null=True) - nom_secretario = models.CharField(max_length=30, blank=True, null=True) - num_tel_reuniao = models.CharField(max_length=15, blank=True, null=True) - end_secretaria = models.CharField(max_length=100, blank=True, null=True) - num_tel_secretaria = models.CharField(max_length=15, blank=True, null=True) - num_fax_secretaria = models.CharField(max_length=15, blank=True, null=True) - des_agenda_reuniao = models.CharField( - max_length=100, blank=True, null=True) - loc_reuniao = models.CharField(max_length=100, blank=True, null=True) - txt_finalidade = models.TextField(blank=True, null=True) - end_email = models.CharField(max_length=100, blank=True, null=True) - ind_unid_deliberativa = models.IntegerField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'comissao' - - -class ComposicaoColigacao(models.Model): - cod_partido = models.IntegerField() - cod_coligacao = models.IntegerField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'composicao_coligacao' - unique_together = (('cod_partido', 'cod_coligacao'),) - - -class ComposicaoComissao(models.Model): - cod_comp_comissao = models.AutoField(primary_key=True) - cod_parlamentar = models.IntegerField() - cod_comissao = models.IntegerField() - cod_periodo_comp = models.IntegerField() - cod_cargo = models.IntegerField() - ind_titular = models.IntegerField() - dat_designacao = models.DateField() - dat_desligamento = models.DateField(blank=True, null=True) - des_motivo_desligamento = models.CharField( - max_length=150, blank=True, null=True) - obs_composicao = models.CharField(max_length=150, blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'composicao_comissao' - - -class ComposicaoMesa(models.Model): - cod_parlamentar = models.IntegerField() - cod_sessao_leg = models.IntegerField() - cod_cargo = models.IntegerField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'composicao_mesa' - unique_together = (('cod_parlamentar', 'cod_sessao_leg', 'cod_cargo'),) - - -class Dependente(models.Model): - cod_dependente = models.AutoField(primary_key=True) - tip_dependente = models.IntegerField() - cod_parlamentar = models.IntegerField() - nom_dependente = models.CharField(max_length=50) - sex_dependente = models.CharField(max_length=1) - dat_nascimento = models.DateField(blank=True, null=True) - num_cpf = models.CharField(max_length=14, blank=True, null=True) - num_rg = models.CharField(max_length=15, blank=True, null=True) - num_tit_eleitor = models.CharField(max_length=15, blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'dependente' - - -class DespachoInicial(models.Model): - cod_materia = models.IntegerField() - num_ordem = models.IntegerField() - cod_comissao = models.IntegerField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'despacho_inicial' - unique_together = (('cod_materia', 'num_ordem'),) - - -class DocumentoAcessorio(models.Model): - cod_documento = models.AutoField(primary_key=True) - cod_materia = models.IntegerField() - tip_documento = models.IntegerField() - nom_documento = models.CharField(max_length=30) - dat_documento = models.DateField(blank=True, null=True) - nom_autor_documento = models.CharField( - max_length=50, blank=True, null=True) - txt_ementa = models.TextField(blank=True, null=True) - txt_indexacao = models.TextField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'documento_acessorio' - - -class DocumentoAcessorioAdministrativo(models.Model): - cod_documento_acessorio = models.AutoField(primary_key=True) - cod_documento = models.IntegerField() - tip_documento = models.IntegerField() - nom_documento = models.CharField(max_length=30) - nom_arquivo = models.CharField(max_length=100) - dat_documento = models.DateField(blank=True, null=True) - nom_autor_documento = models.CharField( - max_length=50, blank=True, null=True) - txt_assunto = models.TextField(blank=True, null=True) - txt_indexacao = models.TextField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'documento_acessorio_administrativo' - - -class DocumentoAdministrativo(models.Model): - cod_documento = models.AutoField(primary_key=True) - tip_documento = models.IntegerField() - num_documento = models.IntegerField() - ano_documento = models.SmallIntegerField() - dat_documento = models.DateField() - num_protocolo = models.IntegerField(blank=True, null=True) - txt_interessado = models.CharField(max_length=50, blank=True, null=True) - cod_autor = models.IntegerField(blank=True, null=True) - num_dias_prazo = models.IntegerField(blank=True, null=True) - dat_fim_prazo = models.DateField(blank=True, null=True) - ind_tramitacao = models.IntegerField() - txt_assunto = models.TextField() - txt_observacao = models.TextField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'documento_administrativo' - - -class ExpedienteMateria(models.Model): - cod_ordem = models.AutoField(primary_key=True) - cod_sessao_plen = models.IntegerField() - cod_materia = models.IntegerField() - dat_ordem = models.DateField() - txt_observacao = models.TextField(blank=True, null=True) - ind_excluido = models.IntegerField() - num_ordem = models.IntegerField() - txt_resultado = models.TextField(blank=True, null=True) - tip_votacao = models.IntegerField() - - class Meta: - managed = False - db_table = 'expediente_materia' - - -class ExpedienteSessaoPlenaria(models.Model): - cod_sessao_plen = models.IntegerField() - cod_expediente = models.IntegerField() - txt_expediente = models.TextField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'expediente_sessao_plenaria' - unique_together = (('cod_sessao_plen', 'cod_expediente'),) - - -class Filiacao(models.Model): - dat_filiacao = models.DateField() - cod_parlamentar = models.IntegerField() - cod_partido = models.IntegerField() - dat_desfiliacao = models.DateField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'filiacao' - unique_together = (('dat_filiacao', 'cod_parlamentar', 'cod_partido'),) - - -class LegislacaoCitada(models.Model): - cod_materia = models.IntegerField() - cod_norma = models.IntegerField() - des_disposicoes = models.CharField(max_length=15, blank=True, null=True) - des_parte = models.CharField(max_length=8, blank=True, null=True) - des_livro = models.CharField(max_length=7, blank=True, null=True) - des_titulo = models.CharField(max_length=7, blank=True, null=True) - des_capitulo = models.CharField(max_length=7, blank=True, null=True) - des_secao = models.CharField(max_length=7, blank=True, null=True) - des_subsecao = models.CharField(max_length=7, blank=True, null=True) - des_artigo = models.CharField(max_length=4, blank=True, null=True) - des_paragrafo = models.CharField(max_length=3, blank=True, null=True) - des_inciso = models.CharField(max_length=10, blank=True, null=True) - des_alinea = models.CharField(max_length=3, blank=True, null=True) - des_item = models.CharField(max_length=3, blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'legislacao_citada' - unique_together = (('cod_materia', 'cod_norma'),) - - -class Legislatura(models.Model): - num_legislatura = models.IntegerField(primary_key=True) - dat_inicio = models.DateField() - dat_fim = models.DateField() - dat_eleicao = models.DateField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'legislatura' - - -class LexmlRegistroProvedor(models.Model): - cod_provedor = models.AutoField(primary_key=True) - id_provedor = models.IntegerField() - nom_provedor = models.CharField(max_length=255) - sgl_provedor = models.CharField(max_length=15) - adm_email = models.CharField(max_length=50, blank=True, null=True) - nom_responsavel = models.CharField(max_length=255, blank=True, null=True) - tipo = models.CharField(max_length=50) - id_responsavel = models.IntegerField(blank=True, null=True) - xml_provedor = models.TextField(blank=True, null=True) - - class Meta: - managed = False - db_table = 'lexml_registro_provedor' - - -class LexmlRegistroPublicador(models.Model): - cod_publicador = models.AutoField(primary_key=True) - id_publicador = models.IntegerField() - nom_publicador = models.CharField(max_length=255) - adm_email = models.CharField(max_length=50, blank=True, null=True) - sigla = models.CharField(max_length=255, blank=True, null=True) - nom_responsavel = models.CharField(max_length=255, blank=True, null=True) - tipo = models.CharField(max_length=50) - id_responsavel = models.IntegerField() - - class Meta: - managed = False - db_table = 'lexml_registro_publicador' - - -class Localidade(models.Model): - cod_localidade = models.IntegerField(primary_key=True) - nom_localidade = models.CharField(max_length=50, blank=True, null=True) - nom_localidade_pesq = models.CharField( - max_length=50, blank=True, null=True) - tip_localidade = models.CharField(max_length=1, blank=True, null=True) - sgl_uf = models.CharField(max_length=2, blank=True, null=True) - sgl_regiao = models.CharField(max_length=2, blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'localidade' - - -class Mandato(models.Model): - cod_mandato = models.AutoField(primary_key=True) - cod_parlamentar = models.IntegerField() - tip_afastamento = models.IntegerField(blank=True, null=True) - num_legislatura = models.IntegerField() - cod_coligacao = models.IntegerField(blank=True, null=True) - tip_causa_fim_mandato = models.IntegerField(blank=True, null=True) - dat_fim_mandato = models.DateField(blank=True, null=True) - num_votos_recebidos = models.IntegerField(blank=True, null=True) - dat_expedicao_diploma = models.DateField(blank=True, null=True) - txt_observacao = models.TextField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'mandato' - - -class MateriaAssunto(models.Model): - cod_assunto = models.IntegerField() - cod_materia = models.IntegerField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'materia_assunto' - unique_together = (('cod_assunto', 'cod_materia'),) - - -class MateriaLegislativa(models.Model): - cod_materia = models.AutoField(primary_key=True) - tip_id_basica = models.IntegerField() - num_protocolo = models.IntegerField(blank=True, null=True) - num_ident_basica = models.IntegerField() - ano_ident_basica = models.SmallIntegerField() - dat_apresentacao = models.DateField(blank=True, null=True) - tip_apresentacao = models.CharField(max_length=1, blank=True, null=True) - cod_regime_tramitacao = models.IntegerField() - dat_publicacao = models.DateField(blank=True, null=True) - tip_origem_externa = models.IntegerField(blank=True, null=True) - num_origem_externa = models.CharField(max_length=10, blank=True, null=True) - ano_origem_externa = models.SmallIntegerField(blank=True, null=True) - dat_origem_externa = models.DateField(blank=True, null=True) - cod_local_origem_externa = models.IntegerField(blank=True, null=True) - nom_apelido = models.CharField(max_length=50, blank=True, null=True) - num_dias_prazo = models.IntegerField(blank=True, null=True) - dat_fim_prazo = models.DateField(blank=True, null=True) - ind_tramitacao = models.IntegerField() - ind_polemica = models.IntegerField(blank=True, null=True) - des_objeto = models.CharField(max_length=150, blank=True, null=True) - ind_complementar = models.IntegerField(blank=True, null=True) - txt_ementa = models.TextField() - txt_indexacao = models.TextField(blank=True, null=True) - txt_observacao = models.TextField(blank=True, null=True) - ind_excluido = models.IntegerField() - txt_resultado = models.TextField(blank=True, null=True) - - class Meta: - managed = False - db_table = 'materia_legislativa' - - -class MesaSessaoPlenaria(models.Model): - cod_cargo = models.IntegerField() - cod_sessao_leg = models.IntegerField() - cod_parlamentar = models.IntegerField() - cod_sessao_plen = models.IntegerField() - ind_excluido = models.IntegerField(blank=True, null=True) - - class Meta: - managed = False - db_table = 'mesa_sessao_plenaria' - unique_together = ( - ('cod_cargo', - 'cod_sessao_leg', - 'cod_parlamentar', - 'cod_sessao_plen'), - ) - - -class NivelInstrucao(models.Model): - cod_nivel_instrucao = models.AutoField(primary_key=True) - des_nivel_instrucao = models.CharField(max_length=50) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'nivel_instrucao' - - -class NormaJuridica(models.Model): - cod_norma = models.AutoField(primary_key=True) - tip_norma = models.IntegerField() - cod_materia = models.IntegerField(blank=True, null=True) - num_norma = models.IntegerField() - ano_norma = models.SmallIntegerField() - tip_esfera_federacao = models.CharField(max_length=1) - dat_norma = models.DateField(blank=True, null=True) - dat_publicacao = models.DateField(blank=True, null=True) - des_veiculo_publicacao = models.CharField( - max_length=30, blank=True, null=True) - num_pag_inicio_publ = models.IntegerField(blank=True, null=True) - num_pag_fim_publ = models.IntegerField(blank=True, null=True) - txt_ementa = models.TextField() - txt_indexacao = models.TextField(blank=True, null=True) - txt_observacao = models.TextField(blank=True, null=True) - ind_complemento = models.IntegerField(blank=True, null=True) - cod_assunto = models.CharField(max_length=16) - dat_vigencia = models.DateField(blank=True, null=True) - timestamp = models.DateTimeField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'norma_juridica' - - -class Numeracao(models.Model): - cod_materia = models.IntegerField() - num_ordem = models.IntegerField() - tip_materia = models.IntegerField() - num_materia = models.CharField(max_length=5) - ano_materia = models.SmallIntegerField() - dat_materia = models.DateField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'numeracao' - unique_together = (('cod_materia', 'num_ordem'),) - - -class Oradores(models.Model): - cod_sessao_plen = models.IntegerField() - cod_parlamentar = models.IntegerField() - num_ordem = models.IntegerField() - url_discurso = models.CharField(max_length=150, blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'oradores' - unique_together = (('cod_sessao_plen', 'cod_parlamentar'),) - - -class OradoresExpediente(models.Model): - cod_sessao_plen = models.IntegerField() - cod_parlamentar = models.IntegerField() - num_ordem = models.IntegerField() - url_discurso = models.CharField(max_length=150, blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'oradores_expediente' - unique_together = (('cod_sessao_plen', 'cod_parlamentar'),) - - -class OrdemDia(models.Model): - cod_ordem = models.AutoField(primary_key=True) - cod_sessao_plen = models.IntegerField() - cod_materia = models.IntegerField() - dat_ordem = models.DateField() - txt_observacao = models.TextField(blank=True, null=True) - ind_excluido = models.IntegerField() - num_ordem = models.IntegerField() - txt_resultado = models.TextField(blank=True, null=True) - tip_votacao = models.IntegerField() - - class Meta: - managed = False - db_table = 'ordem_dia' - - -class OrdemDiaPresenca(models.Model): - cod_presenca_ordem_dia = models.AutoField(primary_key=True) - cod_sessao_plen = models.IntegerField() - cod_parlamentar = models.IntegerField() - dat_ordem = models.DateField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'ordem_dia_presenca' - - -class Orgao(models.Model): - cod_orgao = models.AutoField(primary_key=True) - nom_orgao = models.CharField(max_length=60) - sgl_orgao = models.CharField(max_length=10) - ind_unid_deliberativa = models.IntegerField() - end_orgao = models.CharField(max_length=100, blank=True, null=True) - num_tel_orgao = models.CharField(max_length=50, blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'orgao' - - -class Origem(models.Model): - cod_origem = models.AutoField(primary_key=True) - sgl_origem = models.CharField(max_length=10) - nom_origem = models.CharField(max_length=50) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'origem' - - -class Parecer(models.Model): - cod_relatoria = models.IntegerField() - cod_materia = models.IntegerField() - tip_conclusao = models.CharField(max_length=3, blank=True, null=True) - tip_apresentacao = models.CharField(max_length=1) - txt_parecer = models.TextField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'parecer' - unique_together = (('cod_relatoria', 'cod_materia'),) - - -class Parlamentar(models.Model): - cod_parlamentar = models.AutoField(primary_key=True) - cod_nivel_instrucao = models.IntegerField(blank=True, null=True) - tip_situacao_militar = models.IntegerField(blank=True, null=True) - nom_completo = models.CharField(max_length=50) - nom_parlamentar = models.CharField(max_length=50, blank=True, null=True) - sex_parlamentar = models.CharField(max_length=1) - dat_nascimento = models.DateField(blank=True, null=True) - num_cpf = models.CharField(max_length=14, blank=True, null=True) - num_rg = models.CharField(max_length=15, blank=True, null=True) - num_tit_eleitor = models.CharField(max_length=15, blank=True, null=True) - cod_casa = models.IntegerField() - num_gab_parlamentar = models.CharField( - max_length=10, blank=True, null=True) - num_tel_parlamentar = models.CharField( - max_length=50, blank=True, null=True) - num_fax_parlamentar = models.CharField( - max_length=50, blank=True, null=True) - end_residencial = models.CharField(max_length=100, blank=True, null=True) - cod_localidade_resid = models.IntegerField(blank=True, null=True) - num_cep_resid = models.CharField(max_length=9, blank=True, null=True) - num_tel_resid = models.CharField(max_length=50, blank=True, null=True) - num_fax_resid = models.CharField(max_length=50, blank=True, null=True) - end_web = models.CharField(max_length=100, blank=True, null=True) - nom_profissao = models.CharField(max_length=50, blank=True, null=True) - end_email = models.CharField(max_length=100, blank=True, null=True) - des_local_atuacao = models.CharField(max_length=100, blank=True, null=True) - ind_ativo = models.IntegerField() - txt_biografia = models.TextField(blank=True, null=True) - ind_unid_deliberativa = models.IntegerField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'parlamentar' - - -class Partido(models.Model): - cod_partido = models.AutoField(primary_key=True) - sgl_partido = models.CharField(max_length=9) - nom_partido = models.CharField(max_length=50) - dat_criacao = models.DateField(blank=True, null=True) - dat_extincao = models.DateField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'partido' - - -class PeriodoCompComissao(models.Model): - cod_periodo_comp = models.AutoField(primary_key=True) - dat_inicio_periodo = models.DateField() - dat_fim_periodo = models.DateField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'periodo_comp_comissao' - - -class Proposicao(models.Model): - cod_proposicao = models.AutoField(primary_key=True) - cod_materia = models.IntegerField(blank=True, null=True) - cod_autor = models.IntegerField() - tip_proposicao = models.IntegerField() - dat_envio = models.DateTimeField() - dat_recebimento = models.DateTimeField(blank=True, null=True) - txt_descricao = models.CharField(max_length=100) - cod_mat_ou_doc = models.IntegerField(blank=True, null=True) - dat_devolucao = models.DateTimeField(blank=True, null=True) - txt_justif_devolucao = models.CharField( - max_length=200, blank=True, null=True) - num_proposicao = models.IntegerField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'proposicao' - - -class Protocolo(models.Model): - cod_protocolo = models.AutoField(primary_key=True) - num_protocolo = models.IntegerField(blank=True, null=True) - ano_protocolo = models.SmallIntegerField() - dat_protocolo = models.DateField() - hor_protocolo = models.TimeField() - dat_timestamp = models.DateTimeField() - tip_protocolo = models.IntegerField() - tip_processo = models.IntegerField() - txt_interessado = models.CharField(max_length=60, blank=True, null=True) - cod_autor = models.IntegerField(blank=True, null=True) - txt_assunto_ementa = models.TextField(blank=True, null=True) - tip_documento = models.IntegerField(blank=True, null=True) - tip_materia = models.IntegerField(blank=True, null=True) - num_paginas = models.IntegerField(blank=True, null=True) - txt_observacao = models.TextField(blank=True, null=True) - ind_anulado = models.IntegerField() - txt_user_anulacao = models.CharField(max_length=20, blank=True, null=True) - txt_ip_anulacao = models.CharField(max_length=15, blank=True, null=True) - txt_just_anulacao = models.CharField(max_length=60, blank=True, null=True) - timestamp_anulacao = models.DateTimeField(blank=True, null=True) - - class Meta: - managed = False - db_table = 'protocolo' - - -class RegimeTramitacao(models.Model): - cod_regime_tramitacao = models.AutoField(primary_key=True) - des_regime_tramitacao = models.CharField(max_length=50) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'regime_tramitacao' - - -class RegistroVotacao(models.Model): - cod_votacao = models.AutoField(primary_key=True) - tip_resultado_votacao = models.IntegerField() - cod_materia = models.IntegerField() - cod_ordem = models.IntegerField() - num_votos_sim = models.IntegerField() - num_votos_nao = models.IntegerField() - num_abstencao = models.IntegerField() - txt_observacao = models.TextField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'registro_votacao' - - -class RegistroVotacaoParlamentar(models.Model): - cod_votacao = models.IntegerField() - cod_parlamentar = models.IntegerField() - ind_excluido = models.IntegerField() - vot_parlamentar = models.CharField(max_length=10) - - class Meta: - managed = False - db_table = 'registro_votacao_parlamentar' - unique_together = (('cod_votacao', 'cod_parlamentar'),) - - -class Relatoria(models.Model): - cod_relatoria = models.AutoField(primary_key=True) - cod_materia = models.IntegerField() - cod_parlamentar = models.IntegerField() - tip_fim_relatoria = models.IntegerField(blank=True, null=True) - cod_comissao = models.IntegerField(blank=True, null=True) - dat_desig_relator = models.DateField() - dat_destit_relator = models.DateField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'relatoria' - - -class ReuniaoComissao(models.Model): - cod_reuniao = models.AutoField(primary_key=True) - cod_comissao = models.IntegerField() - num_reuniao = models.IntegerField() - dat_inicio_reuniao = models.DateField() - hr_inicio_reuniao = models.CharField(max_length=5, blank=True, null=True) - txt_observacao = models.TextField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'reuniao_comissao' - - -class SessaoLegislativa(models.Model): - cod_sessao_leg = models.AutoField(primary_key=True) - num_legislatura = models.IntegerField() - num_sessao_leg = models.IntegerField() - tip_sessao_leg = models.CharField(max_length=1) - dat_inicio = models.DateField() - dat_fim = models.DateField() - dat_inicio_intervalo = models.DateField(blank=True, null=True) - dat_fim_intervalo = models.DateField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'sessao_legislativa' - - -class SessaoPlenaria(models.Model): - cod_sessao_plen = models.AutoField(primary_key=True) - cod_andamento_sessao = models.IntegerField(blank=True, null=True) - tip_sessao = models.IntegerField() - cod_sessao_leg = models.IntegerField() - num_legislatura = models.IntegerField() - tip_expediente = models.CharField(max_length=10) - dat_inicio_sessao = models.DateField() - dia_sessao = models.CharField(max_length=15) - hr_inicio_sessao = models.CharField(max_length=5) - hr_fim_sessao = models.CharField(max_length=5, blank=True, null=True) - num_sessao_plen = models.IntegerField() - dat_fim_sessao = models.DateField(blank=True, null=True) - url_audio = models.CharField(max_length=150, blank=True, null=True) - url_video = models.CharField(max_length=150, blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'sessao_plenaria' - - -class SessaoPlenariaPresenca(models.Model): - cod_presenca_sessao = models.AutoField(primary_key=True) - cod_sessao_plen = models.IntegerField() - cod_parlamentar = models.IntegerField() - dat_sessao = models.DateField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'sessao_plenaria_presenca' - - -class StatusTramitacao(models.Model): - cod_status = models.AutoField(primary_key=True) - sgl_status = models.CharField(max_length=10) - des_status = models.CharField(max_length=60) - ind_fim_tramitacao = models.IntegerField() - ind_retorno_tramitacao = models.IntegerField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'status_tramitacao' - - -class StatusTramitacaoAdministrativo(models.Model): - cod_status = models.AutoField(primary_key=True) - sgl_status = models.CharField(max_length=10) - des_status = models.CharField(max_length=60) - ind_fim_tramitacao = models.IntegerField() - ind_retorno_tramitacao = models.IntegerField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'status_tramitacao_administrativo' - - -class TipoAfastamento(models.Model): - tip_afastamento = models.AutoField(primary_key=True) - des_afastamento = models.CharField(max_length=50) - ind_afastamento = models.IntegerField() - ind_fim_mandato = models.IntegerField() - des_dispositivo = models.CharField(max_length=50, blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tipo_afastamento' - - -class TipoAutor(models.Model): - tip_autor = models.IntegerField(primary_key=True) - des_tipo_autor = models.CharField(max_length=50) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tipo_autor' - - -class TipoComissao(models.Model): - tip_comissao = models.AutoField(primary_key=True) - nom_tipo_comissao = models.CharField(max_length=50) - sgl_natureza_comissao = models.CharField(max_length=1) - sgl_tipo_comissao = models.CharField(max_length=10) - des_dispositivo_regimental = models.CharField( - max_length=50, blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tipo_comissao' - - -class TipoDependente(models.Model): - tip_dependente = models.AutoField(primary_key=True) - des_tipo_dependente = models.CharField(max_length=50) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tipo_dependente' - - -class TipoDocumento(models.Model): - tip_documento = models.AutoField(primary_key=True) - des_tipo_documento = models.CharField(max_length=50) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tipo_documento' - - -class TipoDocumentoAdministrativo(models.Model): - tip_documento = models.AutoField(primary_key=True) - sgl_tipo_documento = models.CharField(max_length=5) - des_tipo_documento = models.CharField(max_length=50) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tipo_documento_administrativo' - - -class TipoExpediente(models.Model): - cod_expediente = models.AutoField(primary_key=True) - nom_expediente = models.CharField(max_length=100) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tipo_expediente' - - -class TipoFimRelatoria(models.Model): - tip_fim_relatoria = models.AutoField(primary_key=True) - des_fim_relatoria = models.CharField(max_length=50) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tipo_fim_relatoria' - - -class TipoMateriaLegislativa(models.Model): - tip_materia = models.AutoField(primary_key=True) - sgl_tipo_materia = models.CharField(max_length=5) - des_tipo_materia = models.CharField(max_length=50) - ind_num_automatica = models.IntegerField() - quorum_minimo_votacao = models.IntegerField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tipo_materia_legislativa' - - -class TipoNormaJuridica(models.Model): - tip_norma = models.AutoField(primary_key=True) - voc_lexml = models.CharField(max_length=50, blank=True, null=True) - sgl_tipo_norma = models.CharField(max_length=3) - des_tipo_norma = models.CharField(max_length=50) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tipo_norma_juridica' - - -class TipoNumeracaoProtocolo(models.Model): - seq_tip_num_protocolo = models.AutoField(primary_key=True) - tip_numeracao_protocolo = models.IntegerField() - des_numeracao_protocolo = models.CharField(max_length=50) - dat_inicial_protocolo = models.DateTimeField() - vlr_inicial_protocolo = models.IntegerField() - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tipo_numeracao_protocolo' - - -class TipoProposicao(models.Model): - tip_proposicao = models.AutoField(primary_key=True) - des_tipo_proposicao = models.CharField(max_length=50) - ind_mat_ou_doc = models.CharField(max_length=1) - tip_mat_ou_doc = models.IntegerField() - nom_modelo = models.CharField(max_length=50) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tipo_proposicao' - - -class TipoResultadoVotacao(models.Model): - tip_resultado_votacao = models.AutoField(primary_key=True) - nom_resultado = models.CharField(max_length=100) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tipo_resultado_votacao' - - -class TipoSessaoPlenaria(models.Model): - tip_sessao = models.AutoField(primary_key=True) - nom_sessao = models.CharField(max_length=30) - ind_excluido = models.IntegerField() - num_minimo = models.IntegerField() - - class Meta: - managed = False - db_table = 'tipo_sessao_plenaria' - - -class SituacaoMilitar(models.Model): - tip_situacao_militar = models.IntegerField(primary_key=True) - des_tipo_situacao = models.CharField(max_length=50) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tipo_situacao_militar' - - -class Tramitacao(models.Model): - cod_tramitacao = models.AutoField(primary_key=True) - cod_status = models.IntegerField(blank=True, null=True) - cod_materia = models.IntegerField() - dat_tramitacao = models.DateField(blank=True, null=True) - cod_unid_tram_local = models.IntegerField(blank=True, null=True) - dat_encaminha = models.DateField(blank=True, null=True) - cod_unid_tram_dest = models.IntegerField(blank=True, null=True) - ind_ult_tramitacao = models.IntegerField() - ind_urgencia = models.IntegerField() - sgl_turno = models.CharField(max_length=1, blank=True, null=True) - txt_tramitacao = models.TextField(blank=True, null=True) - dat_fim_prazo = models.DateField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tramitacao' - - -class TramitacaoAdministrativo(models.Model): - cod_tramitacao = models.AutoField(primary_key=True) - cod_documento = models.IntegerField() - dat_tramitacao = models.DateField(blank=True, null=True) - cod_unid_tram_local = models.IntegerField(blank=True, null=True) - dat_encaminha = models.DateField(blank=True, null=True) - cod_unid_tram_dest = models.IntegerField(blank=True, null=True) - cod_status = models.IntegerField(blank=True, null=True) - ind_ult_tramitacao = models.IntegerField() - txt_tramitacao = models.TextField(blank=True, null=True) - dat_fim_prazo = models.DateField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'tramitacao_administrativo' - - -class UnidadeTramitacao(models.Model): - cod_unid_tramitacao = models.AutoField(primary_key=True) - cod_comissao = models.IntegerField(blank=True, null=True) - cod_orgao = models.IntegerField(blank=True, null=True) - cod_parlamentar = models.IntegerField(blank=True, null=True) - ind_excluido = models.IntegerField() - - class Meta: - managed = False - db_table = 'unidade_tramitacao' - - -class VinculoNormaJuridica(models.Model): - cod_vinculo = models.AutoField(primary_key=True) - cod_norma_referente = models.IntegerField() - cod_norma_referida = models.IntegerField() - tip_vinculo = models.CharField(max_length=1, blank=True, null=True) - ind_excluido = models.CharField(max_length=1) - - class Meta: - managed = False - db_table = 'vinculo_norma_juridica' diff --git a/sapl/legacy/router.py b/sapl/legacy/router.py deleted file mode 100644 index 1aa51a46b..000000000 --- a/sapl/legacy/router.py +++ /dev/null @@ -1,22 +0,0 @@ -class LegacyRouter: - - def db_for_read(self, model, **hints): - if model._meta.app_label == 'legacy': - return 'legacy' - return None - - def db_for_write(self, model, **hints): - if model._meta.app_label == 'legacy': - return 'legacy' - return None - - def allow_relation(self, obj1, obj2, **hints): - if obj1._meta.app_label == 'legacy' \ - and obj2._meta.app_label == 'legacy': - return True - return None - - def allow_migrate(self, db, app_label, model_name=None, **hints): - if app_label == 'legacy': - return False - return None diff --git a/sapl/legacy/run_legacy_tests.sh b/sapl/legacy/run_legacy_tests.sh deleted file mode 100755 index 6b7491e81..000000000 --- a/sapl/legacy/run_legacy_tests.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -# All tests under this directory are excluded in default pytest.ini -# To run them use this script in this directory - -py.test --ds=sapl.legacy_migration_settings diff --git a/sapl/legacy/scripts/.flake8 b/sapl/legacy/scripts/.flake8 deleted file mode 100644 index 977657542..000000000 --- a/sapl/legacy/scripts/.flake8 +++ /dev/null @@ -1,3 +0,0 @@ -[flake8] -ignore = E501 - diff --git a/sapl/legacy/scripts/__init__.py b/sapl/legacy/scripts/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/sapl/legacy/scripts/exporta_zope/.gitignore b/sapl/legacy/scripts/exporta_zope/.gitignore deleted file mode 100644 index 11c2f1d6b..000000000 --- a/sapl/legacy/scripts/exporta_zope/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -Data*.fs* -sapl_documentos -XSLT diff --git a/sapl/legacy/scripts/exporta_zope/dump30.py b/sapl/legacy/scripts/exporta_zope/dump30.py deleted file mode 100644 index 471bef4e0..000000000 --- a/sapl/legacy/scripts/exporta_zope/dump30.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- - -from exporta_zope import (br, dump_folder, dump_propriedades, dump_usuarios, - get_app, logando_nao_identificados) - - -def dump_sapl30(): - """Extrai dados do zope de um sapl 3.0, que, ao que tudo indica: - * não possui a pasta XSLT - * usa um mountpoint separado para os documentos - * usa encoding utf-8 (ao invés de iso-8859-1) - """ - destino = '../../../../media' - data_fs_path = destino + '/Data.fs' - docs_path = destino + '/DocumentosSapl.fs' - - try: - app, close_db = get_app(data_fs_path) - sapl = br(app['sapl']) - dump_usuarios(sapl, destino) - finally: - close_db() - - try: - app, close_db = get_app(docs_path) - docs = br(app['sapl_documentos']) - with logando_nao_identificados(): - dump_folder(docs, destino) - dump_propriedades(docs, destino, 'utf-8') - finally: - close_db() diff --git a/sapl/legacy/scripts/exporta_zope/exporta_zope.py b/sapl/legacy/scripts/exporta_zope/exporta_zope.py deleted file mode 100755 index 36c570faa..000000000 --- a/sapl/legacy/scripts/exporta_zope/exporta_zope.py +++ /dev/null @@ -1,498 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# IMPORTANTE: -# Esse script precisa rodar em python 2 -# e depende apenas do descrito no arquivo requiments.txt - -import cStringIO -import hashlib -import mimetypes -import os -import sys -from collections import defaultdict -from contextlib import contextmanager -from functools import partial -from os.path import exists - -import git -import magic -import yaml -import ZODB.DB -import ZODB.FileStorage -from unipath import Path -from ZODB.broken import Broken -from ZODB.POSException import POSKeyError - -from variaveis_comuns import DIR_DADOS_MIGRACAO, TAG_ZOPE - -EXTENSOES = { - # docs - 'application/msword': '.doc', - 'application/pdf': '.pdf', - 'application/vnd.oasis.opendocument.text': '.odt', - 'application/vnd.ms-excel': '.xls', - 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': '.docx', # noqa - 'application/vnd.oasis.opendocument.text-template': '.ott', - 'application/vnd.ms-powerpoint': '.ppt', - 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': '.xlsx', # noqa - 'application/vnd.oasis.opendocument.spreadsheet': '.ods', - 'application/vnd.openxmlformats-officedocument.presentationml.presentation': '.pptx', # noqa - 'application/vnd.oasis.opendocument.graphics': '.odg', - - # incertos... associamos a extensão mais provável - 'application/vnd.ms-office': '.doc', - 'text/x-c++': '.cpp', - - # outros - 'application/xml': '.xml', - 'text/xml': '.xml', - 'application/zip': '.zip', - 'application/x-rar': '.rar', - 'application/x-dosexec': '.exe', - 'message/rfc822': '.mht', - 'text/richtext': '.rtx', - 'application/gzip': '.gz', - 'image/vnd.dwg': '*.dwg', - - # media - 'image/jpeg': '.jpeg', - 'image/png': '.png', - 'image/gif': '.gif', - 'text/html': '.html', - 'text/rtf': '.rtf', - 'text/x-python': '.py', - 'text/plain': '.txt', - 'SDE-Document': '.xml', - 'image/tiff': '.tiff', - 'application/tiff': '.tiff', - 'audio/x-wav': '.wav', - 'video/mp4': '.mp4', - 'image/x-icon': '.ico', - 'image/x-ms-bmp': '.bmp', - 'video/x-ms-asf': '.asf', - 'audio/mpeg': '.mp3', - 'video/x-flv': '.flv', - 'video/quicktime': '.mov', - - # sem extensao - 'application/octet-stream': '', # binário - 'inode/x-empty': '', # vazio - 'application/x-empty': '', # vazio - 'text/x-unknown-content-type': '', # desconhecido - 'application/CDFV2-unknown': '', # desconhecido -} - - -def br(obj): - if isinstance(obj, Broken): - return obj.__Broken_state__ - else: - return obj - - -def guess_extension(fullname, buffer): - # um corte de apenas 1024 impediu a detecção correta de .docx - mime = magic.from_buffer(buffer, mime=True) - extensao = EXTENSOES.get(mime) - if extensao is not None: - return extensao - else: - possibilidades = '\n'.join( - [" '{}': '{}',".format(mime, ext) - for ext in mimetypes.guess_all_extensions(mime)]) - print('''Extensão não conhecida para o arquivo: {} - e mimetype: {} - Algumas possibilidades são: - {} - Atualize o código do dicionário EXTENSOES! - '''.format(fullname, mime, possibilidades) - ) - return '.DESCONHECIDO.{}'.format(mime.replace('/', '__')) - - -CONTEUDO_ARQUIVO_CORROMPIDO = 'ARQUIVO CORROMPIDO' - - -def get_conteudo_file(doc): - # A partir daqui usamos dict.pop('...') nos __Broken_state__ - # para contornar um "vazamento" de memória que ocorre - # ao percorrer a árvore de objetos - # - # Imaginamos que, internamente, o ZODB está guardando referências - # para os objetos Broken criados e não conseguimos identificar como. - # - # Essa medida descarta quase todos os dados retornados - # e só funciona na primeira passagem - try: - pdata = br(doc.pop('data')) - if isinstance(pdata, str): - # Retrocedemos se pdata ja eh uma str (necessario em Images) - doc['data'] = pdata - pdata = doc - - output = cStringIO.StringIO() - while pdata: - output.write(pdata.pop('data')) - pdata = br(pdata.pop('next', None)) - - return output.getvalue() - except POSKeyError: - return CONTEUDO_ARQUIVO_CORROMPIDO - - -def dump_file(doc, path, salvar, get_conteudo=get_conteudo_file): - name = doc['__name__'] - fullname = os.path.join(path, name) - conteudo = get_conteudo(doc) - if conteudo == CONTEUDO_ARQUIVO_CORROMPIDO: - fullname = fullname + '_CORROMPIDO' - print('ATENÇÃO: arquivo corrompido: {}'.format(fullname)) - if conteudo: - # pula arquivos vazios - salvar(fullname, conteudo) - return name - - -def get_conteudo_dtml_method(doc): - return doc['raw'] - - -def print_msg_poskeyerror(id): - print('#' * 80) - print('#' * 80) - print('ATENÇÃO: DIRETÓRIO corrompido: {}'.format(id)) - print('#' * 80) - print('#' * 80) - - -def enumerate_by_key_list(folder, key_list, type_key): - for entry in folder.get(key_list, []): - id, meta_type = entry['id'], entry[type_key] - try: - obj = folder.get(id, None) - except POSKeyError: - print_msg_poskeyerror(id) - else: - yield id, obj, meta_type - - -enumerate_folder = partial(enumerate_by_key_list, - key_list='_objects', type_key='meta_type') - -enumerate_properties = partial(enumerate_by_key_list, - key_list='_properties', type_key='type') - - -def enumerate_btree(folder): - contagem_esperada = folder['_count'].value - tree = folder['_tree'] - contagem_real = 0 # para o caso em que não haja itens - try: - for contagem_real, (id, obj) in enumerate(tree.iteritems(), start=1): - meta_type = type(obj).__name__ - yield id, obj, meta_type - except POSKeyError: - print_msg_poskeyerror(folder['id']) - # verificação de consistência - if contagem_esperada != contagem_real: - print('ATENÇÃO: contagens diferentes na btree: ' - '{} esperada: {} real: {}'.format(folder['title'], - contagem_esperada, - contagem_real)) - - -nao_identificados = defaultdict(list) - - -@contextmanager -def logando_nao_identificados(): - nao_identificados.clear() - yield - if nao_identificados: - print('#' * 80) - print('#' * 80) - print('FORAM ENCONTRADOS ARQUIVOS DE FORMATO NÃO IDENTIFICADO!!!') - print('REFAÇA A EXPORTAÇÃO\n') - print(nao_identificados) - print('#' * 80) - print('#' * 80) - - -def dump_folder(folder, path, salvar, mtimes, enum=enumerate_folder): - name = folder['id'] - path = os.path.join(path, name) - if not exists(path): - os.makedirs(path) - for id, obj, meta_type in enum(folder): - # pula pastas *_old (presentes em várias bases) - if id.endswith('_old') and meta_type in ['Folder', 'BTreeFolder2']: - continue - dump = DUMP_FUNCTIONS.get(meta_type, '?') - if dump == '?': - nao_identificados[meta_type].append(path + '/' + id) - elif dump: - if isinstance(dump, partial) and dump.func == dump_folder: - try: - dump(br(obj), path, salvar, mtimes) - except POSKeyError as e: - print_msg_poskeyerror(id) - continue - else: - # se o objeto for mais recente que o da última exportação - mtime = obj._p_mtime - fullname = os.path.join(path, id) - if mtime > mtimes.get(fullname, 0): - id_interno = dump(br(obj), path, salvar) - assert id == id_interno - mtimes[fullname] = mtime - return name - - -def decode_iso8859(obj): - return obj.decode('iso8859-1') if isinstance(obj, str) else obj - - -def read_sde(element): - - def read_properties(): - for id, obj, meta_type in enumerate_properties(element): - yield id, decode_iso8859(br(obj)) - - def read_children(): - for id, obj, meta_type in enumerate_folder(element): - assert meta_type in ['SDE-Document-Element', - 'SDE-Template-Element', - 'SDE-Template-Link', - 'SDE-Template-Attribute', - 'Script (Python)', - ] - if meta_type != 'Script (Python)': - # ignoramos os scrips python de eventos dos templates - yield {'id': id, - 'meta_type': meta_type, - 'dados': read_sde(br(obj))} - - data = dict(read_properties()) - children = list(read_children()) - if children: - data['children'] = children - return data - - -def save_as_yaml(path, name, obj, salvar): - fullname = os.path.join(path, name) - conteudo = yaml.safe_dump(obj, allow_unicode=True) - salvar(fullname, conteudo) - - -def dump_sde(strdoc, path, salvar, tipo): - id = strdoc['id'] - sde = read_sde(strdoc) - save_as_yaml(path, '{}.{}.yaml'.format(id, tipo), sde, salvar) - return id - - -DUMP_FUNCTIONS = { - 'File': dump_file, - 'Image': dump_file, - 'DTML Method': partial(dump_file, - get_conteudo=get_conteudo_dtml_method), - 'DTMLMethod': partial(dump_file, - get_conteudo=get_conteudo_dtml_method), - 'Folder': partial(dump_folder, enum=enumerate_folder), - 'BTreeFolder2': partial(dump_folder, enum=enumerate_btree), - 'SDE-Document': partial(dump_sde, tipo='sde.document'), - 'StrDoc': partial(dump_sde, tipo='sde.document'), - 'SDE-Template': partial(dump_sde, tipo='sde.template'), - - # explicitamente ignorados - 'ZCatalog': None, - 'Dumper': None, - 'CachingPolicyManager': None, -} - - -def get_app(data_fs_path): - storage = ZODB.FileStorage.FileStorage(data_fs_path, read_only=True) - db = ZODB.DB(storage) - connection = db.open() - root = connection.root() - app = br(root['Application']) - - def close_db(): - db.close() - - return app, close_db - - -def find_sapl(app): - ids_meta_types = [(obj['id'], obj['meta_type']) for obj in app['_objects']] - # estar ordenado é muito importante para que a busca dê prioridade - # a um id "cm_zzz" antes do id "sapl" - for id, meta_type in sorted(ids_meta_types): - if id.startswith('cm_') and meta_type == 'Folder': - cm_zzz = br(app[id]) - return find_sapl(cm_zzz) - elif id == 'sapl' and meta_type in ['SAPL', 'Folder']: - sapl = br(app['sapl']) - return sapl - - -def detectar_encoding(fonte): - desc = magic.from_buffer(fonte) - for termo, enc in [('ISO-8859', 'latin1'), ('UTF-8', 'utf-8')]: - if termo in desc: - return enc - return None - - -def autodecode(fonte): - if isinstance(fonte, str): - enc = detectar_encoding(fonte) - return fonte.decode(enc) if enc else fonte - else: - return fonte - - -def dump_propriedades(docs, path, salvar): - props_sapl = br(docs['props_sapl']) - ids = [p['id'] for p in props_sapl['_properties']] - props = {id: props_sapl[id] for id in ids} - props = {id: autodecode(p) for id, p in props.items()} - save_as_yaml(path, 'sapl_documentos/propriedades.yaml', props, salvar) - - -def dump_usuarios(sapl, path, salvar): - users = br(br(sapl['acl_users'])['data']) - users = {autodecode(k): br(v) for k, v in users['data'].items()} - for dados in users.values(): - dados['name'] = autodecode(dados['name']) - save_as_yaml(path, 'usuarios.yaml', users, salvar) - - -def _dump_sapl(data_fs_path, documentos_fs_path, destino, salvar, mtimes): - assert exists(data_fs_path) - assert exists(documentos_fs_path) - # precisamos trabalhar com strings e não Path's para as comparações de mtimes - data_fs_path, documentos_fs_path, destino = map(str, ( - data_fs_path, documentos_fs_path, destino)) - - app, close_db = get_app(data_fs_path) - try: - sapl = find_sapl(app) - # extrai usuários com suas senhas e perfis - dump_usuarios(sapl, destino, salvar) - - # extrai folhas XSLT (primeira tentativa) - if 'XSLT' in sapl: - dump_folder(br(sapl['XSLT']), destino, salvar, mtimes) - - finally: - close_db() - - app, close_db = get_app(documentos_fs_path) - - try: - sapl = find_sapl(app) - if sapl == {'id': 'sapl'}: - # em algumas instalações sapl_documentos está direto na raiz - docs = br(app['sapl_documentos']) - else: - # caso mais comum - docs = br(sapl['sapl_documentos']) - - # extrai folhas XSLT (segunda tentativa) - if 'XSLT' in sapl: - dump_folder(br(sapl['XSLT']), destino, salvar, mtimes) - - # extrai documentos - with logando_nao_identificados(): - dump_folder(docs, destino, salvar, mtimes) - dump_propriedades(docs, destino, salvar) - finally: - close_db() - - -def repo_execute(repo, cmd, *args): - return repo.git.execute(cmd.split() + list(args)) - - -def ajusta_extensao(fullname, conteudo): - base, extensao = os.path.splitext(fullname) - if extensao not in ['.xsl', '.xslt', '.yaml', '.css']: - extensao = guess_extension(fullname, conteudo) - return base + extensao, extensao - - -def build_salvar(repo): - - def salvar(fullname, conteudo): - fullname, extensao = ajusta_extensao(fullname, conteudo) - - # ajusta caminhos XSLT p conteúdos relacionados ao SDE - if extensao in ['.xsl', '.xslt', '.xml']: - conteudo = conteudo.replace('"XSLT/HTML', '"/XSLT/HTML') - - if exists(fullname): - # destrava arquivo pré-existente (o conteúdo mudou) - repo_execute(repo, 'git annex unlock', fullname) - with open(fullname, 'w') as arq: - arq.write(conteudo) - print(fullname) - - return salvar - - -def dump_sapl(sigla): - sigla = sigla[-3:] # ignora prefixo (por ex. 'sapl_cm_') - data_fs_path, documentos_fs_path = [ - DIR_DADOS_MIGRACAO.child( - 'datafs', '{}_cm_{}.fs'.format(prefixo, sigla)) - for prefixo in ('Data', 'DocumentosSapl')] - - assert exists(data_fs_path), 'Origem não existe: {}'.format(data_fs_path) - if not exists(documentos_fs_path): - documentos_fs_path = data_fs_path - - nome_banco_legado = 'sapl_cm_{}'.format(sigla) - destino = DIR_DADOS_MIGRACAO.child('repos', nome_banco_legado) - destino.mkdir(parents=True) - repo = git.Repo.init(destino) - if TAG_ZOPE in repo.tags: - print('{}: A exportação de documentos já está feita -- abortando'.format(sigla)) - return - - repo_execute(repo, 'git annex init') - repo_execute(repo, 'git config annex.thin true') - - salvar = build_salvar(repo) - try: - finalizado = False - arq_mtimes = Path(repo.working_dir, 'mtimes.yaml') - mtimes = yaml.load( - arq_mtimes.read_file(), - yaml.Loader - ) if arq_mtimes.exists() else {} - _dump_sapl(data_fs_path, documentos_fs_path, destino, salvar, mtimes) - finalizado = True - finally: - # grava mundaças - repo_execute(repo, 'git annex add sapl_documentos') - arq_mtimes.write_file(yaml.safe_dump(mtimes, allow_unicode=True)) - repo.git.add(A=True) - # atualiza repo - if 'master' not in repo.heads or repo.index.diff('HEAD'): - # se de fato existe mudança - status = 'completa' if finalizado else 'parcial' - repo.index.commit(u'Exportação do zope {}'.format(status)) - if finalizado: - repo.git.execute('git tag -f'.split() + [TAG_ZOPE]) - - -if __name__ == "__main__": - if len(sys.argv) == 2: - sigla = sys.argv[1] - dump_sapl(sigla) - else: - print('Uso: python exporta_zope ') diff --git a/sapl/legacy/scripts/exporta_zope/requirements.txt b/sapl/legacy/scripts/exporta_zope/requirements.txt deleted file mode 100644 index 69305576b..000000000 --- a/sapl/legacy/scripts/exporta_zope/requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -# ZODB version 3.7.4 -ZODB==5.3.0 -PyYAML -Unipath -GitPython -pyaml -python-magic -ipython diff --git a/sapl/legacy/scripts/exporta_zope/variaveis_comuns.py b/sapl/legacy/scripts/exporta_zope/variaveis_comuns.py deleted file mode 100644 index e773f0717..000000000 --- a/sapl/legacy/scripts/exporta_zope/variaveis_comuns.py +++ /dev/null @@ -1,4 +0,0 @@ -from unipath import Path - -DIR_DADOS_MIGRACAO = Path('~/migracao_sapl/').expand() -TAG_ZOPE = 'zope' diff --git a/sapl/legacy/scripts/migra_dbs.sh b/sapl/legacy/scripts/migra_dbs.sh deleted file mode 100755 index 891263d40..000000000 --- a/sapl/legacy/scripts/migra_dbs.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -# rodar esse script na raiz do projeto - - -if [ $# -ge 1 ]; then - # mysql com senha - parallel -eta --verbose -j+0 ./sapl/legacy/scripts/migra_um_db.sh :::: <(mysql -u $1 -p$2 -e 'show databases;' | grep '^sapl_') ::: $1 ::: $2 -elif [ $# -ge 0 ]; then - # mysql sem senha - parallel -eta --verbose -j+0 ./sapl/legacy/scripts/migra_um_db.sh :::: <(mysql -u $1 -e 'show databases;' | grep '^sapl_') ::: $1 -else - echo "USO:" - echo " $0 [senha mysql]" -fi; \ No newline at end of file diff --git a/sapl/legacy/scripts/migra_um_db.sh b/sapl/legacy/scripts/migra_um_db.sh deleted file mode 100755 index 20556ae18..000000000 --- a/sapl/legacy/scripts/migra_um_db.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash - -# rodar esse script na raiz do projeto -if [ $# -eq 1 ]; then - - DIR_MIGRACAO=~/migracao_sapl - - DATE=$(date +%Y-%m-%d) - DIR_LOGS=$DIR_MIGRACAO/logs/$DATE - mkdir -p $DIR_LOGS - - LOG="$DIR_LOGS/$1.migracao.log" - rm -f $LOG - - echo "########################################" | tee -a $LOG - echo "MIGRANDO BANCO $1" | tee -a $LOG - echo "########################################" | tee -a $LOG - echo >> $LOG - - echo "--- MIGRACAO ---" | tee -a $LOG - echo >> $LOG - DATABASE_NAME=$1 ./manage.py migracao_25_31 --settings sapl.legacy_migration_settings 2>&1 | tee -a $LOG - echo >> $LOG -else - echo "USO:" - echo " $0 " -fi; diff --git a/sapl/legacy/scripts/normaliza_dump_mysql.py b/sapl/legacy/scripts/normaliza_dump_mysql.py deleted file mode 100755 index a56d74b3a..000000000 --- a/sapl/legacy/scripts/normaliza_dump_mysql.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python -import re -import sys - -from unipath import Path - -cabecalho = ''' -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - -/*!40000 DROP DATABASE IF EXISTS `{banco}`*/; - -CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{banco}` /*!40100 DEFAULT CHARACTER SET latin1 */; - -USE `{banco}`; - -''' - - -def normaliza_dump_mysql(nome_arquivo): - arquivo = Path(nome_arquivo).expand() - banco = arquivo.stem - conteudo = arquivo.read_file() - inicio = re.finditer('--\n-- Table structure for table .*\n--\n', conteudo) - inicio = next(inicio).start() - conteudo = cabecalho.format(banco=banco) + conteudo[inicio:] - arquivo.write_file(conteudo) - - -if __name__ == "__main__": - nome_aquivo = sys.argv[1] - normaliza_dump_mysql(nome_aquivo) diff --git a/sapl/legacy/scripts/recria_dbs_postgres.sh b/sapl/legacy/scripts/recria_dbs_postgres.sh deleted file mode 100755 index a5eab1ed7..000000000 --- a/sapl/legacy/scripts/recria_dbs_postgres.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -# (Re)cria todos os bancos postgres para migração -# cria um banco postgres (de mesmo nome) para cada banco mysql cujo nome começa com "sapl_" - -if [ $# -eq 2 ]; then - parallel --verbose -j+0 ./recria_um_db_postgres.sh :::: <(mysql -u $1 -p$2 -e 'show databases;' | grep '^sapl_' | grep -v '_copy$') -else - echo "USO:" - echo " $0 [usuário mysql] [senha mysql]" -fi; \ No newline at end of file diff --git a/sapl/legacy/scripts/recria_um_db_postgres.sh b/sapl/legacy/scripts/recria_um_db_postgres.sh deleted file mode 100755 index a98056f13..000000000 --- a/sapl/legacy/scripts/recria_um_db_postgres.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -# (Re)cria um db postgres -# uso: recria_um_db_postgres - -set -e # Exit immediately if a command exits with a non-zero status - -echo "Database $1" -sudo -u postgres psql -c "drop DATABASE if exists $1" -sudo -u postgres psql -c "CREATE DATABASE $1 WITH OWNER = sapl ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'pt_BR.UTF-8' LC_CTYPE = 'pt_BR.UTF-8' CONNECTION LIMIT = -1 TEMPLATE template0;" - - -echo "--- DJANGO MIGRATE ---" | tee -a $LOG -DATABASE_NAME=$1 ./manage.py migrate --settings sapl.legacy_migration_settings - diff --git a/sapl/legacy/scripts/ressuscita_dependencias.py b/sapl/legacy/scripts/ressuscita_dependencias.py deleted file mode 100644 index e45143567..000000000 --- a/sapl/legacy/scripts/ressuscita_dependencias.py +++ /dev/null @@ -1,427 +0,0 @@ -from collections import OrderedDict -from textwrap import dedent - -import texttable -import yaml -from unipath import Path - -from sapl.legacy.migracao_dados import (PROPAGACOES_DE_EXCLUSAO, - campos_novos_para_antigos, exec_legado, - get_arquivo_ajustes_pre_migracao, - models_novos_para_antigos) -from sapl.legacy_migration_settings import (DIR_DADOS_MIGRACAO, DIR_REPO, - NOME_BANCO_LEGADO) - - -def stripsplit(ll): - return [l.split() for l in ll.strip().splitlines()] - - -def _tab_legado(model): - return models_novos_para_antigos[model]._meta.db_table - - -fks_legado = { - (_tab_legado(m), campos_novos_para_antigos[f]): _tab_legado(f.related_model) # noqa - for m in models_novos_para_antigos - for f in m._meta.fields - if f in campos_novos_para_antigos and f.related_model} - -# acrescenta mapeamentos que não existem em campos_novos_para_antigos -for tabela_origem, campo, tabela_destino in [ - ['autor', 'cod_parlamentar', 'parlamentar'], - ['autor', 'cod_comissao', 'comissao'], - ['autor', 'cod_partido', 'partido']]: - fks_legado[(tabela_origem, campo)] = tabela_destino - - -urls = ''' -autor /sistema/autor -cargo_comissao /sistema/comissao/cargo -legislatura /sistema/parlamentar/legislatura -materia_legislativa /materia -norma_juridica /norma -parlamentar /parlamentar -sessao_legislativa /sistema/mesa-diretora/sessao-legislativa -sessao_plenaria /sessao -status_tramitacao /sistema/materia/status-tramitacao -tipo_autor /sistema/autor/tipo -tipo_expediente /sistema/sessao-plenaria/tipo-expediente -tipo_proposicao /sistema/proposicao/tipo -tipo_resultado_votacao /sistema/sessao-plenaria/tipo-resultado-votacao -unidade_tramitacao /sistema/materia/unidade-tramitacao -tipo_documento /sistema/materia/tipo-documento -orgao /sistema/materia/orgao -tipo_sessao_plenaria /sistema/sessao-plenaria/tipo -cargo_mesa /sistema/mesa-diretora/cargo-mesa -documento_administrativo /docadm -tipo_materia_legislativa /sistema/materia/tipo -tipo_norma_juridica /sistema/norma/tipo -comissao /comissao -assunto_materia /sistema/assunto-materia -coligacao /sistema/coligacao -nivel_instrucao /sistema/parlamentar/nivel-instrucao -partido /sistema/parlamentar/partido -regime_tramitacao /sistema/materia/regime-tramitacao -tipo_comissao /sistema/comissao/tipo -tipo_documento_administrativo /sistema/tipo-documento-adm -registro_votacao /admin/sessao/registrovotacao -tipo_dependente /sistema/parlamentar/tipo-dependente -origem /sistema/materia/origem -documento_acessorio /materia/documentoacessorio -tipo_fim_relatoria /sistema/materia/tipo-fim-relatoria -tipo_situacao_militar /sistema/parlamentar/tipo-militar -''' -urls = dict(stripsplit(urls)) - - -def get_tabela_campo_tipo_proposicao(tip_proposicao): - [(ind_mat_ou_doc,)] = exec_legado(''' - select ind_mat_ou_doc from tipo_proposicao where tip_proposicao = {}; - '''.format(tip_proposicao)) - if ind_mat_ou_doc == 'M': - return 'tipo_materia_legislativa', 'tip_materia' - elif ind_mat_ou_doc == 'D': - return 'tipo_documento', 'tip_documento' - else: - raise(Exception('ind_mat_ou_doc inválido')) - - -CAMPOS_ORIGEM_PARA_ALVO = { - 'cod_unid_tram_dest': 'cod_unid_tramitacao', - 'cod_unid_tram_local': 'cod_unid_tramitacao', - 'tip_id_basica': 'tip_materia', - 'cod_local_origem_externa': 'cod_origem', -} - - -def get_excluido(fk): - tabela_origem, campo, valor = [fk[k] for k in ('tabela', 'campo', 'valor')] - - if tabela_origem == 'tipo_proposicao': - tip_proposicao = fk['pk']['tip_proposicao'] - tabela_alvo, campo = get_tabela_campo_tipo_proposicao(tip_proposicao) - elif tabela_origem == 'proposicao' and campo == 'cod_mat_ou_doc': - [(ind_mat_ou_doc,)] = exec_legado(''' - select ind_mat_ou_doc from - proposicao p inner join tipo_proposicao t - on p.tip_proposicao = t.tip_proposicao - where cod_proposicao = {}; - '''.format(fk['pk']['cod_proposicao'])) - if ind_mat_ou_doc == 'M': - tabela_alvo, campo = 'materia_legislativa', 'cod_materia' - elif ind_mat_ou_doc == 'D': - tabela_alvo, campo = 'documento_acessorio', 'cod_documento' - else: - raise(Exception('ind_mat_ou_doc inválido')) - else: - tabela_alvo = fks_legado[(tabela_origem, campo)] - - # troca nome de campo pelo correspondente na tabela alvo - campo = CAMPOS_ORIGEM_PARA_ALVO.get(campo, campo) - - sql = 'select ind_excluido, t.* from {} t where {} = {}'.format( - tabela_alvo, campo, valor) - res = list(exec_legado(sql)) - return tabela_origem, campo, valor, tabela_alvo, res - - -def get_desc_materia(cod_materia): - sql = ''' - select t.sgl_tipo_materia, t.des_tipo_materia, - m.num_ident_basica, m.ano_ident_basica - from materia_legislativa m inner join tipo_materia_legislativa t - on m.tip_id_basica = t.tip_materia - where cod_materia = {}; - '''.format(cod_materia) - return list(exec_legado(sql))[0] - - -def get_link_proposicao(cod_proposicao, slug): - url_base = get_url(slug) - return 'http://{}/cadastros/proposicao/proposicao_mostrar_proc?cod_proposicao={}'.format( # noqa - url_base, cod_proposicao) - - -def get_apaga_materias_de_proposicoes(fks, slug): - refs_materias = [['id proposicao', 'sigla tipo matéria', - 'tipo matéria', 'número matéria', 'ano matéria']] - sqls = [] - cods_proposicoes = [] - - for fk in fks: - cod_proposicao = fk['pk']['cod_proposicao'] - cods_proposicoes.append(cod_proposicao) - assert fk['campo'] == 'cod_materia' - up = 'update proposicao set cod_materia = NULL where cod_proposicao = {};' # noqa - refs_materias.append( - [cod_proposicao, *get_desc_materia(fk['valor'])]) - sqls.append(up.format(cod_proposicao)) - - table = texttable.Texttable() - table.set_cols_width([10, 10, 50, 10, 10]) - table.set_deco(table.VLINES | table.HEADER) - table.add_rows(refs_materias) - - links = '\n'.join([get_link_proposicao(p, slug) - for p in cods_proposicoes]) - sqls = '\n'.join(sqls) - if not sqls: - return '' - else: - return ''' -/* REFERÊNCIAS A MATÉRIAS APAGADAS DE PROPOSIÇÕES - -ATENÇÃO - -As seguintes proposições apontaram no passado para matérias -e esses apontamentos foram em algum momento retirados. - -Elas foram migradas da forma com estão agora: sem apontar para nenhuma matéria. -Entretanto, talvez você deseje rever esses apontamentos. - -Segue então uma lista dos apontamentos anteriores que detectamos. - -{} - -Para facilitar sua conferência, seguem os links para as proposições envolvidas: - -{} - -*/ - -{} - - '''.format(table.draw(), links, sqls) - - -def get_dependencias_a_ressuscitar(slug): - ocorrencias = yaml.load( - Path(DIR_REPO.child('ocorrencias.yaml').read_file()), - yaml.Loader - ) - fks_faltando = ocorrencias.get('fk') - if not fks_faltando: - return [], [], [] - - proposicoes_para_materia = [ - fk for fk in fks_faltando - if fk['tabela'] == 'proposicao' and fk['campo'] == 'cod_materia'] - - preambulo = get_apaga_materias_de_proposicoes( - proposicoes_para_materia, slug) - - propagacoes = {(o, c) for t, o, c in PROPAGACOES_DE_EXCLUSAO} - - fks_faltando = [fk for fk in fks_faltando - if fk not in proposicoes_para_materia - and (fk['tabela'], fk['campo']) not in propagacoes] - - excluidos = [get_excluido(fk) for fk in fks_faltando] - desexcluir, criar = [ - set([(tabela_alvo, campo, valor) - for tabela_origem, campo, valor, tabela_alvo, res in excluidos - if condicao(res)]) - for condicao in ( - # o registro existe e ind_excluido == 1 - lambda res: res and res[0][0] == 1, - # o registro não existe - lambda res: not res - )] - return preambulo, desexcluir, criar - - -# deve ser idempotente pois é usada na criação de autor -# por isso o ON DUPLICATE KEY UPDATE -SQL_INSERT_TIPO_AUTOR = ''' - insert into tipo_autor (tip_autor, des_tipo_autor, ind_excluido) - values ({}, "DESCONHECIDO", 0) ON DUPLICATE KEY UPDATE ind_excluido = 0; - ''' - -# deve ser idempotente pois é usada na criação de comissao -# por isso o ON DUPLICATE KEY UPDATE -SQL_INSERT_TIPO_COMISSAO = ''' - insert into tipo_comissao (tip_comissao, nom_tipo_comissao, sgl_natureza_comissao, sgl_tipo_comissao, des_dispositivo_regimental, ind_excluido) - values ({}, "DESCONHECIDO", "P", "DESC", NULL, 0) - ON DUPLICATE KEY UPDATE ind_excluido = 0; - ''' - -SQLS_CRIACAO = [ - ('tipo_proposicao', ''' - insert into tipo_materia_legislativa ( - tip_materia, sgl_tipo_materia, des_tipo_materia, ind_num_automatica, - quorum_minimo_votacao, ind_excluido) - values (0, "DESC", "DESCONHECIDO", 0, 0, 0); - - insert into tipo_proposicao ( - tip_proposicao, des_tipo_proposicao, ind_mat_ou_doc, tip_mat_ou_doc, - nom_modelo, ind_excluido) - values ({}, "DESCONHECIDO", "M", 0, "DESCONHECIDO", 0); - ''', ['tipo_materia_legislativa', 0] - ), - ('tipo_resultado_votacao', ''' - insert into tipo_resultado_votacao ( - tip_resultado_votacao, nom_resultado, ind_excluido) - values ({}, "DESCONHECIDO", 0); - '''), - ('tipo_autor', SQL_INSERT_TIPO_AUTOR), - ('unidade_tramitacao', ''' - insert into unidade_tramitacao ( - cod_unid_tramitacao, cod_comissao, cod_orgao, cod_parlamentar, ind_excluido) - values ({}, NULL, NULL, 0, 0); - '''), - ('autor', SQL_INSERT_TIPO_AUTOR.format(0) + ''' - insert into autor ( - cod_autor, cod_partido, cod_comissao, cod_parlamentar, tip_autor, - nom_autor, des_cargo, col_username, ind_excluido) - values ({}, 0, 0, 0, 0, "DESCONHECIDO", "DESCONHECIDO", NULL, 0); - '''), - ('tipo_documento', ''' - insert into tipo_documento (tip_documento, des_tipo_documento, ind_excluido) - values ({}, "DESCONHECIDO", 0); - '''), - ('partido', ''' - insert into partido (cod_partido, sgl_partido, nom_partido, dat_criacao, dat_extincao, ind_excluido) - values ({}, "DESC", "DESCONHECIDO", NULL, NULL, 0); - '''), - ('legislatura', ''' - insert into legislatura (num_legislatura, dat_inicio, dat_fim, dat_eleicao, ind_excluido) - values ({}, "1/1/1", "1/1/1", "1/1/1", 0); - '''), - ('cargo_mesa', ''' - insert into cargo_mesa (cod_cargo, des_cargo, ind_unico, ind_excluido) - values ({}, "DESCONHECIDO", 0, 0); - '''), - ('orgao', ''' - insert into orgao (cod_orgao, nom_orgao, sgl_orgao, ind_unid_deliberativa, end_orgao, num_tel_orgao, ind_excluido) - values ({}, "DESCONHECIDO", "DESC", 0, NULL, NULL, 0); - '''), - ('origem', ''' - insert into origem (cod_origem, sgl_origem, nom_origem, ind_excluido) - values ({}, "DESC", "DESCONHECIDO", 0); - '''), - ('tipo_comissao', SQL_INSERT_TIPO_COMISSAO), - ('comissao', SQL_INSERT_TIPO_COMISSAO.format(0) + ''' - insert into comissao (cod_comissao, tip_comissao, nom_comissao, sgl_comissao, dat_criacao, - ind_unid_deliberativa, ind_excluido) - values ({}, 0, "DESCONHECIDO", "DESC", "1-1-1", 0, 0); - '''), - ('parlamentar', ''' - insert into parlamentar (cod_parlamentar, nom_completo, nom_parlamentar, sex_parlamentar, cod_casa, ind_ativo, ind_unid_deliberativa, ind_excluido) - values ({}, "DESCONHECIDO", "DESCONHECIDO", "M", 0, 0, 0, 0); - '''), - ('tipo_sessao_plenaria', ''' - insert into tipo_sessao_plenaria (tip_sessao, nom_sessao, ind_excluido, num_minimo) values ({}, "DESCONHECIDO", 0, 0); - '''), -] -SQLS_CRIACAO = {k: (dedent(sql.strip()), extras) - for k, sql, *extras in SQLS_CRIACAO} - - -def criar_sessao_legislativa(campo, valor): - assert campo == 'cod_sessao_leg' - [(num_legislatura,)] = exec_legado( - 'select min(num_legislatura) from legislatura where ind_excluido <> 1') - return ''' -insert into sessao_legislativa ( - cod_sessao_leg, num_legislatura, num_sessao_leg, tip_sessao_leg, - dat_inicio, dat_fim, dat_inicio_intervalo, dat_fim_intervalo, -ind_excluido) values ({}, {}, 0, "O", - "1900-01-01", "1900-01-02", "1900-01-01", "1900-01-02", 0); - '''.format(valor, num_legislatura) - - -def get_link(tabela_alvo, valor, slug): - url_base = get_url(slug) - return 'http://{}{}/{}'.format(url_base, urls[tabela_alvo], valor) - - -def get_sql_desexcluir(tabela_alvo, campo, valor, slug): - sql = 'update {} set ind_excluido = 0 where {} = {};'.format( - tabela_alvo, campo, valor) - return sql, [get_link(tabela_alvo, valor, slug)] - - -def get_sql_criar(tabela_alvo, campo, valor, slug): - if tabela_alvo == 'sessao_legislativa': - sql = criar_sessao_legislativa(campo, valor) - extras = [] - else: - sql, extras = SQLS_CRIACAO[tabela_alvo] - sql = sql.format(valor) - links = [get_link(tabela_alvo, valor, slug)] - for tabela_extra, valor_extra in extras: - links.insert(0, get_link(tabela_extra, valor_extra, slug)) - return sql, links - - -TEMPLATE_RESSUSCITADOS = '''{} -/* RESSUSCITADOS - - -SOBRE REGISTROS QUE ESTAVAM APAGADOS E FORAM RESTAURADOS - -Os registros que listamos a seguir estavam excluídos (ou simplesmente não existiam) no sistema antigo e precisaram ser restaurados (ou criados) para completarmos a migração. Foi necessário fazer isso pois outros registros ativos no sistema apontam para eles. -Vocês agora podem decidir mantê-los, ajustá-los ou excluí-los. Segue a lista: - -{} - -Se a opção for por excluir um desses registros novamente, note que só será possível fazer isso quando nada mais no sistema fizer referência a ele. - -Ao tentar excluir um registro usado em outras partes do sistema, você verá uma lista dos itens que apontam para ele de alguma forma. Para conseguir excluir você deve editar cada dos dos itens dependentes lista mostrada, retirando ou trocando a referência ao que deseja excluir. - -*/ - -{} -''' - - -def get_url(slug): - return 'sapl.{}.leg.br'.format(slug.replace('-', '.')) - - -def sem_repeticoes_mantendo_ordem(sequencia): - return OrderedDict.fromkeys(sequencia).keys() - - -def get_sqls_desexcluir_criar(preambulo, desexcluir, criar, slug): - sqls_links = [get_sql(*(args + (slug,))) - for itens, get_sql in ((desexcluir, get_sql_desexcluir), - (criar, get_sql_criar)) - for args in itens] - if not sqls_links: - return '' - else: - sqls, links = zip(*sqls_links) - - sqls = [dedent(s.strip()) + ';' - for sql in sqls - for s in sql.split(';') if s.strip()] - sqls = sem_repeticoes_mantendo_ordem(sqls) - - links = (l for ll in links for l in ll) # flatten - links = sem_repeticoes_mantendo_ordem(links) - - sqls, links = ['\n'.join(sorted(s)) for s in [sqls, links]] - return TEMPLATE_RESSUSCITADOS.format(preambulo, links, sqls) - - -def get_ressuscitar(slug): - preambulo, desexcluir, criar = get_dependencias_a_ressuscitar(slug) - return get_sqls_desexcluir_criar(preambulo, desexcluir, criar, slug) - - -def get_slug(): - arq = DIR_DADOS_MIGRACAO.child('siglas_para_slugs.yaml') - with open(arq, 'r') as arq: - siglas_para_slugs = yaml.load(arq, yaml.Loader) - sigla = NOME_BANCO_LEGADO[-3:] - return siglas_para_slugs[sigla] - - -def adiciona_ressuscitar(): - sqls = get_ressuscitar(get_slug()) - if sqls.strip(): - arq_ajustes_pre_migracao = get_arquivo_ajustes_pre_migracao() - conteudo = arq_ajustes_pre_migracao.read_file() - arq_ajustes_pre_migracao.write_file('{}\n{}'.format(conteudo, sqls)) diff --git a/sapl/legacy/scripts/shell_para_migracao.sh b/sapl/legacy/scripts/shell_para_migracao.sh deleted file mode 100755 index e7272d7ea..000000000 --- a/sapl/legacy/scripts/shell_para_migracao.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -# Inicia um shell_plus com as configurações de migração usando um banco específico -# Uso: ./shell_para_migracao.sh - -# Rode esse script a partir da raiz do projeto - -DATABASE_NAME=$1 ./manage.py shell_plus --settings sapl.legacy_migration_settings diff --git a/sapl/legacy/scripts/utils.py b/sapl/legacy/scripts/utils.py deleted file mode 100644 index 0cf623be5..000000000 --- a/sapl/legacy/scripts/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -import inspect - -from sapl.base.models import Autor -from sapl.legacy.migracao_dados import appconfs - - -def get_models_com_referencia_a(apontado): - - def tem_referencia_a_apontado(model): - return any(getattr(field, 'related_model', None) == apontado - for field in model._meta.get_fields()) - - return [model for app in appconfs for model in app.models.values() - if tem_referencia_a_apontado(model)] diff --git a/sapl/legacy/test_migracao_dados.py b/sapl/legacy/test_migracao_dados.py deleted file mode 100644 index 061264165..000000000 --- a/sapl/legacy/test_migracao_dados.py +++ /dev/null @@ -1,62 +0,0 @@ -from random import shuffle - -from .migracao_dados import (_formatar_lista_para_sql, - get_autorias_sem_repeticoes, - get_reapontamento_de_autores_repetidos) - - -def test_unifica_autores_repetidos_no_legado(): - - # cod_parlamentar, cod_autor - autores = [[0, 0], - [1, 10], - [1, 11], - [1, 12], - [2, 20], - [2, 21], - [2, 22], - [3, 30], - [3, 31], - [4, 40], - [5, 50]] - reapontamento, apagar = get_reapontamento_de_autores_repetidos(autores) - assert reapontamento == {10: 10, 11: 10, 12: 10, - 20: 20, 21: 20, 22: 20, - 30: 30, 31: 30} - assert sorted(apagar) == [11, 12, 21, 22, 31] - - # cod_autor, cod_materia, ind_primeiro_autor - autoria = [[10, 111, 0], # não é repetida, mas envolve um autor repetido - - [22, 222, 1], # não é repetida, mas envolve um autor repetido - - [10, 777, 1], # repetição c ind_primeiro_autor==1 no INÍCIO - [10, 777, 0], - [11, 777, 0], - [12, 777, 0], - - [30, 888, 0], # repetição c ind_primeiro_autor==1 no MEIO - [31, 888, 1], - [30, 888, 0], - - [11, 999, 0], # repetição SEM ind_primeiro_autor==1 - [12, 999, 0], - - [21, 999, 0], # repetição SEM ind_primeiro_autor==1 - [22, 999, 0], - ] - shuffle(autoria) # não devemos supor ordem na autoria - nova_autoria = get_autorias_sem_repeticoes(autoria, reapontamento) - assert nova_autoria == sorted([(10, 111, 0), - (20, 222, 1), - (10, 777, 1), - (30, 888, 1), - (10, 999, 0), - (20, 999, 0), - ]) - - -def test_formatar_lista_para_sql(): - assert _formatar_lista_para_sql([1, 2, 3]) == '(1, 2, 3)' - assert _formatar_lista_para_sql([1]) == '(1)' - assert _formatar_lista_para_sql([]) is None diff --git a/sapl/legacy/test_renames.py b/sapl/legacy/test_renames.py deleted file mode 100644 index 9a5c4ebaf..000000000 --- a/sapl/legacy/test_renames.py +++ /dev/null @@ -1,113 +0,0 @@ - -from django.contrib.contenttypes.fields import GenericForeignKey - -from sapl.base.models import AppConfig, Autor, CasaLegislativa, TipoAutor -from sapl.comissoes.models import \ - DocumentoAcessorio as DocumentoAcessorioComissoes -from sapl.comissoes.models import Comissao, Composicao, Participacao, Reuniao -from sapl.legacy.migracao_dados import appconfs, get_renames, legacy_app -from sapl.materia.models import (AcompanhamentoMateria, DocumentoAcessorio, - MateriaLegislativa, Proposicao, - TipoMateriaLegislativa, TipoProposicao, - Tramitacao) -from sapl.norma.models import (AnexoNormaJuridica, NormaJuridica, - NormaRelacionada, TipoVinculoNormaJuridica) -from sapl.parlamentares.models import (Frente, Mandato, Parlamentar, Partido, - TipoAfastamento, Votante, Bloco) -from sapl.protocoloadm.models import DocumentoAdministrativo -from sapl.sessao.models import (Bancada, CargoBancada, - ExpedienteMateria, Orador, OradorExpediente, - OrdemDia, RegistroVotacao, ResumoOrdenacao, - SessaoPlenaria, TipoResultadoVotacao, - VotoParlamentar) - -RENAMING_IGNORED_MODELS = [ - Votante, Frente, Bancada, Bloco, Votante, # parlamentares - Composicao, Reuniao, DocumentoAcessorioComissoes, # commissoes - AppConfig, CasaLegislativa, # base - CargoBancada, ResumoOrdenacao, # sessao - AnexoNormaJuridica, TipoVinculoNormaJuridica, # norma - -] - -RENAMING_IGNORED_FIELDS = [ - (TipoAfastamento, {'indicador'}), - (Participacao, {'composicao'}), - (Proposicao, { - 'ano', 'content_type', 'object_id', 'conteudo_gerado_related', - 'status', 'hash_code', 'texto_original'}), - (TipoProposicao, { - 'object_id', 'content_type', 'tipo_conteudo_related', 'perfis', - # não estou entendendo como esses campos são enumerados, - # mas eles não fazem parte da migração - # 'tipomaterialegislativa_set', 'tipodocumento_set', - }), - - (Tramitacao, {'ultima'}), - (SessaoPlenaria, {'finalizada', 'iniciada', 'painel_aberto', 'interativa', - 'upload_ata', - 'upload_anexo', - 'upload_pauta'}), - (ExpedienteMateria, {'votacao_aberta', 'registro_aberto'}), - (OrdemDia, {'votacao_aberta', 'registro_aberto'}), - (NormaJuridica, {'texto_integral', 'data_ultima_atualizacao', 'assuntos'}), - (Parlamentar, { - 'uf_residencia', 'municipio_residencia', 'cropping', 'fotografia'}), - (Partido, {'logo_partido', 'observacao'}), - (MateriaLegislativa, { - 'autores', 'anexadas', 'data_ultima_atualizacao', 'texto_original'}), - (DocumentoAdministrativo, { - 'protocolo', 'numero_externo', 'texto_integral'}), - (Mandato, {'titular', 'data_fim_mandato', 'data_inicio_mandato'}), - (TipoMateriaLegislativa, {'sequencia_numeracao'}), - (TipoAutor, {'content_type'}), - (TipoResultadoVotacao, {'natureza'}), - (RegistroVotacao, {'ordem', 'expediente'}), - (DocumentoAcessorio, {'arquivo', 'data_ultima_atualizacao'}), - (OradorExpediente, {'upload_anexo', 'observacao'}), - (Orador, {'upload_anexo', 'observacao'}), - (VotoParlamentar, {'user', 'ip', 'expediente', 'data_hora', 'ordem'}), - (NormaRelacionada, {'tipo_vinculo'}), - (AcompanhamentoMateria, {'confirmado', 'data_cadastro', 'usuario'}), - (Autor, {'user', 'content_type', 'object_id', 'autor_related'}), - (Comissao, {'ativa'}), - (Reuniao, {'url_audio', 'url_video', 'local_reuniao', 'upload_anexo', - 'periodo', 'upload_pauta', 'tema', 'hora_fim', 'upload_ata', - 'nome', 'hora_inicio'}) -] - - -def test_get_renames(): - field_renames, model_renames = get_renames() - all_models = {m for ac in appconfs for m in ac.get_models()} - for model in all_models: - field_names = {f.name for f in model._meta.get_fields() - if f.name != 'id' - and (f.concrete or isinstance(f, GenericForeignKey))} - if model not in field_renames: - # check ignored models in renaming - assert model in RENAMING_IGNORED_MODELS - else: - renamed = set(field_renames[model].keys()) - - match_msg_template = 'All %s field names mentioned in renames ' \ - 'must match a %s field' - - # all renamed field references correspond to a current field - assert renamed <= field_names, \ - match_msg_template % ('new', 'current') - - # ignored fields are explicitly listed - missing = field_names - renamed - if missing: - assert (model, missing) in RENAMING_IGNORED_FIELDS, \ - 'Campos faltando na renomeação,' \ - 'mas não listados explicitamente: ({}, {})'.format( - model.__name__, missing) - - # all old names correspond to a legacy field - legacy_model = legacy_app.get_model( - model_renames.get(model, model.__name__)) - legacy_field_names = {f.name for f in legacy_model._meta.fields} - assert set(field_renames[model].values()) <= legacy_field_names, \ - match_msg_template % ('old', 'legacy') diff --git a/sapl/legacy/timezonesbrasil.py b/sapl/legacy/timezonesbrasil.py deleted file mode 100644 index a9989f87d..000000000 --- a/sapl/legacy/timezonesbrasil.py +++ /dev/null @@ -1,206 +0,0 @@ -import unicodedata - -from pytz import timezone - -UF_PARA_TIMEZONE = ''' - AC America/Rio_Branco - AL America/Maceio - AP America/Belem - AM America/Manaus - BA America/Bahia - CE America/Fortaleza - DF America/Sao_Paulo - ES America/Sao_Paulo - GO America/Sao_Paulo - MA America/Fortaleza - MT America/Cuiaba - MS America/Campo_Grande - MG America/Sao_Paulo - PR America/Sao_Paulo - PB America/Fortaleza - PA America/Belem - PE America/Recife - PI America/Fortaleza - RJ America/Sao_Paulo - RN America/Fortaleza - RS America/Sao_Paulo - RO America/Porto_Velho - RR America/Boa_Vista - SC America/Sao_Paulo - SE America/Maceio - SP America/Sao_Paulo - TO America/Araguaina -''' -UF_PARA_TIMEZONE = dict(line.split() - for line in UF_PARA_TIMEZONE.strip().splitlines()) - - -def normalizar_texto(texto): - # baseado em https://gist.github.com/j4mie/557354 - norm = unicodedata.normalize('NFKD', texto.lower()) - return norm.encode('ASCII', 'ignore').decode('ascii') - -# Exceções (Anazonas e Pará): -# leste do Amazonas: America/Manaus -# oeste do Amazonas: America/Eirunepe -# leste do Pará: America/Belem -# oeste do Pará: America/Santarem -# fontes: -# https://en.wikipedia.org/wiki/Time_in_Brazil -# https://www.zeitverschiebung.net/en/timezone/america--belem -# https://www.zeitverschiebung.net/en/timezone/america--santarem -# https://www.zeitverschiebung.net/en/timezone/america--manaus -# https://www.zeitverschiebung.net/en/timezone/america--eirunepe - - -TZ_CIDADES_AMAZONAS_E_PARA = [ - ('America/Manaus', ''' - Manaus - Itacoatiara - Parintins - Manacapuru - Coari - Tefé - Humaitá - Tabatinga - Rio Preto da Eva - Maués - Carauari - Fonte Boa - São Gabriel da Cachoeira - Boca do Acre - Manicoré - Nova Olinda do Norte - Borba - São Paulo de Olivença - Barreirinha - Codajás - Iranduba - Novo Aripuanã - Urucurituba - Manaquiri - Guajará - Autazes - Santo Antônio do Içá - Urucará - Anori - Pauini - Barcelos - Careiro da Várzea - Canutama - Jutaí - Alvarães -'''), - ('America/Eirunepe', ''' - Eirunepé - Benjamin Constant - Envira -'''), - ('America/Belem', ''' - Belém - Ananindeua - Macapá - Marabá - Castanhal - Santana - Abaetetuba - Tucuruí - Paragominas - Bragança - Benevides - Capanema - Breves - Cametá - Salinópolis - Tomé Açu - Capitão Poço - Barcarena - Vigia - São Miguel do Guamá - Conceição do Araguaia - Igarapé Miri - Igarapé Açu - Moju - Portel - Itupiranga - Viseu - Soure - Mocajuba - São Félix do Xingu - Augusto Corrêa - Tucumã - Santa Maria do Pará - Acará - Maracanã - Baião - Curuçá - Marapanim - Oeiras do Pará - São João de Pirabas - Santo Antônio do Tauá - São Caetano de Odivelas - Ourém - Muaná - Afuá - Mazagão - Gurupá - Bujaru - Senador José Porfírio - Irituia - parauapebas - brejo grande do araguaia - santana do araguaia - ourilandia do norte - marituba - canaa dos carajas - goianesia do para -'''), - ('America/Santarem', ''' - Santarém - Altamira - Itaituba - Oriximiná - Alenquer - Ábidos - Monte Alegre - Almeirim - Terra Santa - Juruti - Porto de Moz - Nhamundá - Prainha - medicilandia -'''), -] -TZ_CIDADES_AMAZONAS_E_PARA = {normalizar_texto(cidade.strip()): tz - for tz, linhas in TZ_CIDADES_AMAZONAS_E_PARA - for cidade in linhas.strip().splitlines()} - - -def get_nome_timezone(cidade, uf): - uf = uf.upper() - tz = UF_PARA_TIMEZONE[uf] - if uf in ['PA', 'AM']: - cidade = normalizar_texto(cidade) - return TZ_CIDADES_AMAZONAS_E_PARA[cidade] - else: - return tz - - -def get_timezone(cidade, uf): - return timezone(get_nome_timezone(cidade, uf)) - - -def test_get_nome_timezone(): - for cidade, uf, tz in [ - ('Fortaleza', 'CE', 'America/Fortaleza'), - ('Salvador', 'BA', 'America/Bahia'), - ('Belem', 'PA', 'America/Belem'), # sem acento - ('Belém', 'PA', 'America/Belem'), # com acento - ('Santarem', 'PA', 'America/Santarem'), # sem acento - ('Santarém', 'PA', 'America/Santarem'), # com acento - ('Manaus', 'AM', 'America/Manaus'), - ('Eirunepe', 'AM', 'America/Eirunepe'), # sem acento - ('Eirunepé', 'AM', 'America/Eirunepe'), # com acento - ]: - assert get_nome_timezone(cidade, uf) == tz, (cidade, uf, tz) diff --git a/sapl/legacy/views.py b/sapl/legacy/views.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/sapl/legacy_migration_settings.py b/sapl/legacy_migration_settings.py deleted file mode 100644 index 463fbb7a6..000000000 --- a/sapl/legacy_migration_settings.py +++ /dev/null @@ -1,64 +0,0 @@ -import os -import re - -import pytz -import yaml -from decouple import Config, RepositoryEnv -from dj_database_url import parse as db_url - -from sapl.legacy.scripts.exporta_zope.variaveis_comuns import \ - DIR_DADOS_MIGRACAO -from sapl.legacy.timezonesbrasil import get_timezone - -from .settings import * # flake8: noqa - -config = Config(RepositoryEnv(BASE_DIR.child('legacy', '.env'))) - - -INSTALLED_APPS += ( - 'sapl.legacy', # legacy reversed model definitions -) - -DATABASES['legacy'] = config('DATABASE_URL_FONTE', cast=db_url,) -DATABASES['default'] = config( - 'DATABASE_URL_DESTINO', - cast=lambda v: v if isinstance(v, dict) else db_url(v), - default=DATABASES['default']) - -# Sobrescreve o nome dos bancos caso a variável de ambiente seja definida -# Útil para migração em lote de vários bancos -DATABASE_NAME_OVERRIDE = os.environ.get('DATABASE_NAME') -if DATABASE_NAME_OVERRIDE: - DATABASES['legacy']['NAME'] = DATABASE_NAME_OVERRIDE - # não altera o nome se o destino é um banco em memória - if not DATABASES['default']['NAME'] == ':memory:': - DATABASES['default']['NAME'] = DATABASE_NAME_OVERRIDE - -DATABASE_ROUTERS = ['sapl.legacy.router.LegacyRouter', ] - -DEBUG = True - -# delisga indexação fulltext em tempo real -HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.BaseSignalProcessor' - -SHELL_PLUS_DONT_LOAD = ['legacy'] - -NOME_BANCO_LEGADO = DATABASES['legacy']['NAME'] -DIR_REPO = Path(DIR_DADOS_MIGRACAO, 'repos', NOME_BANCO_LEGADO) - -MEDIA_ROOT = DIR_REPO - - -# configura timezone de migração -match = re.match('sapl_cm_(.*)', NOME_BANCO_LEGADO) -SIGLA_CASA = match.group(1) -_PATH_TABELA_TIMEZONES = DIR_DADOS_MIGRACAO.child('tabela_timezones.yaml') -with open(_PATH_TABELA_TIMEZONES, 'r') as arq: - tabela_timezones = yaml.load(arq, yaml.Loader) -municipio, uf, nome_timezone = tabela_timezones[SIGLA_CASA] -if nome_timezone: - PYTZ_TIMEZONE = pytz.timezone(nome_timezone) -else: - PYTZ_TIMEZONE = get_timezone(municipio, uf) - -TIME_ZONE = PYTZ_TIMEZONE.zone diff --git a/sapl/lexml/OAIServer.py b/sapl/lexml/OAIServer.py index 340c03dde..e23db808e 100644 --- a/sapl/lexml/OAIServer.py +++ b/sapl/lexml/OAIServer.py @@ -237,7 +237,8 @@ class OAIServer: return None def oai_query(self, offset=0, batch_size=10, from_=None, until=None, identifier=None): - from_ = timezone.make_aware(from_) # convert from naive to timezone aware datetime + if from_: + from_ = timezone.make_aware(from_) # convert from naive to timezone aware datetime esfera = self.get_esfera_federacao() offset = 0 if offset < 0 else offset batch_size = 10 if batch_size < 0 else batch_size diff --git a/sapl/lexml/legacy.yaml b/sapl/lexml/legacy.yaml deleted file mode 100644 index 12414248e..000000000 --- a/sapl/lexml/legacy.yaml +++ /dev/null @@ -1,18 +0,0 @@ -LexmlProvedor (LexmlRegistroProvedor): - email_responsavel: adm_email - id_provedor: id_provedor - id_responsavel: id_responsavel - nome: nom_provedor - nome_responsavel: nom_responsavel - sigla: sgl_provedor - tipo: tipo - xml: xml_provedor - -LexmlPublicador (LexmlRegistroPublicador): - email_responsavel: adm_email - id_publicador: id_publicador - id_responsavel: id_responsavel - nome: nom_publicador - nome_responsavel: nom_responsavel - sigla: sigla - tipo: tipo diff --git a/sapl/lexml/models.py b/sapl/lexml/models.py index bec1b52ec..1a5d27144 100644 --- a/sapl/lexml/models.py +++ b/sapl/lexml/models.py @@ -1,9 +1,7 @@ -import reversion from django.db import models from django.utils.translation import ugettext_lazy as _ -@reversion.register() class LexmlProvedor(models.Model): # LexmlRegistroProvedor id_provedor = models.PositiveIntegerField(verbose_name=_('Id do provedor')) nome = models.CharField(max_length=255, verbose_name=_('Nome do provedor')) @@ -38,7 +36,6 @@ class LexmlProvedor(models.Model): # LexmlRegistroProvedor return self.nome -@reversion.register() class LexmlPublicador(models.Model): id_publicador = models.PositiveIntegerField( verbose_name=_('Id do publicador')) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 70c5a82be..b1219d56c 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -2,7 +2,7 @@ import logging import os from crispy_forms.bootstrap import Alert, InlineRadios -from crispy_forms.layout import (Button, Field, Fieldset, HTML, Layout, Row) +from crispy_forms.layout import (Button, Field, Fieldset, HTML, Layout, Row, Div) from django import forms from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist, ValidationError @@ -18,7 +18,7 @@ from django.utils import timezone from django.utils.translation import ugettext_lazy as _ import django_filters -from sapl.base.models import AppConfig, Autor, TipoAutor +from sapl.base.models import AppConfig as BaseAppConfig, Autor, TipoAutor from sapl.comissoes.models import Comissao, Composicao, Participacao from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_PUBLIC, STATUS_TA_PRIVATE) @@ -43,7 +43,6 @@ from sapl.utils import (autor_label, autor_modal, timing, SEPARADOR_HASH_PROPOSICAO, validar_arquivo, YES_NO_CHOICES, GoogleRecapthaMixin) -import sapl from .models import (AcompanhamentoMateria, Anexada, Autoria, DespachoInicial, DocumentoAcessorio, Numeracao, @@ -509,7 +508,7 @@ class TramitacaoForm(ModelForm): if not self.instance.data_tramitacao: - if ultima_tramitacao: + if ultima_tramitacao and BaseAppConfig.attr('tramitacao_origem_fixa'): destino = ultima_tramitacao.unidade_tramitacao_destino if (destino != self.cleaned_data['unidade_tramitacao_local']): self.logger.error("A origem da nova tramitação ({}) não é igual ao " @@ -562,7 +561,7 @@ class TramitacaoForm(ModelForm): materia.em_tramitacao = False if tramitacao.status.indicador == "F" else True materia.save() - tramitar_anexadas = sapl.base.models.AppConfig.attr( + tramitar_anexadas = BaseAppConfig.attr( 'tramitacao_materia') if tramitar_anexadas: lista_tramitacao = [] @@ -664,7 +663,7 @@ class TramitacaoUpdateForm(TramitacaoForm): # ela não pode ter seu destino alterado. if ultima_tramitacao != obj: if cd['unidade_tramitacao_destino'] != \ - obj.unidade_tramitacao_destino: + obj.unidade_tramitacao_destino and BaseAppConfig.attr('tramitacao_origem_fixa'): self.logger.error("Você não pode mudar a Unidade de Destino desta " "tramitação para {}, pois irá conflitar com a Unidade " "Local da tramitação seguinte ({})." @@ -701,7 +700,7 @@ class TramitacaoUpdateForm(TramitacaoForm): materia.em_tramitacao = False if nova_tram_principal.status.indicador == "F" else True materia.save() - tramitar_anexadas = sapl.base.models.AppConfig.attr( + tramitar_anexadas = BaseAppConfig.attr( 'tramitacao_materia') if tramitar_anexadas: anexadas_list = lista_anexados(materia) @@ -1121,22 +1120,38 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet): self.form.helper = SaplFormHelper() self.form.helper.form_method = 'GET' self.form.helper.layout = Layout( + Div( Fieldset(_('Pesquisa Básica'), - row1, row2), - + row1, row2, + HTML(autor_label), + HTML(autor_modal), + row4, + ), + Button('btn_pesquisa_avancada', 'Pesquisa Avançada >>>', + css_id='btn_pesquisa_avancada_id', + css_class='btn btn-dark', + onClick="pesquisaAvancada()", + style='margin-bottom: 2vh;font-weight: bold' + ), Fieldset(_('Como listar os resultados da pesquisa'), - row8 + row8, + css_class='pesquisa_avancada', + style='display: none;', ), Fieldset(_('Origem externa'), - row10, row11 + row10, row11, + css_class='pesquisa_avancada', + style='display: none;', ), - Fieldset(_('Pesquisa Avançada'), + Fieldset(_('Mais Opções de Pesquisa...'), row3, - HTML(autor_label), - HTML(autor_modal), - row4, row6, row7, row9, - form_actions(label=_('Pesquisar'))) - ) + row6, row7, row9, + css_class='pesquisa_avancada', + style='display: none;' + ), + form_actions(label=_('Pesquisar')), + ) + ) @property def qs(self): @@ -1491,10 +1506,23 @@ class TramitacaoEmLoteFilterSet(django_filters.FilterSet): class TipoProposicaoForm(ModelForm): + try: + content_types_choices = [ + ( + f'{ct.app_label}/{ct.model}', + ct + ) + for k, ct in ContentType.objects.get_for_models( + *models_with_gr_for_model(TipoProposicao) + ).items() + ] + except: + content_types_choices = [] + logger = logging.getLogger(__name__) - content_type = forms.ModelChoiceField( - queryset=ContentType.objects.all(), + content_type = forms.ChoiceField( + choices=content_types_choices, label=TipoProposicao._meta.get_field('content_type').verbose_name, required=True, help_text=TipoProposicao._meta.get_field('content_type').help_text) @@ -1551,18 +1579,6 @@ class TipoProposicaoForm(ModelForm): super(TipoProposicaoForm, self).__init__(*args, **kwargs) - content_types = ContentType.objects.get_for_models( - *models_with_gr_for_model(TipoProposicao)) - - self.fields['content_type'].choices = [ - (ct.pk, ct) for k, ct in content_types.items()] - # Ordena por id - self.fields['content_type'].choices.sort(key=lambda x: x[0]) - - if self.instance.pk: - self.fields[ - 'tipo_conteudo_related'].initial = self.instance.object_id - def clean(self): super(TipoProposicaoForm, self).clean() @@ -1571,7 +1587,16 @@ class TipoProposicaoForm(ModelForm): cd = self.cleaned_data - content_type = cd['content_type'] + content_type = cd['content_type'].split('/') + content_type = ContentType.objects.filter( + app_label=content_type[0], + model=content_type[1]).first() + cd['content_type'] = content_type + + if not content_type: + self.logger.error("Meta Tipo Inexistente") + raise ValidationError( + _('Meta Tipo Inexistente.')) if 'tipo_conteudo_related' not in cd or not cd[ 'tipo_conteudo_related']: @@ -1783,7 +1808,7 @@ class TramitacaoEmLoteForm(ModelForm): ip = self.initial['ip'] if 'ip' in self.initial else '' ultima_edicao = self.initial['ultima_edicao'] if 'ultima_edicao' in self.initial else '' - tramitar_anexadas = AppConfig.attr('tramitacao_materia') + tramitar_anexadas = BaseAppConfig.attr('tramitacao_materia') for mat_id in materias: mat = MateriaLegislativa.objects.get(id=mat_id) tramitacao = Tramitacao.objects.create( @@ -1902,10 +1927,10 @@ class ProposicaoForm(FileFieldCheckMixin, forms.ModelForm): } def __init__(self, *args, **kwargs): - self.texto_articulado_proposicao = AppConfig.attr( + self.texto_articulado_proposicao = BaseAppConfig.attr( 'texto_articulado_proposicao') - self.receber_recibo = AppConfig.attr( + self.receber_recibo = BaseAppConfig.attr( 'receber_recibo_proposicao') if not self.texto_articulado_proposicao: @@ -1927,7 +1952,7 @@ class ProposicaoForm(FileFieldCheckMixin, forms.ModelForm): ] - if AppConfig.objects.last().escolher_numero_materia_proposicao: + if BaseAppConfig.objects.last().escolher_numero_materia_proposicao: fields.append(to_column(('numero_materia_futuro', 12)),) else: if 'numero_materia_futuro' in self._meta.fields: @@ -2043,7 +2068,7 @@ class ProposicaoForm(FileFieldCheckMixin, forms.ModelForm): def save(self, commit=True): cd = self.cleaned_data inst = self.instance - receber_recibo = AppConfig.objects.last().receber_recibo_proposicao + receber_recibo = BaseAppConfig.objects.last().receber_recibo_proposicao if inst.pk: if 'tipo_texto' in cd: @@ -2063,7 +2088,8 @@ class ProposicaoForm(FileFieldCheckMixin, forms.ModelForm): return super().save(commit) inst.ano = timezone.now().year - sequencia_numeracao = AppConfig.attr('sequencia_numeracao_proposicao') + sequencia_numeracao = BaseAppConfig.attr( + 'sequencia_numeracao_proposicao') if sequencia_numeracao == 'A': numero__max = Proposicao.objects.filter( autor=inst.autor, @@ -2220,7 +2246,7 @@ class ConfirmarProposicaoForm(ProposicaoForm): def __init__(self, *args, **kwargs): self.proposicao_incorporacao_obrigatoria = \ - AppConfig.attr('proposicao_incorporacao_obrigatoria') + BaseAppConfig.attr('proposicao_incorporacao_obrigatoria') if self.proposicao_incorporacao_obrigatoria != 'C': if 'gerar_protocolo' in self._meta.fields: @@ -2272,7 +2298,7 @@ class ConfirmarProposicaoForm(ProposicaoForm): ) ] - if not AppConfig.objects.last().escolher_numero_materia_proposicao or \ + if not BaseAppConfig.objects.last().escolher_numero_materia_proposicao or \ not self.instance.numero_materia_futuro: if 'numero_materia_futuro' in self._meta.fields: del fields[0][0][3] @@ -2352,7 +2378,7 @@ class ConfirmarProposicaoForm(ProposicaoForm): if not self.is_valid(): return self.cleaned_data - numeracao = AppConfig.attr('sequencia_numeracao_proposicao') + numeracao = BaseAppConfig.attr('sequencia_numeracao_proposicao') if not numeracao: self.logger.error("A sequência de numeração (por ano ou geral)" @@ -2435,7 +2461,7 @@ class ConfirmarProposicaoForm(ProposicaoForm): try: self.logger.debug( "Tentando obter modelo de sequência de numeração.") - numeracao = AppConfig.objects.last( + numeracao = BaseAppConfig.objects.last( ).sequencia_numeracao_protocolo except AttributeError as e: self.logger.error("Erro ao obter modelo. " + str(e)) @@ -2587,7 +2613,7 @@ class ConfirmarProposicaoForm(ProposicaoForm): GenericForeignKey """ - numeracao = AppConfig.attr('sequencia_numeracao_protocolo') + numeracao = BaseAppConfig.attr('sequencia_numeracao_protocolo') if numeracao == 'A': nm = Protocolo.objects.filter( ano=timezone.now().year).aggregate(Max('numero')) diff --git a/sapl/materia/legacy.yaml b/sapl/materia/legacy.yaml deleted file mode 100644 index 9ff81287f..000000000 --- a/sapl/materia/legacy.yaml +++ /dev/null @@ -1,146 +0,0 @@ -TipoMateriaLegislativa: - descricao: des_tipo_materia - num_automatica: ind_num_automatica - quorum_minimo_votacao: quorum_minimo_votacao - sigla: sgl_tipo_materia - -RegimeTramitacao: - descricao: des_regime_tramitacao - -Origem: - nome: nom_origem - sigla: sgl_origem - -MateriaLegislativa: - ano: ano_ident_basica - ano_origem_externa: ano_origem_externa - apelido: nom_apelido - complementar: ind_complementar - data_apresentacao: dat_apresentacao - data_fim_prazo: dat_fim_prazo - data_origem_externa: dat_origem_externa - data_publicacao: dat_publicacao - dias_prazo: num_dias_prazo - em_tramitacao: ind_tramitacao - ementa: txt_ementa - indexacao: txt_indexacao - local_origem_externa: cod_local_origem_externa - numero: num_ident_basica - numero_origem_externa: num_origem_externa - numero_protocolo: num_protocolo - objeto: des_objeto - observacao: txt_observacao - polemica: ind_polemica - regime_tramitacao: cod_regime_tramitacao - resultado: txt_resultado - tipo_apresentacao: tip_apresentacao - tipo: tip_id_basica - tipo_origem_externa: tip_origem_externa - -Autoria: - autor: cod_autor - materia: cod_materia - primeiro_autor: ind_primeiro_autor - -AcompanhamentoMateria (AcompMateria): - email: end_email - hash: txt_hash - materia: cod_materia - -Anexada: - data_anexacao: dat_anexacao - data_desanexacao: dat_desanexacao - materia_anexada: cod_materia_anexada - materia_principal: cod_materia_principal - -AssuntoMateria: - assunto: des_assunto - dispositivo: des_dispositivo - -DespachoInicial: - materia: cod_materia - comissao: cod_comissao - -TipoDocumento: - descricao: des_tipo_documento - -DocumentoAcessorio: - autor: nom_autor_documento - data: dat_documento - ementa: txt_ementa - indexacao: txt_indexacao - materia: cod_materia - nome: nom_documento - tipo: tip_documento - -MateriaAssunto: - assunto: cod_assunto - materia: cod_materia - -Numeracao: - ano_materia: ano_materia - data_materia: dat_materia - materia: cod_materia - numero_materia: num_materia - tipo_materia: tip_materia - -Orgao: - endereco: end_orgao - nome: nom_orgao - sigla: sgl_orgao - telefone: num_tel_orgao - unidade_deliberativa: ind_unid_deliberativa - -TipoFimRelatoria: - descricao: des_fim_relatoria - -Relatoria: - comissao: cod_comissao - data_designacao_relator: dat_desig_relator - data_destituicao_relator: dat_destit_relator - materia: cod_materia - parlamentar: cod_parlamentar - tipo_fim_relatoria: tip_fim_relatoria - -Parecer: - materia: cod_materia - parecer: txt_parecer - relatoria: cod_relatoria - tipo_apresentacao: tip_apresentacao - tipo_conclusao: tip_conclusao - -TipoProposicao: - descricao: des_tipo_proposicao - -Proposicao: - autor: cod_autor - data_devolucao: dat_devolucao - data_envio: dat_envio - data_recebimento: dat_recebimento - descricao: txt_descricao - justificativa_devolucao: txt_justif_devolucao - materia_de_vinculo: cod_materia - numero_proposicao: num_proposicao - tipo: tip_proposicao - -StatusTramitacao: - descricao: des_status - indicador: ind_fim_tramitacao - sigla: sgl_status - -UnidadeTramitacao: - comissao: cod_comissao - orgao: cod_orgao - parlamentar: cod_parlamentar - -Tramitacao: - data_encaminhamento: dat_encaminha - data_fim_prazo: dat_fim_prazo - data_tramitacao: dat_tramitacao - materia: cod_materia - status: cod_status - texto: txt_tramitacao - turno: sgl_turno - unidade_tramitacao_destino: cod_unid_tram_dest - unidade_tramitacao_local: cod_unid_tram_local - urgente: ind_urgencia diff --git a/sapl/materia/migrations/0081_auto_20220321_0934.py b/sapl/materia/migrations/0081_auto_20220321_0934.py new file mode 100644 index 000000000..7a09f04f2 --- /dev/null +++ b/sapl/materia/migrations/0081_auto_20220321_0934.py @@ -0,0 +1,33 @@ +# Generated by Django 2.2.24 on 2022-03-21 12:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0080_auto_20211112_1106'), + ] + + operations = [ + migrations.AlterField( + model_name='materialegislativa', + name='ano', + field=models.PositiveSmallIntegerField(choices=[(2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'), + ), + migrations.AlterField( + model_name='materialegislativa', + name='ano_origem_externa', + field=models.PositiveSmallIntegerField(blank=True, choices=[(2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], null=True, verbose_name='Ano'), + ), + migrations.AlterField( + model_name='numeracao', + name='ano_materia', + field=models.PositiveSmallIntegerField(choices=[(2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'), + ), + migrations.AlterField( + model_name='proposicao', + name='ano', + field=models.PositiveSmallIntegerField(blank=True, choices=[(2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], default=None, null=True, verbose_name='Ano'), + ), + ] diff --git a/sapl/materia/migrations/0082_auto_20230529_1641.py b/sapl/materia/migrations/0082_auto_20230529_1641.py new file mode 100644 index 000000000..191ea28a2 --- /dev/null +++ b/sapl/materia/migrations/0082_auto_20230529_1641.py @@ -0,0 +1,33 @@ +# Generated by Django 2.2.28 on 2023-05-29 19:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0081_auto_20220321_0934'), + ] + + operations = [ + migrations.AlterField( + model_name='materialegislativa', + name='ano', + field=models.PositiveSmallIntegerField(choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'), + ), + migrations.AlterField( + model_name='materialegislativa', + name='ano_origem_externa', + field=models.PositiveSmallIntegerField(blank=True, choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], null=True, verbose_name='Ano'), + ), + migrations.AlterField( + model_name='numeracao', + name='ano_materia', + field=models.PositiveSmallIntegerField(choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'), + ), + migrations.AlterField( + model_name='proposicao', + name='ano', + field=models.PositiveSmallIntegerField(blank=True, choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], default=None, null=True, verbose_name='Ano'), + ), + ] diff --git a/sapl/materia/migrations/0083_auto_20230731_1845.py b/sapl/materia/migrations/0083_auto_20230731_1845.py new file mode 100644 index 000000000..d286e0be1 --- /dev/null +++ b/sapl/materia/migrations/0083_auto_20230731_1845.py @@ -0,0 +1,31 @@ +# Generated by Django 2.2.28 on 2023-07-31 21:45 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('materia', '0082_auto_20230529_1641'), + ] + + operations = [ + migrations.AddField( + model_name='proposicao', + name='usuario_devolucao', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='proposicoes_devolvidas', to=settings.AUTH_USER_MODEL, verbose_name='Usuário Responsável pela Devolução'), + ), + migrations.AddField( + model_name='proposicao', + name='usuario_envio', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='proposicoes_enviadas', to=settings.AUTH_USER_MODEL, verbose_name='Usuário Responsável pelo Envio'), + ), + migrations.AddField( + model_name='proposicao', + name='usuario_recebimento', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='proposicoes_recebidas', to=settings.AUTH_USER_MODEL, verbose_name='Usuário Responsável pelo Recebimento'), + ), + ] diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 311918da1..14b62196b 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -8,7 +8,6 @@ from django.template import defaultfilters from django.utils import formats, timezone from django.utils.translation import ugettext_lazy as _ from model_utils import Choices -import reversion from sapl.base.models import SEQUENCIA_NUMERACAO_PROTOCOLO, Autor from sapl.comissoes.models import Comissao, Reuniao @@ -34,7 +33,6 @@ def grupo_autor(): return grupo.id -@reversion.register() class TipoProposicao(models.Model): descricao = models.CharField( max_length=50, @@ -108,7 +106,6 @@ class TipoMateriaManager(models.Manager): ) -@reversion.register() class TipoMateriaLegislativa(models.Model): objects = TipoMateriaManager() sigla = models.CharField(max_length=5, verbose_name=_('Sigla')) @@ -148,7 +145,6 @@ class TipoMateriaLegislativa(models.Model): return self.descricao -@reversion.register() class RegimeTramitacao(models.Model): descricao = models.CharField(max_length=50, verbose_name=_('Descrição')) @@ -161,7 +157,6 @@ class RegimeTramitacao(models.Model): return self.descricao -@reversion.register() class Origem(models.Model): sigla = models.CharField(max_length=10, verbose_name=_('Sigla')) nome = models.CharField(max_length=50, verbose_name=_('Nome')) @@ -187,7 +182,6 @@ def anexo_upload_path(instance, filename): return texto_upload_path(instance, filename, subpath=instance.materia.ano) -@reversion.register() class MateriaLegislativa(models.Model): tipo = models.ForeignKey( @@ -344,9 +338,9 @@ class MateriaLegislativa(models.Model): numero=self.numero_protocolo).first() if protocolo: if protocolo.timestamp: - return protocolo.timestamp.date() + return protocolo.timestamp elif protocolo.timestamp_data_hora_manual: - return protocolo.timestamp_data_hora_manual.date() + return protocolo.timestamp_data_hora_manual elif protocolo.data: return protocolo.data @@ -384,7 +378,6 @@ class MateriaLegislativa(models.Model): update_fields=update_fields) -@reversion.register() class Autoria(models.Model): autor = models.ForeignKey(Autor, verbose_name=_('Autor'), @@ -407,7 +400,6 @@ class Autoria(models.Model): 'autor': self.autor, 'materia': self.materia} -@reversion.register() class AcompanhamentoMateria(models.Model): usuario = models.CharField(max_length=50) materia = models.ForeignKey(MateriaLegislativa, on_delete=models.CASCADE) @@ -436,7 +428,6 @@ class AcompanhamentoMateria(models.Model): } -@reversion.register() class PautaReuniao(models.Model): reuniao = models.ForeignKey( Reuniao, related_name='reuniao_set', @@ -462,7 +453,6 @@ class PautaReuniao(models.Model): } -@reversion.register() class Anexada(models.Model): materia_principal = models.ForeignKey( MateriaLegislativa, related_name='materia_principal_set', @@ -488,7 +478,6 @@ class Anexada(models.Model): 'materia_anexada': self.materia_anexada} -@reversion.register() class AssuntoMateria(models.Model): assunto = models.CharField( max_length=50, @@ -507,7 +496,6 @@ class AssuntoMateria(models.Model): return self.assunto -@reversion.register() class DespachoInicial(models.Model): materia = models.ForeignKey(MateriaLegislativa, on_delete=models.CASCADE) comissao = models.ForeignKey( @@ -524,7 +512,6 @@ class DespachoInicial(models.Model): 'comissao': self.comissao} -@reversion.register() class TipoDocumento(models.Model): descricao = models.CharField( max_length=50, verbose_name=_('Tipo Documento')) @@ -545,7 +532,6 @@ class TipoDocumento(models.Model): return self.descricao -@reversion.register() class DocumentoAcessorio(models.Model): materia = models.ForeignKey(MateriaLegislativa, on_delete=models.CASCADE) tipo = models.ForeignKey( @@ -613,7 +599,6 @@ class DocumentoAcessorio(models.Model): update_fields=update_fields) -@reversion.register() class MateriaAssunto(models.Model): # TODO M2M ?? assunto = models.ForeignKey( @@ -635,7 +620,6 @@ class MateriaAssunto(models.Model): 'materia': self.materia, 'assunto': self.assunto} -@reversion.register() class Numeracao(models.Model): materia = models.ForeignKey(MateriaLegislativa, on_delete=models.CASCADE) tipo_materia = models.ForeignKey( @@ -663,7 +647,6 @@ class Numeracao(models.Model): 'ano': self.ano_materia} -@reversion.register() class Orgao(models.Model): nome = models.CharField(max_length=256, verbose_name=_('Nome')) sigla = models.CharField(max_length=15, verbose_name=_('Sigla')) @@ -693,7 +676,6 @@ class Orgao(models.Model): '%(nome)s - %(sigla)s') % {'nome': self.nome, 'sigla': self.sigla} -@reversion.register() class TipoFimRelatoria(models.Model): descricao = models.CharField( max_length=50, verbose_name=_('Tipo Fim Relatoria')) @@ -707,7 +689,6 @@ class TipoFimRelatoria(models.Model): return self.descricao -@reversion.register() class Relatoria(models.Model): materia = models.ForeignKey(MateriaLegislativa, on_delete=models.CASCADE) parlamentar = models.ForeignKey(Parlamentar, @@ -744,7 +725,6 @@ class Relatoria(models.Model): 'data': self.data_designacao_relator.strftime("%d/%m/%Y")} -@reversion.register() class Parecer(models.Model): relatoria = models.ForeignKey(Relatoria, on_delete=models.CASCADE) materia = models.ForeignKey(MateriaLegislativa, on_delete=models.CASCADE) @@ -764,8 +744,8 @@ class Parecer(models.Model): } -@reversion.register() class Proposicao(models.Model): + autor = models.ForeignKey( Autor, null=True, @@ -800,6 +780,33 @@ class Proposicao(models.Model): verbose_name=_('Data de Devolução') ) + usuario_envio = models.ForeignKey( + get_settings_auth_user_model(), + verbose_name=_('Usuário Responsável pelo Envio'), + on_delete=models.PROTECT, + related_name='proposicoes_enviadas', + blank=True, + null=True + ) + + usuario_recebimento = models.ForeignKey( + get_settings_auth_user_model(), + verbose_name=_('Usuário Responsável pelo Recebimento'), + on_delete=models.PROTECT, + related_name='proposicoes_recebidas', + blank=True, + null=True + ) + + usuario_devolucao = models.ForeignKey( + get_settings_auth_user_model(), + verbose_name=_('Usuário Responsável pela Devolução'), + on_delete=models.PROTECT, + related_name='proposicoes_devolvidas', + blank=True, + null=True + ) + descricao = models.TextField(verbose_name=_('Ementa')) justificativa_devolucao = models.CharField( @@ -1013,6 +1020,13 @@ class Proposicao(models.Model): def save(self, force_insert=False, force_update=False, using=None, update_fields=None): + # atualiza o usuario baseado no status da proposição (que esta sendo calculado pela data) + if self.data_envio is not None and not self.usuario_envio: + self.usuario_envio = self.user + elif self.data_recebimento is not None and not self.usuario_recebimento: + self.usuario_recebimento = self.user + elif self.data_devolucao is not None and not self.usuario_devolucao: + self.usuario_devolucao = self.user if not self.pk and self.texto_original: texto_original = self.texto_original @@ -1074,7 +1088,6 @@ class HistoricoProposicao(models.Model): return f'{self.data_hora} - {self.STATUS_PROPOSICAO[self.status]} - {str(self.proposicao)}' -@reversion.register() class StatusTramitacao(models.Model): INDICADOR_CHOICES = Choices(('F', 'fim', _('Fim')), ('R', 'retorno', _('Retorno'))) @@ -1110,7 +1123,6 @@ class UnidadeTramitacaoManager(models.Manager): ).order_by('nome_composto') -@reversion.register() class UnidadeTramitacao(models.Model): comissao = models.ForeignKey( Comissao, blank=True, null=True, @@ -1156,7 +1168,6 @@ class UnidadeTramitacao(models.Model): return _('%(parlamentar)s') % {'parlamentar': self.parlamentar} -@reversion.register() class Tramitacao(models.Model): TURNO_CHOICES = Choices( ('P', 'primeiro', _('Primeiro')), diff --git a/sapl/materia/views.py b/sapl/materia/views.py index daf0fe0cb..7b80b7918 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1,11 +1,11 @@ from datetime import datetime from io import BytesIO -from random import choice -from string import ascii_letters, digits import logging import os +from random import choice import shutil +from string import ascii_letters, digits import time import zipfile @@ -31,6 +31,7 @@ from django.views.generic.edit import FormView from django_filters.views import FilterView import weasyprint +import sapl from sapl.base.email_utils import do_envia_email_confirmacao from sapl.base.models import Autor, CasaLegislativa, AppConfig as BaseAppConfig from sapl.comissoes.models import Participacao @@ -53,7 +54,6 @@ from sapl.utils import (autor_label, autor_modal, gerar_hash_arquivo, get_base_u mail_service_configured, montar_row_autor, SEPARADOR_HASH_PROPOSICAO, show_results_filter_set, get_tempfile_dir, google_recaptcha_configured) -import sapl from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm, AnexadaEmLoteFilterSet, AdicionarVariasAutoriasFilterSet, @@ -437,7 +437,8 @@ class PesquisarStatusTramitacaoView(FilterView): url = '' if 'descricao' in self.request.META['QUERY_STRING'] or\ - 'page' in self.request.META['QUERY_STRING']: resultados = self.object_list + 'page' in self.request.META['QUERY_STRING']: + resultados = self.object_list else: resultados = [] @@ -476,6 +477,13 @@ class TipoProposicaoCrud(CrudAux): form_class = TipoProposicaoForm layout_key = None + def get_initial(self): + initial = CrudAux.UpdateView.get_initial(self) + ct = self.object.content_type + initial['content_type'] = f'{ct.app_label}/{ct.model}' + initial['tipo_conteudo_related'] = self.object.object_id + return initial + def criar_materia_proposicao(proposicao): tipo_materia = TipoMateriaLegislativa.objects.get( @@ -792,14 +800,20 @@ class UnidadeTramitacaoCrud(CrudAux): def get_headers(self): return [_('Unidade de Tramitação')] + def is_not_empty(self, value): + if value is None: + return False + value = value.strip().replace(' ', '') + return value != '' + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) for row in context['rows']: - if row[0][0]: # Comissão + if self.is_not_empty(row[0][0]): # Comissão pass - elif row[1][0]: # Órgão + elif self.is_not_empty(row[1][0]): # Órgão row[0] = (row[1][0], row[0][1]) - elif row[2][0]: # Parlamentar + elif self.is_not_empty(row[2][0]): # Parlamentar row[0] = (row[2][0], row[0][1]) row[1], row[2] = ('', ''), ('', '') return context @@ -1246,7 +1260,13 @@ class HistoricoProposicaoView(PermissionRequiredMixin, ListView): ordering = ['-data_hora'] paginate_by = 10 model = HistoricoProposicao - permission_required = ('materia.detail_proposicao_enviada', ) + permission_required = ( + 'materia.list_historicoproposicao', + 'materia.add_historicoproposicao', + 'materia.change_historicoproposicao', + 'materia.delete_historicoproposicao', + 'materia.detail_historicoproposicao', + ) def get_queryset(self): qs = super().get_queryset() @@ -1259,7 +1279,7 @@ class HistoricoProposicaoView(PermissionRequiredMixin, ListView): if not user.is_superuser and grupo_autor.user_set.filter( id=user.id).exists(): - autores = Autor.objects.filter(user=user) + autores = Autor.objects.filter(operadores=user) qs = qs.filter(proposicao__autor__in=autores) return qs @@ -1395,10 +1415,11 @@ class TramitacaoCrud(MasterDetailCrud): # necessária? if ultima_tramitacao: if ultima_tramitacao.unidade_tramitacao_destino: - context['form'].fields[ - 'unidade_tramitacao_local'].choices = [ - (ultima_tramitacao.unidade_tramitacao_destino.pk, - ultima_tramitacao.unidade_tramitacao_destino)] + if BaseAppConfig.attr('tramitacao_origem_fixa'): + context['form'].fields[ + 'unidade_tramitacao_local'].choices = [ + (ultima_tramitacao.unidade_tramitacao_destino.pk, + ultima_tramitacao.unidade_tramitacao_destino)] else: self.logger.error('user=' + username + '. Unidade de tramitação destino ' 'da última tramitação não pode ser vazia!') @@ -1411,7 +1432,7 @@ class TramitacaoCrud(MasterDetailCrud): # Se não for a primeira tramitação daquela matéria, o campo # não pode ser modificado - if not primeira_tramitacao: + if not primeira_tramitacao and BaseAppConfig.attr('tramitacao_origem_fixa'): context['form'].fields[ 'unidade_tramitacao_local'].widget.attrs['readonly'] = True diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index 784d4ee7d..026d49842 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -2,24 +2,22 @@ import logging from crispy_forms.layout import (Button, Fieldset, HTML, Layout) from django import forms +from django.contrib.postgres.search import SearchVector from django.core.exceptions import ObjectDoesNotExist, ValidationError -from django.db import models from django.db.models import Q from django.forms import ModelChoiceField, ModelForm, widgets from django.utils import timezone from django.utils.translation import ugettext_lazy as _ import django_filters -from sapl.base.models import Autor, TipoAutor +from sapl.base.models import TipoAutor from sapl.crispy_layout_mixin import form_actions, SaplFormHelper, to_row -from sapl.materia.forms import choice_anos_com_materias from sapl.materia.models import (MateriaLegislativa, TipoMateriaLegislativa, Orgao) from sapl.parlamentares.models import Partido -from sapl.utils import (autor_label, autor_modal, ANO_CHOICES, choice_anos_com_normas, +from sapl.utils import (autor_label, autor_modal, ANO_CHOICES, choice_anos_com_normas, FileFieldCheckMixin, FilterOverridesMetaMixin, - NormaPesquisaOrderingFilter, RangeWidgetOverride, - validar_arquivo) + NormaPesquisaOrderingFilter, validar_arquivo) from .models import (AnexoNormaJuridica, AssuntoNorma, AutoriaNorma, NormaJuridica, NormaRelacionada, TipoNormaJuridica) @@ -75,7 +73,7 @@ class NormaFilterSet(django_filters.FilterSet): method='filter_ementa', label=_('Pesquisar expressões na ementa da norma')) - indexacao = django_filters.CharFilter(lookup_expr='icontains', + indexacao = django_filters.CharFilter(method='filter_indexacao', label=_('Indexação')) assuntos = django_filters.ModelChoiceFilter( @@ -124,20 +122,20 @@ class NormaFilterSet(django_filters.FilterSet): self.form.helper.layout = Layout( Fieldset(_('Pesquisa de Norma'), row1, row2, row3, row4, row5, - Fieldset(_('Pesquisa Avançada'), - row6, - HTML(autor_label), - HTML(autor_modal)), + Fieldset(_('Pesquisa Avançada'), + row6, + HTML(autor_label), + HTML(autor_modal)), form_actions(label='Pesquisar')) ) def filter_ementa(self, queryset, name, value): - texto = value.split() - q = Q() - for t in texto: - q &= Q(ementa__icontains=t) + return queryset.annotate(search=SearchVector('ementa', + config='portuguese')).filter(search=value) - return queryset.filter(q) + def filter_indexacao(self, queryset, name, value): + return queryset.annotate(search=SearchVector('indexacao', + config='portuguese')).filter(search=value) def filter_autoria(self, queryset, name, value): return queryset.filter(**{ @@ -311,7 +309,6 @@ class AutoriaNormaForm(ModelForm): if not self.instance: self.fields['autor'].choices = [] - class Meta: model = AutoriaNorma fields = ['tipo_autor', 'autor', @@ -400,7 +397,12 @@ class NormaRelacionadaForm(ModelForm): class Meta: model = NormaRelacionada - fields = ['orgao', 'tipo', 'numero', 'ano', 'ementa', 'tipo_vinculo'] + fields = ['orgao', 'tipo', 'numero', 'ano', + 'resumo', 'ementa', 'tipo_vinculo'] + + widgets = { + 'resumo': forms.Textarea( + attrs={'id': 'texto-rico'})} def __init__(self, *args, **kwargs): super(NormaRelacionadaForm, self).__init__(*args, **kwargs) diff --git a/sapl/norma/legacy.yaml b/sapl/norma/legacy.yaml deleted file mode 100644 index 23bf5bb80..000000000 --- a/sapl/norma/legacy.yaml +++ /dev/null @@ -1,46 +0,0 @@ -AssuntoNorma: - assunto: des_assunto - descricao: des_estendida - -TipoNormaJuridica: - descricao: des_tipo_norma - equivalente_lexml: voc_lexml - sigla: sgl_tipo_norma - -NormaJuridica: - ano: ano_norma - complemento: ind_complemento - data: dat_norma - data_publicacao: dat_publicacao - data_vigencia: dat_vigencia - ementa: txt_ementa - esfera_federacao: tip_esfera_federacao - indexacao: txt_indexacao - materia: cod_materia - numero: num_norma - observacao: txt_observacao - pagina_fim_publicacao: num_pag_fim_publ - pagina_inicio_publicacao: num_pag_inicio_publ - timestamp: timestamp - tipo: tip_norma - veiculo_publicacao: des_veiculo_publicacao - -LegislacaoCitada: - alinea: des_alinea - artigo: des_artigo - capitulo: des_capitulo - disposicoes: des_disposicoes - inciso: des_inciso - item: des_item - livro: des_livro - materia: cod_materia - norma: cod_norma - paragrafo: des_paragrafo - parte: des_parte - secao: des_secao - subsecao: des_subsecao - titulo: des_titulo - -NormaRelacionada (VinculoNormaJuridica): - norma_principal: cod_norma_referente - norma_relacionada: cod_norma_referida diff --git a/sapl/norma/migrations/0039_auto_20220321_0934.py b/sapl/norma/migrations/0039_auto_20220321_0934.py new file mode 100644 index 000000000..711f3bd7f --- /dev/null +++ b/sapl/norma/migrations/0039_auto_20220321_0934.py @@ -0,0 +1,29 @@ +# Generated by Django 2.2.24 on 2022-03-21 12:34 + +from django.db import migrations, models +import sapl.norma.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0038_normajuridica_orgao'), + ] + + operations = [ + migrations.AlterField( + model_name='anexonormajuridica', + name='ano', + field=models.PositiveSmallIntegerField(choices=[(2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'), + ), + migrations.AlterField( + model_name='normaestatisticas', + name='ano', + field=models.PositiveSmallIntegerField(choices=[(2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], default=sapl.norma.models.get_ano_atual, verbose_name='Ano'), + ), + migrations.AlterField( + model_name='normajuridica', + name='ano', + field=models.PositiveSmallIntegerField(choices=[(2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'), + ), + ] diff --git a/sapl/norma/migrations/0040_normarelacionada_resumo.py b/sapl/norma/migrations/0040_normarelacionada_resumo.py new file mode 100644 index 000000000..1d2d14cd4 --- /dev/null +++ b/sapl/norma/migrations/0040_normarelacionada_resumo.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.28 on 2022-07-31 23:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0039_auto_20220321_0934'), + ] + + operations = [ + migrations.AddField( + model_name='normarelacionada', + name='resumo', + field=models.TextField(blank=True, default='', verbose_name='Resumo'), + ), + ] diff --git a/sapl/norma/migrations/0041_auto_20220814_2235.py b/sapl/norma/migrations/0041_auto_20220814_2235.py new file mode 100644 index 000000000..a8f14dfa4 --- /dev/null +++ b/sapl/norma/migrations/0041_auto_20220814_2235.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.28 on 2022-08-15 01:35 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0040_normarelacionada_resumo'), + ] + + operations = [ + migrations.AlterField( + model_name='normajuridica', + name='materia', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='normajuridica_set', to='materia.MateriaLegislativa', verbose_name='Matéria'), + ), + ] diff --git a/sapl/norma/migrations/0042_norma_viewnormasestatisticas.py b/sapl/norma/migrations/0042_norma_viewnormasestatisticas.py new file mode 100644 index 000000000..3179bd6ac --- /dev/null +++ b/sapl/norma/migrations/0042_norma_viewnormasestatisticas.py @@ -0,0 +1,56 @@ +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0041_auto_20220814_2235'), + ] + + operations = [ + migrations.RunSQL(""" +drop view if exists norma_viewnormasestatisticas; +create or replace view norma_viewnormasestatisticas as +select row_number() OVER() as id, * from ( + SELECT + ROW_NUMBER() OVER ( + PARTITION BY ano_est, mes_est + ORDER BY ano_est, mes_est desc, norma_count desc + )::smallint AS "mais_acessadas" + , + * + from ( + SELECT + "norma_normaestatisticas"."norma_id" as norma_id, + extract(year from horario_acesso) as ano_est, + extract(month from horario_acesso) as mes_est, + count(*) as norma_count, + "norma_normajuridica"."numero" as norma_numero, + "norma_normajuridica"."ano" as norma_ano, + "norma_normajuridica"."data" as norma_data, + "norma_tiponormajuridica"."sigla" as norma_tipo_sigla, + "norma_tiponormajuridica"."descricao" as norma_tipo_descricao, + "norma_normajuridica"."ementa" as norma_ementa, + "norma_normajuridica"."observacao" as norma_observacao + from norma_normaestatisticas + INNER JOIN "norma_normajuridica" ON ("norma_normaestatisticas"."norma_id" = "norma_normajuridica"."id") + INNER JOIN "norma_tiponormajuridica" ON ("norma_normajuridica"."tipo_id" = "norma_tiponormajuridica"."id") + group by + "norma_normaestatisticas"."norma_id", + ano_est, + mes_est, + norma_numero, + norma_ano, + norma_data, + norma_ementa, + norma_observacao, + norma_tipo_sigla, + norma_tipo_descricao + order by ano_est, mes_est desc, norma_count desc, norma_ano desc + ) as subquery +) as query_final + order by ano_est, mes_est desc, mais_acessadas; + """), + ] \ No newline at end of file diff --git a/sapl/norma/migrations/0043_viewnormasestatisticas.py b/sapl/norma/migrations/0043_viewnormasestatisticas.py new file mode 100644 index 000000000..b14a92645 --- /dev/null +++ b/sapl/norma/migrations/0043_viewnormasestatisticas.py @@ -0,0 +1,35 @@ +# Generated by Django 2.2.28 on 2022-09-19 20:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0042_norma_viewnormasestatisticas'), + ] + + operations = [ + migrations.CreateModel( + name='ViewNormasEstatisticas', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('mais_acessadas', models.PositiveSmallIntegerField(verbose_name='Mais Acessadas')), + ('ano_est', models.PositiveSmallIntegerField(verbose_name='Ano do Registro de Acesso')), + ('mes_est', models.PositiveSmallIntegerField(verbose_name='Mês do Registro de Acesso')), + ('norma_id', models.BigIntegerField(verbose_name='Id da Norma')), + ('norma_count', models.PositiveSmallIntegerField(verbose_name='Mês do Registro de Acesso')), + ('norma_numero', models.CharField(max_length=8, verbose_name='Número da Norma')), + ('norma_ano', models.PositiveSmallIntegerField(verbose_name='Ano da Norma')), + ('norma_ementa', models.TextField(verbose_name='Ementa')), + ('norma_observacao', models.TextField(blank=True, verbose_name='Observação')), + ('norma_tipo_sigla', models.CharField(max_length=3, verbose_name='Sigla do Tipo da Norma')), + ('norma_tipo_descricao', models.CharField(max_length=50, verbose_name='Descrição do Tipo da Norma')), + ('norma_data', models.DateField(verbose_name='Data da Norma')), + ], + options={ + 'db_table': 'norma_viewnormasestatisticas', + 'managed': False, + }, + ), + ] diff --git a/sapl/norma/migrations/0044_auto_20230529_1641.py b/sapl/norma/migrations/0044_auto_20230529_1641.py new file mode 100644 index 000000000..a09ee4816 --- /dev/null +++ b/sapl/norma/migrations/0044_auto_20230529_1641.py @@ -0,0 +1,29 @@ +# Generated by Django 2.2.28 on 2023-05-29 19:41 + +from django.db import migrations, models +import sapl.norma.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0043_viewnormasestatisticas'), + ] + + operations = [ + migrations.AlterField( + model_name='anexonormajuridica', + name='ano', + field=models.PositiveSmallIntegerField(choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'), + ), + migrations.AlterField( + model_name='normaestatisticas', + name='ano', + field=models.PositiveSmallIntegerField(choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], default=sapl.norma.models.get_ano_atual, verbose_name='Ano'), + ), + migrations.AlterField( + model_name='normajuridica', + name='ano', + field=models.PositiveSmallIntegerField(choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'), + ), + ] diff --git a/sapl/norma/models.py b/sapl/norma/models.py index 85358ed75..3e33d11ba 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -4,7 +4,6 @@ from django.template import defaultfilters from django.utils import timezone from django.utils.translation import ugettext_lazy as _ from model_utils import Choices -import reversion from sapl.base.models import Autor from sapl.compilacao.models import TextoArticulado @@ -16,7 +15,6 @@ from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, OverwriteStorage) -@reversion.register() class AssuntoNorma(models.Model): assunto = models.CharField(max_length=50, verbose_name=_('Assunto')) descricao = models.CharField( @@ -31,7 +29,6 @@ class AssuntoNorma(models.Model): return self.assunto -@reversion.register() class TipoNormaJuridica(models.Model): # TODO transform into Domain Model and use an FK for the field EQUIVALENTE_LEXML_CHOICES = ((name, name) for name in @@ -120,12 +117,12 @@ class NormaJuridicaManager(models.Manager): if not count: ta.dispositivos_set.filter( dispositivo_pai__isnull=False).delete() + ta.publicacao_set.all().delete() ta.delete() return qs -@reversion.register() class NormaJuridica(models.Model): objects = NormaJuridicaManager() @@ -150,7 +147,9 @@ class NormaJuridica(models.Model): verbose_name=_('Tipo da Norma Jurídica')) materia = models.ForeignKey( MateriaLegislativa, blank=True, null=True, - on_delete=models.PROTECT, verbose_name=_('Matéria')) + on_delete=models.PROTECT, + verbose_name=_('Matéria'), + related_name='normajuridica_set') orgao = models.ForeignKey( Orgao, blank=True, null=True, on_delete=models.PROTECT, verbose_name=_('Órgão')) @@ -308,7 +307,41 @@ class NormaEstatisticas(models.Model): 'usuario': self.usuario, 'norma': self.norma} -@reversion.register() +class ViewNormasEstatisticas(models.Model): + mais_acessadas = models.PositiveSmallIntegerField( + verbose_name=_('Mais Acessadas')) + ano_est = models.PositiveSmallIntegerField( + verbose_name=_('Ano do Registro de Acesso')) + mes_est = models.PositiveSmallIntegerField( + verbose_name=_('Mês do Registro de Acesso')) + + norma_id = models.BigIntegerField(verbose_name=_('Id da Norma')) + norma_count = models.PositiveSmallIntegerField( + verbose_name=_('Mês do Registro de Acesso')) + + norma_numero = models.CharField( + max_length=8, verbose_name=_('Número da Norma')) + + norma_ano = models.PositiveSmallIntegerField( + verbose_name=_('Ano da Norma')) + norma_ementa = models.TextField(verbose_name=_('Ementa')) + norma_observacao = models.TextField( + blank=True, verbose_name=_('Observação')) + + norma_tipo_sigla = models.CharField( + max_length=3, + verbose_name=_('Sigla do Tipo da Norma')) + + norma_tipo_descricao = models.CharField( + max_length=50, verbose_name=_('Descrição do Tipo da Norma')) + + norma_data = models.DateField(verbose_name=_('Data da Norma')) + + class Meta: + managed = False + db_table = "norma_viewnormasestatisticas" + + class AutoriaNorma(models.Model): autor = models.ForeignKey(Autor, verbose_name=_('Autor'), @@ -331,7 +364,6 @@ class AutoriaNorma(models.Model): 'autor': self.autor, 'norma': self.norma} -@reversion.register() class LegislacaoCitada(models.Model): materia = models.ForeignKey(MateriaLegislativa, on_delete=models.CASCADE) norma = models.ForeignKey(NormaJuridica, on_delete=models.CASCADE) @@ -369,7 +401,6 @@ class LegislacaoCitada(models.Model): return str(self.norma) -@reversion.register() class TipoVinculoNormaJuridica(models.Model): sigla = models.CharField( max_length=1, blank=True, verbose_name=_('Sigla')) @@ -390,7 +421,6 @@ class TipoVinculoNormaJuridica(models.Model): return self.descricao_ativa -@reversion.register() class NormaRelacionada(models.Model): norma_principal = models.ForeignKey( NormaJuridica, @@ -406,6 +436,11 @@ class NormaRelacionada(models.Model): TipoVinculoNormaJuridica, on_delete=models.PROTECT, verbose_name=_('Tipo de Vínculo')) + resumo = models.TextField( + blank=True, + default="", + verbose_name=_('Resumo'), + ) class Meta: verbose_name = _('Norma Relacionada') @@ -419,7 +454,6 @@ class NormaRelacionada(models.Model): 'norma_relacionada': str(self.norma_relacionada)} -@reversion.register() class AnexoNormaJuridica(models.Model): norma = models.ForeignKey( NormaJuridica, diff --git a/sapl/norma/views.py b/sapl/norma/views.py index 256399256..d6d474590 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -100,10 +100,11 @@ class PesquisarAssuntoNormaView(FilterView): if data: url = '&' + str(self.request.META["QUERY_STRING"]) if url.startswith("&page"): - url = '' + url = '' if 'assunto' in self.request.META['QUERY_STRING'] or\ - 'page' in self.request.META['QUERY_STRING']: resultados = self.object_list + 'page' in self.request.META['QUERY_STRING']: + resultados = self.object_list else: resultados = [] @@ -125,7 +126,7 @@ class NormaRelacionadaCrud(MasterDetailCrud): help_topic = 'norma_juridica' class BaseMixin(MasterDetailCrud.BaseMixin): - list_field_names = ['norma_relacionada', 'tipo_vinculo'] + list_field_names = ['norma_relacionada', 'tipo_vinculo', 'resujmo'] class CreateView(MasterDetailCrud.CreateView): form_class = NormaRelacionadaForm @@ -273,13 +274,14 @@ class NormaCrud(Crud): class DetailView(Crud.DetailView): def get(self, request, *args, **kwargs): estatisticas_acesso_normas = AppConfig.objects.first().estatisticas_acesso_normas - if estatisticas_acesso_normas == 'S': + if estatisticas_acesso_normas == 'S' and \ + NormaJuridica.objects.filter(id=kwargs['pk']).exists(): NormaEstatisticas.objects.create(usuario=str(self.request.user), norma_id=kwargs['pk'], ano=timezone.now().year, horario_acesso=timezone.now()) - if not 'display' in request.GET and \ + if 'display' not in request.GET and \ not request.user.has_perm('norma.change_normajuridica'): ta = self.get_object().texto_articulado.first() if ta and ta.privacidade == STATUS_TA_PUBLIC: diff --git a/sapl/painel/models.py b/sapl/painel/models.py index aec696a53..8a178e6c2 100644 --- a/sapl/painel/models.py +++ b/sapl/painel/models.py @@ -1,9 +1,7 @@ -import reversion from django.db import models from django.utils.translation import ugettext_lazy as _ -@reversion.register() class Painel(models.Model): PAINEL_TYPES = ( ('C', 'Completo'), @@ -24,7 +22,6 @@ class Painel(models.Model): return str(self.aberto) + ":" + self.data_painel.strftime("%d/%m/%Y") -@reversion.register() class Cronometro(models.Model): CRONOMETRO_TYPES = ( ('A', _('Aparte')), diff --git a/sapl/painel/views.py b/sapl/painel/views.py index e93d609e1..bf0504bbd 100644 --- a/sapl/painel/views.py +++ b/sapl/painel/views.py @@ -446,7 +446,7 @@ def response_nenhuma_materia(response): return JsonResponse(response) -def get_votos(response, materia): +def get_votos(response, materia, mostrar_voto): logger = logging.getLogger(__name__) if type(materia) == OrdemDia: if materia.tipo_votacao != 4: @@ -492,8 +492,13 @@ def get_votos(response, materia): for i, p in enumerate(response['presentes']): try: logger.info("Tentando obter votos do parlamentar (id={}).".format(p['parlamentar_id'])) - if votos_parlamentares.get(parlamentar_id=p['parlamentar_id']).voto: - response['presentes'][i]['voto'] = 'Voto Informado' + voto = votos_parlamentares.get(parlamentar_id=p['parlamentar_id']).voto + + if voto: + if mostrar_voto: + response['presentes'][i]['voto'] = voto + else: + response['presentes'][i]['voto'] = 'Voto Informado' except ObjectDoesNotExist: # logger.error("Votos do parlamentar (id={}) não encontrados. Retornado vazio." # .format(p['parlamentar_id'])) @@ -564,7 +569,8 @@ def get_dados_painel(request, pk): 'cronometro_consideracoes': get_cronometro_status(request, 'consideracoes'), 'status_painel': sessao.painel_aberto, 'brasao': brasao, - 'discutir': False + 'discutir': False, + 'mostrar_voto': app_config.mostrar_voto } ordem_dia = get_materia_aberta(pk) @@ -577,13 +583,13 @@ def get_dados_painel(request, pk): response.update({'discutir':True}) return JsonResponse(get_votos( get_presentes(pk, response, ordem_dia), - ordem_dia)) + ordem_dia, app_config.mostrar_voto)) elif expediente: if expediente.resultado == 'Matéria em Discussão': response.update({'discutir':True}) return JsonResponse(get_votos( get_presentes(pk, response, expediente), - expediente)) + expediente, app_config.mostrar_voto)) # Caso não tenha nenhuma aberta, # a matéria a ser mostrada no Painel deve ser a última votada @@ -619,7 +625,7 @@ def get_dados_painel(request, pk): if ordem_expediente: return JsonResponse(get_votos( get_presentes(pk, response, ordem_expediente), - ordem_expediente)) + ordem_expediente, app_config.mostrar_voto)) # Retorna que não há nenhuma matéria já votada ou aberta return response_nenhuma_materia(get_presentes(pk, response, None)) diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index 31e216184..8621eb360 100755 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -1,7 +1,6 @@ from datetime import timedelta import logging -from sapl.crispy_layout_mixin import SaplFormHelper from crispy_forms.layout import Fieldset, Layout from django import forms from django.contrib.auth import get_user_model @@ -13,14 +12,15 @@ from django.db.models import Q from django.forms import ModelForm from django.utils import timezone from django.utils.translation import ugettext_lazy as _ +import django_filters from floppyforms.widgets import ClearableFileInput from image_cropping.widgets import CropWidget, ImageCropWidget -from sapl.utils import FileFieldCheckMixin from sapl.base.models import Autor, TipoAutor +from sapl.crispy_layout_mixin import SaplFormHelper from sapl.crispy_layout_mixin import form_actions, to_row from sapl.rules import SAPL_GROUP_VOTANTE -import django_filters +from sapl.utils import FileFieldCheckMixin from .models import (Coligacao, ComposicaoColigacao, Filiacao, Frente, Legislatura, Mandato, Parlamentar, Partido, Votante, Bloco, FrenteParlamentar, BlocoMembro) @@ -161,6 +161,10 @@ class LegislaturaForm(ModelForm): model = Legislatura exclude = [] + widgets = { + 'observacao': forms.Textarea( + attrs={'id': 'texto-rico'})} + def clean(self): data = super(LegislaturaForm, self).clean() @@ -253,7 +257,8 @@ class ParlamentarFilterSet(django_filters.FilterSet): class ColigacaoFilterSet(django_filters.FilterSet): - nome = django_filters.CharFilter(label=_('Nome da Coligação'), lookup_expr='icontains') + nome = django_filters.CharFilter( + label=_('Nome da Coligação'), lookup_expr='icontains') class Meta: model = Coligacao @@ -316,7 +321,8 @@ class ParlamentarCreateForm(ParlamentarForm): return self.cleaned_data cleaned_data = self.cleaned_data - parlamentar = Parlamentar.objects.filter(nome_parlamentar=cleaned_data['nome_parlamentar']).exists() + parlamentar = Parlamentar.objects.filter( + nome_parlamentar=cleaned_data['nome_parlamentar']).exists() if parlamentar: self.logger.error('Parlamentar já cadastrado.') @@ -537,9 +543,11 @@ class FrenteParlamentarForm(ModelForm): return self.cleaned_data if cd['cargo'].cargo_unico: - frente_parlamentar = FrenteParlamentar.objects.filter(frente=cd['frente'], cargo=cd['cargo']) + frente_parlamentar = FrenteParlamentar.objects.filter( + frente=cd['frente'], cargo=cd['cargo']) if frente_parlamentar and not frente_parlamentar[0].parlamentar == cd['parlamentar']: - raise ValidationError(_("Cargo único já ocupado por outro parlamentar.")) + raise ValidationError( + _("Cargo único já ocupado por outro parlamentar.")) return cd @@ -669,11 +677,15 @@ class VincularParlamentarForm(forms.Form): data_expedicao_diploma = cleaned_data['data_expedicao_diploma'] if parlamentar.mandato_set.filter(legislatura=legislatura): - self.logger.error('Parlamentar já está vinculado a legislatura informada.') - raise ValidationError(_('Parlamentar já está vinculado a legislatura informada.')) + self.logger.error( + 'Parlamentar já está vinculado a legislatura informada.') + raise ValidationError( + _('Parlamentar já está vinculado a legislatura informada.')) elif data_expedicao_diploma and legislatura.data_inicio <= data_expedicao_diploma: - self.logger.error('Data da Expedição do Diploma deve ser anterior a data de início da Legislatura.') - raise ValidationError(_('Data da Expedição do Diploma deve ser anterior a data de início da Legislatura.')) + self.logger.error( + 'Data da Expedição do Diploma deve ser anterior a data de início da Legislatura.') + raise ValidationError( + _('Data da Expedição do Diploma deve ser anterior a data de início da Legislatura.')) return cleaned_data @@ -714,6 +726,8 @@ class BlocoForm(ModelForm): ) else: bloco.save() + + bloco.partidos.set(self.cleaned_data['partidos']) return bloco @@ -736,8 +750,10 @@ class BlocoMembroForm(ModelForm): if cd['cargo'].cargo_unico \ and BlocoMembro.objects.filter(bloco=cd['bloco'], cargo=cd['cargo'], data_saida__isnull=True)\ .exclude(pk=self.instance.pk).exists(): - raise ValidationError(_("Cargo único já ocupado por outro membro.")) + raise ValidationError( + _("Cargo único já ocupado por outro membro.")) elif not cd['data_saida'] and BlocoMembro.objects.filter(parlamentar=cd['parlamentar'], data_saida__isnull=True).exists(): - raise ValidationError(_("Parlamentar já é membro do bloco parlamentar.")) + raise ValidationError( + _("Parlamentar já é membro do bloco parlamentar.")) return cd diff --git a/sapl/parlamentares/legacy.yaml b/sapl/parlamentares/legacy.yaml deleted file mode 100644 index fc72431f5..000000000 --- a/sapl/parlamentares/legacy.yaml +++ /dev/null @@ -1,101 +0,0 @@ -Legislatura: - numero: num_legislatura - data_eleicao: dat_eleicao - data_fim: dat_fim - data_inicio: dat_inicio - -SessaoLegislativa: - data_fim: dat_fim - data_fim_intervalo: dat_fim_intervalo - data_inicio: dat_inicio - data_inicio_intervalo: dat_inicio_intervalo - legislatura: num_legislatura - numero: num_sessao_leg - tipo: tip_sessao_leg - -Coligacao: - legislatura: num_legislatura - nome: nom_coligacao - numero_votos: num_votos_coligacao - -Partido: - data_criacao: dat_criacao - data_extincao: dat_extincao - nome: nom_partido - sigla: sgl_partido - -ComposicaoColigacao: - coligacao: cod_coligacao - partido: cod_partido - -NivelInstrucao: - descricao: des_nivel_instrucao - -SituacaoMilitar: - descricao: des_tipo_situacao - -Parlamentar: - ativo: ind_ativo - biografia: txt_biografia - cep_residencia: num_cep_resid - cpf: num_cpf - data_nascimento: dat_nascimento - email: end_email - endereco_residencia: end_residencial - endereco_web: end_web - fax: num_fax_parlamentar - fax_residencia: num_fax_resid - locais_atuacao: des_local_atuacao - nivel_instrucao: cod_nivel_instrucao - nome_completo: nom_completo - nome_parlamentar: nom_parlamentar - numero_gab_parlamentar: num_gab_parlamentar - profissao: nom_profissao - rg: num_rg - sexo: sex_parlamentar - situacao_militar: tip_situacao_militar - telefone: num_tel_parlamentar - telefone_residencia: num_tel_resid - titulo_eleitor: num_tit_eleitor - -TipoDependente: - descricao: des_tipo_dependente - -Dependente: - cpf: num_cpf - data_nascimento: dat_nascimento - nome: nom_dependente - parlamentar: cod_parlamentar - rg: num_rg - sexo: sex_dependente - tipo: tip_dependente - titulo_eleitor: num_tit_eleitor - -Filiacao: - data: dat_filiacao - data_desfiliacao: dat_desfiliacao - parlamentar: cod_parlamentar - partido: cod_partido - -TipoAfastamento: - descricao: des_afastamento - dispositivo: des_dispositivo - -Mandato: - coligacao: cod_coligacao - data_expedicao_diploma: dat_expedicao_diploma - legislatura: num_legislatura - observacao: txt_observacao - parlamentar: cod_parlamentar - tipo_afastamento: tip_afastamento - tipo_causa_fim_mandato: tip_causa_fim_mandato - votos_recebidos: num_votos_recebidos - -CargoMesa: - descricao: des_cargo - unico: ind_unico - -ComposicaoMesa: - cargo: cod_cargo - parlamentar: cod_parlamentar - sessao_legislativa: cod_sessao_leg diff --git a/sapl/parlamentares/migrations/0039_legislatura_observacao.py b/sapl/parlamentares/migrations/0039_legislatura_observacao.py new file mode 100644 index 000000000..0c68d5f1e --- /dev/null +++ b/sapl/parlamentares/migrations/0039_legislatura_observacao.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.20 on 2022-07-28 23:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('parlamentares', '0038_sessao_legislativa_redundante'), + ] + + operations = [ + migrations.AddField( + model_name='legislatura', + name='observacao', + field=models.TextField(blank=True, verbose_name='Observação'), + ), + ] diff --git a/sapl/parlamentares/migrations/0040_auto_20220806_1341.py b/sapl/parlamentares/migrations/0040_auto_20220806_1341.py new file mode 100644 index 000000000..69bd95510 --- /dev/null +++ b/sapl/parlamentares/migrations/0040_auto_20220806_1341.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.28 on 2022-08-06 16:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('parlamentares', '0039_legislatura_observacao'), + ] + + operations = [ + migrations.AlterField( + model_name='parlamentar', + name='rg', + field=models.CharField(blank=True, max_length=20, verbose_name='R.G.'), + ), + migrations.AlterField( + model_name='parlamentar', + name='titulo_eleitor', + field=models.CharField(blank=True, max_length=25, verbose_name='Título de Eleitor'), + ), + ] diff --git a/sapl/parlamentares/migrations/0041_parlamentar_telefone_celular.py b/sapl/parlamentares/migrations/0041_parlamentar_telefone_celular.py new file mode 100644 index 000000000..6d4d65631 --- /dev/null +++ b/sapl/parlamentares/migrations/0041_parlamentar_telefone_celular.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.28 on 2023-01-12 14:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('parlamentares', '0040_auto_20220806_1341'), + ] + + operations = [ + migrations.AddField( + model_name='parlamentar', + name='telefone_celular', + field=models.CharField(blank=True, max_length=50, verbose_name='Celular'), + ), + ] diff --git a/sapl/parlamentares/migrations/0042_auto_20230529_1641.py b/sapl/parlamentares/migrations/0042_auto_20230529_1641.py new file mode 100644 index 000000000..d941d0424 --- /dev/null +++ b/sapl/parlamentares/migrations/0042_auto_20230529_1641.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.28 on 2023-05-29 19:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('parlamentares', '0041_parlamentar_telefone_celular'), + ] + + operations = [ + migrations.AlterField( + model_name='parlamentar', + name='telefone_celular', + field=models.CharField(blank=True, max_length=50, verbose_name='Telefone Celular'), + ), + ] diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py index 096c16814..8c6515d68 100644 --- a/sapl/parlamentares/models.py +++ b/sapl/parlamentares/models.py @@ -5,7 +5,6 @@ from django.utils.translation import ugettext_lazy as _ from image_cropping.fields import ImageCropField, ImageRatioField from model_utils import Choices from prompt_toolkit.key_binding.bindings.named_commands import self_insert -import reversion from sapl.base.models import Autor from sapl.decorators import vigencia_atual @@ -15,13 +14,15 @@ from sapl.utils import (LISTA_DE_UFS, YES_NO_CHOICES, SaplGenericRelation, restringe_tipos_de_arquivo_img, texto_upload_path) -@reversion.register() class Legislatura(models.Model): numero = models.PositiveIntegerField(verbose_name=_('Número')) data_inicio = models.DateField(verbose_name=_('Data Início')) data_fim = models.DateField(verbose_name=_('Data Fim')) data_eleicao = models.DateField(verbose_name=_('Data Eleição')) + observacao = models.TextField( + blank=True, verbose_name=_('Observação')) + class Meta: ordering = ['-data_inicio'] verbose_name = _('Legislatura') @@ -44,7 +45,6 @@ class Legislatura(models.Model): 'end': self.data_fim.year} -@reversion.register() class SessaoLegislativa(models.Model): TIPO_SESSAO_CHOICES = Choices( ('O', 'ordinaria', _('Ordinária')), @@ -78,7 +78,6 @@ class SessaoLegislativa(models.Model): 'fim': self.data_fim.year} -@reversion.register() class Coligacao(models.Model): legislatura = models.ForeignKey(Legislatura, on_delete=models.PROTECT, @@ -105,7 +104,6 @@ def logo_upload_path(instance, filename): return get_logo_media_path(instance, 'logo', filename) -@reversion.register() class Partido(models.Model): sigla = models.CharField(max_length=20, verbose_name=_('Sigla')) nome = models.CharField(max_length=50, verbose_name=_('Nome')) @@ -133,7 +131,6 @@ class Partido(models.Model): } -@reversion.register() class ComposicaoColigacao(models.Model): # TODO M2M partido = models.ForeignKey(Partido, @@ -152,7 +149,6 @@ class ComposicaoColigacao(models.Model): } -@reversion.register() class NivelInstrucao(models.Model): descricao = models.CharField( max_length=50, verbose_name=_('Nível de Instrução')) @@ -166,7 +162,6 @@ class NivelInstrucao(models.Model): return self.descricao -@reversion.register() class SituacaoMilitar(models.Model): descricao = models.CharField( max_length=50, verbose_name=_('Situação Militar')) @@ -193,7 +188,6 @@ def true_false_none(x): return None -@reversion.register() class Parlamentar(models.Model): FEMININO = 'F' MASCULINO = 'M' @@ -224,15 +218,17 @@ class Parlamentar(models.Model): cpf = models.CharField( max_length=14, blank=True, verbose_name=_('C.P.F')) rg = models.CharField( - max_length=15, blank=True, verbose_name=_('R.G.')) + max_length=20, blank=True, verbose_name=_('R.G.')) titulo_eleitor = models.CharField( - max_length=15, + max_length=25, blank=True, verbose_name=_('Título de Eleitor')) numero_gab_parlamentar = models.CharField( max_length=10, blank=True, verbose_name=_('Nº Gabinete')) telefone = models.CharField( max_length=50, blank=True, verbose_name=_('Telefone')) + telefone_celular = models.CharField( + max_length=50, blank=True, verbose_name=_('Telefone Celular')) fax = models.CharField( max_length=50, blank=True, verbose_name=_('Fax')) endereco_residencia = models.CharField( @@ -312,7 +308,7 @@ class Parlamentar(models.Model): @property def avatar_html(self): return ''if self.fotografia else '' + + self.fotografia.url + '>'if self.fotografia else '' def delete(self, using=None, keep_parents=False): if self.fotografia: @@ -339,7 +335,6 @@ class Parlamentar(models.Model): update_fields=update_fields) -@reversion.register() class TipoDependente(models.Model): descricao = models.CharField(max_length=150, verbose_name=_('Descrição')) @@ -352,7 +347,6 @@ class TipoDependente(models.Model): return self.descricao -@reversion.register() class Dependente(models.Model): FEMININO = 'F' MASCULINO = 'M' @@ -385,7 +379,6 @@ class Dependente(models.Model): return self.nome -@reversion.register() class Filiacao(models.Model): data = models.DateField(verbose_name=_('Data Filiação')) parlamentar = models.ForeignKey(Parlamentar, on_delete=models.CASCADE) @@ -408,7 +401,6 @@ class Filiacao(models.Model): } -@reversion.register() class TipoAfastamento(models.Model): descricao = models.CharField(max_length=50, verbose_name=_('Descrição')) indicador = models.CharField( @@ -427,7 +419,6 @@ class TipoAfastamento(models.Model): return self.descricao -@reversion.register() class Mandato(models.Model): parlamentar = models.ForeignKey(Parlamentar, on_delete=models.CASCADE) tipo_afastamento = models.ForeignKey( @@ -481,7 +472,6 @@ class Mandato(models.Model): f.data_desfiliacao or timezone.datetime.max.date())] -@reversion.register() class CargoMesa(models.Model): # TODO M2M ???? descricao = models.CharField( @@ -498,7 +488,6 @@ class CargoMesa(models.Model): return self.descricao -@reversion.register() class MesaDiretora(models.Model): data_inicio = models.DateField(verbose_name=_('Data Início'), null=True) data_fim = models.DateField(verbose_name=_('Data Fim'), null=True) @@ -513,16 +502,16 @@ class MesaDiretora(models.Model): def __str__(self): return _('Mesa da %(sessao)s sessao da %(legislatura)s Legislatura') % { - 'sessao':self.sessao_legislativa, 'legislatura':self.sessao_legislativa.legislatura + 'sessao': self.sessao_legislativa, 'legislatura': self.sessao_legislativa.legislatura } -@reversion.register() class ComposicaoMesa(models.Model): # TODO M2M ???? Ternary????? parlamentar = models.ForeignKey(Parlamentar, on_delete=models.PROTECT) cargo = models.ForeignKey(CargoMesa, on_delete=models.PROTECT) - mesa_diretora = models.ForeignKey(MesaDiretora, on_delete=models.PROTECT, null=True) + mesa_diretora = models.ForeignKey( + MesaDiretora, on_delete=models.PROTECT, null=True) class Meta: verbose_name = _('Ocupação de cargo na Mesa') @@ -535,7 +524,6 @@ class ComposicaoMesa(models.Model): } -@reversion.register() class Frente(models.Model): ''' * Uma frente agrupa vários parlamentares @@ -577,7 +565,6 @@ class Frente(models.Model): return self.nome -@reversion.register() class FrenteCargo(models.Model): nome_cargo = models.CharField( max_length=80, @@ -596,7 +583,6 @@ class FrenteCargo(models.Model): return f"{self.nome_cargo}" -@reversion.register() class FrenteParlamentar(models.Model): frente = models.ForeignKey( Frente, @@ -648,7 +634,6 @@ class Votante(models.Model): return self.user.username -@reversion.register() class Bloco(models.Model): ''' * blocos podem existir por mais de uma legislatura @@ -690,7 +675,6 @@ class Bloco(models.Model): return self.nome -@reversion.register() class BlocoCargo(models.Model): nome_cargo = models.CharField( max_length=120, @@ -709,7 +693,6 @@ class BlocoCargo(models.Model): return f"{self.nome_cargo}" -@reversion.register() class BlocoMembro(models.Model): bloco = models.ForeignKey( Bloco, diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 684b4f19b..95df777bc 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -177,8 +177,8 @@ class ProposicaoParlamentarCrud(CrudBaseForListAndDetailExternalAppView): yield (str(reverse_lazy( 'sapl.compilacao:ta_text', kwargs={'ta_id': ta.pk})) + '?back_type=history', - 'btn-success', - _('Texto Eletrônico')) + 'btn-success', + _('Texto Eletrônico')) class PesquisarParlamentarView(FilterView): @@ -226,7 +226,8 @@ class PesquisarParlamentarView(FilterView): url = '' if 'nome_parlamentar' in self.request.META['QUERY_STRING'] or\ - 'page' in self.request.META['QUERY_STRING']: resultados = self.object_list + 'page' in self.request.META['QUERY_STRING']: + resultados = self.object_list else: resultados = [] @@ -281,7 +282,8 @@ class PesquisarColigacaoView(FilterView): url = '' if 'nome' in self.request.META['QUERY_STRING'] or\ - 'page' in self.request.META['QUERY_STRING']: resultados = self.object_list + 'page' in self.request.META['QUERY_STRING']: + resultados = self.object_list else: resultados = [] @@ -335,7 +337,8 @@ class PesquisarPartidoView(FilterView): url = '' if 'nome' in self.request.META['QUERY_STRING'] or\ - 'page' in self.request.META['QUERY_STRING']: resultados = self.object_list + 'page' in self.request.META['QUERY_STRING']: + resultados = self.object_list else: resultados = [] @@ -351,7 +354,6 @@ class PesquisarPartidoView(FilterView): return self.render_to_response(context) - class ParticipacaoParlamentarCrud(CrudBaseForListAndDetailExternalAppView): model = Participacao parent_field = 'parlamentar' @@ -376,7 +378,8 @@ class ParticipacaoParlamentarCrud(CrudBaseForListAndDetailExternalAppView): comissoes = [] for p in object_list: - ## TODO: atualmente periodo.data_fim pode ser nulo o que pode gerar um erro nessa tela + # TODO: atualmente periodo.data_fim pode ser nulo o que pode + # gerar um erro nessa tela data_fim = p.composicao.periodo.data_fim if data_fim: data_fim = data_fim.strftime("%d/%m/%Y") @@ -580,8 +583,8 @@ class FrenteParlamentarCrud(MasterDetailCrud): def get_parlamentar_frentes(request, pk): template_name = 'parlamentares/parlamentar_frentes_list.html' frentes = [f for f in FrenteParlamentar.objects.filter(parlamentar_id=pk) - .select_related('frente', 'cargo') - .order_by('-data_entrada', '-data_saida')] + .select_related('frente', 'cargo') + .order_by('-data_entrada', '-data_saida')] context = { 'subnav_template_name': 'parlamentares/subnav.yaml', @@ -653,6 +656,11 @@ class ComposicaoColigacaoCrud(MasterDetailCrud): class LegislaturaCrud(CrudAux): model = Legislatura help_topic = 'legislatura' + list_field_names = [ + 'numero', + 'data_eleicao', + 'data_inicio', + 'data_fim'] class CreateView(CrudAux.CreateView): logger = logging.getLogger(__name__) @@ -1007,8 +1015,8 @@ class MesaDiretoraView(FormView): return self.render_to_response( {'legislaturas': Legislatura.objects.all( ).order_by('-numero'), - 'legislatura_selecionada': Legislatura.objects.last(), - 'cargos_vagos': CargoMesa.objects.all()}) + 'legislatura_selecionada': Legislatura.objects.last(), + 'cargos_vagos': CargoMesa.objects.all()}) @xframe_options_exempt def get(self, request, *args, **kwargs): @@ -1051,13 +1059,13 @@ class MesaDiretoraView(FormView): return self.render_to_response( {'legislaturas': Legislatura.objects.all( ).order_by('-numero'), - 'legislatura_selecionada': legislatura, - 'sessoes': sessoes, - 'sessao_selecionada': sessao_atual, - 'composicao_mesa': composicao_mesa, - 'parlamentares': parlamentares_vagos, - 'cargos_vagos': cargos_vagos - }) + 'legislatura_selecionada': legislatura, + 'sessoes': sessoes, + 'sessao_selecionada': sessao_atual, + 'composicao_mesa': composicao_mesa, + 'parlamentares': parlamentares_vagos, + 'cargos_vagos': cargos_vagos + }) def altera_field_mesa(request): @@ -1102,17 +1110,20 @@ def altera_field_mesa(request): # Mesa nao deve ser informada ainda if not mesa_diretora: # Cria nova mesa diretora ou retorna a primeira - mesa_diretora, _ = MesaDiretora.objects.get_or_create(sessao_legislativa=sessao_selecionada) + mesa_diretora, _ = MesaDiretora.objects.get_or_create( + sessao_legislativa=sessao_selecionada) # TODO: quando a mesa for criada explicitamente em tabelas auxiliares, # deve-se somente tentar recuperar a mesa, e caso nao exista # retornar o erro abaixo - # return JsonResponse({'msg': ('Nenhuma mesa encontrada na sessão!')}) + # return JsonResponse({'msg': ('Nenhuma mesa encontrada na sessão!')}) else: try: - mesa_diretora = MesaDiretora.objects.get(id=mesa_diretora, sessao_legislativa=sessao_selecionada) + mesa_diretora = MesaDiretora.objects.get( + id=mesa_diretora, sessao_legislativa=sessao_selecionada) except ObjectDoesNotExist: - mesa_diretora = MesaDiretora.objects.filter(sessao_legislativa=sessao_selecionada).first() + mesa_diretora = MesaDiretora.objects.filter( + sessao_legislativa=sessao_selecionada).first() # Atualiza os componentes da view após a mudança composicao_mesa = ComposicaoMesa.objects.select_related('cargo', 'parlamentar').filter( @@ -1156,13 +1167,14 @@ def insere_parlamentar_composicao(request): username = request.user.username if request.user.has_perm( '%s.add_%s' % ( - AppConfig.label, ComposicaoMesa._meta.model_name)): + AppConfig.label, ComposicaoMesa._meta.model_name)): composicao = ComposicaoMesa() try: # logger.debug( # "user=" + username + ". Tentando obter SessaoLegislativa com id={}.".format(request.POST['sessao'])) - mesa_diretora, _ = MesaDiretora.objects.get_or_create(sessao_legislativa_id=int(request.POST['sessao'])) + mesa_diretora, _ = MesaDiretora.objects.get_or_create( + sessao_legislativa_id=int(request.POST['sessao'])) composicao.mesa_diretora = mesa_diretora except MultiValueDictKeyError: logger.error( @@ -1217,7 +1229,7 @@ def remove_parlamentar_composicao(request): username = request.user.username if request.POST and request.user.has_perm( '%s.delete_%s' % ( - AppConfig.label, ComposicaoMesa._meta.model_name)): + AppConfig.label, ComposicaoMesa._meta.model_name)): if 'composicao_mesa' in request.POST: try: @@ -1227,7 +1239,8 @@ def remove_parlamentar_composicao(request): id=request.POST['composicao_mesa']) except ObjectDoesNotExist: logger.error( - "user=" + username + ". ComposicaoMesa com id={} não encontrada, portanto não pode ser removida." + "user=" + username + + ". ComposicaoMesa com id={} não encontrada, portanto não pode ser removida." .format(request.POST['composicao_mesa'])) return JsonResponse( {'msg': ( @@ -1331,7 +1344,8 @@ def altera_field_mesa_public_view(request): "Selecionado o id da primeira sessão.") sessao_selecionada = sessoes.first() else: - sessao_selecionada = SessaoLegislativa.objects.get(id=sessao_selecionada) + sessao_selecionada = SessaoLegislativa.objects.get( + id=sessao_selecionada) # Atualiza os componentes da view após a mudança lista_sessoes = [(s.id, s.__str__()) for s in sessoes] @@ -1344,10 +1358,12 @@ def altera_field_mesa_public_view(request): try: mesa_diretora = sessao_selecionada.mesadiretora_set.first() except ObjectDoesNotExist: - logger.error(f"user={username}. Mesa não encontrada com sessão Nº {sessao_selecionada.id}. ") + logger.error( + f"user={username}. Mesa não encontrada com sessão Nº {sessao_selecionada.id}. ") else: # Cria nova mesa diretora ou retorna a primeira - mesa_diretora, _ = MesaDiretora.objects.get_or_create(sessao_legislativa=sessao_selecionada) + mesa_diretora, _ = MesaDiretora.objects.get_or_create( + sessao_legislativa=sessao_selecionada) # TODO: quando a mesa for criada explicitamente em tabelas auxiliares, # deve-se somente tentar recuperar a mesa, e caso nao exista @@ -1372,6 +1388,7 @@ def altera_field_mesa_public_view(request): partido_parlamentar_sessao_legislativa(sessao, parlamentar)) if parlamentar.fotografia: try: + logger.warning(f"Iniciando cropping da imagem {parlamentar.fotografia}") thumbnail_url = get_backend().get_thumbnail_url( parlamentar.fotografia, { @@ -1381,6 +1398,7 @@ def altera_field_mesa_public_view(request): 'detail': True, } ) + logger.warning(f"Cropping da imagem {parlamentar.fotografia} realizado com sucesso") lista_fotos.append(thumbnail_url) except Exception as e: logger.error(e) diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 1d70d3a31..58223f21c 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -20,6 +20,7 @@ from sapl.crispy_layout_mixin import (form_actions, SaplFormHelper, from sapl.materia.models import (MateriaLegislativa, TipoMateriaLegislativa, UnidadeTramitacao) +from sapl.protocoloadm.models import VinculoDocAdminMateria from sapl.utils import (AnoNumeroOrderingFilter, autor_label, autor_modal, choice_anos_com_documentoadministrativo, choice_anos_com_materias, timing, @@ -793,7 +794,7 @@ class TramitacaoAdmForm(ModelForm): ip=tramitacao.ip, ultima_edicao=tramitacao.ultima_edicao )) - ## TODO: BULK UPDATE não envia Signal para Tramitacao + # TODO: BULK UPDATE não envia Signal para Tramitacao TramitacaoAdministrativo.objects.bulk_create(lista_tramitacao) return tramitacao @@ -915,7 +916,7 @@ class TramitacaoAdmEditForm(TramitacaoAdmForm): da.tramitacao = False if nova_tram_principal.status.indicador == "F" else True da.save() - ## TODO: refatorar? + # TODO: refatorar? return nova_tram_principal @@ -1138,9 +1139,10 @@ class DocumentoAdministrativoForm(FileFieldCheckMixin, ModelForm): tipo = TipoDocumentoAdministrativo.objects.get( id=tipo_documento) raise ValidationError( - _('{}/{} ({}) já existente!'.format(numero_documento, - ano_documento, - tipo))) + _('{}/{} ({}) já existente! ' + 'Você diferenciar preenchendo o campo complemento'.format(numero_documento, + ano_documento, + tipo))) # campos opcionais, mas que se informados devem ser válidos if numero_protocolo and ano_protocolo: @@ -1694,7 +1696,7 @@ class TramitacaoEmLoteAdmForm(ModelForm): ip=tramitacao.ip, ultima_edicao=tramitacao.ultima_edicao )) - ## TODO: BULK UPDATE não envia Signal para Tramitacao + # TODO: BULK UPDATE não envia Signal para Tramitacao TramitacaoAdministrativo.objects.bulk_create(lista_tramitacao) return tramitacao @@ -1732,3 +1734,100 @@ class TramitacaoEmLoteAdmFilterSet(django_filters.FilterSet): self.form.helper.layout = Layout( Fieldset(_('Tramitação em Lote'), row1, row2, form_actions(label=_('Pesquisar')))) + + +class VinculoDocAdminMateriaForm(ModelForm): + + logger = logging.getLogger(__name__) + + tipo = forms.ModelChoiceField( + label='Tipo', + required=True, + queryset=TipoMateriaLegislativa.objects.all(), + empty_label='Selecione', + ) + + numero = forms.IntegerField(label='Número', required=True) + + ano = forms.CharField(label='Ano', required=True) + + class Meta: + model = VinculoDocAdminMateria + fields = ['tipo', 'numero', 'ano', 'data_anexacao', 'data_desanexacao'] + + def __init__(self, *args, **kwargs): + return super().__init__(*args, **kwargs) + + def clean(self): + super().clean() + + if not self.is_valid(): + return self.cleaned_data + + cleaned_data = self.cleaned_data + + data_anexacao = cleaned_data['data_anexacao'] + data_desanexacao = cleaned_data['data_desanexacao'] if cleaned_data['data_desanexacao'] else data_anexacao + + if data_anexacao > data_desanexacao: + self.logger.error( + "Data de anexação posterior à data de desanexação.") + raise ValidationError( + _("Data de anexação posterior à data de desanexação.")) + + try: + self.logger.info("Tentando obter objeto MateriaLegislativa (numero={}, ano={}, tipo={})." + .format(cleaned_data['numero'], cleaned_data['ano'], cleaned_data['tipo'])) + materia = MateriaLegislativa.objects.get( + numero=cleaned_data['numero'], + ano=cleaned_data['ano'], + tipo=cleaned_data['tipo']) + except ObjectDoesNotExist: + msg = _('A {} {}/{} não existe no cadastro de matérias legislativas.' + .format(cleaned_data['tipo'], cleaned_data['numero'], cleaned_data['ano'])) + self.logger.warning( + "A matéria a ser anexada não existe no cadastro de matérias legislativas.") + raise ValidationError(msg) + + if VinculoDocAdminMateria.objects.filter( + documento=self.instance.documento, materia=materia + ).exclude(pk=self.instance.pk).exists(): + self.logger.error( + "Matéria já se encontra vinculada a este documento.") + raise ValidationError( + _('Matéria já se encontra vinculada a este documento')) + + cleaned_data['materia'] = materia + + return cleaned_data + + def save(self, commit=False): + vinculo = super().save(commit) + vinculo.materia = self.cleaned_data['materia'] + vinculo.save() + return vinculo + + +class VinculoDocAdminMateriaEmLoteFilterSet(django_filters.FilterSet): + + class Meta(FilterOverridesMetaMixin): + model = MateriaLegislativa + fields = ['tipo', 'data_apresentacao'] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.filters['tipo'].label = 'Tipo de Matéria' + self.filters['data_apresentacao'].label = 'Data (Inicial - Final)' + + self.form.fields['tipo'].required = True + self.form.fields['data_apresentacao'].required = True + + row1 = to_row([('tipo', 12)]) + row2 = to_row([('data_apresentacao', 12)]) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Pesquisa de Matérias'), + row1, row2, form_actions(label='Pesquisar'))) diff --git a/sapl/protocoloadm/legacy.yaml b/sapl/protocoloadm/legacy.yaml deleted file mode 100644 index 7dae79f73..000000000 --- a/sapl/protocoloadm/legacy.yaml +++ /dev/null @@ -1,62 +0,0 @@ -TipoDocumentoAdministrativo: - descricao: des_tipo_documento - sigla: sgl_tipo_documento - -DocumentoAdministrativo: - ano: ano_documento - assunto: txt_assunto - autor: cod_autor - data: dat_documento - data_fim_prazo: dat_fim_prazo - dias_prazo: num_dias_prazo - interessado: txt_interessado - numero: num_documento - observacao: txt_observacao - tipo: tip_documento - tramitacao: ind_tramitacao - -DocumentoAcessorioAdministrativo: - arquivo: nom_arquivo - assunto: txt_assunto - autor: nom_autor_documento - data: dat_documento - documento: cod_documento - indexacao: txt_indexacao - nome: nom_documento - tipo: tip_documento - -Protocolo: - ano: ano_protocolo - anulado: ind_anulado - assunto_ementa: txt_assunto_ementa - autor: cod_autor - data: dat_protocolo - hora: hor_protocolo - interessado: txt_interessado - ip_anulacao: txt_ip_anulacao - justificativa_anulacao: txt_just_anulacao - numero: num_protocolo - numero_paginas: num_paginas - observacao: txt_observacao - timestamp: dat_timestamp - timestamp_anulacao: timestamp_anulacao - tipo_documento: tip_documento - tipo_materia: tip_materia - tipo_processo: tip_processo - tipo_protocolo: tip_protocolo - user_anulacao: txt_user_anulacao - -StatusTramitacaoAdministrativo: - descricao: des_status - indicador: ind_fim_tramitacao - sigla: sgl_status - -TramitacaoAdministrativo: - data_encaminhamento: dat_encaminha - data_fim_prazo: dat_fim_prazo - data_tramitacao: dat_tramitacao - documento: cod_documento - status: cod_status - texto: txt_tramitacao - unidade_tramitacao_destino: cod_unid_tram_dest - unidade_tramitacao_local: cod_unid_tram_local diff --git a/sapl/protocoloadm/migrations/0040_auto_20220321_0934.py b/sapl/protocoloadm/migrations/0040_auto_20220321_0934.py new file mode 100644 index 000000000..65b839de8 --- /dev/null +++ b/sapl/protocoloadm/migrations/0040_auto_20220321_0934.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.24 on 2022-03-21 12:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('protocoloadm', '0039_auto_20211201_1201'), + ] + + operations = [ + migrations.AlterField( + model_name='documentoadministrativo', + name='ano', + field=models.PositiveSmallIntegerField(choices=[(2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'), + ), + migrations.AlterField( + model_name='protocolo', + name='ano', + field=models.PositiveSmallIntegerField(choices=[(2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano do Protocolo'), + ), + ] diff --git a/sapl/protocoloadm/migrations/0041_auto_20220804_2239.py b/sapl/protocoloadm/migrations/0041_auto_20220804_2239.py new file mode 100644 index 000000000..0e67fbc46 --- /dev/null +++ b/sapl/protocoloadm/migrations/0041_auto_20220804_2239.py @@ -0,0 +1,35 @@ +# Generated by Django 2.2.28 on 2022-08-05 01:39 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0081_auto_20220321_0934'), + ('protocoloadm', '0040_auto_20220321_0934'), + ] + + operations = [ + migrations.CreateModel( + name='VinculoDocAdminMateria', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('data_anexacao', models.DateField(verbose_name='Data Anexação')), + ('data_desanexacao', models.DateField(blank=True, null=True, verbose_name='Data Desanexação')), + ('documento', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='materialegislativa_vinculada_set', to='protocoloadm.DocumentoAdministrativo', verbose_name='Documento Administrativo')), + ('materia', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='documentoadministrativo_vinculado_set', to='materia.MateriaLegislativa', verbose_name='Matéria Legislativa')), + ], + options={ + 'verbose_name': 'Vinculo entre Documento Administrativo e Matéria Legislativa', + 'verbose_name_plural': 'Vinculos entre Documento Administrativo e Matéria Legislativa', + 'ordering': ('id',), + }, + ), + migrations.AddField( + model_name='documentoadministrativo', + name='materiasvinculadas', + field=models.ManyToManyField(blank=True, related_name='docadmsvinculados', through='protocoloadm.VinculoDocAdminMateria', to='materia.MateriaLegislativa'), + ), + ] diff --git a/sapl/protocoloadm/migrations/0042_auto_20220805_1236.py b/sapl/protocoloadm/migrations/0042_auto_20220805_1236.py new file mode 100644 index 000000000..cc667daba --- /dev/null +++ b/sapl/protocoloadm/migrations/0042_auto_20220805_1236.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.28 on 2022-08-05 15:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0081_auto_20220321_0934'), + ('protocoloadm', '0041_auto_20220804_2239'), + ] + + operations = [ + migrations.AlterField( + model_name='documentoadministrativo', + name='materiasvinculadas', + field=models.ManyToManyField(blank=True, related_name='docadmvinculados', through='protocoloadm.VinculoDocAdminMateria', to='materia.MateriaLegislativa'), + ), + migrations.AlterUniqueTogether( + name='vinculodocadminmateria', + unique_together={('documento', 'materia')}, + ), + ] diff --git a/sapl/protocoloadm/migrations/0043_auto_20220919_1705.py b/sapl/protocoloadm/migrations/0043_auto_20220919_1705.py new file mode 100644 index 000000000..adcfd7b18 --- /dev/null +++ b/sapl/protocoloadm/migrations/0043_auto_20220919_1705.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.28 on 2022-09-19 20:05 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('protocoloadm', '0042_auto_20220805_1236'), + ] + + operations = [ + migrations.AlterModelOptions( + name='documentoadministrativo', + options={'ordering': ('ano', 'numero', 'id'), 'verbose_name': 'Documento Administrativo', 'verbose_name_plural': 'Documentos Administrativos'}, + ), + ] diff --git a/sapl/protocoloadm/migrations/0044_auto_20230529_1641.py b/sapl/protocoloadm/migrations/0044_auto_20230529_1641.py new file mode 100644 index 000000000..6b7396677 --- /dev/null +++ b/sapl/protocoloadm/migrations/0044_auto_20230529_1641.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.28 on 2023-05-29 19:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('protocoloadm', '0043_auto_20220919_1705'), + ] + + operations = [ + migrations.AlterField( + model_name='documentoadministrativo', + name='ano', + field=models.PositiveSmallIntegerField(choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano'), + ), + migrations.AlterField( + model_name='protocolo', + name='ano', + field=models.PositiveSmallIntegerField(choices=[(2024, 2024), (2023, 2023), (2022, 2022), (2021, 2021), (2020, 2020), (2019, 2019), (2018, 2018), (2017, 2017), (2016, 2016), (2015, 2015), (2014, 2014), (2013, 2013), (2012, 2012), (2011, 2011), (2010, 2010), (2009, 2009), (2008, 2008), (2007, 2007), (2006, 2006), (2005, 2005), (2004, 2004), (2003, 2003), (2002, 2002), (2001, 2001), (2000, 2000), (1999, 1999), (1998, 1998), (1997, 1997), (1996, 1996), (1995, 1995), (1994, 1994), (1993, 1993), (1992, 1992), (1991, 1991), (1990, 1990), (1989, 1989), (1988, 1988), (1987, 1987), (1986, 1986), (1985, 1985), (1984, 1984), (1983, 1983), (1982, 1982), (1981, 1981), (1980, 1980), (1979, 1979), (1978, 1978), (1977, 1977), (1976, 1976), (1975, 1975), (1974, 1974), (1973, 1973), (1972, 1972), (1971, 1971), (1970, 1970), (1969, 1969), (1968, 1968), (1967, 1967), (1966, 1966), (1965, 1965), (1964, 1964), (1963, 1963), (1962, 1962), (1961, 1961), (1960, 1960), (1959, 1959), (1958, 1958), (1957, 1957), (1956, 1956), (1955, 1955), (1954, 1954), (1953, 1953), (1952, 1952), (1951, 1951), (1950, 1950), (1949, 1949), (1948, 1948), (1947, 1947), (1946, 1946), (1945, 1945), (1944, 1944), (1943, 1943), (1942, 1942), (1941, 1941), (1940, 1940), (1939, 1939), (1938, 1938), (1937, 1937), (1936, 1936), (1935, 1935), (1934, 1934), (1933, 1933), (1932, 1932), (1931, 1931), (1930, 1930), (1929, 1929), (1928, 1928), (1927, 1927), (1926, 1926), (1925, 1925), (1924, 1924), (1923, 1923), (1922, 1922), (1921, 1921), (1920, 1920), (1919, 1919), (1918, 1918), (1917, 1917), (1916, 1916), (1915, 1915), (1914, 1914), (1913, 1913), (1912, 1912), (1911, 1911), (1910, 1910), (1909, 1909), (1908, 1908), (1907, 1907), (1906, 1906), (1905, 1905), (1904, 1904), (1903, 1903), (1902, 1902), (1901, 1901), (1900, 1900), (1899, 1899), (1898, 1898), (1897, 1897), (1896, 1896), (1895, 1895), (1894, 1894), (1893, 1893), (1892, 1892), (1891, 1891), (1890, 1890)], verbose_name='Ano do Protocolo'), + ), + ] diff --git a/sapl/protocoloadm/models.py b/sapl/protocoloadm/models.py index 9b1a65d85..3cdf32735 100644 --- a/sapl/protocoloadm/models.py +++ b/sapl/protocoloadm/models.py @@ -1,17 +1,19 @@ +import re + from django.db import models from django.utils import timezone +from django.utils.functional import cached_property from django.utils.translation import ugettext_lazy as _ from model_utils import Choices -import reversion -from sapl.base.models import Autor -from sapl.materia.models import TipoMateriaLegislativa, UnidadeTramitacao +from sapl.base.models import Autor, AppConfig as SaplAppConfig +from sapl.materia.models import TipoMateriaLegislativa, UnidadeTramitacao,\ + MateriaLegislativa from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, texto_upload_path, get_settings_auth_user_model, OverwriteStorage) -@reversion.register() class TipoDocumentoAdministrativo(models.Model): sigla = models.CharField(max_length=5, verbose_name=_('Sigla')) descricao = models.CharField(max_length=50, verbose_name=_('Descrição')) @@ -50,7 +52,6 @@ def texto_upload_path(instance, filename): """ -@reversion.register() class Protocolo(models.Model): numero = models.PositiveIntegerField( blank=False, @@ -91,7 +92,8 @@ class Protocolo(models.Model): blank=True ) de_proposicao = models.BooleanField(default=False) - # Não foi utilizado auto_now_add=True em timestamp porque ele usa datetime.now que não é timezone aware. + # Não foi utilizado auto_now_add=True em timestamp porque ele usa + # datetime.now que não é timezone aware. timestamp = models.DateTimeField( null=True, blank=True, @@ -152,7 +154,6 @@ class Protocolo(models.Model): } -@reversion.register() class DocumentoAdministrativo(models.Model): tipo = models.ForeignKey( TipoDocumentoAdministrativo, on_delete=models.PROTECT, @@ -160,7 +161,7 @@ class DocumentoAdministrativo(models.Model): numero = models.PositiveIntegerField(verbose_name=_('Número')) complemento = models.CharField(max_length=10, blank=True, - verbose_name=_('Complemento')) + verbose_name=_('Complemento')) ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'), choices=RANGE_ANOS) @@ -214,6 +215,17 @@ class DocumentoAdministrativo(models.Model): ) ) + materiasvinculadas = models.ManyToManyField( + MateriaLegislativa, + blank=True, + through='VinculoDocAdminMateria', + related_name='docadmvinculados', + through_fields=( + 'documento', + 'materia' + ) + ) + user = models.ForeignKey( get_settings_auth_user_model(), verbose_name=_('Usuário'), @@ -235,13 +247,73 @@ class DocumentoAdministrativo(models.Model): class Meta: verbose_name = _('Documento Administrativo') verbose_name_plural = _('Documentos Administrativos') - ordering = ('id',) + ordering = ('ano', 'numero', 'id',) + + @classmethod + def mask_to_str(cls, values, mask): + erro = set() + pattern = '({[^{}]+}|{[ /.-]*})' + campos_escolhidos = re.findall(pattern, mask) + campos_permitidos = { + '{.}', '{/}', '{-}', + '{sigla}', + '{nome}', + '{numero}', + '{ano}', + '{complemento}', + '{assunto}', + } + condicionais = { + '{.}': '.', + '{/}': '/', + '{-}': '-', + } - def __str__(self): - return _('%(tipo)s - %(assunto)s') % { - 'tipo': self.tipo, 'assunto': self.assunto + erro = set(campos_escolhidos) - campos_permitidos + + if erro: + mask = '{sigla} Nº {numero}/{ano}{-}{complemento} - {nome}' + campos_escolhidos = re.findall(pattern, mask) + + for i, k in enumerate(campos_escolhidos): + if k in values.keys(): + if i > 0 and campos_escolhidos[i - 1] in condicionais: + mask = mask.replace( + campos_escolhidos[i - 1], + condicionais[campos_escolhidos[i - 1]]if values[k] else '', 1) + mask = mask.replace(k, values[k], 1) + elif k in condicionais: + if i > 0 and campos_escolhidos[i - 1] in condicionais: + mask = mask.replace( + campos_escolhidos[i - 1], + '', 1) + if i + 1 == len(campos_escolhidos): + mask = mask.replace(k, '', 1) + + return mask, erro + + @cached_property + def _identificacao_de_documento(self): + mask = SaplAppConfig.attr('identificacao_de_documentos') + + values = { + '{sigla}': self.tipo.sigla, + '{nome}': self.tipo.descricao, + '{numero}': f'{self.numero:0>3}', + '{ano}': f'{self.ano}', + '{complemento}': self.complemento, + '{assunto}': self.assunto } + return DocumentoAdministrativo.mask_to_str(values, mask)[0] + + def __str__(self): + return self._identificacao_de_documento + + @property + def epigrafe(self): + return str(self) + def delete(self, using=None, keep_parents=False): texto_integral = self.texto_integral result = super().delete(using=using, keep_parents=keep_parents) @@ -269,7 +341,6 @@ class DocumentoAdministrativo(models.Model): update_fields=update_fields) -@reversion.register() class DocumentoAcessorioAdministrativo(models.Model): documento = models.ForeignKey(DocumentoAdministrativo, on_delete=models.PROTECT) @@ -327,7 +398,6 @@ class DocumentoAcessorioAdministrativo(models.Model): update_fields=update_fields) -@reversion.register() class StatusTramitacaoAdministrativo(models.Model): INDICADOR_CHOICES = Choices( ('F', 'fim', _('Fim')), @@ -351,7 +421,6 @@ class StatusTramitacaoAdministrativo(models.Model): return self.descricao -@reversion.register() class TramitacaoAdministrativo(models.Model): status = models.ForeignKey( StatusTramitacaoAdministrativo, @@ -405,7 +474,6 @@ class TramitacaoAdministrativo(models.Model): } -@reversion.register() class Anexado(models.Model): documento_principal = models.ForeignKey( DocumentoAdministrativo, related_name='documento_principal_set', @@ -436,7 +504,36 @@ class Anexado(models.Model): } -@reversion.register() +class VinculoDocAdminMateria(models.Model): + documento = models.ForeignKey( + DocumentoAdministrativo, related_name='materialegislativa_vinculada_set', + on_delete=models.CASCADE, + verbose_name=_('Documento Administrativo') + ) + materia = models.ForeignKey( + MateriaLegislativa, related_name='documentoadministrativo_vinculado_set', + on_delete=models.CASCADE, + verbose_name=_('Matéria Legislativa') + ) + data_anexacao = models.DateField(verbose_name=_('Data Anexação')) + data_desanexacao = models.DateField( + blank=True, null=True, verbose_name=_('Data Desanexação') + ) + + class Meta: + verbose_name = _( + 'Vinculo entre Documento Administrativo e Matéria Legislativa') + verbose_name_plural = _( + 'Vinculos entre Documento Administrativo e Matéria Legislativa') + ordering = ('id',) + unique_together = ( + ('documento', 'materia'), + ) + + def __str__(self): + return f'Vinculo: {self.documento} - {self.materia}' + + class AcompanhamentoDocumento(models.Model): usuario = models.CharField(max_length=50) documento = models.ForeignKey( diff --git a/sapl/protocoloadm/urls.py b/sapl/protocoloadm/urls.py index 2e3e07ac1..05c787897 100644 --- a/sapl/protocoloadm/urls.py +++ b/sapl/protocoloadm/urls.py @@ -25,7 +25,10 @@ from sapl.protocoloadm.views import (AcompanhamentoDocumentoView, AnexadoCrud, DocumentoAnexadoEmLoteView, PrimeiraTramitacaoEmLoteAdmView, TramitacaoEmLoteAdmView, - apaga_protocolos_view) + apaga_protocolos_view, + VinculoDocAdminMateriaCrud, + VinculoDocAdminMateriaEmLoteView, + get_pdf_docacessorios) from .apps import AppConfig @@ -34,18 +37,23 @@ app_name = AppConfig.name urlpatterns_documento_administrativo = [ url(r'^docadm/', include(DocumentoAdministrativoCrud.get_urls() + - AnexadoCrud.get_urls() + + AnexadoCrud.get_urls() + TramitacaoAdmCrud.get_urls() + - DocumentoAcessorioAdministrativoCrud.get_urls())), + DocumentoAcessorioAdministrativoCrud.get_urls() + + VinculoDocAdminMateriaCrud.get_urls())), url(r'^docadm/pesq-doc-adm', PesquisarDocumentoAdministrativoView.as_view(), name='pesq_doc_adm'), url(r'^docadm/texto_integral/(?P\d+)$', doc_texto_integral, name='doc_texto_integral'), - + url(r'^docadm/(?P\d+)/anexado_em_lote', DocumentoAnexadoEmLoteView.as_view(), name='anexado_em_lote'), + url(r'^docadm/(?P\d+)/vinculo-em-lote', VinculoDocAdminMateriaEmLoteView.as_view(), + name='vinculodocadminmateria_em_lote'), + url(r'^docadm/documentoacessorioadministrativo/pdf/(?P\d+)$', get_pdf_docacessorios, + name='merge_docacessorios') ] urlpatterns_protocolo = [ @@ -119,12 +127,6 @@ urlpatterns_sistema = [ include(TipoDocumentoAdministrativoCrud.get_urls())), url(r'^sistema/status-tramitacao-adm/', include(StatusTramitacaoAdministrativoCrud.get_urls())), - - # FIXME: Usado para pesquisar autor- SOLUÇÃO-foi transformado em api/autor - # Melhor forma de fazer? - # Deve mudar de app? - # url(r'^protocoloadm/pesquisar-autor', - # pesquisa_autores, name='pesquisar_autor'), ] urlpatterns = (urlpatterns_documento_administrativo + diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 01e525750..38ffcf42a 100755 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -1,9 +1,13 @@ +import os +import time from datetime import datetime import logging +from io import BytesIO from random import choice import re from string import ascii_letters, digits +from PyPDF4 import PdfFileMerger from braces.views import FormValidMessageMixin from django.conf import settings from django.contrib import messages @@ -16,7 +20,7 @@ from django.db import transaction from django.db.models import Max, Q from django.http import Http404, HttpResponse, JsonResponse from django.http.response import HttpResponseRedirect -from django.shortcuts import redirect +from django.shortcuts import redirect, get_object_or_404 from django.shortcuts import render from django.urls import reverse from django.utils import timezone @@ -35,12 +39,15 @@ from sapl.crud.base import (Crud, CrudAux, MasterDetailCrud, make_pagination, from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa, UnidadeTramitacao from sapl.materia.views import gerar_pdf_impressos from sapl.parlamentares.models import Legislatura, Parlamentar -from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo +from sapl.protocoloadm.forms import VinculoDocAdminMateriaForm,\ + VinculoDocAdminMateriaEmLoteFilterSet +from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo,\ + VinculoDocAdminMateria from sapl.relatorios.views import relatorio_doc_administrativos from sapl.utils import (create_barcode, get_base_url, get_client_ip, get_mime_type_from_file_extension, lista_anexados, show_results_filter_set, mail_service_configured, from_date_to_datetime_utc, - google_recaptcha_configured) + google_recaptcha_configured, get_tempfile_dir) from .forms import (AcompanhamentoDocumentoForm, AnexadoEmLoteFilterSet, AnexadoForm, AnularProtocoloAdmForm, compara_tramitacoes_doc, @@ -55,7 +62,7 @@ from .forms import (AcompanhamentoDocumentoForm, AnexadoEmLoteFilterSet, Anexado from .models import (Anexado, AcompanhamentoDocumento, DocumentoAcessorioAdministrativo, DocumentoAdministrativo, StatusTramitacaoAdministrativo, TipoDocumentoAdministrativo, TramitacaoAdministrativo) - +from ..settings import MEDIA_ROOT TipoDocumentoAdministrativoCrud = CrudAux.build( TipoDocumentoAdministrativo, '') @@ -115,6 +122,71 @@ def doc_texto_integral(request, pk): raise Http404 +def get_pdf_docacessorios(request, pk): + documento_administrativo = get_object_or_404(DocumentoAdministrativo, pk=pk) + logger = logging.getLogger(__name__) + username = 'Usuário anônimo' if request.user.is_anonymous else request.user.username + try: + external_name, data = create_pdf_docacessorios(documento_administrativo) + logger.info( + "user= {}. Gerou o pdf compilado de documento acessorios".format(username)) + except FileNotFoundError: + logger.error("user= {}.Não há arquivos cadastrados".format(username)) + msg = _('Não há arquivos cadastrados nesses documentos acessórios.') + messages.add_message(request, messages.ERROR, msg) + return redirect(reverse('sapl.materia:documentoacessorio_list', + kwargs={'pk': pk})) + except Exception as e: + logger.error("user= {}.Um erro inesperado ocorreu na criação do pdf de documentos acessorios: {}" + .format(username, str(e))) + msg = _('Um erro inesperado ocorreu. Entre em contato com o suporte do SAPL.') + messages.add_message(request, messages.ERROR, msg) + return redirect(reverse('sapl.materia:documentoacessorio_list', + kwargs={'pk': pk})) + + if not data: + msg = _('Não há nenhum documento acessório PDF cadastrado.') + messages.add_message(request, messages.ERROR, msg) + return redirect(reverse('sapl.materia:documentoacessorio_list', + kwargs={'pk': pk})) + + response = HttpResponse(data, content_type='application/pdf') + response['Content-Disposition'] = ('attachment; filename="%s"' + % external_name) + return response + + +def create_pdf_docacessorios(docadministrativo): + """ + Creates a unified in memory PDF file + """ + logger = logging.getLogger(__name__) + docs = docadministrativo.documentoacessorioadministrativo_set. \ + all().values_list('arquivo', flat=True) + if not docs: + return None, None + + docs_path = [os.path.join(MEDIA_ROOT, i) + for i in docs if i.lower().endswith('pdf')] + if not docs_path: + raise FileNotFoundError( + "Não há arquivos PDF cadastrados em documentos acessorios.") + logger.info("Gerando compilado PDF de documentos acessorios com {} documentos" + .format(docs_path)) + + merger = PdfFileMerger() + for f in docs_path: + merger.append(fileobj=f) + + data = BytesIO() + merger.write(data) + merger.close() + + external_name = "docadm_{}_{}_docacessorios.pdf".format( + docadministrativo.numero, docadministrativo.ano) + return external_name, data.getvalue() + + class AcompanhamentoConfirmarView(TemplateView): logger = logging.getLogger(__name__) @@ -1126,7 +1198,7 @@ class DocumentoAnexadoEmLoteView(PermissionRequiredMixin, FilterView): context['object_list'] = [] else: context['temp_object_list'] = context['object_list'].order_by( - 'numero', '-ano') + 'numero', '-ano') context['object_list'] = [] for obj in context['temp_object_list']: if not obj.pk == int(context['root_pk']): @@ -1155,7 +1227,6 @@ class DocumentoAnexadoEmLoteView(PermissionRequiredMixin, FilterView): if not ciclico: context['object_list'].append(obj) - context['numero_res'] = len(context['object_list']) @@ -1300,7 +1371,6 @@ class TramitacaoAdmCrud(MasterDetailCrud): return initial - class ListView(DocumentoAdministrativoMixin, MasterDetailCrud.ListView): def get_queryset(self): @@ -1751,3 +1821,154 @@ def apaga_protocolos_view(request): return JsonResponse({'type': 'success', 'msg': ''}) else: return JsonResponse({'type': 'error', 'msg': 'Senha Incorreta'}) + + +class VinculoDocAdminMateriaCrud(MasterDetailCrud): + model = VinculoDocAdminMateria + parent_field = 'documento' + help_topic = 'vinculodocadminmateria' + public = [RP_LIST, RP_DETAIL] + + class BaseMixin(MasterDetailCrud.BaseMixin): + list_field_names = ['data_anexacao', ('materia', 'materia__ementa')] + + @property + def verbose_name(self): + return _('Vinculo') + + @property + def verbose_name_plural(self): + return _('Vinculos') + + @property + def title(self): + return self.object.documento.epigrafe + + class CreateView(MasterDetailCrud.CreateView): + form_class = VinculoDocAdminMateriaForm + + class UpdateView(MasterDetailCrud.UpdateView): + form_class = VinculoDocAdminMateriaForm + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['title'] = self.object.documento + return context + + def get_initial(self): + initial = super(UpdateView, self).get_initial() + initial['tipo'] = self.object.materia.tipo.id + initial['numero'] = self.object.materia.numero + initial['ano'] = self.object.materia.ano + return initial + + class DetailView(MasterDetailCrud.DetailView): + + @property + def layout_key(self): + return 'VinculoDocAdminMateriaDetail' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['title'] = self.object.documento.epigrafe + return context + + +class VinculoDocAdminMateriaEmLoteView(PermissionRequiredMixin, FilterView): + filterset_class = VinculoDocAdminMateriaEmLoteFilterSet + template_name = 'protocoloadm/em_lote/vinculodocadminmateria.html' + permission_required = ('protocoloadm.add_documentoadministrativo',) + + def get_context_data(self, **kwargs): + context = super(VinculoDocAdminMateriaEmLoteView, + self).get_context_data(**kwargs) + + context['root_pk'] = self.kwargs['pk'] + + context['subnav_template_name'] = 'protocoloadm/subnav.yaml' + + context['title'] = _('Matérias Vinculadas em Lote') + + # Verifica se os campos foram preenchidos + if not self.request.GET.get('tipo', " "): + msg = _('Por favor, selecione um tipo de matéria.') + messages.add_message(self.request, messages.ERROR, msg) + + if not self.request.GET.get('data_apresentacao_0', " ") or not self.request.GET.get('data_apresentacao_1', " "): + msg = _('Por favor, preencha as datas.') + messages.add_message(self.request, messages.ERROR, msg) + + return context + + if not self.request.GET.get('data_apresentacao_0', " ") or not self.request.GET.get('data_apresentacao_1', " "): + msg = _('Por favor, preencha as datas.') + messages.add_message(self.request, messages.ERROR, msg) + return context + + qr = self.request.GET.copy() + if not len(qr): + context['object_list'] = [] + else: + context['object_list'] = context['object_list'].order_by( + 'numero', '-ano') + documento = DocumentoAdministrativo.objects.get( + pk=self.kwargs['pk']) + not_list = [self.kwargs['pk']] + \ + [m for m in documento.materiasvinculadas.values_list( + 'id', flat=True)] + context['object_list'] = context['object_list'].exclude( + pk__in=not_list) + + context['numero_res'] = len(context['object_list']) + + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + + return context + + def post(self, request, *args, **kwargs): + marcadas = request.POST.getlist('materia_id') + + data_anexacao = datetime.strptime( + request.POST['data_anexacao'], "%d/%m/%Y").date() + + if request.POST['data_desanexacao'] == '': + data_desanexacao = None + v_data_desanexacao = data_anexacao + else: + data_desanexacao = datetime.strptime( + request.POST['data_desanexacao'], "%d/%m/%Y").date() + v_data_desanexacao = data_desanexacao + + if len(marcadas) == 0: + msg = _('Nenhuma máteria foi selecionada.') + messages.add_message(request, messages.ERROR, msg) + + if data_anexacao > v_data_desanexacao: + msg = _('Data de anexação posterior à data de desanexação.') + messages.add_message(request, messages.ERROR, msg) + + return self.get(request, self.kwargs) + + if data_anexacao > v_data_desanexacao: + msg = _('Data de anexação posterior à data de desanexação.') + messages.add_message(request, messages.ERROR, msg) + return self.get(request, self.kwargs) + + documento = DocumentoAdministrativo.objects.get(pk=kwargs['pk']) + for materia in MateriaLegislativa.objects.filter(id__in=marcadas): + + v = VinculoDocAdminMateria() + v.documento = documento + v.materia = materia + v.data_anexacao = data_anexacao + v.data_desanexacao = data_desanexacao + v.save() + + msg = _('Matéria(s) vinculadas(s).') + messages.add_message(request, messages.SUCCESS, msg) + + success_url = reverse('sapl.protocoloadm:vinculodocadminmateria_list', + kwargs={'pk': kwargs['pk']}) + return HttpResponseRedirect(success_url) diff --git a/sapl/relatorios/forms.py b/sapl/relatorios/forms.py new file mode 100644 index 000000000..59eb2d741 --- /dev/null +++ b/sapl/relatorios/forms.py @@ -0,0 +1,783 @@ +import django_filters +from crispy_forms.bootstrap import (FormActions) +from crispy_forms.layout import (HTML, Button, Fieldset, + Layout, Submit) +from django import forms +from django.utils.translation import ugettext_lazy as _ + +from sapl.audiencia.models import AudienciaPublica +from sapl.base.models import Autor +from sapl.comissoes.models import Reuniao +from sapl.crispy_layout_mixin import SaplFormHelper, to_row, form_actions +from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa, MateriaEmTramitacao, UnidadeTramitacao, \ + StatusTramitacao +from sapl.norma.models import NormaJuridica +from sapl.protocoloadm.models import DocumentoAdministrativo +from sapl.sessao.models import SessaoPlenaria +from sapl.utils import FilterOverridesMetaMixin, choice_anos_com_normas, qs_override_django_filter, \ + choice_anos_com_materias, choice_tipos_normas, autor_label, autor_modal + + +class RelatorioDocumentosAcessoriosFilterSet(django_filters.FilterSet): + + @property + def qs(self): + parent = super(RelatorioDocumentosAcessoriosFilterSet, self).qs + return parent.distinct().order_by('-data') + + class Meta(FilterOverridesMetaMixin): + model = DocumentoAcessorio + fields = ['tipo', 'materia__tipo', 'data'] + + def __init__(self, *args, **kwargs): + super( + RelatorioDocumentosAcessoriosFilterSet, self + ).__init__(*args, **kwargs) + + self.filters['tipo'].label = 'Tipo de Documento' + self.filters['materia__tipo'].label = 'Tipo de Matéria do Documento' + self.filters['data'].label = 'Período (Data Inicial - Data Final)' + + self.form.fields['tipo'].required = True + + row0 = to_row([('tipo', 6), + ('materia__tipo', 6)]) + + row1 = to_row([('data', 12)]) + + buttons = FormActions( + *[ + HTML(''' +
+ + +
+ ''') + ], + Submit('pesquisar', _('Pesquisar'), css_class='float-right', + onclick='return true;'), + css_class='form-group row justify-content-between', + ) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Pesquisa'), + row0, row1, + buttons) + ) + + +class RelatorioAtasFilterSet(django_filters.FilterSet): + class Meta(FilterOverridesMetaMixin): + model = SessaoPlenaria + fields = ['data_inicio'] + + @property + def qs(self): + parent = super(RelatorioAtasFilterSet, self).qs + return parent.distinct().prefetch_related('tipo').exclude( + upload_ata='').order_by('-data_inicio', 'tipo', 'numero') + + def __init__(self, *args, **kwargs): + super(RelatorioAtasFilterSet, self).__init__( + *args, **kwargs) + + self.filters['data_inicio'].label = 'Período de Abertura (Inicial - Final)' + self.form.fields['data_inicio'].required = False + + row1 = to_row([('data_inicio', 12)]) + + buttons = FormActions( + *[ + HTML(''' +
+ + +
+ ''') + ], + Submit('pesquisar', _('Pesquisar'), css_class='float-right', + onclick='return true;'), + css_class='form-group row justify-content-between', + ) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Atas das Sessões Plenárias'), + row1, buttons, ) + ) + + +def ultimo_ano_com_norma(): + anos_normas = choice_anos_com_normas() + + if anos_normas: + return anos_normas[0] + return '' + + +class RelatorioNormasMesFilterSet(django_filters.FilterSet): + ano = django_filters.ChoiceFilter(required=True, + label='Ano da Norma', + choices=choice_anos_com_normas, + initial=ultimo_ano_com_norma) + + tipo = django_filters.ChoiceFilter(required=False, + label='Tipo Norma', + choices=choice_tipos_normas, + initial=0) + + class Meta: + model = NormaJuridica + fields = ['ano'] + + def __init__(self, *args, **kwargs): + super(RelatorioNormasMesFilterSet, self).__init__( + *args, **kwargs) + + self.filters['ano'].label = 'Ano' + self.form.fields['ano'].required = True + + row1 = to_row([('ano', 6), ('tipo', 6)]) + + buttons = FormActions( + *[ + HTML(''' +
+ + +
+ ''') + ], + Submit('pesquisar', _('Pesquisar'), css_class='float-right', + onclick='return true;'), + css_class='form-group row justify-content-between', + ) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Normas por mês do ano.'), + row1, buttons, ) + ) + + @property + def qs(self): + parent = super(RelatorioNormasMesFilterSet, self).qs + return parent.distinct().order_by('data') + + +class RelatorioPresencaSessaoFilterSet(django_filters.FilterSet): + class Meta(FilterOverridesMetaMixin): + model = SessaoPlenaria + fields = ['data_inicio', + 'sessao_legislativa', + 'tipo', + 'legislatura'] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.form.fields['exibir_ordem_dia'] = forms.BooleanField( + required=False, label='Exibir presença das Ordens do Dia') + self.form.initial['exibir_ordem_dia'] = True + + self.form.fields['exibir_somente_titular'] = forms.BooleanField( + required=False, label='Exibir somente parlamentares titulares') + self.form.initial['exibir_somente_titular'] = False + + self.form.fields['exibir_somente_ativo'] = forms.BooleanField( + required=False, label='Exibir somente parlamentares ativos') + self.form.initial['exibir_somente_ativo'] = False + + self.form.fields['legislatura'].required = True + + self.filters['data_inicio'].label = 'Período (Inicial - Final)' + + tipo_sessao_ordinaria = self.filters['tipo'].queryset.filter( + nome='Ordinária') + if tipo_sessao_ordinaria: + self.form.initial['tipo'] = tipo_sessao_ordinaria.first() + + row1 = to_row([('legislatura', 4), + ('sessao_legislativa', 4), + ('tipo', 4)]) + row2 = to_row([('exibir_ordem_dia', 12), + ('exibir_somente_titular', 12), + ('exibir_somente_ativo', 12)]) + row3 = to_row([('data_inicio', 12)]) + + buttons = FormActions( + *[ + HTML(''' +
+ + +
+ ''') + ], + Submit('pesquisar', _('Pesquisar'), css_class='float-right', + onclick='return true;'), + css_class='form-group row justify-content-between', + ) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Presença dos parlamentares nas sessões plenárias'), + row1, row2, row3, buttons, ) + ) + + @property + def qs(self): + return qs_override_django_filter(self) + + +class RelatorioHistoricoTramitacaoFilterSet(django_filters.FilterSet): + autoria__autor = django_filters.CharFilter(widget=forms.HiddenInput()) + + @property + def qs(self): + parent = super(RelatorioHistoricoTramitacaoFilterSet, self).qs + return parent.distinct().prefetch_related('tipo').order_by('-ano', 'tipo', 'numero') + + class Meta(FilterOverridesMetaMixin): + model = MateriaLegislativa + fields = ['tipo', 'tramitacao__status', 'tramitacao__data_tramitacao', + 'tramitacao__unidade_tramitacao_local', 'tramitacao__unidade_tramitacao_destino'] + + def __init__(self, *args, **kwargs): + super(RelatorioHistoricoTramitacaoFilterSet, self).__init__( + *args, **kwargs) + + self.filters['tipo'].label = 'Tipo de Matéria' + self.filters['tramitacao__status'].label = _('Status') + self.filters['tramitacao__unidade_tramitacao_local'].label = _( + 'Unidade Local (Origem)') + self.filters['tramitacao__unidade_tramitacao_destino'].label = _( + 'Unidade Destino') + + row1 = to_row([('tramitacao__data_tramitacao', 12)]) + row2 = to_row([('tramitacao__unidade_tramitacao_local', 6), + ('tramitacao__unidade_tramitacao_destino', 6)]) + row3 = to_row( + [('tipo', 6), + ('tramitacao__status', 6)]) + + row4 = to_row([ + ('autoria__autor', 0), + (Button('pesquisar', + 'Pesquisar Autor', + css_class='btn btn-primary btn-sm'), 2), + (Button('limpar', + 'Limpar Autor', + css_class='btn btn-primary btn-sm'), 2) + ]) + + buttons = FormActions( + *[ + HTML(''' +
+ + +
+ ''') + ], + Submit('pesquisar', _('Pesquisar'), css_class='float-right', + onclick='return true;'), + css_class='form-group row justify-content-between', + ) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Pesquisar'), + row1, row2, row3, row4, + HTML(autor_label), + HTML(autor_modal), + buttons, ) + ) + + +class RelatorioDataFimPrazoTramitacaoFilterSet(django_filters.FilterSet): + materia__ano = django_filters.ChoiceFilter(required=False, + label='Ano da Matéria', + choices=choice_anos_com_materias) + # materia__autores = django_filters.CharFilter(widget=forms.HiddenInput()) + materia__autores = django_filters.ModelChoiceFilter( + label='Autor da Matéria', + queryset=Autor.objects.all(), field_name='materia__autores') + + @property + def qs(self): + parent = super(RelatorioDataFimPrazoTramitacaoFilterSet, self).qs + return parent.distinct().prefetch_related('materia__tipo').order_by('tramitacao__data_fim_prazo', 'materia__tipo', 'materia__numero') + + class Meta(FilterOverridesMetaMixin): + model = MateriaEmTramitacao + fields = ['materia__tipo', + 'tramitacao__unidade_tramitacao_local', + 'tramitacao__unidade_tramitacao_destino', + 'tramitacao__status', + 'tramitacao__data_fim_prazo', + 'materia__autores'] + + def __init__(self, *args, **kwargs): + super(RelatorioDataFimPrazoTramitacaoFilterSet, self).__init__( + *args, **kwargs) + + self.filters['materia__tipo'].label = 'Tipo de Matéria' + self.filters[ + 'tramitacao__unidade_tramitacao_local'].label = 'Unidade Local (Origem)' + self.filters['tramitacao__unidade_tramitacao_destino'].label = 'Unidade Destino' + self.filters['tramitacao__status'].label = 'Status de tramitação' + self.filters['materia__autores'].label = 'Autor da Matéria' + + row1 = to_row([('materia__ano', 12)]) + row2 = to_row([('tramitacao__data_fim_prazo', 12)]) + row3 = to_row([('tramitacao__unidade_tramitacao_local', 6), + ('tramitacao__unidade_tramitacao_destino', 6)]) + row4 = to_row( + [('materia__tipo', 6), + ('tramitacao__status', 6)]) + row5 = to_row([('materia__autores', 12)]) + + buttons = FormActions( + *[ + HTML(''' +
+ + +
+ ''') + ], + Submit('pesquisar', _('Pesquisar'), css_class='float-right', + onclick='return true;'), + css_class='form-group row justify-content-between', + ) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Tramitações'), + row1, row2, row3, row4, row5, + buttons, ) + ) + + +class RelatorioReuniaoFilterSet(django_filters.FilterSet): + + @property + def qs(self): + parent = super(RelatorioReuniaoFilterSet, self).qs + return parent.distinct().order_by('-data', 'comissao') + + class Meta: + model = Reuniao + fields = ['comissao', 'data', + 'nome', 'tema'] + + def __init__(self, *args, **kwargs): + super(RelatorioReuniaoFilterSet, self).__init__( + *args, **kwargs) + + row1 = to_row([('data', 12)]) + row2 = to_row( + [('comissao', 4), + ('nome', 4), + ('tema', 4)]) + + buttons = FormActions( + *[ + HTML(''' +
+ + +
+ ''') + ], + Submit('pesquisar', _('Pesquisar'), css_class='float-right', + onclick='return true;'), + css_class='form-group row justify-content-between', + ) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Reunião de Comissão'), + row1, row2, + buttons, ) + ) + + +class RelatorioAudienciaFilterSet(django_filters.FilterSet): + + @property + def qs(self): + parent = super(RelatorioAudienciaFilterSet, self).qs + return parent.distinct().order_by('-data', 'tipo') + + class Meta: + model = AudienciaPublica + fields = ['tipo', 'data', + 'nome'] + + def __init__(self, *args, **kwargs): + super(RelatorioAudienciaFilterSet, self).__init__( + *args, **kwargs) + + row1 = to_row([('data', 12)]) + row2 = to_row( + [('tipo', 4), + ('nome', 4)]) + + buttons = FormActions( + *[ + HTML(''' +
+ + +
+ ''') + ], + Submit('pesquisar', _('Pesquisar'), css_class='float-right', + onclick='return true;'), + css_class='form-group row justify-content-between', + ) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Audiência Pública'), + row1, row2, + buttons, ) + ) + + +class RelatorioMateriasTramitacaoFilterSet(django_filters.FilterSet): + materia__ano = django_filters.ChoiceFilter(required=True, + label='Ano da Matéria', + choices=choice_anos_com_materias) + + tramitacao__unidade_tramitacao_destino = django_filters.ModelChoiceFilter( + queryset=UnidadeTramitacao.objects.all(), + label=_('Unidade Atual')) + + tramitacao__status = django_filters.ModelChoiceFilter( + queryset=StatusTramitacao.objects.all(), + label=_('Status Atual')) + + materia__autores = django_filters.ModelChoiceFilter( + label='Autor da Matéria', + queryset=Autor.objects.all()) + + @property + def qs(self): + parent = super(RelatorioMateriasTramitacaoFilterSet, self).qs + return parent.distinct().order_by( + '-materia__ano', 'materia__tipo', '-materia__numero' + ) + + class Meta: + model = MateriaEmTramitacao + fields = ['materia__ano', 'materia__tipo', + 'tramitacao__unidade_tramitacao_destino', + 'tramitacao__status', 'materia__autores'] + + def __init__(self, *args, **kwargs): + super(RelatorioMateriasTramitacaoFilterSet, self).__init__( + *args, **kwargs) + + self.filters['materia__tipo'].label = 'Tipo de Matéria' + + row1 = to_row([('materia__ano', 12)]) + row2 = to_row([('materia__tipo', 12)]) + row3 = to_row([('tramitacao__unidade_tramitacao_destino', 12)]) + row4 = to_row([('tramitacao__status', 12)]) + row5 = to_row([('materia__autores', 12)]) + + buttons = FormActions( + *[ + HTML(''' +
+ + +
+ ''') + ], + Submit('pesquisar', _('Pesquisar'), css_class='float-right', + onclick='return true;'), + css_class='form-group row justify-content-between', + ) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Pesquisa de Matéria em Tramitação'), + row1, row2, row3, row4, row5, + buttons, ) + ) + + +class RelatorioMateriasPorAnoAutorTipoFilterSet(django_filters.FilterSet): + ano = django_filters.ChoiceFilter(required=True, + label='Ano da Matéria', + choices=choice_anos_com_materias) + + class Meta: + model = MateriaLegislativa + fields = ['ano'] + + def __init__(self, *args, **kwargs): + super(RelatorioMateriasPorAnoAutorTipoFilterSet, self).__init__( + *args, **kwargs) + + row1 = to_row( + [('ano', 12)]) + + buttons = FormActions( + *[ + HTML(''' +
+ + +
+ ''') + ], + Submit('pesquisar', _('Pesquisar'), css_class='float-right', + onclick='return true;'), + css_class='form-group row justify-content-between', + ) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Pesquisa de Matéria por Ano Autor Tipo'), + row1, + buttons, ) + ) + + +class RelatorioMateriasPorAutorFilterSet(django_filters.FilterSet): + autoria__autor = django_filters.CharFilter(widget=forms.HiddenInput()) + + @property + def qs(self): + parent = super().qs + return parent.distinct().order_by('-ano', '-numero', 'tipo', 'autoria__autor', '-autoria__primeiro_autor') + + class Meta(FilterOverridesMetaMixin): + model = MateriaLegislativa + fields = ['tipo', 'data_apresentacao'] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.filters['tipo'].label = 'Tipo de Matéria' + + row1 = to_row( + [('tipo', 12)]) + row2 = to_row( + [('data_apresentacao', 12)]) + row3 = to_row( + [('autoria__autor', 0), + (Button('pesquisar', + 'Pesquisar Autor', + css_class='btn btn-primary btn-sm'), 2), + (Button('limpar', + 'Limpar Autor', + css_class='btn btn-primary btn-sm'), 10)]) + + buttons = FormActions( + *[ + HTML(''' +
+ + +
+ ''') + ], + Submit('pesquisar', _('Pesquisar'), css_class='float-right', + onclick='return true;'), + css_class='form-group row justify-content-between', + ) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Pesquisa de Matéria por Autor'), + row1, row2, + HTML(autor_label), + HTML(autor_modal), + row3, + buttons, ) + ) + + +class RelatorioHistoricoTramitacaoAdmFilterSet(django_filters.FilterSet): + + @property + def qs(self): + parent = super(RelatorioHistoricoTramitacaoAdmFilterSet, self).qs + return parent.distinct().prefetch_related('tipo').order_by('-ano', 'tipo', 'numero') + + class Meta(FilterOverridesMetaMixin): + model = DocumentoAdministrativo + fields = ['tipo', 'tramitacaoadministrativo__status', + 'tramitacaoadministrativo__data_tramitacao', + 'tramitacaoadministrativo__unidade_tramitacao_local', + 'tramitacaoadministrativo__unidade_tramitacao_destino'] + + def __init__(self, *args, **kwargs): + super(RelatorioHistoricoTramitacaoAdmFilterSet, self).__init__( + *args, **kwargs) + + self.filters['tipo'].label = 'Tipo de Documento' + self.filters['tramitacaoadministrativo__status'].label = _('Status') + self.filters['tramitacaoadministrativo__unidade_tramitacao_local'].label = _( + 'Unidade Local (Origem)') + self.filters['tramitacaoadministrativo__unidade_tramitacao_destino'].label = _( + 'Unidade Destino') + + row1 = to_row([('tramitacaoadministrativo__data_tramitacao', 12)]) + row2 = to_row([('tramitacaoadministrativo__unidade_tramitacao_local', 6), + ('tramitacaoadministrativo__unidade_tramitacao_destino', 6)]) + row3 = to_row( + [('tipo', 6), + ('tramitacaoadministrativo__status', 6)]) + + buttons = FormActions( + *[ + HTML(''' +
+ + +
+ ''') + ], + Submit('pesquisar', _('Pesquisar'), css_class='float-right', + onclick='return true;'), + css_class='form-group row justify-content-between', + ) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_(''), + row1, row2, row3, + buttons, ) + ) + + +class RelatorioNormasPorAutorFilterSet(django_filters.FilterSet): + autorianorma__autor = django_filters.CharFilter(widget=forms.HiddenInput()) + + @property + def qs(self): + parent = super().qs + return parent.distinct().filter(autorianorma__primeiro_autor=True) \ + .order_by('autorianorma__autor', '-autorianorma__primeiro_autor', 'tipo', '-ano', '-numero') + + class Meta(FilterOverridesMetaMixin): + model = NormaJuridica + fields = ['tipo', 'data'] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.filters['tipo'].label = 'Tipo de Norma' + + row1 = to_row( + [('tipo', 12)]) + row2 = to_row( + [('data', 12)]) + row3 = to_row( + [('autorianorma__autor', 0), + (Button('pesquisar', + 'Pesquisar Autor', + css_class='btn btn-primary btn-sm'), 2), + (Button('limpar', + 'Limpar Autor', + css_class='btn btn-primary btn-sm'), 10)]) + buttons = FormActions( + *[ + HTML(''' +
+ + +
+ ''') + ], + Submit('pesquisar', _('Pesquisar'), css_class='float-right', + onclick='return true;'), + css_class='form-group row justify-content-between', + ) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Pesquisar'), + row1, row2, + HTML(autor_label), + HTML(autor_modal), + row3, + form_actions(label='Pesquisar')) + ) + + +class RelatorioNormasVigenciaFilterSet(django_filters.FilterSet): + ano = django_filters.ChoiceFilter(required=True, + label='Ano da Norma', + choices=choice_anos_com_normas, + initial=ultimo_ano_com_norma) + + tipo = django_filters.ChoiceFilter(required=False, + label='Tipo Norma', + choices=choice_tipos_normas, + initial=0) + + vigencia = forms.ChoiceField( + label=_('Vigência'), + choices=[(True, "Vigente"), (False, "Não vigente")], + widget=forms.RadioSelect(), + required=True, + initial=True) + + def __init__(self, *args, **kwargs): + super(RelatorioNormasVigenciaFilterSet, self).__init__( + *args, **kwargs) + + self.filters['ano'].label = 'Ano' + self.form.fields['ano'].required = True + self.form.fields['vigencia'] = self.vigencia + + row1 = to_row([('ano', 6), ('tipo', 6)]) + row2 = to_row([('vigencia', 12)]) + + buttons = FormActions( + *[ + HTML(''' +
+ + +
+ ''') + ], + Submit('pesquisar', _('Pesquisar'), css_class='float-right', + onclick='return true;'), + css_class='form-group row justify-content-between', + ) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Normas por vigência.'), + row1, row2, + buttons, ) + ) + + @property + def qs(self): + return qs_override_django_filter(self) diff --git a/sapl/relatorios/urls.py b/sapl/relatorios/urls.py index 41b1de4f3..b27bfc55a 100644 --- a/sapl/relatorios/urls.py +++ b/sapl/relatorios/urls.py @@ -4,9 +4,15 @@ from .apps import AppConfig from .views import (relatorio_capa_processo, relatorio_documento_administrativo, relatorio_espelho, relatorio_etiqueta_protocolo, relatorio_materia, - relatorio_ordem_dia, relatorio_pauta_sessao, - relatorio_protocolo, relatorio_sessao_plenaria, - resumo_ata_pdf, relatorio_sessao_plenaria_pdf, etiqueta_materia_legislativa) + relatorio_ordem_dia, relatorio_protocolo, relatorio_sessao_plenaria, + resumo_ata_pdf, relatorio_sessao_plenaria_pdf, etiqueta_materia_legislativa, + relatorio_materia_tramitacao, RelatoriosListView, RelatorioMateriasPorAutorView, + RelatorioNormasPublicadasMesView, RelatorioNormasVigenciaView, RelatorioMateriasPorAnoAutorTipoView, + RelatorioMateriasTramitacaoView, RelatorioMateriaAnoAssuntoView, RelatorioHistoricoTramitacaoView, + RelatorioDataFimPrazoTramitacaoView, RelatorioPresencaSessaoView, RelatorioAtasView, + RelatorioReuniaoView, RelatorioAudienciaView, RelatorioHistoricoTramitacaoAdmView, + RelatorioDocumentosAcessoriosView, RelatorioNormasPorAutorView) +from ..base.views import EstatisticasAcessoNormas app_name = AppConfig.name @@ -41,4 +47,54 @@ urlpatterns = [ relatorio_sessao_plenaria_pdf, name='relatorio_sessao_plenaria_pdf'), url(r'^relatorios/(?P\d+)/etiqueta-materia-legislativa$', etiqueta_materia_legislativa, name='etiqueta_materia_legislativa'), -] + + url(r'^relatorios/(?P\d+)/materia-tramitacao$', + relatorio_materia_tramitacao, name='relatorio_materia_tramitacao'), + + # TODO mover estas telas para a app 'relatorios' + url(r'^sistema/relatorios/$', + RelatoriosListView.as_view(), name='relatorios_list'), + url(r'^sistema/relatorios/materia-por-autor$', + RelatorioMateriasPorAutorView.as_view(), name='materia_por_autor'), + url(r'^sistema/relatorios/relatorio-por-mes$', + RelatorioNormasPublicadasMesView.as_view(), name='normas_por_mes'), + url(r'^sistema/relatorios/relatorio-por-vigencia$', + RelatorioNormasVigenciaView.as_view(), name='normas_por_vigencia'), + url(r'^sistema/relatorios/estatisticas-acesso$', + EstatisticasAcessoNormas.as_view(), name='estatisticas_acesso'), + url(r'^sistema/relatorios/materia-por-ano-autor-tipo$', + RelatorioMateriasPorAnoAutorTipoView.as_view(), + name='materia_por_ano_autor_tipo'), + url(r'^sistema/relatorios/materia-por-tramitacao$', + RelatorioMateriasTramitacaoView.as_view(), + name='materia_por_tramitacao'), + url(r'^sistema/relatorios/materia-por-assunto$', + RelatorioMateriaAnoAssuntoView.as_view(), + name='materia_por_ano_assunto'), + url(r'^sistema/relatorios/historico-tramitacoes$', + RelatorioHistoricoTramitacaoView.as_view(), + name='historico_tramitacoes'), + url(r'^sistema/relatorios/data-fim-prazo-tramitacoes$', + RelatorioDataFimPrazoTramitacaoView.as_view(), + name='data_fim_prazo_tramitacoes'), + url(r'^sistema/relatorios/presenca$', + RelatorioPresencaSessaoView.as_view(), + name='presenca_sessao'), + url(r'^sistema/relatorios/atas$', + RelatorioAtasView.as_view(), + name='atas'), + url(r'^sistema/relatorios/reuniao$', + RelatorioReuniaoView.as_view(), + name='reuniao'), + url(r'^sistema/relatorios/audiencia$', + RelatorioAudienciaView.as_view(), + name='audiencia'), + url(r'^sistema/relatorios/historico-tramitacoesadm$', + RelatorioHistoricoTramitacaoAdmView.as_view(), + name='historico_tramitacoes_adm'), + url(r'^sistema/relatorios/documentos_acessorios$', + RelatorioDocumentosAcessoriosView.as_view(), + name='relatorio_documentos_acessorios'), + url(r'^sistema/relatorios/normas-por-autor$', + RelatorioNormasPorAutorView.as_view(), name='normas_por_autor'), +] \ No newline at end of file diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 93a6cf33c..98cc47442 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -1,50 +1,62 @@ -from datetime import datetime as dt +import collections import html import logging import re -import tempfile -import unidecode +from datetime import datetime as dt, datetime +import unidecode from django.core.exceptions import ObjectDoesNotExist +from django.db.models import Count, Q, F from django.http import Http404, HttpResponse +from django.template.loader import render_to_string from django.utils import timezone from django.utils.translation import ugettext_lazy as _ -from django.template.loader import render_to_string -from django.utils.html import strip_tags +from django.views.generic import TemplateView, ListView +from django_filters.views import FilterView +from weasyprint import HTML, CSS -from sapl.settings import MEDIA_URL -from sapl.base.models import Autor, CasaLegislativa -from sapl.comissoes.models import Comissao +from sapl.audiencia.models import TipoAudienciaPublica, AudienciaPublica +from sapl.base.models import Autor, CasaLegislativa, AppConfig as SaplAppConfig, AppConfig +from sapl.comissoes.models import Comissao, Reuniao from sapl.materia.models import (Autoria, MateriaLegislativa, Numeracao, - Tramitacao, UnidadeTramitacao, ConfigEtiquetaMateriaLegislativa) -from sapl.parlamentares.models import CargoMesa, Filiacao, Parlamentar + Tramitacao, UnidadeTramitacao, ConfigEtiquetaMateriaLegislativa, MateriaAssunto, + TipoMateriaLegislativa, MateriaEmTramitacao, DocumentoAcessorio, TipoDocumento, + StatusTramitacao) +from sapl.norma.models import TipoNormaJuridica, NormaJuridica +from sapl.parlamentares.models import Filiacao, Parlamentar, SessaoLegislativa, Legislatura from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo, - TramitacaoAdministrativo) + TramitacaoAdministrativo, StatusTramitacaoAdministrativo, + TipoDocumentoAdministrativo) +from sapl.relatorios.forms import RelatorioNormasPorAutorFilterSet, RelatorioHistoricoTramitacaoAdmFilterSet, \ + RelatorioNormasVigenciaFilterSet, RelatorioNormasMesFilterSet, RelatorioMateriasPorAutorFilterSet, \ + RelatorioMateriasPorAnoAutorTipoFilterSet, RelatorioMateriasTramitacaoFilterSet, RelatorioAudienciaFilterSet, \ + RelatorioReuniaoFilterSet, RelatorioDataFimPrazoTramitacaoFilterSet, RelatorioHistoricoTramitacaoFilterSet, \ + RelatorioPresencaSessaoFilterSet, RelatorioAtasFilterSet, RelatorioDocumentosAcessoriosFilterSet from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao, IntegranteMesa, JustificativaAusencia, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, OcorrenciaSessao, - RegistroVotacao, VotoParlamentar, OradorOrdemDia, - ConsideracoesFinais, TipoExpediente, ResumoOrdenacao) -from sapl.settings import STATIC_ROOT -from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data, create_barcode - + RegistroVotacao, VotoParlamentar, OradorOrdemDia, + ConsideracoesFinais, ResumoOrdenacao, TipoSessaoPlenaria) from sapl.sessao.views import (get_identificacao_basica, get_mesa_diretora, get_presenca_sessao, get_expedientes, get_materias_expediente, get_oradores_expediente, get_presenca_ordem_do_dia, get_materias_ordem_do_dia, get_oradores_ordemdia, - get_oradores_explicacoes_pessoais, get_consideracoes_finais, - get_ocorrencias_da_sessao, get_assinaturas) - + get_oradores_explicacoes_pessoais, get_consideracoes_finais, + get_ocorrencias_da_sessao, get_assinaturas, + get_correspondencias) +from sapl.settings import MEDIA_URL +from sapl.settings import STATIC_ROOT +from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data, create_barcode, show_results_filter_set, \ + num_materias_por_tipo, parlamentares_ativos from .templates import (pdf_capa_processo_gerar, pdf_documento_administrativo_gerar, pdf_espelho_gerar, pdf_etiqueta_protocolo_gerar, pdf_materia_gerar, pdf_ordem_dia_gerar, pdf_pauta_sessao_gerar, pdf_protocolo_gerar, pdf_sessao_plenaria_gerar) - -from weasyprint import HTML, CSS +from sapl.crud.base import make_pagination def get_kwargs_params(request, fields): @@ -114,7 +126,7 @@ def get_materias(mats): for materia in mats: dic = {} dic['titulo'] = materia.tipo.sigla + " " + materia.tipo.descricao \ - + " " + str(materia.numero) + "/" + str(materia.ano) + + " " + str(materia.numero) + "/" + str(materia.ano) dic['txt_ementa'] = materia.ementa dic['nom_autor'] = ', '.join( @@ -510,7 +522,7 @@ def is_empty(value): return True if not txt.strip() else False -def get_sessao_plenaria(sessao, casa): +def get_sessao_plenaria(sessao, casa, user): inf_basicas_dic = { "num_sessao_plen": str(sessao.numero), "nom_sessao": sessao.tipo.nome, @@ -534,9 +546,9 @@ def get_sessao_plenaria(sessao, casa): # Lista da composicao da mesa diretora lst_mesa = [] - for composicao in IntegranteMesa.objects.select_related('parlamentar', 'cargo')\ - .filter(sessao_plenaria=sessao)\ - .order_by('cargo_id'): + for composicao in IntegranteMesa.objects.select_related('parlamentar', 'cargo') \ + .filter(sessao_plenaria=sessao) \ + .order_by('cargo_id'): partido_sigla = Filiacao.objects.filter( parlamentar=composicao.parlamentar).first() sigla = '' if not partido_sigla else partido_sigla.partido.sigla @@ -567,6 +579,30 @@ def get_sessao_plenaria(sessao, casa): "tipo": "Matéria" if ausente.ausencia == 1 else "Sessão" }) + # Exibe as Correspondencias + lst_correspondencias = [] + qs = sessao.correspondencia_set.all() + is_anon = user.is_anonymous + is_ostensivo = SaplAppConfig.attr('documentos_administrativos') == 'O' + if is_anon and not is_ostensivo: + qs = qs.none() + elif is_anon: + qs = qs.filter(documento__restrito=False) + for c in qs: + d = c.documento + lst_correspondencias.append( + { + 'id': d.id, + 'tipo': c.get_tipo_display(), + 'epigrafe': d.epigrafe, + 'data': d.data.strftime('%d/%m/%Y'), + 'interessado': d.interessado, + 'assunto': d.assunto, + 'restrito': d.restrito, + 'is_ostensivo': is_ostensivo + } + ) + # Exibe os Expedientes lst_expedientes = [] expedientes = ExpedienteSessao.objects.filter( @@ -624,7 +660,7 @@ def get_sessao_plenaria(sessao, casa): materia=expediente_materia.materia).first() if numeracao: dic_expediente_materia["des_numeracao"] = ( - str(numeracao.numero_materia) + '/' + str(numeracao.ano_materia)) + str(numeracao.numero_materia) + '/' + str(numeracao.ano_materia)) autoria = materia.autoria_set.all() dic_expediente_materia['num_autores'] = 'Autores' if len( @@ -668,8 +704,8 @@ def get_sessao_plenaria(sessao, casa): # Lista dos votos nominais das matérias do Expediente lst_expediente_materia_vot_nom = [] - materias_expediente_votacao_nominal = ExpedienteMateria.objects.filter(sessao_plenaria=sessao, tipo_votacao=2)\ - .order_by('-materia') + materias_expediente_votacao_nominal = ExpedienteMateria.objects.filter(sessao_plenaria=sessao, tipo_votacao=2) \ + .order_by('-materia') for mevn in materias_expediente_votacao_nominal: votos_materia = [] @@ -701,8 +737,8 @@ def get_sessao_plenaria(sessao, casa): # Lista presença na ordem do dia lst_presenca_ordem_dia = [] - presenca_ordem_dia = PresencaOrdemDia.objects.filter(sessao_plenaria=sessao)\ - .order_by('parlamentar__nome_parlamentar') + presenca_ordem_dia = PresencaOrdemDia.objects.filter(sessao_plenaria=sessao) \ + .order_by('parlamentar__nome_parlamentar') for parlamentar in [p.parlamentar for p in presenca_ordem_dia]: lst_presenca_ordem_dia.append({ "nom_parlamentar": parlamentar.nome_parlamentar, @@ -718,17 +754,17 @@ def get_sessao_plenaria(sessao, casa): "nom_resultado": '', "num_ordem": votacao.numero_ordem, "id_materia": ( - materia.tipo.sigla + ' ' + - materia.tipo.descricao + ' ' + - str(materia.numero) + '/' + - str(materia.ano)), + materia.tipo.sigla + ' ' + + materia.tipo.descricao + ' ' + + str(materia.numero) + '/' + + str(materia.ano)), "des_numeracao": ' ' } numeracao = materia.numeracao_set.first() if numeracao: dic_votacao["des_numeracao"] = ( - str(numeracao.numero_materia) + '/' + str(numeracao.ano_materia)) + str(numeracao.numero_materia) + '/' + str(numeracao.ano_materia)) materia_em_tramitacao = materia.materiaemtramitacao_set.first() dic_votacao.update({ @@ -781,8 +817,8 @@ def get_sessao_plenaria(sessao, casa): # Lista dos votos nominais das matérias da Ordem do Dia lst_votacao_vot_nom = [] - materias_ordem_dia_votacao_nominal = OrdemDia.objects.filter(sessao_plenaria=sessao, tipo_votacao=2)\ - .order_by('-materia') + materias_ordem_dia_votacao_nominal = OrdemDia.objects.filter(sessao_plenaria=sessao, tipo_votacao=2) \ + .order_by('-materia') for modvn in materias_ordem_dia_votacao_nominal: votos_materia_od = [] @@ -874,6 +910,7 @@ def get_sessao_plenaria(sessao, casa): lst_mesa, lst_presenca_sessao, lst_ausencia_sessao, + lst_correspondencias, lst_expedientes, lst_expediente_materia, lst_expediente_materia_vot_nom, @@ -937,6 +974,7 @@ def relatorio_sessao_plenaria(request, pk): lst_mesa, lst_presenca_sessao, lst_ausencia_sessao, + lst_correspondencias, lst_expedientes, lst_expediente_materia, lst_expediente_materia_vot_nom, @@ -947,7 +985,7 @@ def relatorio_sessao_plenaria(request, pk): lst_oradores_ordemdia, lst_oradores, lst_ocorrencias, - lst_consideracoes) = get_sessao_plenaria(sessao, casa) + lst_consideracoes) = get_sessao_plenaria(sessao, casa, request.user) for idx in range(len(lst_expedientes)): txt_expedientes = lst_expedientes[idx]['txt_expediente'] @@ -963,6 +1001,7 @@ def relatorio_sessao_plenaria(request, pk): lst_mesa, lst_presenca_sessao, lst_ausencia_sessao, + lst_correspondencias, lst_expedientes, lst_expediente_materia, lst_expediente_materia_vot_nom, @@ -989,10 +1028,10 @@ def get_protocolos(prots): ts = timezone.localtime(protocolo.timestamp) if protocolo.timestamp: dic['data'] = ts.strftime("%d/%m/%Y") + ' - Horário:' + \ - ts.strftime("%H:%m") + ts.strftime("%H:%m") else: dic['data'] = protocolo.data.strftime("%d/%m/%Y") + ' - Horário:' \ - + protocolo.hora.strftime("%H:%m") + + protocolo.hora.strftime("%H:%m") dic['txt_assunto'] = protocolo.assunto_ementa @@ -1120,7 +1159,7 @@ def get_etiqueta_protocolos(prots): for materia in MateriaLegislativa.objects.filter( numero_protocolo=p.numero, ano=p.ano): dic['num_materia'] = materia.tipo.sigla + ' ' + \ - str(materia.numero) + '/' + str(materia.ano) + str(materia.numero) + '/' + str(materia.ano) dic['natureza'] = '' if p.tipo_processo == 0: @@ -1132,7 +1171,7 @@ def get_etiqueta_protocolos(prots): for documento in DocumentoAdministrativo.objects.filter( protocolo=p): dic['num_documento'] = documento.tipo.sigla + ' ' + \ - str(documento.numero) + '/' + str(documento.ano) + str(documento.numero) + '/' + str(documento.ano) dic['ident_processo'] = dic['num_materia'] or dic['num_documento'] @@ -1198,7 +1237,7 @@ def get_pauta_sessao(sessao, casa): dic_expediente_materia = {} dic_expediente_materia["tipo_materia"] = materia.tipo.sigla + \ - ' - ' + materia.tipo.descricao + ' - ' + materia.tipo.descricao dic_expediente_materia["num_ordem"] = str( expediente_materia.numero_ordem) dic_expediente_materia["id_materia"] = str( @@ -1242,7 +1281,7 @@ def get_pauta_sessao(sessao, casa): id=votacao.materia.id).first() dic_votacao = {} dic_votacao["tipo_materia"] = materia.tipo.sigla + \ - ' - ' + materia.tipo.descricao + ' - ' + materia.tipo.descricao dic_votacao["num_ordem"] = votacao.numero_ordem dic_votacao["id_materia"] = str( materia.numero) + "/" + str(materia.ano) @@ -1345,6 +1384,7 @@ def resumo_ata_pdf(request, pk): context.update(get_identificacao_basica(sessao_plenaria)) context.update(get_mesa_diretora(sessao_plenaria)) context.update(get_presenca_sessao(sessao_plenaria)) + context.update(get_correspondencias(sessao_plenaria, request.user)) context.update(get_expedientes(sessao_plenaria)) context.update(get_materias_expediente(sessao_plenaria)) context.update(get_oradores_expediente(sessao_plenaria)) @@ -1497,6 +1537,7 @@ def relatorio_sessao_plenaria_pdf(request, pk): lst_mesa, lst_presenca_sessao, lst_ausencia_sessao, + lst_correspondencias, lst_expedientes, lst_expediente_materia, lst_expediente_materia_vot_nom, @@ -1507,10 +1548,11 @@ def relatorio_sessao_plenaria_pdf(request, pk): lst_oradores_ordemdia, lst_oradores, lst_ocorrencias, - lst_consideracoes) = get_sessao_plenaria(sessao, casa) + lst_consideracoes) = get_sessao_plenaria(sessao, casa, request.user) dict_ord_template = { 'cont_mult': 'conteudo_multimidia.html', + 'correspondencia': 'correspondencias.html', 'exp': 'expedientes.html', 'id_basica': 'identificacao_basica.html', 'lista_p': 'lista_presenca_sessao.html', @@ -1534,6 +1576,7 @@ def relatorio_sessao_plenaria_pdf(request, pk): "lst_expediente_materia_vot_nom": lst_expediente_materia_vot_nom, "lst_presenca_sessao": lst_presenca_sessao, "lst_ausencia_sessao": lst_ausencia_sessao, + "lst_correspondencias": lst_correspondencias, "lst_expedientes": lst_expedientes, "lst_expediente_materia": lst_expediente_materia, "lst_oradores_expediente": lst_oradores_expediente, @@ -1565,7 +1608,8 @@ def relatorio_sessao_plenaria_pdf(request, pk): 'decimo_segundo_ordenacao': dict_ord_template[ordenacao.decimo_segundo], 'decimo_terceiro_ordenacao': dict_ord_template[ordenacao.decimo_terceiro], 'decimo_quarto_ordenacao': dict_ord_template[ordenacao.decimo_quarto], - 'decimo_quinto_ordenacao': dict_ord_template[ordenacao.decimo_quinto] + 'decimo_quinto_ordenacao': dict_ord_template[ordenacao.decimo_quinto], + 'decimo_sexto_ordenacao': dict_ord_template[ordenacao.decimo_sexto] }) except KeyError as e: # self.logger.error("KeyError: " + str(e) + ". Erro ao tentar utilizar " @@ -1575,17 +1619,18 @@ def relatorio_sessao_plenaria_pdf(request, pk): 'segundo_ordenacao': 'conteudo_multimidia.html', 'terceiro_ordenacao': 'mesa_diretora.html', 'quarto_ordenacao': 'lista_presenca_sessao.html', - 'quinto_ordenacao': 'expedientes.html', - 'sexto_ordenacao': 'materias_expediente.html', - 'setimo_ordenacao': 'votos_nominais_expediente.html', - 'oitavo_ordenacao': 'oradores_expediente.html', - 'nono_ordenacao': 'lista_presenca_ordemdia.html', - 'decimo_ordenacao': 'materias_ordemdia.html', - 'decimo_primeiro_ordenacao': 'votos_nominais_ordemdia.html', - 'decimo_segundo_ordenacao': 'oradores_ordemdia.html', - 'decimo_terceiro_ordenacao': 'oradores_explicacoes.html', - 'decimo_quarto_ordenacao': 'ocorrencias_da_sessao.html', - 'decimo_quinto_ordenacao': 'consideracoes_finais.html' + 'quinto_ordenacao': 'correspondencias.html', + 'sexto_ordenacao': 'expedientes.html', + 'setimo_ordenacao': 'materias_expediente.html', + 'oitavo_ordenacao': 'votos_nominais_expediente.html', + 'nono_ordenacao': 'oradores_expediente.html', + 'decimo_ordenacao': 'lista_presenca_ordemdia.html', + 'decimo_primeiro_ordenacao': 'materias_ordemdia.html', + 'decimo_segundo_ordenacao': 'votos_nominais_ordemdia.html', + 'decimo_terceiro_ordenacao': 'oradores_ordemdia.html', + 'decimo_quarto_ordenacao': 'oradores_explicacoes.html', + 'decimo_quinto_ordenacao': 'ocorrencias_da_sessao.html', + 'decimo_sexto_ordenacao': 'consideracoes_finais.html' }) html_template = render_to_string( @@ -1627,7 +1672,7 @@ def gera_etiqueta_ml(materia_legislativa, base_url): max_ementa_size = 240 ementa = materia_legislativa.ementa ementa = ementa if len( - ementa) < max_ementa_size else ementa[:max_ementa_size]+"..." + ementa) < max_ementa_size else ementa[:max_ementa_size] + "..." context = { 'numero': materia_legislativa.numero, @@ -1664,3 +1709,1028 @@ def etiqueta_materia_legislativa(request, pk): response.write(pdf_file) return response + + +def relatorio_materia_tramitacao(request, pk): + base_url = request.build_absolute_uri() + materia_legislativa = MateriaLegislativa.objects.get(pk=pk) + tramitacoes = Tramitacao.objects.filter(materia=materia_legislativa) + casa = CasaLegislativa.objects.first() + rodape = ' '.join(get_rodape(casa)) + + context = {} + context.update( + {'object': tramitacoes, + 'materia': materia_legislativa, + 'ano': materia_legislativa.ano, + 'numero': materia_legislativa.numero, + 'autor': materia_legislativa.autores.first(), + 'tipo': materia_legislativa.tipo.descricao, + 'rodape': rodape, + 'data': dt.today().strftime('%d/%m/%Y'), + 'rodape': rodape}) + header_context = {"casa": casa, + 'logotipo': casa.logotipo, 'MEDIA_URL': MEDIA_URL} + + html_template = render_to_string( + 'relatorios/relatorio_materia_tramitacao.html', context) + html_header = render_to_string( + 'relatorios/header_ata.html', header_context) + + pdf_file = make_pdf( + base_url=base_url, main_template=html_template, header_template=html_header) + + response = HttpResponse(content_type='application/pdf;') + response['Content-Disposition'] = 'inline; filename=relatorio.pdf' + response['Content-Transfer-Encoding'] = 'binary' + response.write(pdf_file) + + return response + + +class RelatoriosListView(TemplateView): + template_name = 'relatorios/relatorios_list.html' + + def get_context_data(self, **kwargs): + context = super(TemplateView, self).get_context_data(**kwargs) + estatisticas_acesso_normas = AppConfig.objects.first().estatisticas_acesso_normas + context['estatisticas_acesso_normas'] = True if estatisticas_acesso_normas == 'S' else False + + return context + + +class RelatorioMixin: + # TODO: verificar se todos os relatorios de sistema/relatorios extendem esse Mixin + def get(self, request, *args, **kwargs): + super(RelatorioMixin, self).get(request) + + # TODO: import as global + from sapl.utils import is_report_allowed + if not is_report_allowed(request): + raise Http404() + + is_relatorio = request.GET.get('relatorio') + context = self.get_context_data(filter=self.filterset) + + if is_relatorio: + return self.relatorio(request, context) + else: + return self.render_to_response(context) + + +class RelatorioDocumentosAcessoriosView(RelatorioMixin, FilterView): + model = DocumentoAcessorio + filterset_class = RelatorioDocumentosAcessoriosFilterSet + template_name = 'relatorios/RelatorioDocumentosAcessorios_filter.html' + relatorio = relatorio_documento_acessorio + + def get_context_data(self, **kwargs): + context = super( + RelatorioDocumentosAcessoriosView, self + ).get_context_data(**kwargs) + + context['title'] = _('Documentos Acessórios das Matérias Legislativas') + + if not self.filterset.form.is_valid(): + return context + + query_dict = self.request.GET.copy() + context['show_results'] = show_results_filter_set(query_dict) + + context['tipo_documento'] = str( + TipoDocumento.objects.get(pk=self.request.GET['tipo']) + ) + + tipo_materia = self.request.GET['materia__tipo'] + if tipo_materia: + context['tipo_materia'] = str( + TipoMateriaLegislativa.objects.get(pk=tipo_materia) + ) + else: + context['tipo_materia'] = "Não selecionado" + + data_inicial = self.request.GET['data_0'] + data_final = self.request.GET['data_1'] + if not data_inicial: + data_inicial = "Data Inicial não definida" + if not data_final: + data_final = "Data Final não definida" + context['periodo'] = ( + data_inicial + ' - ' + data_final + ) + + return context + + +class RelatorioAtasView(RelatorioMixin, FilterView): + model = SessaoPlenaria + filterset_class = RelatorioAtasFilterSet + template_name = 'relatorios/RelatorioAtas_filter.html' + relatorio = relatorio_atas + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['title'] = _('Atas das Sessões Plenárias') + + # Verifica se os campos foram preenchidos + if not self.filterset.form.is_valid(): + return context + + qr = self.request.GET.copy() + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + context['periodo'] = ( + self.request.GET['data_inicio_0'] + + ' - ' + self.request.GET['data_inicio_1']) + + return context + + +class RelatorioPresencaSessaoView(RelatorioMixin, FilterView): + logger = logging.getLogger(__name__) + model = SessaoPlenaria + filterset_class = RelatorioPresencaSessaoFilterSet + template_name = 'relatorios/RelatorioPresencaSessao_filter.html' + relatorio = relatorio_presenca_sessao + + def get_context_data(self, **kwargs): + + context = super().get_context_data(**kwargs) + context['title'] = _('Presença dos parlamentares nas sessões') + + # Verifica se os campos foram preenchidos + if not self.filterset.form.is_valid(): + return context + + cd = self.filterset.form.cleaned_data + if not cd['data_inicio'] and not cd['sessao_legislativa'] \ + and not cd['legislatura']: + msg = _( + "Formulário inválido! Preencha pelo menos algum dos campos Período, Legislatura ou Sessão Legislativa.") + messages.error(self.request, msg) + return context + + # Caso a data tenha sido preenchida, verifica se foi preenchida + # corretamente + if self.request.GET.get('data_inicio_0') and not self.request.GET.get('data_inicio_1'): + msg = _("Formulário inválido! Preencha a data do Período Final.") + messages.error(self.request, msg) + return context + + if not self.request.GET.get('data_inicio_0') and self.request.GET.get('data_inicio_1'): + msg = _("Formulário inválido! Preencha a data do Período Inicial.") + messages.error(self.request, msg) + return context + + param0 = {} + + legislatura_pk = self.request.GET.get('legislatura') + if legislatura_pk: + param0['sessao_plenaria__legislatura_id'] = legislatura_pk + legislatura = Legislatura.objects.get(id=legislatura_pk) + context['legislatura'] = legislatura + + sessao_legislativa_pk = self.request.GET.get('sessao_legislativa') + if sessao_legislativa_pk: + param0['sessao_plenaria__sessao_legislativa_id'] = sessao_legislativa_pk + sessao_legislativa = SessaoLegislativa.objects.get( + id=sessao_legislativa_pk) + context['sessao_legislativa'] = sessao_legislativa + + tipo_sessao_plenaria_pk = self.request.GET.get('tipo') + context['tipo'] = '' + if tipo_sessao_plenaria_pk: + param0['sessao_plenaria__tipo_id'] = tipo_sessao_plenaria_pk + context['tipo'] = TipoSessaoPlenaria.objects.get( + id=tipo_sessao_plenaria_pk) + + _range = [] + + if ('data_inicio_0' in self.request.GET) and self.request.GET['data_inicio_0'] and \ + ('data_inicio_1' in self.request.GET) and self.request.GET['data_inicio_1']: + where = context['object_list'].query.where + _range = where.children[0].rhs + + elif legislatura_pk and not sessao_legislativa_pk: + _range = [legislatura.data_inicio, legislatura.data_fim] + + elif sessao_legislativa_pk: + _range = [sessao_legislativa.data_inicio, + sessao_legislativa.data_fim] + + param0.update({'sessao_plenaria__data_inicio__range': _range}) + + # Parlamentares com Mandato no intervalo de tempo (Ativos) + parlamentares_qs = parlamentares_ativos( + _range[0], _range[1]).order_by('nome_parlamentar') + parlamentares_id = parlamentares_qs.values_list('id', flat=True) + + # Presenças de cada Parlamentar em Sessões + presenca_sessao = SessaoPlenariaPresenca.objects.filter( + **param0).values_list('parlamentar_id').annotate(sessao_count=Count('id')) + + # Presenças de cada Ordem do Dia + presenca_ordem = PresencaOrdemDia.objects.filter( + **param0).values_list('parlamentar_id').annotate(sessao_count=Count('id')) + + # Ausencias justificadas + ausencia_justificadas = JustificativaAusencia.objects.filter( + **param0, ausencia=2).values_list('parlamentar_id')\ + .annotate(sessao_count=Count('id')) + + total_ordemdia = PresencaOrdemDia.objects.filter( + **param0).distinct('sessao_plenaria__id').order_by('sessao_plenaria__id').count() + + total_sessao = context['object_list'].count() + + username = self.request.user.username + + context['exibir_somente_titular'] = self.request.GET.get( + 'exibir_somente_titular') == 'on' + context['exibir_somente_ativo'] = self.request.GET.get( + 'exibir_somente_ativo') == 'on' + + # Completa o dicionario as informacoes parlamentar/sessao/ordem + parlamentares_presencas = [] + for p in parlamentares_qs: + parlamentar = {} + m = p.mandato_set.filter(Q(data_inicio_mandato__lte=_range[0], data_fim_mandato__gte=_range[1]) | + Q(data_inicio_mandato__lte=_range[0], data_fim_mandato__isnull=True) | + Q(data_inicio_mandato__gte=_range[0], data_fim_mandato__lte=_range[1]) | + # mandato suplente + Q(data_inicio_mandato__gte=_range[0], data_fim_mandato__lte=_range[1])) + + m = m.last() + + if not context['exibir_somente_titular'] and not context['exibir_somente_ativo']: + parlamentar = { + 'parlamentar': p, + 'titular': m.titular if m else False, + 'sessao_porc': 0, + 'ordemdia_porc': 0 + } + elif context['exibir_somente_titular'] and not context['exibir_somente_ativo']: + if m and m.titular: + parlamentar = { + 'parlamentar': p, + 'titular': m.titular if m else False, + 'sessao_porc': 0, + 'ordemdia_porc': 0 + } + else: + continue + elif not context['exibir_somente_titular'] and context['exibir_somente_ativo']: + if p.ativo: + parlamentar = { + 'parlamentar': p, + 'titular': m.titular if m else False, + 'sessao_porc': 0, + 'ordemdia_porc': 0 + } + else: + continue + elif context['exibir_somente_titular'] and context['exibir_somente_ativo']: + if m and m.titular and p.ativo: + parlamentar = { + 'parlamentar': p, + 'titular': m.titular if m else False, + 'sessao_porc': 0, + 'ordemdia_porc': 0 + } + else: + continue + else: + continue + + try: + self.logger.debug( + F'user={username}. Tentando obter presença do parlamentar (pk={p.id}).') + sessao_count = presenca_sessao.get(parlamentar_id=p.id)[1] + except ObjectDoesNotExist as e: + self.logger.error( + F'user={username}. Erro ao obter presença do parlamentar (pk={p.id}). Definido como 0. {str(e)}') + sessao_count = 0 + try: + # Presenças de cada Ordem do Dia + self.logger.info( + F'user={username}. Tentando obter PresencaOrdemDia para o parlamentar pk={p.id}.') + ordemdia_count = presenca_ordem.get(parlamentar_id=p.id)[1] + except ObjectDoesNotExist: + self.logger.error( + F'user={username}. Erro ao obter PresencaOrdemDia para o parlamentar pk={p.id}. Definido como 0.') + ordemdia_count = 0 + try: + self.logger.debug( + F'user={username}. Tentando obter ausência justificada do parlamentar (pk={p.id}).') + ausencia_justificadas_count = ausencia_justificadas.get(parlamentar_id=p.id)[1] + except ObjectDoesNotExist as e: + self.logger.error( + F'user={username}. Erro ao obter ausência do parlamentar (pk={p.id}). Definido como 0. {str(e)}') + ausencia_justificadas_count = 0 + + ausencia_count = total_sessao - sessao_count if total_sessao else 0 + ausencia_porc = round(100 * (1 - sessao_count / total_sessao), 2) if total_sessao else 0 + # # porcentagem do total de ausencias + # ausencia_justificadas_porc = round(100 * ausencias_justificadas_count / ausencia_count, 2)\ + # if ausencia_count else 0 + + # porcentagem do total de sessoes + ausencia_justificadas_porc = round(100 * ausencia_justificadas_count / total_sessao, 2) \ + if total_sessao else 0 + + parlamentar.update({ + 'sessao_count': sessao_count, + 'ordemdia_count': ordemdia_count, + 'ausencia_count': ausencia_count, + 'ausencia_porc': ausencia_porc, + 'ausencia_justificada_count': ausencia_justificadas_count, + 'ausencia_justificadas_porc': ausencia_justificadas_porc, + }) + + if total_sessao != 0: + parlamentar.update({'sessao_porc': round( + sessao_count * 100 / total_sessao, 2)}) + if total_ordemdia != 0: + parlamentar.update({'ordemdia_porc': round( + ordemdia_count * 100 / total_ordemdia, 2)}) + + parlamentares_presencas.append(parlamentar) + + context['date_range'] = _range + context['total_ordemdia'] = total_ordemdia + context['total_sessao'] = context['object_list'].count() + context['parlamentares'] = parlamentares_presencas + context['periodo'] = f"{self.request.GET['data_inicio_0']} - {self.request.GET['data_inicio_1']}" + context['sessao_legislativa'] = '' + context['legislatura'] = '' + context['exibir_ordem'] = self.request.GET.get( + 'exibir_ordem_dia') == 'on' + + if sessao_legislativa_pk: + context['sessao_legislativa'] = SessaoLegislativa.objects.get( + id=sessao_legislativa_pk) + if legislatura_pk: + context['legislatura'] = Legislatura.objects.get(id=legislatura_pk) + # ===================================================================== + qr = self.request.GET.copy() + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + + return context + + +class RelatorioHistoricoTramitacaoView(RelatorioMixin, FilterView): + model = MateriaLegislativa + filterset_class = RelatorioHistoricoTramitacaoFilterSet + template_name = 'relatorios/RelatorioHistoricoTramitacao_filter.html' + relatorio = relatorio_historico_tramitacao + + def get_context_data(self, **kwargs): + context = super(RelatorioHistoricoTramitacaoView, + self).get_context_data(**kwargs) + context['title'] = _( + 'Histórico de Tramitações de Matérias Legislativas') + if not self.filterset.form.is_valid(): + return context + qr = self.request.GET.copy() + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + context['data_tramitacao'] = (self.request.GET['tramitacao__data_tramitacao_0'] + ' - ' + + self.request.GET['tramitacao__data_tramitacao_1']) + if self.request.GET['tipo']: + tipo = self.request.GET['tipo'] + context['tipo'] = ( + str(TipoMateriaLegislativa.objects.get(id=tipo))) + else: + context['tipo'] = '' + + if self.request.GET['tramitacao__status']: + tramitacao_status = self.request.GET['tramitacao__status'] + context['tramitacao__status'] = ( + str(StatusTramitacao.objects.get(id=tramitacao_status))) + else: + context['tramitacao__status'] = '' + + if self.request.GET['tramitacao__unidade_tramitacao_local']: + context['tramitacao__unidade_tramitacao_local'] = \ + (str(UnidadeTramitacao.objects.get( + id=self.request.GET['tramitacao__unidade_tramitacao_local']))) + else: + context['tramitacao__unidade_tramitacao_local'] = '' + + if self.request.GET['tramitacao__unidade_tramitacao_destino']: + context['tramitacao__unidade_tramitacao_destino'] = \ + (str(UnidadeTramitacao.objects.get( + id=self.request.GET['tramitacao__unidade_tramitacao_destino']))) + else: + context['tramitacao__unidade_tramitacao_destino'] = '' + + if self.request.GET['autoria__autor']: + context['autoria__autor'] = \ + (str(Autor.objects.get( + id=self.request.GET['autoria__autor']))) + else: + context['autoria__autor'] = '' + + return context + + +class RelatorioDataFimPrazoTramitacaoView(RelatorioMixin, FilterView): + model = MateriaEmTramitacao + filterset_class = RelatorioDataFimPrazoTramitacaoFilterSet + template_name = 'relatorios/RelatorioDataFimPrazoTramitacao_filter.html' + relatorio = relatorio_fim_prazo_tramitacao + + def get_context_data(self, **kwargs): + context = super(RelatorioDataFimPrazoTramitacaoView, + self).get_context_data(**kwargs) + context['title'] = _( + 'Relatório de tramitações em intervalo de data de fim de prazo.') + if not self.filterset.form.is_valid(): + return context + qr = self.request.GET.copy() + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + + context['data_fim_prazo'] = (self.request.GET['tramitacao__data_fim_prazo_0'] + ' - ' + + self.request.GET['tramitacao__data_fim_prazo_1']) + + if self.request.GET['materia__ano']: + context['ano'] = self.request.GET['materia__ano'] + else: + context['ano'] = '' + + if self.request.GET['materia__tipo']: + tipo = self.request.GET['materia__tipo'] + context['tipo'] = ( + str(TipoMateriaLegislativa.objects.get(id=tipo))) + else: + context['tipo'] = '' + + if self.request.GET['materia__autores']: + autor = int(self.request.GET['materia__autores']) + context['materia__autor'] = (str(Autor.objects.get(id=autor))) + else: + context['materia__autor'] = '' + + if self.request.GET['tramitacao__status']: + tramitacao_status = self.request.GET['tramitacao__status'] + context['tramitacao__status'] = ( + str(StatusTramitacao.objects.get(id=tramitacao_status))) + else: + context['tramitacao__status'] = '' + + if self.request.GET['tramitacao__unidade_tramitacao_local']: + context['tramitacao__unidade_tramitacao_local'] = \ + (str(UnidadeTramitacao.objects.get( + id=self.request.GET['tramitacao__unidade_tramitacao_local']))) + else: + context['tramitacao__unidade_tramitacao_local'] = '' + + if self.request.GET['tramitacao__unidade_tramitacao_destino']: + context['tramitacao__unidade_tramitacao_destino'] = \ + (str(UnidadeTramitacao.objects.get( + id=self.request.GET['tramitacao__unidade_tramitacao_destino']))) + else: + context['tramitacao__unidade_tramitacao_destino'] = '' + + return context + + +class RelatorioReuniaoView(RelatorioMixin, FilterView): + model = Reuniao + filterset_class = RelatorioReuniaoFilterSet + template_name = 'relatorios/RelatorioReuniao_filter.html' + relatorio = relatorio_reuniao + + def get_filterset_kwargs(self, filterset_class): + super(RelatorioReuniaoView, + self).get_filterset_kwargs(filterset_class) + + kwargs = {'data': self.request.GET or None} + return kwargs + + def get_context_data(self, **kwargs): + context = super(RelatorioReuniaoView, + self).get_context_data(**kwargs) + context['title'] = _('Reunião de Comissão') + if not self.filterset.form.is_valid(): + return context + qr = self.request.GET.copy() + + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + + if self.request.GET['comissao']: + comissao = self.request.GET['comissao'] + context['comissao'] = (str(Comissao.objects.get(id=comissao))) + else: + context['comissao'] = '' + + return context + + +class RelatorioAudienciaView(RelatorioMixin, FilterView): + model = AudienciaPublica + filterset_class = RelatorioAudienciaFilterSet + template_name = 'relatorios/RelatorioAudiencia_filter.html' + relatorio = relatorio_audiencia + + def get_filterset_kwargs(self, filterset_class): + super(RelatorioAudienciaView, + self).get_filterset_kwargs(filterset_class) + + kwargs = {'data': self.request.GET or None} + return kwargs + + def get_context_data(self, **kwargs): + context = super(RelatorioAudienciaView, + self).get_context_data(**kwargs) + context['title'] = _('Audiência Pública') + if not self.filterset.form.is_valid(): + return context + + qr = self.request.GET.copy() + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + + if self.request.GET['tipo']: + tipo = self.request.GET['tipo'] + context['tipo'] = (str(TipoAudienciaPublica.objects.get(id=tipo))) + else: + context['tipo'] = '' + + return context + + +class RelatorioMateriasTramitacaoView(RelatorioMixin, FilterView): + model = MateriaEmTramitacao + filterset_class = RelatorioMateriasTramitacaoFilterSet + template_name = 'relatorios/RelatorioMateriasPorTramitacao_filter.html' + relatorio = relatorio_materia_em_tramitacao + + paginate_by = 100 + + total_resultados_tipos = {} + + def get_filterset_kwargs(self, filterset_class): + data = super().get_filterset_kwargs(filterset_class) + + if data['data']: + qs = data['queryset'] + + ano_materia = data['data']['materia__ano'] + tipo_materia = data['data']['materia__tipo'] + unidade_tramitacao_destino = data['data']['tramitacao__unidade_tramitacao_destino'] + status_tramitacao = data['data']['tramitacao__status'] + autor = data['data']['materia__autores'] + + kwargs = {} + if ano_materia: + kwargs['materia__ano'] = ano_materia + if tipo_materia: + kwargs['materia__tipo'] = tipo_materia + if unidade_tramitacao_destino: + kwargs['tramitacao__unidade_tramitacao_destino'] = unidade_tramitacao_destino + if status_tramitacao: + kwargs['tramitacao__status'] = status_tramitacao + if autor: + kwargs['materia__autores'] = autor + + qs = qs.filter(**kwargs) + data['queryset'] = qs + + self.total_resultados_tipos = num_materias_por_tipo( + qs, "materia__tipo") + + return data + + def get_queryset(self): + qs = super().get_queryset() + qs = qs.select_related('materia__tipo').filter( + materia__em_tramitacao=True + ).exclude( + tramitacao__status__indicador='F' + ).order_by('-materia__ano', '-materia__numero') + return qs + + def get_context_data(self, **kwargs): + context = super( + RelatorioMateriasTramitacaoView, self + ).get_context_data(**kwargs) + + context['title'] = _('Matérias em Tramitação') + + if not self.filterset.form.is_valid(): + return context + + qr = self.request.GET.copy() + + context['qtdes'] = self.total_resultados_tipos + context['ano'] = (self.request.GET['materia__ano']) + + if self.request.GET['materia__tipo']: + tipo = self.request.GET['materia__tipo'] + context['tipo'] = ( + str(TipoMateriaLegislativa.objects.get(id=tipo)) + ) + else: + context['tipo'] = '' + + if self.request.GET['tramitacao__status']: + tramitacao_status = self.request.GET['tramitacao__status'] + context['tramitacao__status'] = ( + str(StatusTramitacao.objects.get(id=tramitacao_status)) + ) + else: + context['tramitacao__status'] = '' + + if self.request.GET['tramitacao__unidade_tramitacao_destino']: + context['tramitacao__unidade_tramitacao_destino'] = ( + str(UnidadeTramitacao.objects.get( + id=self.request.GET['tramitacao__unidade_tramitacao_destino'] + )) + ) + else: + context['tramitacao__unidade_tramitacao_destino'] = '' + + if self.request.GET['materia__autores']: + autor = self.request.GET['materia__autores'] + context['materia__autor'] = ( + str(Autor.objects.get(id=autor)) + ) + else: + context['materia__autor'] = '' + if 'page' in qr: + del qr['page'] + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + context['show_results'] = show_results_filter_set(qr) + + paginator = context['paginator'] + page_obj = context['page_obj'] + + context['page_range'] = make_pagination( + page_obj.number, paginator.num_pages + ) + context['NO_ENTRIES_MSG'] = 'Nenhum encontrado.' + + return context + + +class RelatorioMateriasPorAnoAutorTipoView(RelatorioMixin, FilterView): + model = MateriaLegislativa + filterset_class = RelatorioMateriasPorAnoAutorTipoFilterSet + template_name = 'relatorios/RelatorioMateriasPorAnoAutorTipo_filter.html' + relatorio = relatorio_materia_por_ano_autor + + def get_materias_autor_ano(self, ano, primeiro_autor): + + autorias = Autoria.objects.filter(materia__ano=ano, primeiro_autor=primeiro_autor).values( + 'autor', + 'materia__tipo__sigla', + 'materia__tipo__descricao').annotate( + total=Count('materia__tipo')).order_by( + 'autor', + 'materia__tipo') + + autores_ids = set([i['autor'] for i in autorias]) + + autores = dict((a.id, a) for a in Autor.objects.filter( + id__in=autores_ids)) + + relatorio = [] + visitados = set() + curr = None + + for a in autorias: + # se mudou autor, salva atual, caso existente, e reinicia `curr` + if a['autor'] not in visitados: + if curr: + relatorio.append(curr) + + curr = {} + curr['autor'] = autores[a['autor']] + curr['materia'] = [] + curr['total'] = 0 + + visitados.add(a['autor']) + + # atualiza valores + curr['materia'].append((a['materia__tipo__descricao'], a['total'])) + curr['total'] += a['total'] + # adiciona o ultimo + relatorio.append(curr) + + return relatorio + + def get_filterset_kwargs(self, filterset_class): + super(RelatorioMateriasPorAnoAutorTipoView, + self).get_filterset_kwargs(filterset_class) + + kwargs = {'data': self.request.GET or None} + return kwargs + + def get_context_data(self, **kwargs): + context = super(RelatorioMateriasPorAnoAutorTipoView, + self).get_context_data(**kwargs) + + context['title'] = _('Matérias por Ano, Autor e Tipo') + if not self.filterset.form.is_valid(): + return context + qs = context['object_list'] + context['qtdes'] = num_materias_por_tipo(qs) + + qr = self.request.GET.copy() + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + context['ano'] = self.request.GET['ano'] + + if 'ano' in self.request.GET and self.request.GET['ano']: + ano = int(self.request.GET['ano']) + context['relatorio'] = self.get_materias_autor_ano(ano, True) + context['corelatorio'] = self.get_materias_autor_ano(ano, False) + else: + context['relatorio'] = [] + + return context + + +class RelatorioMateriasPorAutorView(RelatorioMixin, FilterView): + model = MateriaLegislativa + filterset_class = RelatorioMateriasPorAutorFilterSet + template_name = 'relatorios/RelatorioMateriasPorAutor_filter.html' + relatorio = relatorio_materia_por_autor + + def get_filterset_kwargs(self, filterset_class): + super().get_filterset_kwargs(filterset_class) + kwargs = {'data': self.request.GET or None} + return kwargs + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + context['title'] = _('Matérias por Autor') + if not self.filterset.form.is_valid(): + return context + + qs = context['object_list'] + context['materias_resultado'] = list(collections.OrderedDict.fromkeys(qs)) + context['qtdes'] = num_materias_por_tipo(qs) + + qr = self.request.GET.copy() + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + if self.request.GET['tipo']: + tipo = int(self.request.GET['tipo']) + context['tipo'] = ( + str(TipoMateriaLegislativa.objects.get(id=tipo))) + else: + context['tipo'] = '' + if self.request.GET['autoria__autor']: + autor = int(self.request.GET['autoria__autor']) + context['autor'] = (str(Autor.objects.get(id=autor))) + else: + context['autor'] = '' + context['periodo'] = ( + self.request.GET['data_apresentacao_0'] + + ' - ' + self.request.GET['data_apresentacao_1']) + + return context + + +class RelatorioMateriaAnoAssuntoView(ListView): + template_name = 'relatorios/RelatorioMateriasAnoAssunto.html' + + def get_queryset(self): + return MateriaAssunto.objects.all().values( + 'assunto_id', + assunto_materia=F('assunto__assunto'), + ano=F('materia__ano')).annotate( + total=Count('assunto_id')).order_by('-materia__ano', 'assunto_id') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['title'] = _('Matérias por Ano e Assunto') + + # In[10]: MateriaAssunto.objects.all().values( + # ...: 'materia__ano').annotate( + # ...: total = Count('materia__ano')).order_by('-materia__ano') + + mat = MateriaLegislativa.objects.filter( + materiaassunto__isnull=True).values( + 'ano').annotate( + total=Count('ano')).order_by('-ano') + + context.update({"materias_sem_assunto": mat}) + return context + + +class RelatorioNormasPublicadasMesView(RelatorioMixin, FilterView): + model = NormaJuridica + filterset_class = RelatorioNormasMesFilterSet + template_name = 'relatorios/RelatorioNormaMes_filter.html' + relatorio = relatorio_normas_mes + + def get_context_data(self, **kwargs): + context = super(RelatorioNormasPublicadasMesView, + self).get_context_data(**kwargs) + context['title'] = _('Normas') + + # Verifica se os campos foram preenchidos + if not self.filterset.form.is_valid(): + return context + + qr = self.request.GET.copy() + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + context['ano'] = self.request.GET['ano'] + + normas_mes = collections.OrderedDict() + meses = {1: 'Janeiro', 2: 'Fevereiro', 3: 'Março', 4: 'Abril', 5: 'Maio', 6: 'Junho', + 7: 'Julho', 8: 'Agosto', 9: 'Setembro', 10: 'Outubro', 11: 'Novembro', 12: 'Dezembro'} + for norma in context['object_list']: + if not meses[norma.data.month] in normas_mes: + normas_mes[meses[norma.data.month]] = [] + normas_mes[meses[norma.data.month]].append(norma) + + context['normas_mes'] = normas_mes + + quant_normas_mes = {} + for key in normas_mes.keys(): + quant_normas_mes[key] = len(normas_mes[key]) + + context['quant_normas_mes'] = quant_normas_mes + + return context + + +class RelatorioNormasVigenciaView(RelatorioMixin, FilterView): + model = NormaJuridica + filterset_class = RelatorioNormasVigenciaFilterSet + template_name = 'relatorios/RelatorioNormasVigencia_filter.html' + relatorio = relatorio_normas_vigencia + + def get_filterset_kwargs(self, filterset_class): + super(RelatorioNormasVigenciaView, + self).get_filterset_kwargs(filterset_class) + + kwargs = {'data': self.request.GET or None} + qs = self.get_queryset().order_by('data').distinct() + if kwargs['data']: + ano = kwargs['data']['ano'] + vigencia = kwargs['data']['vigencia'] + if ano: + qs = qs.filter(ano=ano) + + if vigencia == 'True': + qs_dt_not_null = qs.filter(data_vigencia__isnull=True) + qs = (qs_dt_not_null | qs.filter( + data_vigencia__gte=datetime.now().date())).distinct() + else: + qs = qs.filter( + data_vigencia__lt=datetime.now().date()) + + kwargs.update({ + 'queryset': qs + }) + return kwargs + + def get_context_data(self, **kwargs): + context = super(RelatorioNormasVigenciaView, + self).get_context_data(**kwargs) + context['title'] = _('Normas por vigência') + + # Verifica se os campos foram preenchidos + if not self.filterset.form.is_valid(): + return context + + normas_totais = NormaJuridica.objects.filter( + ano=self.request.GET['ano']) + + context['quant_total'] = len(normas_totais) + if self.request.GET['vigencia'] == 'True': + context['vigencia'] = 'Vigente' + context['quant_vigente'] = len(context['object_list']) + context['quant_nao_vigente'] = context['quant_total'] - \ + context['quant_vigente'] + else: + context['vigencia'] = 'Não vigente' + context['quant_nao_vigente'] = len(context['object_list']) + context['quant_vigente'] = context['quant_total'] - \ + context['quant_nao_vigente'] + + qr = self.request.GET.copy() + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + context['ano'] = self.request.GET['ano'] + + return context + + +class RelatorioHistoricoTramitacaoAdmView(RelatorioMixin, FilterView): + model = DocumentoAdministrativo + filterset_class = RelatorioHistoricoTramitacaoAdmFilterSet + template_name = 'relatorios/RelatorioHistoricoTramitacaoAdm_filter.html' + relatorio = relatorio_historico_tramitacao_adm + + def get_context_data(self, **kwargs): + context = super(RelatorioHistoricoTramitacaoAdmView, + self).get_context_data(**kwargs) + context['title'] = _( + 'Histórico de Tramitações de Documento Administrativo') + if not self.filterset.form.is_valid(): + return context + qr = self.request.GET.copy() + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + context['data_tramitacao'] = (self.request.GET['tramitacaoadministrativo__data_tramitacao_0'] + ' - ' + + self.request.GET['tramitacaoadministrativo__data_tramitacao_1']) + if self.request.GET['tipo']: + tipo = self.request.GET['tipo'] + context['tipo'] = ( + str(TipoDocumentoAdministrativo.objects.get(id=tipo))) + else: + context['tipo'] = '' + + if self.request.GET['tramitacaoadministrativo__status']: + tramitacao_status = self.request.GET['tramitacaoadministrativo__status'] + context['tramitacaoadministrativo__status'] = ( + str(StatusTramitacaoAdministrativo.objects.get(id=tramitacao_status))) + else: + context['tramitacaoadministrativo__status'] = '' + + if self.request.GET['tramitacaoadministrativo__unidade_tramitacao_local']: + context['tramitacaoadministrativo__unidade_tramitacao_local'] = \ + (str(UnidadeTramitacao.objects.get( + id=self.request.GET['tramitacaoadministrativo__unidade_tramitacao_local']))) + else: + context['tramitacaoadministrativo__unidade_tramitacao_local'] = '' + + if self.request.GET['tramitacaoadministrativo__unidade_tramitacao_destino']: + context['tramitacaoadministrativo__unidade_tramitacao_destino'] = \ + (str(UnidadeTramitacao.objects.get( + id=self.request.GET['tramitacaoadministrativo__unidade_tramitacao_destino']))) + else: + context['tramitacaoadministrativo__unidade_tramitacao_destino'] = '' + + return context + + +class RelatorioNormasPorAutorView(RelatorioMixin, FilterView): + model = NormaJuridica + filterset_class = RelatorioNormasPorAutorFilterSet + template_name = 'relatorios/RelatorioNormasPorAutor_filter.html' + relatorio = relatorio_normas_por_autor + + def get_filterset_kwargs(self, filterset_class): + super().get_filterset_kwargs(filterset_class) + kwargs = {'data': self.request.GET or None} + return kwargs + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + context['title'] = _('Normas por Autor') + if not self.filterset.form.is_valid(): + return context + + qtdes = {} + for tipo in TipoNormaJuridica.objects.all(): + qs = context['object_list'] + qtde = len(qs.filter(tipo_id=tipo.id)) + if qtde > 0: + qtdes[tipo] = qtde + context['qtdes'] = qtdes + + qr = self.request.GET.copy() + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + if self.request.GET['tipo']: + tipo = int(self.request.GET['tipo']) + context['tipo'] = ( + str(TipoNormaJuridica.objects.get(id=tipo))) + else: + context['tipo'] = '' + + if self.request.GET['autorianorma__autor']: + autor = int(self.request.GET['autorianorma__autor']) + context['autor'] = (str(Autor.objects.get(id=autor))) + else: + context['autor'] = '' + context['periodo'] = ( + self.request.GET['data_0'] + + ' - ' + self.request.GET['data_1']) + + return context diff --git a/sapl/rules/apps.py b/sapl/rules/apps.py index 6a3c45f4b..cdaa71516 100644 --- a/sapl/rules/apps.py +++ b/sapl/rules/apps.py @@ -9,7 +9,6 @@ from django.core import exceptions from django.db import models, router from django.db.utils import DEFAULT_DB_ALIAS from django.utils.translation import ugettext_lazy as _ -import reversion from sapl.rules import (SAPL_GROUP_ADMINISTRATIVO, SAPL_GROUP_COMISSOES, SAPL_GROUP_GERAL, SAPL_GROUP_MATERIA, SAPL_GROUP_NORMA, @@ -237,14 +236,6 @@ def cria_usuarios_padrao(): rules.cria_usuarios_padrao() -def revision_pre_delete_signal(sender, **kwargs): - with reversion.create_revision(): - kwargs['instance'].save() - reversion.set_comment("Deletado pelo sinal.") - - models.signals.post_migrate.connect(receiver=update_groups) models.signals.post_migrate.connect( receiver=create_proxy_permissions, dispatch_uid="django.contrib.auth.management.create_permissions") -models.signals.pre_delete.connect( - receiver=revision_pre_delete_signal, dispatch_uid="pre_delete_signal") diff --git a/sapl/rules/group_administrativo.py b/sapl/rules/group_administrativo.py index 0e5ec2f78..7e4577b74 100644 --- a/sapl/rules/group_administrativo.py +++ b/sapl/rules/group_administrativo.py @@ -12,5 +12,6 @@ rules_group_administrativo = { (protocoloadm.Anexado, __base__, set()), (protocoloadm.DocumentoAcessorioAdministrativo, __base__, set()), (protocoloadm.TramitacaoAdministrativo, __base__, set()), + (protocoloadm.VinculoDocAdminMateria, __base__, set()) ] } diff --git a/sapl/rules/group_geral.py b/sapl/rules/group_geral.py index 59d78cc48..d12b94152 100644 --- a/sapl/rules/group_geral.py +++ b/sapl/rules/group_geral.py @@ -1,3 +1,5 @@ +from django.contrib.contenttypes import models as contenttypes + from sapl.audiencia import models as audiencia from sapl.base import models as base from sapl.comissoes import models as comissoes @@ -11,6 +13,7 @@ from sapl.rules import SAPL_GROUP_GERAL, RP_ADD, __base__, __perms_publicas__, \ __listdetailchange__ from sapl.sessao import models as sessao + rules_group_geral = { 'group': SAPL_GROUP_GERAL, 'rules': [ @@ -25,6 +28,7 @@ rules_group_geral = { (base.Autor, __base__, __perms_publicas__), (base.OperadorAutor, __base__, __perms_publicas__), (base.AuditLog, __base__, set()), + (base.Metadata, __base__, set()), (protocoloadm.StatusTramitacaoAdministrativo, __base__, set()), (protocoloadm.TipoDocumentoAdministrativo, __base__, set()), @@ -106,12 +110,15 @@ rules_group_geral = { __base__ + ['lock_unlock_textoarticulado'], set()), # estes tres models são complexos e a principio apenas o admin tem perm - (compilacao.TipoDispositivo, [], set()), + (compilacao.TipoDispositivo, __listdetailchange__, __perms_publicas__), (compilacao.TipoDispositivoRelationship, [], set()), (compilacao.PerfilEstruturalTextoArticulado, [], set()), (audiencia.AudienciaPublica, __base__, __perms_publicas__), (audiencia.TipoAudienciaPublica, __base__, __perms_publicas__), + # permite consulta anônima pela api a lista de contenttypes + (contenttypes.ContentType, [], __perms_publicas__), + ] } diff --git a/sapl/rules/group_sessao.py b/sapl/rules/group_sessao.py index 0e30c1706..5bc217f05 100644 --- a/sapl/rules/group_sessao.py +++ b/sapl/rules/group_sessao.py @@ -21,6 +21,7 @@ rules_group_sessao = { (sessao.JustificativaAusencia, __base__, __perms_publicas__), (sessao.RetiradaPauta, __base__, __perms_publicas__), (sessao.RegistroLeitura, __base__, __perms_publicas__), - (sessao.ConsideracoesFinais, __base__, __perms_publicas__) + (sessao.ConsideracoesFinais, __base__, __perms_publicas__), + (sessao.Correspondencia, __base__, __perms_publicas__) ] } diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 851f2d744..73ac911f0 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -1,8 +1,8 @@ -import django_filters - -from crispy_forms.layout import Button, Fieldset, HTML, Layout from datetime import datetime +import logging +import re +from crispy_forms.layout import Button, Fieldset, HTML, Layout from django import forms from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist, ValidationError @@ -11,21 +11,26 @@ from django.db.models import Q from django.forms import ModelForm from django.forms.widgets import CheckboxSelectMultiple from django.utils.translation import ugettext_lazy as _ +import django_filters from sapl.base.models import Autor, TipoAutor -from sapl.crispy_layout_mixin import (form_actions, to_row, +from sapl.crispy_layout_mixin import (form_actions, to_row, SaplFormHelper, SaplFormLayout) from sapl.materia.forms import MateriaLegislativaFilterSet from sapl.materia.models import (MateriaLegislativa, StatusTramitacao, TipoMateriaLegislativa) from sapl.parlamentares.models import Mandato, Parlamentar +from sapl.protocoloadm.models import TipoDocumentoAdministrativo,\ + DocumentoAdministrativo +from sapl.sessao.models import Correspondencia from sapl.utils import (autor_label, autor_modal, choice_anos_com_sessaoplenaria, FileFieldCheckMixin, FilterOverridesMetaMixin, MateriaPesquisaOrderingFilter, RANGE_DIAS_MES, RANGE_MESES, - timezone, validar_arquivo) + TIME_PATTERN, timezone, validar_arquivo) +import sapl.utils from .models import (Bancada, ExpedienteMateria, JustificativaAusencia, OcorrenciaSessao, Orador, @@ -33,18 +38,22 @@ from .models import (Bancada, ExpedienteMateria, ORDENACAO_RESUMO, PresencaOrdemDia, RegistroLeitura, ResumoOrdenacao, RetiradaPauta, SessaoPlenaria, SessaoPlenariaPresenca, - TipoResultadoVotacao, TipoRetiradaPauta) + TipoResultadoVotacao, TipoRetiradaPauta, Tramitacao) MES_CHOICES = RANGE_MESES DIA_CHOICES = RANGE_DIAS_MES +def tramitacao_select_validation(): + return True + + class SessaoPlenariaForm(FileFieldCheckMixin, ModelForm): class Meta: model = SessaoPlenaria - exclude = ['cod_andamento_sessao'] + exclude = ['cod_andamento_sessao', 'correspondencias'] def clean(self): super(SessaoPlenariaForm, self).clean() @@ -62,9 +71,9 @@ class SessaoPlenariaForm(FileFieldCheckMixin, ModelForm): encerramento = self.cleaned_data['data_fim'] error = ValidationError( - "Número de Sessão Plenária já existente " - "para a Legislatura, Sessão Legislativa e Tipo informados. " - "Favor escolher um número distinto.") + "Número de Sessão Plenária '" + str(num) + "' já existente " + "para o Tipo de Sessão " + str(tipo) + " da " + str(sl) + + " Sessão Legislativa da " + str(leg) + " Legislatura. Por Favor, escolha um número distinto.") qs = tipo.build_predicados_queryset(leg, sl, abertura) qs &= Q(numero=num) @@ -86,8 +95,7 @@ class SessaoPlenariaForm(FileFieldCheckMixin, ModelForm): encerramento_entre_leg = True encerramento_entre_sl = True - - ## Sessões Extraordinárias podem estar fora da sessão legislativa + # Sessões Extraordinárias podem estar fora da sessão legislativa descricao_tipo = tipo.nome.lower() if "extraordinária" in descricao_tipo or "especial" in descricao_tipo: # Ignora checagem de limites para Sessão Legislativa @@ -103,7 +111,6 @@ class SessaoPlenariaForm(FileFieldCheckMixin, ModelForm): raise ValidationError("A data de abertura e encerramento da Sessão " "Plenária deve estar compreendida entre a " "data de abertura e encerramento da Sessão Legislativa") - upload_pauta = self.cleaned_data.get('upload_pauta', False) upload_ata = self.cleaned_data.get('upload_ata', False) @@ -111,13 +118,23 @@ class SessaoPlenariaForm(FileFieldCheckMixin, ModelForm): if upload_pauta: validar_arquivo(upload_pauta, "Pauta da Sessão") - + if upload_ata: validar_arquivo(upload_ata, "Ata da Sessão") if upload_anexo: validar_arquivo(upload_anexo, "Anexo da Sessão") + hora_inicio = self.cleaned_data['hora_inicio'] + if not re.match(sapl.utils.TIME_PATTERN, hora_inicio): + raise ValidationError(f'Formato ou valores de horário de ' + f'abertura errados: {hora_inicio}') + + hora_fim = self.cleaned_data['hora_fim'] + if hora_fim and not re.match(sapl.utils.TIME_PATTERN, hora_fim): + raise ValidationError(f'Formato ou valores de horário de ' + f'encerramento errados: {hora_fim}.') + return self.cleaned_data @@ -286,6 +303,12 @@ class BancadaForm(ModelForm): return bancada +class DependentChoiceField(forms.ChoiceField): + + def validate(self, value): + return True + + class ExpedienteMateriaForm(ModelForm): _model = ExpedienteMateria @@ -298,6 +321,10 @@ class ExpedienteMateriaForm(ModelForm): empty_label='Selecione', widget=forms.Select(attrs={'autocomplete': 'off'})) + tramitacao_select = DependentChoiceField( + label=_('Situação de Pauta'), + widget=forms.Select()) + numero_materia = forms.CharField( label='Número Matéria', required=True, widget=forms.TextInput(attrs={'autocomplete': 'off'})) @@ -318,7 +345,7 @@ class ExpedienteMateriaForm(ModelForm): class Meta: model = ExpedienteMateria fields = ['data_ordem', 'numero_ordem', 'tipo_materia', 'observacao', - 'numero_materia', 'ano_materia', 'tipo_votacao'] + 'numero_materia', 'ano_materia', 'tramitacao_select', 'tipo_votacao'] def clean_numero_ordem(self): sessao = self.instance.sessao_plenaria @@ -341,8 +368,6 @@ class ExpedienteMateriaForm(ModelForm): if not self.is_valid(): return cleaned_data - sessao = self.instance.sessao_plenaria - try: materia = MateriaLegislativa.objects.get( numero=self.cleaned_data['numero_materia'], @@ -355,11 +380,27 @@ class ExpedienteMateriaForm(ModelForm): else: cleaned_data['materia'] = materia + try: + if materia.tramitacao_set.exists() and self.cleaned_data['tramitacao_select']: + tramitacao = materia.tramitacao_set.get( + pk=self.cleaned_data['tramitacao_select']) + cleaned_data['tramitacao'] = tramitacao + except ObjectDoesNotExist: + raise ValidationError( + _('Tramitação selecionada não existe para a Matéria: %(value)s'), + code='invalid', + params={'value': self.cleaned_data['tramitacao_select']}, + ) + return cleaned_data def save(self, commit=False): expediente = super(ExpedienteMateriaForm, self).save(commit) expediente.materia = self.cleaned_data['materia'] + if 'tramitacao' in self.cleaned_data and self.cleaned_data['tramitacao']: + expediente.tramitacao = self.cleaned_data['tramitacao'] + else: + expediente.tramitacao = None expediente.save() return expediente @@ -605,8 +646,16 @@ class AdicionarVariasMateriasFilterSet(MateriaLegislativaFilterSet): class OradorForm(ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + + sessao = SessaoPlenaria.objects.get(id=self.initial['id_sessao']) self.fields['parlamentar'].queryset = \ - Parlamentar.objects.filter(mandato__legislatura__sessaoplenaria=self.initial['id_sessao'], ativo=True).order_by('nome_parlamentar') + Parlamentar.objects.filter( + mandato__data_inicio_mandato__isnull=False, + mandato__data_fim_mandato__isnull=False, + mandato__data_inicio_mandato__lte=sessao.data_inicio, + mandato__data_fim_mandato__gte=sessao.data_inicio, + ativo=True + ).distinct().order_by('nome_parlamentar') def clean(self): super(OradorForm, self).clean() @@ -643,8 +692,16 @@ class OradorForm(ModelForm): class OradorExpedienteForm(ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + + sessao = SessaoPlenaria.objects.get(id=self.initial['id_sessao']) self.fields['parlamentar'].queryset = \ - Parlamentar.objects.filter(mandato__legislatura__sessaoplenaria=self.initial['id_sessao'], ativo=True).order_by('nome_parlamentar') + Parlamentar.objects.filter( + mandato__data_inicio_mandato__isnull=False, + mandato__data_fim_mandato__isnull=False, + mandato__data_inicio_mandato__lte=sessao.data_inicio, + mandato__data_fim_mandato__gte=sessao.data_inicio, + ativo=True + ).distinct().order_by('nome_parlamentar') def clean(self): super(OradorExpedienteForm, self).clean() @@ -680,7 +737,8 @@ class OradorOrdemDiaForm(ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['parlamentar'].queryset = \ - Parlamentar.objects.filter(mandato__legislatura__sessaoplenaria=self.initial['id_sessao'], ativo=True).order_by('nome_parlamentar') + Parlamentar.objects.filter( + mandato__legislatura__sessaoplenaria=self.initial['id_sessao'], ativo=True).order_by('nome_parlamentar') def clean(self): super(OradorOrdemDiaForm, self).clean() @@ -779,6 +837,10 @@ class ResumoOrdenacaoForm(forms.Form): label='15°', choices=ORDENACAO_RESUMO ) + decimo_sexto = forms.ChoiceField( + label='16°', + choices=ORDENACAO_RESUMO + ) def __init__(self, *args, **kwargs): row1 = to_row( @@ -813,13 +875,16 @@ class ResumoOrdenacaoForm(forms.Form): row15 = to_row( [('decimo_quinto', 12)] ) + row16 = to_row( + [('decimo_sexto', 12)] + ) self.helper = SaplFormHelper() self.helper.layout = Layout( Fieldset(_(''), row1, row2, row3, row4, row5, row6, row7, row8, row9, row10, - row11, row12, row13, row14, row15, + row11, row12, row13, row14, row15, row16, form_actions(label='Atualizar')) ) @@ -862,6 +927,7 @@ class ResumoOrdenacaoForm(forms.Form): ordenacao.decimo_terceiro = cleaned_data['decimo_terceiro'] ordenacao.decimo_quarto = cleaned_data['decimo_quarto'] ordenacao.decimo_quinto = cleaned_data['decimo_quinto'] + ordenacao.decimo_sexto = cleaned_data['decimo_sexto'] ordenacao.save() @@ -976,7 +1042,8 @@ class JustificativaAusenciaForm(ModelForm): class OrdemExpedienteLeituraForm(forms.ModelForm): - observacao = forms.CharField(required=False, label='Observação', widget=forms.Textarea,) + observacao = forms.CharField( + required=False, label='Observação', widget=forms.Textarea,) class Meta: model = RegistroLeitura @@ -984,7 +1051,7 @@ class OrdemExpedienteLeituraForm(forms.ModelForm): 'ordem', 'expediente', 'observacao', - 'user', + 'user', 'ip'] widgets = {'materia': forms.HiddenInput(), 'ordem': forms.HiddenInput(), @@ -996,14 +1063,14 @@ class OrdemExpedienteLeituraForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - + instance = self.initial['instance'] if instance: self.instance = instance.first() self.fields['observacao'].initial = self.instance.observacao row1 = to_row( - [('observacao', 12)]) + [('observacao', 12)]) actions = [HTML('Cancelar Leitura')] @@ -1012,11 +1079,115 @@ class OrdemExpedienteLeituraForm(forms.ModelForm): self.helper.form_method = 'POST' self.helper.layout = Layout( Fieldset(_('Leitura de Matéria'), - HTML(''' + HTML(''' Matéria: {{materia}}
Ementa: {{materia.ementa}}
'''), row1, form_actions(more=actions), - ) - ) \ No newline at end of file + ) + ) + + +class CorrespondenciaForm(ModelForm): + + logger = logging.getLogger(__name__) + + tipo_documento = forms.ModelChoiceField( + label='Tipo do Documento', + required=True, + queryset=TipoDocumentoAdministrativo.objects.all(), + empty_label='Selecione', + ) + + numero_documento = forms.IntegerField(label='Número', required=True) + + ano_documento = forms.CharField(label='Ano', required=True) + + class Meta: + model = Correspondencia + fields = ['tipo', 'numero_ordem', 'observacao', + 'tipo_documento', 'numero_documento', 'ano_documento'] + + def __init__(self, *args, **kwargs): + return super().__init__(*args, **kwargs) + + def clean(self): + super().clean() + + if not self.is_valid(): + return self.cleaned_data + + cleaned_data = self.cleaned_data + try: + self.logger.info("Tentando obter objeto Documento Administrativo (numero={}, ano={}, tipo={})." + .format(cleaned_data['numero_documento'], cleaned_data['ano_documento'], cleaned_data['tipo_documento'])) + documento = DocumentoAdministrativo.objects.filter( + numero=cleaned_data['numero_documento'], + ano=cleaned_data['ano_documento'], + tipo=cleaned_data['tipo_documento']).order_by('-id').first() + if not documento: + raise ObjectDoesNotExist() + + except ObjectDoesNotExist: + msg = _('{} {}/{} não existe no cadastro de documentos administrativos.' + .format(cleaned_data['tipo_documento'], cleaned_data['numero_documento'], cleaned_data['ano_documento'])) + self.logger.warning( + "O Documento Administrativo não existe no cadastro.") + raise ValidationError(msg) + + if Correspondencia.objects.filter( + sessao_plenaria=self.instance.sessao_plenaria, documento=documento + ).exclude(pk=self.instance.pk).exists(): + self.logger.error( + "Documento Administrativo já se encontra nesta Sessão.") + raise ValidationError( + _('Documento Administrativo já se encontra nesta Sessão.')) + + cleaned_data['documento'] = documento + + return cleaned_data + + def clean_numero_ordem(self): + sessao = self.instance.sessao_plenaria + + numero_ordem_exists = Correspondencia.objects.filter( + sessao_plenaria=sessao, + numero_ordem=self.cleaned_data['numero_ordem']).exists() + + if numero_ordem_exists and not self.instance.pk: + msg = _('Esse número de ordem já existe.') + raise ValidationError(msg) + + return self.cleaned_data['numero_ordem'] + + def save(self, commit=False): + correspondencia = super().save(commit) + correspondencia.documento = self.cleaned_data['documento'] + correspondencia.save() + return correspondencia + + +class CorrespondenciaEmLoteFilterSet(django_filters.FilterSet): + + class Meta(FilterOverridesMetaMixin): + model = DocumentoAdministrativo + fields = ['tipo', 'data'] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.filters['tipo'].label = 'Tipo do documento' + self.filters['data'].label = 'Data (Inicial - Final)' + + self.form.fields['tipo'].required = True + self.form.fields['data'].required = True + + row1 = to_row([('tipo', 12)]) + row2 = to_row([('data', 12)]) + + self.form.helper = SaplFormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Pesquisa de Documentos Administrativos'), + row1, row2, form_actions(label='Pesquisar'))) diff --git a/sapl/sessao/legacy.yaml b/sapl/sessao/legacy.yaml deleted file mode 100644 index 6df4dd90d..000000000 --- a/sapl/sessao/legacy.yaml +++ /dev/null @@ -1,77 +0,0 @@ -TipoSessaoPlenaria: - nome: nom_sessao - quorum_minimo: num_minimo - -SessaoPlenaria: - cod_andamento_sessao: cod_andamento_sessao - data_fim: dat_fim_sessao - data_inicio: dat_inicio_sessao - hora_fim: hr_fim_sessao - hora_inicio: hr_inicio_sessao - legislatura: num_legislatura - numero: num_sessao_plen - sessao_legislativa: cod_sessao_leg - tipo: tip_sessao - url_audio: url_audio - url_video: url_video - -: - data_ordem: dat_ordem - materia: cod_materia - numero_ordem: num_ordem - observacao: txt_observacao - resultado: txt_resultado - sessao_plenaria: cod_sessao_plen - tipo_votacao: tip_votacao - -ExpedienteMateria: - -TipoExpediente: - nome: nom_expediente - -ExpedienteSessao (ExpedienteSessaoPlenaria): - conteudo: txt_expediente - sessao_plenaria: cod_sessao_plen - tipo: cod_expediente - -IntegranteMesa (MesaSessaoPlenaria): - cargo: cod_cargo - parlamentar: cod_parlamentar - sessao_plenaria: cod_sessao_plen - -: - numero_ordem: num_ordem - parlamentar: cod_parlamentar - sessao_plenaria: cod_sessao_plen - url_discurso: url_discurso - -Orador (Oradores): - -OradorExpediente (OradoresExpediente): - -OrdemDia: - -PresencaOrdemDia (OrdemDiaPresenca): - parlamentar: cod_parlamentar - sessao_plenaria: cod_sessao_plen - -TipoResultadoVotacao: - nome: nom_resultado - -RegistroVotacao: - materia: cod_materia - numero_abstencoes: num_abstencao - numero_votos_nao: num_votos_nao - numero_votos_sim: num_votos_sim - observacao: txt_observacao - tipo_resultado_votacao: tip_resultado_votacao - -VotoParlamentar (RegistroVotacaoParlamentar): - parlamentar: cod_parlamentar - votacao: cod_votacao - voto: vot_parlamentar - -SessaoPlenariaPresenca: - data_sessao: dat_sessao - parlamentar: cod_parlamentar - sessao_plenaria: cod_sessao_plen diff --git a/sapl/sessao/migrations/0060_auto_20220321_0934.py b/sapl/sessao/migrations/0060_auto_20220321_0934.py new file mode 100644 index 000000000..034e1ad98 --- /dev/null +++ b/sapl/sessao/migrations/0060_auto_20220321_0934.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2022-03-21 12:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0059_sessaoplenaria_data_ultima_atualizacao'), + ] + + operations = [ + migrations.AlterField( + model_name='tiposessaoplenaria', + name='tipo_numeracao', + field=models.PositiveIntegerField(choices=[(1, 'Quinzenal'), (2, 'Mensal'), (5, 'Semestral'), (10, 'Anual'), (11, 'Sessão Legislativa'), (12, 'Legislatura'), (99, 'Numeração Única')], default=11, verbose_name='Tipo de Numeração'), + ), + ] diff --git a/sapl/sessao/migrations/0063_merge_20220609_0838.py b/sapl/sessao/migrations/0063_merge_20220609_0838.py new file mode 100644 index 000000000..e5d5956aa --- /dev/null +++ b/sapl/sessao/migrations/0063_merge_20220609_0838.py @@ -0,0 +1,14 @@ +# Generated by Django 2.2.28 on 2022-06-09 11:38 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0060_auto_20220321_0934'), + ('sessao', '0062_auto_20220405_1307'), + ] + + operations = [ + ] diff --git a/sapl/sessao/migrations/0064_auto_20220713_2335.py b/sapl/sessao/migrations/0064_auto_20220713_2335.py new file mode 100644 index 000000000..0c0c34866 --- /dev/null +++ b/sapl/sessao/migrations/0064_auto_20220713_2335.py @@ -0,0 +1,25 @@ +# Generated by Django 2.2.28 on 2022-07-14 02:35 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0081_auto_20220321_0934'), + ('sessao', '0063_merge_20220609_0838'), + ] + + operations = [ + migrations.AddField( + model_name='expedientemateria', + name='tramitacao', + field=models.ForeignKey(blank=True, default='', null=True, on_delete=django.db.models.deletion.PROTECT, to='materia.Tramitacao', verbose_name='Situação Atual'), + ), + migrations.AddField( + model_name='ordemdia', + name='tramitacao', + field=models.ForeignKey(blank=True, default='', null=True, on_delete=django.db.models.deletion.PROTECT, to='materia.Tramitacao', verbose_name='Situação Atual'), + ), + ] diff --git a/sapl/sessao/migrations/0065_correspondencia.py b/sapl/sessao/migrations/0065_correspondencia.py new file mode 100644 index 000000000..125a1d70b --- /dev/null +++ b/sapl/sessao/migrations/0065_correspondencia.py @@ -0,0 +1,31 @@ +# Generated by Django 2.2.28 on 2022-08-13 16:50 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('protocoloadm', '0042_auto_20220805_1236'), + ('sessao', '0064_auto_20220713_2335'), + ] + + operations = [ + migrations.CreateModel( + name='Correspondencia', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('observacao', models.TextField(blank=True, verbose_name='Observação')), + ('numero_ordem', models.PositiveIntegerField(verbose_name='Nº Ordem')), + ('tipo', models.PositiveIntegerField(choices=[(1, 'Recebida'), (2, 'Enviada')], default=1, verbose_name='Tipo da Correspondência')), + ('documento', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='protocoloadm.DocumentoAdministrativo', verbose_name='Documento Administrativo')), + ('sessao_plenaria', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria')), + ], + options={ + 'verbose_name': 'Correspondência', + 'verbose_name_plural': 'Correspondências', + 'ordering': ('numero_ordem',), + }, + ), + ] diff --git a/sapl/sessao/migrations/0066_auto_20220813_1431.py b/sapl/sessao/migrations/0066_auto_20220813_1431.py new file mode 100644 index 000000000..9ddde02c6 --- /dev/null +++ b/sapl/sessao/migrations/0066_auto_20220813_1431.py @@ -0,0 +1,25 @@ +# Generated by Django 2.2.28 on 2022-08-13 17:31 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('protocoloadm', '0042_auto_20220805_1236'), + ('sessao', '0065_correspondencia'), + ] + + operations = [ + migrations.AddField( + model_name='sessaoplenaria', + name='correspondencias', + field=models.ManyToManyField(blank=True, related_name='sessoesplenarias', through='sessao.Correspondencia', to='protocoloadm.DocumentoAdministrativo'), + ), + migrations.AlterField( + model_name='correspondencia', + name='sessao_plenaria', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='correspondencia_set', to='sessao.SessaoPlenaria'), + ), + ] diff --git a/sapl/sessao/migrations/0067_auto_20220813_2233.py b/sapl/sessao/migrations/0067_auto_20220813_2233.py new file mode 100644 index 000000000..1ec771b19 --- /dev/null +++ b/sapl/sessao/migrations/0067_auto_20220813_2233.py @@ -0,0 +1,98 @@ +# Generated by Django 2.2.28 on 2022-08-14 01:33 + +from django.db import migrations, models + + +def insere_correspondencia_antes_de_exp(apps, schema_editor): + ResumoOrdenacao = apps.get_model('sessao', 'ResumoOrdenacao') + ordenacao = ResumoOrdenacao.objects.get_or_create()[0] + fields = list(map(lambda x: x.name, ResumoOrdenacao._meta.get_fields())) + fields.reverse() + + for i, f in enumerate(fields): + setattr(ordenacao, f, getattr(ordenacao, fields[i + 1])) + + if i + 2 == len(fields): + return + + if getattr(ordenacao, f) == 'exp': + setattr(ordenacao, fields[i + 1], 'correspondencia') + ordenacao.save() + return + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0066_auto_20220813_1431'), + ] + + operations = [ + migrations.AddField( + model_name='resumoordenacao', + name='decimo_sexto', + field=models.CharField(default='cons_finais', max_length=50), + ), + migrations.AlterField( + model_name='correspondencia', + name='tipo', + field=models.PositiveIntegerField(choices=[(1, 'Recebida'), (2, 'Enviada'), ( + 2, 'Interna')], default=1, verbose_name='Tipo da Correspondência'), + ), + migrations.AlterField( + model_name='resumoordenacao', + name='decimo', + field=models.CharField(default='lista_p_o_d', max_length=50), + ), + migrations.AlterField( + model_name='resumoordenacao', + name='decimo_primeiro', + field=models.CharField(default='mat_o_d', max_length=50), + ), + migrations.AlterField( + model_name='resumoordenacao', + name='decimo_quarto', + field=models.CharField(default='oradores_expli', max_length=50), + ), + migrations.AlterField( + model_name='resumoordenacao', + name='decimo_quinto', + field=models.CharField(default='ocorr_sessao', max_length=50), + ), + migrations.AlterField( + model_name='resumoordenacao', + name='decimo_segundo', + field=models.CharField(default='v_n_mat_o_d', max_length=50), + ), + migrations.AlterField( + model_name='resumoordenacao', + name='decimo_terceiro', + field=models.CharField(default='oradores_o_d', max_length=50), + ), + migrations.AlterField( + model_name='resumoordenacao', + name='nono', + field=models.CharField(default='oradores_exped', max_length=50), + ), + migrations.AlterField( + model_name='resumoordenacao', + name='oitavo', + field=models.CharField(default='v_n_mat_exp', max_length=50), + ), + migrations.AlterField( + model_name='resumoordenacao', + name='quinto', + field=models.CharField(default='correspondencia', max_length=50), + ), + migrations.AlterField( + model_name='resumoordenacao', + name='setimo', + field=models.CharField(default='mat_exp', max_length=50), + ), + migrations.AlterField( + model_name='resumoordenacao', + name='sexto', + field=models.CharField(default='exp', max_length=50), + ), + migrations.RunPython(insere_correspondencia_antes_de_exp) + ] diff --git a/sapl/sessao/migrations/0068_auto_20220816_1237.py b/sapl/sessao/migrations/0068_auto_20220816_1237.py new file mode 100644 index 000000000..d1f2f7670 --- /dev/null +++ b/sapl/sessao/migrations/0068_auto_20220816_1237.py @@ -0,0 +1,29 @@ +# Generated by Django 2.2.24 on 2022-08-16 15:37 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0067_auto_20220813_2233'), + ] + + operations = [ + migrations.AlterField( + model_name='correspondencia', + name='tipo', + field=models.PositiveIntegerField(choices=[(1, 'Recebida'), (2, 'Enviada'), (3, 'Interna')], default=1, verbose_name='Tipo da Correspondência'), + ), + migrations.AlterField( + model_name='expedientemateria', + name='tramitacao', + field=models.ForeignKey(blank=True, default='', null=True, on_delete=django.db.models.deletion.PROTECT, to='materia.Tramitacao', verbose_name='Situação de Pauta'), + ), + migrations.AlterField( + model_name='ordemdia', + name='tramitacao', + field=models.ForeignKey(blank=True, default='', null=True, on_delete=django.db.models.deletion.PROTECT, to='materia.Tramitacao', verbose_name='Situação de Pauta'), + ), + ] diff --git a/sapl/sessao/migrations/0069_auto_20220919_1705.py b/sapl/sessao/migrations/0069_auto_20220919_1705.py new file mode 100644 index 000000000..f37236d3d --- /dev/null +++ b/sapl/sessao/migrations/0069_auto_20220919_1705.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.28 on 2022-09-19 20:05 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0068_auto_20220816_1237'), + ] + + operations = [ + migrations.AlterField( + model_name='correspondencia', + name='sessao_plenaria', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='correspondencia_set', to='sessao.SessaoPlenaria', verbose_name='Sessão Plenária'), + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 39f144c2c..55fe581a1 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -6,19 +6,19 @@ from django.db.models import Q, F from django.utils import timezone, formats from django.utils.translation import ugettext_lazy as _ from model_utils import Choices -import reversion from sapl.base.models import Autor from sapl.materia.models import MateriaLegislativa +from sapl.materia.models import Tramitacao from sapl.parlamentares.models import (CargoMesa, Legislatura, Parlamentar, Partido, SessaoLegislativa) +from sapl.protocoloadm.models import DocumentoAdministrativo from sapl.utils import (YES_NO_CHOICES, SaplGenericRelation, get_settings_auth_user_model, restringe_tipos_de_arquivo_txt, texto_upload_path, OverwriteStorage) -@reversion.register() class CargoBancada(models.Model): nome_cargo = models.CharField(max_length=80, verbose_name=_('Cargo de Bancada')) @@ -36,7 +36,6 @@ class CargoBancada(models.Model): return self.nome_cargo -@reversion.register() class Bancada(models.Model): legislatura = models.ForeignKey(Legislatura, on_delete=models.PROTECT, @@ -74,7 +73,6 @@ class Bancada(models.Model): return self.nome -@reversion.register() class TipoSessaoPlenaria(models.Model): TIPO_NUMERACAO_CHOICES = Choices( @@ -155,7 +153,6 @@ def anexo_upload_path(instance, filename): # return get_sessao_media_path(instance, 'anexo', filename) -@reversion.register() class SessaoPlenaria(models.Model): # TODO trash??? Seems to have been a FK in the past. Would be: # andamento_sessao = models.ForeignKey( @@ -247,6 +244,17 @@ class SessaoPlenaria(models.Model): choices=YES_NO_CHOICES, verbose_name=_('Publicar Pauta?')) + correspondencias = models.ManyToManyField( + DocumentoAdministrativo, + blank=True, + through='Correspondencia', + related_name='sessoesplenarias', + through_fields=( + 'sessao_plenaria', + 'documento' + ) + ) + class Meta: verbose_name = _('Sessão Plenária') verbose_name_plural = _('Sessões Plenárias') @@ -346,7 +354,6 @@ class SessaoPlenaria(models.Model): ).update(data_ordem=self.data_inicio) -@reversion.register() class AbstractOrdemDia(models.Model): TIPO_VOTACAO_CHOICES = Choices( (1, 'simbolica', 'Simbólica'), @@ -360,6 +367,12 @@ class AbstractOrdemDia(models.Model): materia = models.ForeignKey(MateriaLegislativa, on_delete=models.PROTECT, verbose_name=_('Matéria')) + tramitacao = models.ForeignKey(Tramitacao, + on_delete=models.PROTECT, + verbose_name=_('Situação de Pauta'), + blank=True, + default='', + null=True) data_ordem = models.DateField(verbose_name=_('Data da Sessão')) observacao = models.TextField( blank=True, verbose_name=_('Observação')) @@ -394,7 +407,6 @@ class AbstractOrdemDia(models.Model): self.numero_ordem, self.materia, self.sessao_plenaria) -@reversion.register() class ExpedienteMateria(AbstractOrdemDia): class Meta: @@ -403,7 +415,6 @@ class ExpedienteMateria(AbstractOrdemDia): ordering = ['numero_ordem'] -@reversion.register() class TipoExpediente(models.Model): nome = models.CharField(max_length=100, verbose_name=_('Tipo')) ordenacao = models.PositiveIntegerField( @@ -420,7 +431,6 @@ class TipoExpediente(models.Model): return self.nome -@reversion.register() class ExpedienteSessao(models.Model): # ExpedienteSessaoPlenaria sessao_plenaria = models.ForeignKey( SessaoPlenaria, @@ -440,7 +450,6 @@ class ExpedienteSessao(models.Model): # ExpedienteSessaoPlenaria return '%s - %s' % (self.tipo, self.sessao_plenaria) -@reversion.register() class OcorrenciaSessao(models.Model): # OcorrenciaSessaoPlenaria sessao_plenaria = models.OneToOneField(SessaoPlenaria, on_delete=models.PROTECT) @@ -456,7 +465,6 @@ class OcorrenciaSessao(models.Model): # OcorrenciaSessaoPlenaria return '%s - %s' % (self.sessao_plenaria, self.conteudo) -@reversion.register() class ConsideracoesFinais(models.Model): # ConsideracoesFinaisSessaoPlenaria sessao_plenaria = models.OneToOneField(SessaoPlenaria, on_delete=models.PROTECT) @@ -472,7 +480,6 @@ class ConsideracoesFinais(models.Model): # ConsideracoesFinaisSessaoPlenaria return '%s - %s' % (self.sessao_plenaria, self.conteudo) -@reversion.register() class IntegranteMesa(models.Model): # MesaSessaoPlenaria sessao_plenaria = models.ForeignKey(SessaoPlenaria, on_delete=models.CASCADE) @@ -488,7 +495,6 @@ class IntegranteMesa(models.Model): # MesaSessaoPlenaria return '%s - %s' % (self.cargo, self.parlamentar) -@reversion.register() class AbstractOrador(models.Model): # Oradores sessao_plenaria = models.ForeignKey(SessaoPlenaria, on_delete=models.CASCADE) @@ -527,7 +533,6 @@ class AbstractOrador(models.Model): # Oradores return result -@reversion.register() class Orador(AbstractOrador): # Oradores class Meta: @@ -536,7 +541,6 @@ class Orador(AbstractOrador): # Oradores ordering = ('id',) -@reversion.register() class OradorExpediente(AbstractOrador): # OradoresExpediente class Meta: @@ -545,7 +549,6 @@ class OradorExpediente(AbstractOrador): # OradoresExpediente ordering = ('id',) -@reversion.register() class OradorOrdemDia(AbstractOrador): # OradoresOrdemDia class Meta: @@ -554,7 +557,6 @@ class OradorOrdemDia(AbstractOrador): # OradoresOrdemDia ordering = ('id',) -@reversion.register() class OrdemDia(AbstractOrdemDia): class Meta: @@ -563,7 +565,6 @@ class OrdemDia(AbstractOrdemDia): ordering = ['numero_ordem'] -@reversion.register() class PresencaOrdemDia(models.Model): # OrdemDiaPresenca sessao_plenaria = models.ForeignKey(SessaoPlenaria, on_delete=models.CASCADE) @@ -581,7 +582,6 @@ class PresencaOrdemDia(models.Model): # OrdemDiaPresenca 'parlamentar': self.parlamentar} -@reversion.register() class TipoResultadoVotacao(models.Model): NATUREZA_CHOICES = Choices( ('A', 'aprovado', 'Aprovado'), @@ -601,7 +601,6 @@ class TipoResultadoVotacao(models.Model): return self.nome -@reversion.register() class RegistroVotacao(models.Model): tipo_resultado_votacao = models.ForeignKey( TipoResultadoVotacao, @@ -660,7 +659,6 @@ class RegistroVotacao(models.Model): '{}, {}'. format(self.ordem, self.expediente)) -@reversion.register() class VotoParlamentar(models.Model): # RegistroVotacaoParlamentar ''' As colunas ordem e expediente são redundantes, levando em consideração @@ -705,7 +703,6 @@ class VotoParlamentar(models.Model): # RegistroVotacaoParlamentar 'votacao': self.votacao, 'parlamentar': self.parlamentar} -@reversion.register() class SessaoPlenariaPresenca(models.Model): sessao_plenaria = models.ForeignKey(SessaoPlenaria, on_delete=models.CASCADE) @@ -723,6 +720,7 @@ ORDENACAO_RESUMO = [ ('cont_mult', 'Conteúdo Multimídia'), ('mesa_d', 'Mesa Diretora'), ('lista_p', 'Lista de Presença'), + ('correspondencia', 'Correspondências'), ('exp', 'Expedientes'), ('mat_exp', 'Matérias do Expediente'), ('v_n_mat_exp', 'Votações Nominais - Matérias do Expediente'), @@ -737,7 +735,6 @@ ORDENACAO_RESUMO = [ ] -@reversion.register() class ResumoOrdenacao(models.Model): ''' Tabela para registrar em qual ordem serão renderizados os componentes @@ -803,6 +800,10 @@ class ResumoOrdenacao(models.Model): max_length=50, default=ORDENACAO_RESUMO[14][0] ) + decimo_sexto = models.CharField( + max_length=50, + default=ORDENACAO_RESUMO[15][0] + ) class Meta: verbose_name = _('Ordenação do Resumo de uma Sessão') @@ -813,7 +814,6 @@ class ResumoOrdenacao(models.Model): return 'Ordenação do Resumo de uma Sessão' -@reversion.register() class TipoRetiradaPauta(models.Model): descricao = models.CharField(max_length=150, verbose_name=_('Descrição')) @@ -826,7 +826,6 @@ class TipoRetiradaPauta(models.Model): return self.descricao -@reversion.register() class TipoJustificativa(models.Model): descricao = models.CharField(max_length=150, verbose_name=_('Descrição')) @@ -839,7 +838,6 @@ class TipoJustificativa(models.Model): return self.descricao -@reversion.register() class JustificativaAusencia(models.Model): TIPO_AUSENCIA_CHOICES = Choices( (1, 'materia', 'Matéria'), @@ -964,7 +962,6 @@ class RetiradaPauta(models.Model): '{}, {}'. format(self.ordem, self.expediente)) -@reversion.register() class RegistroLeitura(models.Model): materia = models.ForeignKey(MateriaLegislativa, on_delete=models.CASCADE) ordem = models.ForeignKey(OrdemDia, @@ -1011,3 +1008,42 @@ class RegistroLeitura(models.Model): 'RegistroLeitura deve ter exatamente um dos campos ' 'ordem ou expediente preenchido. Ambos estão preenchidos: ' '{}, {}'. format(self.ordem, self.expediente)) + + +class Correspondencia(models.Model): + TIPO_CHOICES = Choices( + (1, 'recebida', 'Recebida'), + (2, 'enviada', 'Enviada'), + (3, 'interna', 'Interna'), + ) + + sessao_plenaria = models.ForeignKey( + SessaoPlenaria, + on_delete=models.CASCADE, + related_name='correspondencia_set', + verbose_name=_('Sessão Plenária')) + documento = models.ForeignKey( + DocumentoAdministrativo, + on_delete=models.PROTECT, + verbose_name=_('Documento Administrativo')) + + observacao = models.TextField( + blank=True, verbose_name=_('Observação')) + + numero_ordem = models.PositiveIntegerField(verbose_name=_('Nº Ordem')) + + tipo = models.PositiveIntegerField( + verbose_name=_('Tipo da Correspondência'), + choices=TIPO_CHOICES, default=1) + + class Meta: + verbose_name = _('Correspondência') + verbose_name_plural = _('Correspondências') + ordering = ('numero_ordem',) + + @property + def assunto(self): + return self.documento.assunto + + def __str__(self): + return _('Correspondência: {}').format(self.documento) diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index af66c2d83..05e19a844 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -31,12 +31,15 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, sessao_legislativa_legislatura_ajax, VotacaoEmBlocoOrdemDia, VotacaoEmBlocoExpediente, VotacaoEmBlocoSimbolicaView, VotacaoEmBlocoNominalView, + LeituraEmBlocoExpediente, LeituraEmBlocoOrdemDia, recuperar_nome_tipo_sessao, ExpedienteLeituraView, OrdemDiaLeituraView, retirar_leitura, TransferenciaMateriasExpediente, TransferenciaMateriasOrdemDia, - filtra_materias_copia_sessao_ajax, verifica_materia_sessao_plenaria_ajax) + filtra_materias_copia_sessao_ajax, verifica_materia_sessao_plenaria_ajax, + recuperar_tramitacao, CorrespondenciaEmLoteView, + CorrespondenciaCrud, recuperar_documento) from .apps import AppConfig @@ -51,7 +54,13 @@ urlpatterns = [ JustificativaAusenciaCrud.get_urls() + MateriaOrdemDiaCrud.get_urls() + OradorOrdemDiaCrud.get_urls() + - RetiradaPautaCrud.get_urls())), + RetiradaPautaCrud.get_urls() + + CorrespondenciaCrud.get_urls() + )), + + + url(r'^sessao/(?P\d+)/correspondencia-em-lote', CorrespondenciaEmLoteView.as_view(), + name='correspondencia_em_lote'), url(r'^sessao/(?P\d+)/mesa$', MesaView.as_view(), name='mesa'), @@ -67,7 +76,9 @@ urlpatterns = [ remove_parlamentar_composicao, name='remove_parlamentar_composicao'), + url(r'^sessao/recuperar-documento/', recuperar_documento), url(r'^sessao/recuperar-materia/', recuperar_materia), + url(r'^sessao/recuperar-tramitacao/', recuperar_tramitacao), url(r'^sessao/recuperar-numero-sessao/', recuperar_numero_sessao_view, name='recuperar_numero_sessao_view' @@ -79,8 +90,8 @@ urlpatterns = [ sessao_legislativa_legislatura_ajax, name='sessao_legislativa_legislatura_ajax_view'), url(r'^sessao/filtra-materias-copia-sessao-ajax/', - filtra_materias_copia_sessao_ajax, - name='filtra_materias_copia_sessao_ajax_view'), + filtra_materias_copia_sessao_ajax, + name='filtra_materias_copia_sessao_ajax_view'), url(r'^sessao/verifica-materia-sessao-plenaria-ajax/', verifica_materia_sessao_plenaria_ajax, name='verifica_materia_sessao_plenaria_ajax_view'), @@ -89,7 +100,8 @@ urlpatterns = [ abrir_votacao, name="abrir_votacao"), - url(r'^sessao/(?P\d+)/reordena/(?P[\w\-]+)/(?P\d+)/$', reordena_materias, name="reordena_materias"), + url(r'^sessao/(?P\d+)/reordena/(?P[\w\-]+)/(?P\d+)/$', + reordena_materias, name="reordena_materias"), url(r'^sistema/sessao-plenaria/tipo/', include(TipoSessaoCrud.get_urls())), @@ -147,6 +159,12 @@ urlpatterns = [ url(r'^sessao/(?P\d+)/votacao_bloco_expediente$', VotacaoEmBlocoExpediente.as_view(), name='votacao_bloco_expediente'), + url(r'^sessao/(?P\d+)/leitura_bloco_expediente$', + LeituraEmBlocoExpediente.as_view(), + name='leitura_bloco_expediente'), + url(r'^sessao/(?P\d+)/leitura_bloco_ordem_dia$', + LeituraEmBlocoOrdemDia.as_view(), + name='leitura_bloco_ordem_dia'), url(r'^sessao/(?P\d+)/resumo$', ResumoView.as_view(), name='resumo'), url(r'^sessao/(?P\d+)/resumo_ata$', diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index e70d5ea37..617961f9e 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -1,8 +1,8 @@ - from collections import OrderedDict from datetime import datetime -from re import sub +import json import logging +from re import sub from django.conf import settings from django.contrib import messages @@ -13,9 +13,11 @@ from django.db.models import Max, Q from django.http import JsonResponse from django.http.response import Http404, HttpResponseRedirect from django.urls import reverse +from django.urls.base import reverse_lazy from django.utils import timezone from django.utils.datastructures import MultiValueDictKeyError from django.utils.decorators import method_decorator +from django.utils.encoding import force_text from django.utils.html import strip_tags from django.utils.translation import ugettext_lazy as _ from django.views.decorators.csrf import csrf_exempt @@ -24,6 +26,7 @@ from django.views.generic.base import RedirectView from django.views.generic.detail import DetailView from django.views.generic.edit import FormMixin from django_filters.views import FilterView +import pytz from sapl.base.models import AppConfig as AppsAppConfig from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, @@ -35,8 +38,13 @@ from sapl.materia.models import (Autoria, TipoMateriaLegislativa, from sapl.materia.views import MateriaLegislativaPesquisaView from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato, Parlamentar, SessaoLegislativa) +from sapl.protocoloadm.models import TipoDocumentoAdministrativo, \ + DocumentoAdministrativo from sapl.sessao.apps import AppConfig -from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm, OrdemExpedienteLeituraForm +from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm, OrdemExpedienteLeituraForm, \ + CorrespondenciaForm, CorrespondenciaEmLoteFilterSet +from sapl.sessao.models import Correspondencia +from sapl.settings import TIME_ZONE from sapl.utils import show_results_filter_set, remover_acentos, get_client_ip from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, @@ -54,7 +62,6 @@ from .models import (Bancada, CargoBancada, CargoMesa, RetiradaPauta, TipoJustificativa, JustificativaAusencia, OradorOrdemDia, ORDENACAO_RESUMO, RegistroLeitura) - TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') TipoJustificativaCrud = CrudAux.build(TipoJustificativa, 'tipo_justificativa') CargoBancadaCrud = CrudAux.build(CargoBancada, '') @@ -133,14 +140,20 @@ def verifica_votacoes_abertas(request, pk): v.__str__())) username = request.user.username logger.info('user=' + username + '. Já existem votações ou leituras abertas nas seguintes Sessões: ' + - ', '.join(msg_abertas) + '. Para abrir ' - 'outra, termine ou feche as votações ou leituras abertas.') + ', '.join(msg_abertas) + '. Estas votações ou leituras foram fechadas.') msg = _('Já existem votações ou leituras abertas nas seguintes Sessões: ' + - ', '.join(msg_abertas) + '. Para abrir ' - 'outra, termine ou feche as votações ou leituras abertas.') + ', '.join(msg_abertas) + '. Estas votações ou leituras foram fechadas.') messages.add_message(request, messages.INFO, msg) - return False + for sessao in votacoes_abertas: + ordens = sessao.ordemdia_set.filter(votacao_aberta=True) + expediente = sessao.expedientemateria_set.filter(votacao_aberta=True) + for o in ordens: + o.votacao_aberta = False + o.save() + for e in expediente: + e.votacao_aberta = False + e.save() return True @@ -153,7 +166,8 @@ def verifica_sessao_iniciada(request, spk, is_leitura=False): username = request.user.username aux_text = 'leitura' if is_leitura else 'votação' logger.info('user=' + username + '. Não é possível abrir matérias para {}. ' - 'Esta SessaoPlenaria (id={}) não foi iniciada ou está finalizada.'.format(aux_text, spk)) + 'Esta SessaoPlenaria (id={}) não foi iniciada ou está finalizada.'.format( + aux_text, spk)) msg = _('Não é possível abrir matérias para {}. ' 'Esta Sessão Plenária não foi iniciada ou está finalizada.' ' Vá em "Abertura"->"Dados Básicos" e altere os valores dos campos necessários.'.format(aux_text)) @@ -227,25 +241,33 @@ def customize_link_materia(context, pk, has_permission, is_expediente): num_protocolo = materia.numero_protocolo if materia.numero_protocolo else "-" sessao_plenaria = SessaoPlenaria.objects.get(id=pk) data_sessao = sessao_plenaria.data_fim if sessao_plenaria.data_fim else sessao_plenaria.data_inicio - tramitacao = Tramitacao.objects\ - .select_related('materia', 'status', 'materia__tipo')\ - .filter(materia=materia, turno__isnull=False, data_tramitacao__lte=data_sessao)\ - .exclude(turno__exact='')\ - .order_by('-data_tramitacao', '-id')\ - .first() + tramitacao = Tramitacao.objects \ + .select_related('materia', 'status', 'materia__tipo') \ + .filter(materia=materia, turno__isnull=False, data_tramitacao__lte=data_sessao) \ + .exclude(turno__exact='') \ + .order_by('-data_tramitacao', '-id') \ + .first() turno = '-' if tramitacao: for t in Tramitacao.TURNO_CHOICES: if t[0] == tramitacao.turno: turno = t[1] break - materia_em_tramitacao = MateriaEmTramitacao.objects\ - .select_related("materia", "tramitacao")\ - .filter(materia=materia)\ - .first() + materia_em_tramitacao = MateriaEmTramitacao.objects \ + .select_related("materia", "tramitacao") \ + .filter(materia=materia) \ + .first() # idUnica para cada materia idAutor = "autor" + str(i) idAutores = "autores" + str(i) + link_texto_original = '' + if materia.texto_original: + link_texto_original = f""" + + + Texto original + + """ title_materia = f"""
{row[1][0]}
Processo: {numeracao}
@@ -253,6 +275,7 @@ def customize_link_materia(context, pk, has_permission, is_expediente): Protocolo: {num_protocolo}
Turno: {turno}
+ {link_texto_original}
""" # Na linha abaixo, o segundo argumento é None para não colocar @@ -266,8 +289,8 @@ def customize_link_materia(context, pk, has_permission, is_expediente): exist_leitura = obj.registroleitura_set.filter( materia=obj.materia).exists() - if (obj.tipo_votacao != 4 and not exist_resultado and not exist_retirada) or\ - (obj.tipo_votacao == 4 and not exist_leitura): + if (obj.tipo_votacao != LEITURA and not exist_resultado and not exist_retirada) or \ + (obj.tipo_votacao == LEITURA and not exist_leitura): if obj.votacao_aberta: url = '' if is_expediente: @@ -478,11 +501,11 @@ def customize_link_materia(context, pk, has_permission, is_expediente): 'mid': obj.materia_id}) resultado = ( - '%s

%s
' % ( - url, - context.get('page', 1), - resultado_descricao, - resultado_observacao)) + '%s

%s
' % ( + url, + context.get('page', 1), + resultado_descricao, + resultado_observacao)) else: if obj.tipo_votacao == NOMINAL: @@ -493,7 +516,7 @@ def customize_link_materia(context, pk, has_permission, is_expediente): 'pk': obj.sessao_plenaria_id, 'oid': obj.pk, 'mid': obj.materia_id}) + \ - '?&materia=expediente' + '?&materia=expediente' else: url = reverse( 'sapl.sessao:votacao_nominal_transparencia', @@ -501,7 +524,7 @@ def customize_link_materia(context, pk, has_permission, is_expediente): 'pk': obj.sessao_plenaria_id, 'oid': obj.pk, 'mid': obj.materia_id}) + \ - '?&materia=ordem' + '?&materia=ordem' resultado = ('%s
%s
' % (url, @@ -516,7 +539,7 @@ def customize_link_materia(context, pk, has_permission, is_expediente): 'pk': obj.sessao_plenaria_id, 'oid': obj.pk, 'mid': obj.materia_id}) + \ - '?&materia=expediente' + '?&materia=expediente' else: url = reverse( 'sapl.sessao:votacao_simbolica_transparencia', @@ -524,7 +547,7 @@ def customize_link_materia(context, pk, has_permission, is_expediente): 'pk': obj.sessao_plenaria_id, 'oid': obj.pk, 'mid': obj.materia_id}) + \ - '?&materia=ordem' + '?&materia=ordem' resultado = ('%s
%s
' % (url, @@ -679,8 +702,8 @@ class TransferenciaMateriasSessaoAbstract(PermissionRequiredMixin, ListView): exp = ExpedienteMateria.objects.filter(sessao_plenaria=sessao) numero_ordem = exp.last().numero_ordem if exp.exists() else 0 for num_ordem, expediente in enumerate( - ExpedienteMateria.objects.filter(id__in=marcadas), - numero_ordem + 1 + ExpedienteMateria.objects.filter(id__in=marcadas), + numero_ordem + 1 ): lista_expediente.append( ExpedienteMateria( @@ -700,7 +723,7 @@ class TransferenciaMateriasSessaoAbstract(PermissionRequiredMixin, ListView): o = OrdemDia.objects.filter(sessao_plenaria=sessao) numero_ordem = o.last().numero_ordem if o.exists() else 0 for num_ordem, ordemdia in enumerate( - OrdemDia.objects.filter(id__in=marcadas), numero_ordem + 1 + OrdemDia.objects.filter(id__in=marcadas), numero_ordem + 1 ): lista_ordemdia.append( OrdemDia( @@ -770,7 +793,7 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): class BaseMixin(MasterDetailCrud.BaseMixin): list_field_names = ['numero_ordem', 'materia', - ('materia__ementa', '', 'observacao'), + ('materia__ementa', '', 'tramitacao', 'observacao'), 'resultado'] class CreateView(MasterDetailCrud.CreateView): @@ -786,9 +809,9 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): pk=self.kwargs['pk']).data_inicio.strftime('%d/%m/%Y') max_numero_ordem = OrdemDia.objects.filter( sessao_plenaria=self.kwargs['pk']).aggregate( - Max('numero_ordem'))['numero_ordem__max'] + Max('numero_ordem'))['numero_ordem__max'] self.initial['numero_ordem'] = ( - max_numero_ordem if max_numero_ordem else 0) + 1 + max_numero_ordem if max_numero_ordem else 0) + 1 return self.initial def get_success_url(self): @@ -806,6 +829,7 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): context["tipo_materia_salvo"] = self.object.materia.tipo.id context["numero_materia_salvo"] = self.object.materia.numero context["ano_materia_salvo"] = self.object.materia.ano + context["tramitacao_salvo"] = None if not self.object.tramitacao else self.object.tramitacao.id return context @@ -816,6 +840,7 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): initial['numero_materia'] = self.object.materia.numero initial['ano_materia'] = self.object.materia.ano initial['numero_ordem'] = self.object.numero_ordem + initial['tramitacao'] = None if not self.object.tramitacao else self.object.tramitacao.id return initial @@ -856,6 +881,33 @@ def recuperar_materia(request): return response +def recuperar_tramitacao(request): + tipo = request.GET['tipo_materia'] + numero = request.GET['numero_materia'] + ano = request.GET['ano_materia'] + + try: + materia = MateriaLegislativa.objects.get(tipo_id=tipo, + ano=ano, + numero=numero) + tramitacao = {} + for obj in materia.tramitacao_set.all(): + tramitacao[obj.id] = { + 'status': obj.status.descricao, + 'texto': obj.texto, + 'data_tramitacao': obj.data_tramitacao.strftime('%d/%m/%Y'), + 'unidade_tramitacao_local': str(obj.unidade_tramitacao_local), + 'unidade_tramitacao_destino': str(obj.unidade_tramitacao_destino) + + } + + response = JsonResponse(tramitacao) + except ObjectDoesNotExist: + response = JsonResponse({'id': 0}) + + return response + + class ExpedienteMateriaCrud(MasterDetailCrud): model = ExpedienteMateria parent_field = 'sessao_plenaria' @@ -900,9 +952,9 @@ class ExpedienteMateriaCrud(MasterDetailCrud): pk=self.kwargs['pk']).data_inicio.strftime('%d/%m/%Y') max_numero_ordem = ExpedienteMateria.objects.filter( sessao_plenaria=self.kwargs['pk']).aggregate( - Max('numero_ordem'))['numero_ordem__max'] + Max('numero_ordem'))['numero_ordem__max'] initial['numero_ordem'] = ( - max_numero_ordem if max_numero_ordem else 0) + 1 + max_numero_ordem if max_numero_ordem else 0) + 1 return initial def get_success_url(self): @@ -920,6 +972,7 @@ class ExpedienteMateriaCrud(MasterDetailCrud): context["tipo_materia_salvo"] = self.object.materia.tipo.id context["numero_materia_salvo"] = self.object.materia.numero context["ano_materia_salvo"] = self.object.materia.ano + context["tramitacao_salvo"] = self.object.tramitacao.id if self.object.tramitacao is not None else '' return context @@ -930,6 +983,7 @@ class ExpedienteMateriaCrud(MasterDetailCrud): initial['numero_materia'] = self.object.materia.numero initial['ano_materia'] = self.object.materia.ano initial['numero_ordem'] = self.object.numero_ordem + initial['tramitacao'] = self.object.tramitacao.id if self.object.tramitacao is not None else '' return initial @@ -1287,7 +1341,7 @@ class SessaoCrud(Crud): username = self.request.user.username self.logger.error('user=' + username + '. Cadastre alguma legislatura antes de adicionar ' - 'uma sessão plenária!') + 'uma sessão plenária!') messages.add_message(self.request, messages.ERROR, msg) return {} @@ -1380,7 +1434,7 @@ class PresencaView(FormMixin, PresencaMixin, DetailView): # Id dos parlamentares presentes marcados = request.POST.getlist('presenca_ativos') \ - + request.POST.getlist('presenca_inativos') + + request.POST.getlist('presenca_inativos') # Deletar os que foram desmarcados deletar = set(presentes_banco) - set(marcados) @@ -1436,7 +1490,7 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView): username = self.request.user.username self.logger.error('user=' + username + '. Você precisa primeiro configurar os cronômetros' - ' nas Configurações da Aplicação') + ' nas Configurações da Aplicação') msg = _( 'Você precisa primeiro configurar os cronômetros \ nas Configurações da Aplicação') @@ -1495,7 +1549,7 @@ class PresencaOrdemDiaView(FormMixin, PresencaMixin, DetailView): # Id dos parlamentares presentes marcados = request.POST.getlist('presenca_ativos') \ - + request.POST.getlist('presenca_inativos') + + request.POST.getlist('presenca_inativos') # Deletar os que foram desmarcados deletar = set(presentes_banco) - set(marcados) @@ -1757,7 +1811,7 @@ def insere_parlamentar_composicao(request): username = request.user.username if request.user.has_perm( '%s.add_%s' % ( - AppConfig.label, IntegranteMesa._meta.model_name)): + AppConfig.label, IntegranteMesa._meta.model_name)): composicao = IntegranteMesa() @@ -1790,8 +1844,9 @@ def insere_parlamentar_composicao(request): cargo_id=composicao.cargo.id).exists() if parlamentar_ja_inserido: - logger.debug("user=" + username + ". Parlamentar (id={}) já inserido na sessao_plenaria(id={}) e cargo(ìd={})." - .format(request.POST['parlamentar'], composicao.sessao_plenaria.id, composicao.cargo.id)) + logger.debug( + "user=" + username + ". Parlamentar (id={}) já inserido na sessao_plenaria(id={}) e cargo(ìd={})." + .format(request.POST['parlamentar'], composicao.sessao_plenaria.id, composicao.cargo.id)) return JsonResponse({'msg': ('Parlamentar já inserido!', 0)}) composicao.save() @@ -1818,8 +1873,8 @@ def remove_parlamentar_composicao(request): logger = logging.getLogger(__name__) username = request.user.username if request.POST and request.user.has_perm( - '%s.delete_%s' % ( - AppConfig.label, IntegranteMesa._meta.model_name)): + '%s.delete_%s' % ( + AppConfig.label, IntegranteMesa._meta.model_name)): if 'composicao_mesa' in request.POST: try: @@ -1875,7 +1930,8 @@ class ResumoOrdenacaoView(PermissionRequiredMixin, FormView): 'decimo_segundo': self.get_tupla(ordenacao.decimo_segundo), 'decimo_terceiro': self.get_tupla(ordenacao.decimo_terceiro), 'decimo_quarto': self.get_tupla(ordenacao.decimo_quarto), - 'decimo_quinto': self.get_tupla(ordenacao.decimo_quinto) + 'decimo_quinto': self.get_tupla(ordenacao.decimo_quinto), + 'decimo_sexto': self.get_tupla(ordenacao.decimo_sexto) } return initial @@ -1942,7 +1998,6 @@ def get_mesa_diretora(sessao_plenaria): def get_presenca_sessao(sessao_plenaria): - parlamentares_sessao = [p.parlamentar for p in SessaoPlenariaPresenca.objects.filter( sessao_plenaria_id=sessao_plenaria.id ).order_by('parlamentar__nome_parlamentar').distinct()] @@ -1955,6 +2010,37 @@ def get_presenca_sessao(sessao_plenaria): 'justificativa_ausencia': ausentes_sessao}) +def get_correspondencias(sessao_plenaria, user): + qs = sessao_plenaria.correspondencia_set.all() + + is_anon = user.is_anonymous + is_ostensivo = AppsAppConfig.attr( + 'documentos_administrativos') == 'O' + + if is_anon and not is_ostensivo: + qs = qs.none() + + if is_anon: + qs = qs.filter(documento__restrito=False) + + results = [] + for c in qs: + d = c.documento + results.append( + { + 'id': d.id, + 'tipo': c.get_tipo_display(), + 'epigrafe': str(d), + 'data': d.data.strftime('%d/%m/%Y'), + 'interessado': d.interessado, + 'assunto': d.assunto, + 'restrito': d.restrito, + 'is_ostensivo': is_ostensivo + } + ) + return {'correspondencias': results} + + def get_expedientes(sessao_plenaria): expediente = ExpedienteSessao.objects.filter( sessao_plenaria_id=sessao_plenaria.id).order_by('tipo__ordenacao', 'tipo__nome') @@ -1972,7 +2058,8 @@ def get_materias_expediente(sessao_plenaria): for m in ExpedienteMateria.objects.select_related("materia").filter(sessao_plenaria_id=sessao_plenaria.id): tramitacao = '' data_sessao = sessao_plenaria.data_fim if sessao_plenaria.data_fim else sessao_plenaria.data_inicio - for aux_tramitacao in Tramitacao.objects.filter(materia=m.materia, data_tramitacao__lte=data_sessao).order_by('-data_tramitacao', '-id'): + for aux_tramitacao in Tramitacao.objects.filter(materia=m.materia, data_tramitacao__lte=data_sessao).order_by( + '-data_tramitacao', '-id'): if aux_tramitacao.turno: tramitacao = aux_tramitacao break @@ -2097,15 +2184,17 @@ def get_assinaturas(sessao_plenaria): return context + def get_assinaturas_presidente(sessao_plenaria): mesa_dia = get_mesa_diretora(sessao_plenaria)['mesa'] - presidente_dia = [m['parlamentar'] for m in mesa_dia if m['cargo'].descricao == 'Presidente'] - presidente_dia = presidente_dia[0] if presidente_dia else '' + presidente_dia = [m['parlamentar'] + for m in mesa_dia if m['cargo'].descricao == 'Presidente'] + presidente_dia = presidente_dia[0] if presidente_dia else '' context = {} assinatura_presidente = [ - {'parlamentar': presidente_dia, 'cargo': "Presidente"}] + {'parlamentar': presidente_dia, 'cargo': "Presidente"}] context.update({'assinatura_mesa': assinatura_presidente}) return context @@ -2116,7 +2205,8 @@ def get_materias_ordem_do_dia(sessao_plenaria): for o in OrdemDia.objects.filter(sessao_plenaria_id=sessao_plenaria.id): tramitacao = '' data_sessao = sessao_plenaria.data_fim if sessao_plenaria.data_fim else sessao_plenaria.data_inicio - for aux_tramitacao in Tramitacao.objects.filter(materia=o.materia, data_tramitacao__lte=data_sessao).order_by('-data_tramitacao', '-id'): + for aux_tramitacao in Tramitacao.objects.filter(materia=o.materia, data_tramitacao__lte=data_sessao).order_by( + '-data_tramitacao', '-id'): if aux_tramitacao.turno: tramitacao = aux_tramitacao break @@ -2257,8 +2347,8 @@ class ResumoView(DetailView): # Votos de Votação Nominal de Matérias Expediente votacoes = [] - for mevn in ExpedienteMateria.objects.filter(sessao_plenaria_id=self.object.id, tipo_votacao=2)\ - .order_by('-materia'): + for mevn in ExpedienteMateria.objects.filter(sessao_plenaria_id=self.object.id, tipo_votacao=2) \ + .order_by('-materia'): votos_materia = [] titulo_materia = mevn.materia registro = RegistroVotacao.objects.filter(expediente=mevn) @@ -2286,6 +2376,9 @@ class ResumoView(DetailView): # Presença Sessão context.update(get_presenca_sessao(self.object)) # ===================================================================== + # Correspondências + context.update(get_correspondencias(self.object, self.request.user)) + # ===================================================================== # Expedientes context.update(get_expedientes(self.object)) # ===================================================================== @@ -2336,9 +2429,10 @@ class ResumoView(DetailView): # Indica a ordem com a qual o template será renderizado dict_ord_template = { 'cont_mult': 'conteudo_multimidia.html', + 'correspondencia': 'correspondencias.html', 'exp': 'expedientes.html', 'id_basica': 'identificacao_basica.html', - 'lista_p': 'lista_presenca.html', + 'lista_p': 'lista_presenca_sessao.html', 'lista_p_o_d': 'lista_presenca_ordem_dia.html', 'mat_exp': 'materias_expediente.html', 'v_n_mat_exp': 'votos_nominais_materias_expediente.html', @@ -2369,27 +2463,29 @@ class ResumoView(DetailView): 'decimo_segundo_ordenacao': dict_ord_template[ordenacao.decimo_segundo], 'decimo_terceiro_ordenacao': dict_ord_template[ordenacao.decimo_terceiro], 'decimo_quarto_ordenacao': dict_ord_template[ordenacao.decimo_quarto], - 'decimo_quinto_ordenacao': dict_ord_template[ordenacao.decimo_quinto] + 'decimo_quinto_ordenacao': dict_ord_template[ordenacao.decimo_quinto], + 'decimo_sexto_ordenacao': dict_ord_template[ordenacao.decimo_sexto] }) except KeyError as e: self.logger.error("KeyError: " + str(e) + ". Erro ao tentar utilizar " - "configuração de ordenação. Utilizando ordenação padrão.") + "configuração de ordenação. Utilizando ordenação padrão.") context.update({ 'primeiro_ordenacao': 'identificacao_basica.html', 'segundo_ordenacao': 'conteudo_multimidia.html', 'terceiro_ordenacao': 'mesa_diretora.html', - 'quarto_ordenacao': 'lista_presenca.html', - 'quinto_ordenacao': 'expedientes.html', - 'sexto_ordenacao': 'materias_expediente.html', - 'setimo_ordenacao': 'votos_nominais_materias_expediente.html', - 'oitavo_ordenacao': 'oradores_expediente.html', - 'nono_ordenacao': 'lista_presenca_ordem_dia.html', - 'decimo_ordenacao': 'materias_ordem_dia.html', - 'decimo_primeiro_ordenacao': 'votos_nominais_materias_ordem_dia.html', - 'decimo_segundo_ordenacao': 'oradores_ordemdia.html', - 'decimo_terceiro_ordenacao': 'oradores_explicacoes.html', - 'decimo_quarto_ordenacao': 'ocorrencias_da_sessao.html', - 'decimo_quinto_ordenacao': 'consideracoes_finais.html' + 'quarto_ordenacao': 'lista_presenca_sessao.html', + 'quinto_ordenacao': 'correspondencias.html', + 'sexto_ordenacao': 'expedientes.html', + 'setimo_ordenacao': 'materias_expediente.html', + 'oitavo_ordenacao': 'votos_nominais_materias_expediente.html', + 'nono_ordenacao': 'oradores_expediente.html', + 'decimo_ordenacao': 'lista_presenca_ordem_dia.html', + 'decimo_primeiro_ordenacao': 'materias_ordem_dia.html', + 'decimo_segundo_ordenacao': 'votos_nominais_materias_ordem_dia.html', + 'decimo_terceiro_ordenacao': 'oradores_ordemdia.html', + 'decimo_quarto_ordenacao': 'oradores_explicacoes.html', + 'decimo_quinto_ordenacao': 'ocorrencias_da_sessao.html', + 'decimo_sexto_ordenacao': 'consideracoes_finais.html' }) sessao = context['object'] @@ -2445,7 +2541,6 @@ class ExpedienteView(FormMixin, DetailView): list_conteudo = request.POST.getlist('conteudo') for tipo, conteudo in zip(list_tipo, list_conteudo): - ExpedienteSessao.objects.filter( sessao_plenaria_id=self.object.id, tipo_id=tipo).delete() @@ -2458,8 +2553,9 @@ class ExpedienteView(FormMixin, DetailView): msg = _('Registro salvo com sucesso') messages.add_message(self.request, messages.SUCCESS, msg) - self.logger.info('user=' + username + '. ExpedienteSessao(sessao_plenaria_id={} e tipo_id={}) salvo com sucesso.' - .format(self.object.id, tipo)) + self.logger.info( + 'user=' + username + '. ExpedienteSessao(sessao_plenaria_id={} e tipo_id={}) salvo com sucesso.' + .format(self.object.id, tipo)) return self.form_valid(form) else: @@ -2544,7 +2640,8 @@ class OcorrenciaSessaoView(FormMixin, DetailView): username = self.request.user.username self.logger.info( - 'user=' + username + '. OcorrenciaSessao de sessao_plenaria_id={} atualizada com sucesso.'.format(self.object.id)) + 'user=' + username + '. OcorrenciaSessao de sessao_plenaria_id={} atualizada com sucesso.'.format( + self.object.id)) @method_decorator(permission_required('sessao.add_ocorrenciasessao')) def post(self, request, *args, **kwargs): @@ -2612,7 +2709,8 @@ class ConsideracoesFinaisView(FormMixin, DetailView): username = self.request.user.username self.logger.info( - 'user=' + username + '. consideracoesFinais de sessao_plenaria_id={} atualizada com sucesso.'.format(self.object.id)) + 'user=' + username + '. consideracoesFinais de sessao_plenaria_id={} atualizada com sucesso.'.format( + self.object.id)) @method_decorator(permission_required('sessao.add_consideracoesfinais')) def post(self, request, *args, **kwargs): @@ -2636,7 +2734,6 @@ class ConsideracoesFinaisView(FormMixin, DetailView): class VotacaoEditView(SessaoPermissionMixin): - ''' Votação Simbólica e Secreta ''' @@ -2651,7 +2748,7 @@ class VotacaoEditView(SessaoPermissionMixin): materia_id = kwargs['mid'] ordem_id = kwargs['oid'] - if(int(request.POST['anular_votacao']) == 1): + if (int(request.POST['anular_votacao']) == 1): RegistroVotacao.objects.filter(ordem_id=ordem_id).delete() ordem = OrdemDia.objects.get(id=ordem_id) @@ -2687,7 +2784,7 @@ class VotacaoEditView(SessaoPermissionMixin): ' ', ' ', strip_tags(votacao.observacao)), 'resultado': votacao.tipo_resultado_votacao.nome, 'tipo_resultado': - votacao.tipo_resultado_votacao_id} + votacao.tipo_resultado_votacao_id} context.update({'votacao_titulo': titulo, 'votacao': votacao_existente, 'tipos': self.get_tipos_votacao()}) @@ -2709,7 +2806,6 @@ class VotacaoEditView(SessaoPermissionMixin): class VotacaoView(SessaoPermissionMixin): - """ Votação Simbólica e Secreta """ @@ -2830,7 +2926,8 @@ class VotacaoView(SessaoPermissionMixin): except Exception as e: username = request.user.username self.logger.error('user=' + username + '. Problemas ao salvar RegistroVotacao da materia de id={} ' - 'e da ordem de id={}. '.format(materia_id, ordem_id) + str(e)) + 'e da ordem de id={}. '.format(materia_id, ordem_id) + str( + e)) return self.form_invalid(form) else: ordem = OrdemDia.objects.get(id=ordem_id) @@ -3043,7 +3140,7 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): # Caso todas as opções sejam 'Não votou', fecha a votação if nao_votou == len(request.POST.getlist('voto_parlamentar')): self.logger.error('user=' + username + '. Não é possível finalizar a votação sem ' - 'nenhum voto') + 'nenhum voto') form.add_error(None, 'Não é possível finalizar a votação sem ' 'nenhum voto') return self.form_invalid(form) @@ -3201,7 +3298,8 @@ class VotacaoNominalEditAbstract(SessaoPermissionMixin): if not ordem or not votacao: self.logger.error( - 'user=' + username + '. Objeto OrdemDia com id={} ou RegistroVotacao de OrdemDia não existe.'.format(ordem_id)) + 'user=' + username + '. Objeto OrdemDia com id={} ou RegistroVotacao de OrdemDia não existe.'.format( + ordem_id)) raise Http404() materia = ordem.materia @@ -3289,7 +3387,7 @@ class VotacaoNominalEditAbstract(SessaoPermissionMixin): 'user=' + username + '. Objeto ExpedienteMateria com id={} não existe.'.format(expediente_id)) raise Http404() - if(int(request.POST['anular_votacao']) == 1): + if (int(request.POST['anular_votacao']) == 1): fechar_votacao_materia(materia_votacao) return self.form_valid(form) @@ -3365,7 +3463,7 @@ class VotacaoNominalTransparenciaDetailView(TemplateView): ' ', ' ', strip_tags(votacao.observacao)), 'resultado': votacao.tipo_resultado_votacao.nome, 'tipo_resultado': - votacao.tipo_resultado_votacao_id} + votacao.tipo_resultado_votacao_id} context.update({'resultado_votacao': votacao_existente, 'tipos': self.get_tipos_votacao()}) @@ -3405,7 +3503,7 @@ class VotacaoNominalExpedienteDetailView(DetailView): ' ', ' ', strip_tags(votacao.observacao)), 'resultado': votacao.tipo_resultado_votacao.nome, 'tipo_resultado': - votacao.tipo_resultado_votacao_id} + votacao.tipo_resultado_votacao_id} context.update({'votacao': votacao_existente, 'tipos': self.get_tipos_votacao()}) @@ -3453,7 +3551,7 @@ class VotacaoSimbolicaTransparenciaDetailView(TemplateView): ' ', ' ', strip_tags(votacao.observacao)), 'resultado': votacao.tipo_resultado_votacao.nome, 'tipo_resultado': - votacao.tipo_resultado_votacao_id} + votacao.tipo_resultado_votacao_id} context.update({'resultado_votacao': votacao_existente, 'tipos': self.get_tipos_votacao()}) @@ -3465,7 +3563,6 @@ class VotacaoSimbolicaTransparenciaDetailView(TemplateView): class VotacaoExpedienteView(SessaoPermissionMixin): - """ Votação Simbólica e Secreta """ @@ -3618,7 +3715,6 @@ class VotacaoExpedienteView(SessaoPermissionMixin): class VotacaoExpedienteEditView(SessaoPermissionMixin): - """ Votação Simbólica e Secreta """ @@ -3670,7 +3766,7 @@ class VotacaoExpedienteEditView(SessaoPermissionMixin): ' ', ' ', strip_tags(votacao.observacao)), 'resultado': votacao.tipo_resultado_votacao.nome, 'tipo_resultado': - votacao.tipo_resultado_votacao_id} + votacao.tipo_resultado_votacao_id} context.update({'votacao_titulo': titulo, 'votacao': votacao_existente}) @@ -3719,7 +3815,8 @@ class PautaSessaoView(TemplateView): template_name = "sessao/pauta_inexistente.html" def get(self, request, *args, **kwargs): - sessao = SessaoPlenaria.objects.filter(publicar_pauta = True).order_by("-data_inicio").first() + sessao = SessaoPlenaria.objects.filter( + publicar_pauta=True).order_by("-data_inicio").first() if not sessao: return self.render_to_response({}) @@ -3771,9 +3868,12 @@ class PautaSessaoDetailView(DetailView): sessao_plenaria = SessaoPlenaria.objects.get(id=self.object.id) data_sessao = sessao_plenaria.data_inicio.strftime("%Y-%m-%d ") - data_hora_sessao = datetime.strptime(data_sessao + sessao_plenaria.hora_inicio, "%Y-%m-%d %H:%M") - ultima_tramitacao = m.materia.tramitacao_set.filter(timestamp__lt = data_hora_sessao).order_by( - '-data_tramitacao', '-id').first() + data_hora_sessao = datetime.strptime( + data_sessao + sessao_plenaria.hora_inicio, "%Y-%m-%d %H:%M") + data_hora_sessao_utc = pytz.timezone(TIME_ZONE).localize( + data_hora_sessao).astimezone(pytz.utc) + ultima_tramitacao = m.materia.tramitacao_set.filter(timestamp__lt=data_hora_sessao_utc).order_by( + '-data_tramitacao', '-id').first() if m.tramitacao is None else m.tramitacao numeracao = m.materia.numeracao_set.first() materias_expediente.append({ @@ -3789,11 +3889,37 @@ class PautaSessaoDetailView(DetailView): 'autor': [str(x.autor) for x in m.materia.autoria_set.select_related('autor').all()] }) context.update({'materia_expediente': materias_expediente}) + + # ===================================================================== + # Correspondencias + correspondencias = [] + qs = self.object.correspondencia_set.all() + is_anon = request.user.is_anonymous + is_ostensivo = AppsAppConfig.attr('documentos_administrativos') == 'O' + if is_anon and not is_ostensivo: + qs = qs.none() + elif is_anon: + qs = qs.filter(documento__restrito=False) + for c in qs: + d = c.documento + correspondencias.append( + { + 'id': d.id, + 'tipo': c.get_tipo_display(), + 'epigrafe': str(d), + 'data': d.data.strftime('%d/%m/%Y'), + 'interessado': d.interessado, + 'assunto': d.assunto, + 'restrito': d.restrito, + 'is_ostensivo': is_ostensivo + } + ) + context.update({'correspondencias': correspondencias}) # ===================================================================== # Expedientes expedientes = [] - for e in ExpedienteSessao.objects.select_related("tipo").filter(sessao_plenaria_id=self.object.id)\ - .order_by('tipo__ordenacao'): + for e in ExpedienteSessao.objects.select_related("tipo").filter(sessao_plenaria_id=self.object.id) \ + .order_by('tipo__ordenacao'): conteudo = e.conteudo from sapl.relatorios.views import is_empty if not is_empty(conteudo): @@ -3825,9 +3951,12 @@ class PautaSessaoDetailView(DetailView): sessao_plenaria = SessaoPlenaria.objects.get(id=self.object.id) data_sessao = sessao_plenaria.data_inicio.strftime("%Y-%m-%d ") - data_hora_sessao = datetime.strptime(data_sessao + sessao_plenaria.hora_inicio, "%Y-%m-%d %H:%M") - ultima_tramitacao = o.materia.tramitacao_set.filter(timestamp__lt = data_hora_sessao).order_by( - '-data_tramitacao', '-id').first() + data_hora_sessao = datetime.strptime( + data_sessao + sessao_plenaria.hora_inicio, "%Y-%m-%d %H:%M") + data_hora_sessao_utc = pytz.timezone(TIME_ZONE).localize( + data_hora_sessao).astimezone(pytz.utc) + ultima_tramitacao = o.materia.tramitacao_set.filter(timestamp__lt=data_hora_sessao_utc).order_by( + '-data_tramitacao', '-id').first() if o.tramitacao is None else o.tramitacao numeracao = o.materia.numeracao_set.first() materias_ordem.append({ @@ -3933,7 +4062,7 @@ class PesquisarPautaSessaoView(PesquisarSessaoPlenariaView): def get_filterset_kwargs(self, filterset_class): kwargs = super().get_filterset_kwargs(filterset_class) qs = kwargs.get('queryset') - qs = qs.filter(publicar_pauta = True) + qs = qs.filter(publicar_pauta=True) kwargs['queryset'] = qs return kwargs @@ -3962,17 +4091,18 @@ def verifica_materia_sessao_plenaria_ajax(request): sessao_plenaria=pk_sessao_plenaria, materia=id_materia_selecionada ).exists() is_materia_presente_any_sessao = ExpedienteMateria.objects.filter( - materia=id_materia_selecionada + materia=id_materia_selecionada ).exists() elif tipo_materia_sessao == MATERIAS_ORDEMDIA: is_materia_presente = OrdemDia.objects.filter( sessao_plenaria=pk_sessao_plenaria, materia=id_materia_selecionada ).exists() is_materia_presente_any_sessao = OrdemDia.objects.filter( - materia=id_materia_selecionada + materia=id_materia_selecionada ).exists() - return JsonResponse({'is_materia_presente': is_materia_presente, 'is_materia_presente_any_sessao': is_materia_presente_any_sessao}) + return JsonResponse( + {'is_materia_presente': is_materia_presente, 'is_materia_presente_any_sessao': is_materia_presente_any_sessao}) class AdicionarVariasMateriasExpediente(PermissionRequiredForAppCrudMixin, @@ -4119,7 +4249,7 @@ class AdicionarVariasMateriasOrdemDia(AdicionarVariasMateriasExpediente): MateriaLegislativa.objects.get(id=m)) messages.add_message(request, messages.ERROR, msg) self.logger.error('user=' + username + '. Formulário Inválido. Você esqueceu de selecionar ' - 'o tipo de votação de MateriaLegislativa com id={}'.format(m)) + 'o tipo de votação de MateriaLegislativa com id={}'.format(m)) return self.get(request, self.kwargs) @@ -4218,7 +4348,6 @@ class JustificativaAusenciaCrud(MasterDetailCrud): @property def layout_display(self): - layout = super().layout_display if self.object.ausencia == 2: @@ -4237,7 +4366,6 @@ class JustificativaAusenciaCrud(MasterDetailCrud): layout_key = None def get_context_data_old(self, **kwargs): - context = super().get_context_data(**kwargs) presencas = SessaoPlenariaPresenca.objects.filter( @@ -4273,7 +4401,6 @@ class JustificativaAusenciaCrud(MasterDetailCrud): kwargs={'pk': self.kwargs['pk']}) class UpdateView(MasterDetailCrud.UpdateView): - form_class = JustificativaAusenciaForm layout_key = None @@ -4286,6 +4413,97 @@ class JustificativaAusenciaCrud(MasterDetailCrud): pass +class LeituraEmBloco(PermissionRequiredForAppCrudMixin, ListView): + template_name = 'sessao/leitura/leitura_bloco.html' + app_label = AppConfig.label + expediente = True + paginate_by = 100 + + def get_queryset(self): + return ExpedienteMateria.objects.filter(sessao_plenaria_id=self.kwargs['pk'], + retiradapauta=None, tipo_votacao=LEITURA, registroleitura__materia=None) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['pk'] = self.kwargs['pk'] + context['root_pk'] = self.kwargs['pk'] + if not verifica_sessao_iniciada(self.request, self.kwargs['pk']): + context['sessao_iniciada'] = False + return context + context['sessao_iniciada'] = True + context['turno_choices'] = Tramitacao.TURNO_CHOICES + context['title'] = SessaoPlenaria.objects.get(id=self.kwargs['pk']) + if self.expediente: + context['expediente'] = True + else: + context['expediente'] = False + return context + + def post(self, request, *args, **kwargs): + if 'marcadas_4' in request.POST: + models = None + selectedlist = request.POST.getlist('marcadas_4') + if request.POST['origem'] == 'ordem': + models = OrdemDia.objects.filter(id__in=selectedlist) + elif request.POST['origem'] == 'expediente': + models = ExpedienteMateria.objects.filter(id__in=selectedlist) + + if not models: + messages.add_message(self.request, messages.ERROR, + _('Impossível localizar as matérias selecionadas')) + return self.get(request, self.kwargs) + + materias = [m.materia for m in models] + RegistroLeitura.objects.filter(materia__in=materias).delete() + leituras = [] + for m in models: + obj = None + if isinstance(m, ExpedienteMateria): + obj = RegistroLeitura(expediente=m, materia=m.materia, + observacao=request.POST['observacao'], + user=self.request.user, + ip=get_client_ip(self.request)) + elif isinstance(m, OrdemDia): + obj = RegistroLeitura(ordem=m, materia=m.materia, + observacao=request.POST['observacao'], + user=self.request.user, + ip=get_client_ip(self.request)) + leituras.append(obj) + + RegistroLeitura.objects.bulk_create(leituras) + else: + messages.add_message(self.request, messages.ERROR, _('Nenhuma matéria selecionada para leitura em Bloco')) + return self.get(request, self.kwargs) + + return HttpResponseRedirect(self.get_success_url()) + + def get_success_url(self): + if self.request.POST['origem'] == 'ordem': + return reverse('sapl.sessao:ordemdia_list', + kwargs={'pk': self.kwargs['pk']}) + else: + return reverse('sapl.sessao:expedientemateria_list', + kwargs={'pk': self.kwargs['pk']}) + + +class LeituraEmBlocoExpediente(LeituraEmBloco): + expediente = True + paginate_by = 100 + + def get_queryset(self): + return ExpedienteMateria.objects.filter(sessao_plenaria_id=self.kwargs['pk'], + retiradapauta=None, tipo_votacao=LEITURA, registroleitura__materia=None) + + +class LeituraEmBlocoOrdemDia(LeituraEmBloco): + expediente = False + paginate_by = 100 + + def get_queryset(self): + return OrdemDia.objects.filter(sessao_plenaria_id=self.kwargs['pk'], + retiradapauta=None, tipo_votacao=LEITURA, registroleitura__materia=None) + + class VotacaoEmBlocoExpediente(PermissionRequiredForAppCrudMixin, ListView): template_name = 'sessao/votacao/votacao_bloco.html' app_label = AppConfig.label @@ -4325,7 +4543,6 @@ class VotacaoEmBlocoOrdemDia(VotacaoEmBlocoExpediente): class VotacaoEmBlocoSimbolicaView(PermissionRequiredForAppCrudMixin, TemplateView): - """ Votação Simbólica """ @@ -4421,8 +4638,8 @@ class VotacaoEmBlocoSimbolicaView(PermissionRequiredForAppCrudMixin, TemplateVie except Exception as e: username = request.user.username self.logger.error('user=' + username + '. Problemas ao salvar ' - 'RegistroVotacao da materia de id={} ' - 'e da ordem de id={}. ' + 'RegistroVotacao da materia de id={} ' + 'e da ordem de id={}. ' .format(ordem.materia.id, ordem.id) + str(e)) return self.form_invalid(form, context) else: @@ -4453,8 +4670,10 @@ class VotacaoEmBlocoSimbolicaView(PermissionRequiredForAppCrudMixin, TemplateVie votacao.save() except Exception as e: username = request.user.username - self.logger.error('user=' + username + '. Problemas ao salvar RegistroVotacao da materia de id={} ' - 'e da ordem de id={}. '.format(expediente.materia.id, expediente.id) + str(e)) + self.logger.error( + 'user=' + username + '. Problemas ao salvar RegistroVotacao da materia de id={} ' + 'e da ordem de id={}. '.format(expediente.materia.id, + expediente.id) + str(e)) return self.form_invalid(form, context) else: expediente.resultado = resultado.nome @@ -4618,7 +4837,7 @@ class VotacaoEmBlocoNominalView(PermissionRequiredForAppCrudMixin, TemplateView) if form.is_valid(): if form.cleaned_data['resultado_votacao'] == None: form.add_error(None, 'Não é possível finalizar a votação sem ' - 'nenhum resultado da votação.') + 'nenhum resultado da votação.') return self.form_invalid(form, context) qtde_votos = (int(request.POST['votos_sim']) + @@ -4629,9 +4848,9 @@ class VotacaoEmBlocoNominalView(PermissionRequiredForAppCrudMixin, TemplateView) # Caso todas as opções sejam 'Não votou', fecha a votação if int(request.POST['nao_votou']) == qtde_votos: self.logger.error('user=' + username + '. Não é possível finalizar a votação sem ' - 'nenhum voto.') + 'nenhum voto.') form.add_error(None, 'Não é possível finalizar a votação sem ' - 'nenhum voto.') + 'nenhum voto.') return self.form_invalid(form, context) if request.POST['origem'] == 'ordem': @@ -4963,3 +5182,244 @@ def retirar_leitura(request, pk, iso, oid): ordem_expediente.votacao_aberta = False ordem_expediente.save() return HttpResponseRedirect(succ_url) + + +def recuperar_documento(request): + tipo = request.GET['tipo_documento'] + numero = request.GET['numero_documento'] + ano = request.GET['ano_documento'] + + is_ostensivo = AppsAppConfig.attr('documentos_administrativos') == 'O' + + qs = DocumentoAdministrativo.objects.order_by('-id') + qs = qs.filter(tipo_id=tipo, ano=ano, numero=numero) + + is_anon = request.user.is_anonymous + is_restrito = qs.filter(restrito=True).exists() + if is_anon and not is_ostensivo or is_anon and is_restrito or not qs.exists(): + return JsonResponse({'detail': 'Documento administrativo não encontrado.'}) + + d = qs.first() + return JsonResponse( + { + 'id': d.id, + 'epigrafe': str(d), + 'data': d.data.strftime('%d/%m/%Y'), + 'assunto': d.assunto, + 'restrito': d.restrito, + 'is_ostensivo': is_ostensivo + } + ) + + +class CorrespondenciaCrud(MasterDetailCrud): + model = Correspondencia + parent_field = 'sessao_plenaria' + help_topic = 'sessaoplenaria_correspondencia' + public = [RP_LIST, RP_DETAIL] + + class BaseMixin(MasterDetailCrud.BaseMixin): + list_field_names = ['numero_ordem', + ('documento__data', 'documento__interessado'), 'documento', 'documento__assunto'] + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + s = SessaoPlenaria.objects.get(pk=context['root_pk']) + context.update({ + 'subnav_template_name': 'sessao/subnav-solene.yaml' + if s.tipo.nome == "Solene" else 'sessao/subnav.yaml'}) + + return context + + @property + def verbose_name(self): + return _('Correspondência') + + @property + def verbose_name_plural(self): + return _('Correspondências') + + @property + def title(self): + return self.object.sessao_plenaria + + class ListView(MasterDetailCrud.ListView): + + def get_queryset(self): + qs = super().get_queryset() + + is_anon = self.request.user.is_anonymous + is_ostensivo = AppsAppConfig.attr( + 'documentos_administrativos') == 'O' + + if is_anon and not is_ostensivo: + return qs.none() + + if is_anon: + return qs.filter(documento__restrito=False) + + return qs + + def hook_header_numero_ordem(self, *args, **kwargs): + return force_text(_('Ordem / Tipo')) if not self.request.user.is_anonymous else force_text(_('Tipo')) + + def hook_numero_ordem(self, obj, ss, url): + if not self.request.user.is_anonymous: + return f'{obj.numero_ordem} - {obj.get_tipo_display()}', url + else: + return f'{obj.get_tipo_display()}', url + + class CreateView(MasterDetailCrud.CreateView): + form_class = CorrespondenciaForm + + def get_initial(self): + initial = super().get_initial() + max_numero_ordem = Correspondencia.objects.filter( + sessao_plenaria=self.kwargs['pk']).aggregate( + Max('numero_ordem'))['numero_ordem__max'] + initial['numero_ordem'] = ( + max_numero_ordem if max_numero_ordem else 0) + 1 + + return initial + + class UpdateView(MasterDetailCrud.UpdateView): + form_class = CorrespondenciaForm + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['title'] = self.object.documento + return context + + def get_initial(self): + initial = super().get_initial() + initial['tipo_documento'] = self.object.documento.tipo.id + initial['numero_documento'] = self.object.documento.numero + initial['ano_documento'] = self.object.documento.ano + + return initial + + class DetailView(MasterDetailCrud.DetailView): + + @property + def layout_key(self): + return 'CorrespondenciaDetail' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['title'] = self.object.sessao_plenaria + return context + + def hook_header_sessao_plenaria(self, *args, **kwargs): + return _('Sessão Plenária') + + def hook_documento(self, obj, verbose_name=None, field_display=None): + d = obj.documento + url = reverse( + 'sapl.protocoloadm:documentoadministrativo_detail', + kwargs={'pk': d.id} + ) + return ( + verbose_name, + f'{d}
{d.assunto}' + ) + + def get_object(self, queryset=None): + + obj = super().get_object(queryset=queryset) + + is_anon = self.request.user.is_anonymous + is_ostensivo = AppsAppConfig.attr( + 'documentos_administrativos') == 'O' + + if is_anon and not is_ostensivo: + raise Http404() + + if is_anon and obj.documento.restrito: + raise Http404() + + return obj + + +class CorrespondenciaEmLoteView(PermissionRequiredMixin, FilterView): + filterset_class = CorrespondenciaEmLoteFilterSet + template_name = 'sessao/em_lote/correspondencia.html' + permission_required = ('sessao.add_correspondencia',) + + def get_queryset(self): + qs = super().get_queryset() + return qs.filter(sessao_plenaria_id=self.kwargs['pk']) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + s = SessaoPlenaria.objects.get(pk=self.kwargs['pk']) + + context['root_pk'] = self.kwargs['pk'] + context['title'] = _( + 'Correspondencias em Lote ({})').format(s) + + # Verifica se os campos foram preenchidos + msg = None + if not self.request.GET.get('tipo', " "): + msg = _('Por favor, selecione um tipo de documento administrativo.') + messages.add_message(self.request, messages.ERROR, msg) + + if not self.request.GET.get('data_0', " ") or not self.request.GET.get('data_1', " "): + msg = _('Por favor, preencha as datas.') + messages.add_message(self.request, messages.ERROR, msg) + + if msg: + return context + + qr = self.request.GET.copy() + if not len(qr): + context['object_list'] = [] + else: + context['object_list'] = context['object_list'].order_by( + 'numero', '-ano') + sessao_plenaria = SessaoPlenaria.objects.get( + pk=self.kwargs['pk']) + not_list = [self.kwargs['pk']] + \ + [m for m in sessao_plenaria.correspondencias.values_list( + 'id', flat=True)] + context['object_list'] = context['object_list'].exclude( + pk__in=not_list) + + context['numero_res'] = len(context['object_list']) + + context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' + + context['show_results'] = show_results_filter_set(qr) + + return context + + def post(self, request, *args, **kwargs): + marcados = request.POST.getlist('documento_id') + + if len(marcados) == 0: + msg = _('Nenhum documento foi selecionado.') + messages.add_message(request, messages.ERROR, msg) + return self.get(request, self.kwargs) + + sessao_plenaria = SessaoPlenaria.objects.get(pk=kwargs['pk']) + + max_numero_ordem = Correspondencia.objects.filter( + sessao_plenaria=self.kwargs['pk']).aggregate( + Max('numero_ordem'))['numero_ordem__max'] or 0 + + for documento in DocumentoAdministrativo.objects.filter( + id__in=marcados + ).values_list('id', flat=True): + max_numero_ordem += 1 + c = Correspondencia() + c.numero_ordem = max_numero_ordem + c.sessao_plenaria = sessao_plenaria + c.documento_id = documento + c.tipo = request.POST.get('tipo') + c.save() + + msg = _('Correspondencias adicionadas.') + messages.add_message(request, messages.SUCCESS, msg) + + success_url = reverse('sapl.sessao:correspondencia_list', + kwargs={'pk': kwargs['pk']}) + return HttpResponseRedirect(success_url) diff --git a/sapl/settings.py b/sapl/settings.py index 2de054240..df4d98283 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -41,7 +41,7 @@ ALLOWED_HOSTS = ['*'] LOGIN_REDIRECT_URL = '/' LOGIN_URL = '/login/?next=' -SAPL_VERSION = '3.1.162' +SAPL_VERSION = '3.1.163-RC16' if DEBUG: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' @@ -88,14 +88,13 @@ INSTALLED_APPS = ( 'easy_thumbnails', 'image_cropping', - 'reversion', - 'reversion_compare', - 'haystack', - 'speedinfo', + 'django.contrib.postgres', 'webpack_loader', + 'django_prometheus', + ) + SAPL_APPS # FTS = Full Text Search @@ -126,16 +125,18 @@ HAYSTACK_CONNECTIONS = { } MIDDLEWARE = [ - 'reversion.middleware.RevisionMiddleware', + 'django_prometheus.middleware.PrometheusBeforeMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', + 'sapl.endpoint_restriction_middleware.EndpointRestrictionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', + 'django_prometheus.middleware.PrometheusAfterMiddleware', ] if DEBUG: INSTALLED_APPS += ('debug_toolbar',) @@ -148,6 +149,7 @@ REST_FRAMEWORK = { "UNICODE_JSON": False, "DEFAULT_PARSER_CLASSES": ( "rest_framework.parsers.JSONParser", + "rest_framework.parsers.MultiPartParser" ), 'DEFAULT_RENDERER_CLASSES': ( 'rest_framework.renderers.JSONRenderer', @@ -160,7 +162,7 @@ REST_FRAMEWORK = { "rest_framework.authentication.SessionAuthentication", ), - 'DEFAULT_SCHEMA_CLASS': 'sapl.api.core.schema.Schema', + 'DEFAULT_SCHEMA_CLASS': 'sapl.api.schema.Schema', "DEFAULT_PAGINATION_CLASS": "sapl.api.pagination.StandardPagination", @@ -170,6 +172,13 @@ REST_FRAMEWORK = { ), } +DRFAUTOAPI = { + 'DEFAULT_SERIALIZER_MODULE': 'sapl.api.serializers', + 'DEFAULT_FILTER_MODULE': 'sapl.api.forms', + 'GLOBAL_SERIALIZER_MIXIN': 'sapl.api.serializers.SaplSerializerMixin', + 'GLOBAL_FILTERSET_MIXIN': 'sapl.api.forms.SaplFilterSetMixin' +} + SPECTACULAR_SETTINGS = { 'TITLE': 'Sapl API - docs', 'DESCRIPTION': 'Sapl API - Docs', @@ -178,8 +187,7 @@ SPECTACULAR_SETTINGS = { CACHES = { 'default': { - 'BACKEND': 'speedinfo.backends.proxy_cache', - 'CACHE_BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', + 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', } } @@ -320,7 +328,8 @@ FORM_RENDERER = 'django.forms.renderers.DjangoTemplates' # suprime texto de ajuda default do django-filter FILTERS_HELP_TEXT_FILTER = False -LOGGING_CONSOLE_VERBOSE = config('LOGGING_CONSOLE_VERBOSE', cast=bool, default=False) +LOGGING_CONSOLE_VERBOSE = config( + 'LOGGING_CONSOLE_VERBOSE', cast=bool, default=False) LOGGING = { 'version': 1, @@ -371,7 +380,7 @@ LOGGING = { 'propagate': True, }, 'django': { - 'handlers': ['applogfile'], + 'handlers': ['applogfile'] + ['console_verbose'] if LOGGING_CONSOLE_VERBOSE else [], 'level': 'ERROR', 'propagate': True, }, diff --git a/sapl/static/sapl/css/relatorio.css b/sapl/static/sapl/css/relatorio.css index 5411b70b5..0dcbd8061 100644 --- a/sapl/static/sapl/css/relatorio.css +++ b/sapl/static/sapl/css/relatorio.css @@ -1,7 +1,7 @@ @page{ margin-top: 5.2cm; size: A4 portrait; -} +} h2.gray-title{ color: gray; @@ -13,11 +13,11 @@ h2.gray-title{ h3 { font-size: 10pt; break-after: avoid-page; - page-break-after: avoid; + page-break-after: avoid; } p, a { - font-size: 10pt; + font-size: 10pt; text-align: justify; text-justify: inter-word; } @@ -58,6 +58,7 @@ fieldset { table { + table-layout: fixed; max-width: 520px; } table.grayTable { @@ -68,6 +69,11 @@ table.grayTable { } table.grayTable td, table.grayTable th { border: 1px solid #000000; + padding: 5px; + overflow-wrap: break-word; + word-wrap: break-word; + text-align: justify; + vertical-align: top; } table.grayTable tbody td { font-size: 10px; @@ -91,4 +97,4 @@ table.grayTable thead th { } table.grayTable thead th:first-child { border-left: none; -} \ No newline at end of file +} \ No newline at end of file diff --git a/sapl/static/sapl/frontend/css/chunk-vendors.9904f9d0.css b/sapl/static/sapl/frontend/css/chunk-vendors.9904f9d0.css new file mode 100644 index 000000000..42bac7c09 --- /dev/null +++ b/sapl/static/sapl/frontend/css/chunk-vendors.9904f9d0.css @@ -0,0 +1,13 @@ +.tox{box-shadow:none;box-sizing:content-box;color:#222f3e;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit;background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:2px solid #eee;border-radius:10px;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox.tox-tinymce-inline{border:none;box-shadow:none;overflow:initial}.tox.tox-tinymce-inline .tox-editor-container{overflow:initial}.tox.tox-tinymce-inline .tox-editor-header{background-color:#fff;border:2px solid #eee;border-radius:10px;box-shadow:none;overflow:hidden}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox[dir=rtl] .tox-icon--flip svg{transform:rotateY(180deg)}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #eee;border-radius:6px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#eee;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(0,108,231,.1);border-color:#006ce7;color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:#006ce7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#006ce7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#006ce7}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#006ce7}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.1);border-color:rgba(255,165,0,.5);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.5)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.1);border-color:rgba(204,0,0,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.4)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#c00}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.1);border-color:rgba(120,171,70,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.4)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar,.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#006ce7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#006ce7;border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;position:relative;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button:before{border-radius:6px;bottom:-1px;box-shadow:inset 0 0 0 2px #fff,0 0 0 1px #006ce7,0 0 0 3px rgba(0,108,231,.25);content:"";left:-1px;opacity:0;pointer-events:none;position:absolute;right:-1px;top:-1px}.tox .tox-button[disabled]{background-color:#006ce7;background-image:none;border-color:#006ce7;box-shadow:none;color:hsla(0,0%,100%,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#0060ce;background-image:none;border-color:#0060ce;box-shadow:none;color:#fff}.tox .tox-button:focus-visible:not(:disabled):before{opacity:1}.tox .tox-button:hover:not(:disabled){background-color:#0060ce;background-image:none;border-color:#0060ce;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#0054b4;background-image:none;border-color:#0054b4;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-position:0 0;background-repeat:repeat;border-radius:6px;border-style:solid;border-width:1px;color:#222f3e;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary,.tox .tox-button--secondary[disabled]{background-color:#f0f0f0;background-image:none;border-color:#f0f0f0;box-shadow:none}.tox .tox-button--secondary[disabled]{color:rgba(34,47,62,.5)}.tox .tox-button--secondary:focus:not(:disabled),.tox .tox-button--secondary:hover:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:active:not(:disabled){background-color:#d6d6d6;background-image:none;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked[disabled]{background-color:rgba(34,47,62,.12);border-color:transparent;box-shadow:unset;color:rgba(34,47,62,.5)}.tox .tox-button--naked:focus:not(:disabled),.tox .tox-button--naked:hover:not(:disabled){background-color:rgba(34,47,62,.12);border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked:active:not(:disabled){background-color:rgba(34,47,62,.18);border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#222f3e}.tox .tox-checkbox{align-items:center;border-radius:6px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:6px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:3px;width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(34,47,62,.3)}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg,.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#006ce7}.tox .tox-checkbox--disabled{color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg,.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg,.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(34,47,62,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:6px;box-shadow:inset 0 0 0 1px #006ce7;padding:3px}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#e3e3e3;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#fcfcfc;color:rgba(34,47,62,.7);cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none}.tox .tox-collection__group-heading,.tox .tox-collection__item{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;border-radius:3px;color:#222f3e;display:flex}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--grid .tox-collection__item,.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#fff;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active{background-color:#cce2fa}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#a6ccf7;color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#cce2fa}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#a6ccf7;color:#222f3e}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#cce2fa;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled),.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;flex:1;font-style:normal;font-weight:400;word-break:break-all}.tox .tox-collection__item-accessory,.tox .tox-collection__item-label{display:inline-block;font-size:14px;line-height:24px;text-transform:none}.tox .tox-collection__item-accessory{color:rgba(34,47,62,.7);height:24px}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret:after{content:"";font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#222f3e}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg{fill:rgba(34,47,62,.5)}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark,.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--horizontal{background-color:#fff;border:1px solid #e3e3e3;border-radius:6px;box-shadow:0 0 2px 0 rgba(34,47,62,.2),0 4px 8px 0 rgba(34,47,62,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:28px;margin:6px 1px 5px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid transparent}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid transparent}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(180deg,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{flex-direction:column}.tox .tox-rgb-form,.tox .tox-rgb-form div{display:flex;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-hue-slider,.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-hue-slider,.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:5px 0 6px 11px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px -4px}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:inset 0 0 0 1px hsla(0,0%,50%,.3);transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{fill:#222f3e;height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#cce2fa}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#fff;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#fff;border:1px solid #eee;border-radius:6px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#222f3e;display:flex;justify-content:space-between}.tox .tox-comment__date{color:#222f3e;font-size:12px;line-height:18px}.tox .tox-comment__body{color:#222f3e;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:none}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(34,47,62,.7);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay:after{background:#fff;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient:after{background:linear-gradient(hsla(0,0%,100%,0),#fff);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#fff;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#222f3e;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#fff;box-shadow:0 0 8px 8px #fff;color:#222f3e;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#fff;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(34,47,62,.7)}.tox .tox-user__avatar img{border-radius:50%;height:36px;-o-object-fit:cover;object-fit:cover;vertical-align:middle;width:36px}.tox .tox-user__name{color:#222f3e;font-size:14px;font-style:normal;font-weight:700;line-height:18px;text-transform:none}.tox:not([dir=rtl]) .tox-user__avatar img,.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name,.tox[dir=rtl] .tox-user__avatar img,.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:hsla(0,0%,100%,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog,.tox .tox-dialog-wrap__backdrop--opaque{background-color:#fff}.tox .tox-dialog{border-color:#eee;border-radius:10px;border-style:solid;border-width:0;box-shadow:0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;max-height:calc(100vh - 16px);width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#fff;border-bottom:none;color:#222f3e;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:-webkit-grab;cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:-webkit-grabbing;cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:20px;margin:0}.tox .tox-dialog__body,.tox .tox-dialog__title{font-style:normal;font-weight:400;line-height:1.3;text-transform:none}.tox .tox-dialog__body{color:#222f3e;display:flex;flex:1;font-size:16px;min-width:0;text-align:left}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(34,47,62,.7);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(0,108,231,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #006ce7;color:#006ce7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#006ce7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:active,.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#0054b4;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#222f3e}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{font-size:20px}.tox .tox-dialog__body-content .tox-form__group h1,.tox .tox-dialog__body-content .tox-form__group h2{color:#222f3e;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{font-size:16px}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#fff;border-top:none;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:hsla(0,0%,100%,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #eee}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__iframe.tox-dialog__iframe--opaque{background:#fff}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #eee;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(34,47,62,.7);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #eee}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{background-color:#fff;border-bottom:none;box-shadow:0 2px 2px -2px rgba(34,47,62,.1),0 8px 8px -4px rgba(34,47,62,.07);padding:4px 0;transition:box-shadow .5s}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header{border-top:1px solid #e3e3e3;box-shadow:none}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:#fff;box-shadow:0 2px 2px -2px rgba(34,47,62,.2),0 8px 8px -4px rgba(34,47,62,.15);padding:4px 0}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header{box-shadow:0 2px 2px -2px rgba(34,47,62,.2),0 8px 8px -4px rgba(34,47,62,.15)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{box-sizing:border-box;max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(34,47,62,.2);border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#006ce7;cursor:pointer}.tox .tox-color-input span:before{background-image:linear-gradient(45deg,rgba(0,0,0,.25) 25%,transparent 0),linear-gradient(-45deg,rgba(0,0,0,.25) 25%,transparent 0),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.25) 0),linear-gradient(-45deg,transparent 75%,rgba(0,0,0,.25) 0);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #fff;border-radius:6px;box-sizing:border-box;content:"";height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(34,47,62,.7);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - 4px)}.tox .tox-form__grid--3col>.tox-form__group{width:calc(33.33333% - 4px)}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - 4px)}.tox .tox-form__controls-h-stack,.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column}.tox .tox-form__group--stretched .tox-textarea{flex:1}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#eee;border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 5.5px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#fff;border-color:#006ce7;box-shadow:0 0 0 2px rgba(0,108,231,.25);outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#006ce7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#222f3e}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#222f3e}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#eee;border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 5.5px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#fff;border-color:#006ce7;box-shadow:0 0 0 2px rgba(0,108,231,.25);outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-imagepreview{background-color:#666;height:380px;overflow:hidden;position:relative;width:100%}.tox .tox-imagepreview.tox-imagepreview__loaded{overflow:auto}.tox .tox-imagepreview__container{display:flex;left:100vw;position:absolute;top:100vw}.tox .tox-imagepreview__image{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools .tox-spacer{flex:1}.tox .tox-image-tools .tox-bar{align-items:center;display:flex;height:60px;justify-content:center}.tox .tox-image-tools .tox-imagepreview,.tox .tox-image-tools .tox-imagepreview+.tox-bar{margin-top:8px}.tox .tox-image-tools .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-image-tools .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-image-tools .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-image-tools .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-image-tools .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-image-tools .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-image-tools .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#eee;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px -4px}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(0,108,231,.5);border-color:rgba(0,108,231,.5)}.tox .tox-insert-table-picker__label{color:rgba(34,47,62,.7);display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n),.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#fff;border:1px solid transparent;border-radius:6px;box-shadow:0 0 2px 0 rgba(34,47,62,.2),0 4px 8px 0 rgba(34,47,62,.15);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0 4px}.tox .tox-menu.tox-collection.tox-collection--grid,.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:8px}@media only screen and (min-width:768px){.tox .tox-menu .tox-collection__item-label{overflow-wrap:break-word;word-break:normal}}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height=%2739px%27 viewBox=%270 0 40 39px%27 width=%2740%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Crect x=%270%27 y=%2738px%27 width=%27100%27 height=%271%27 fill=%27transparent%27/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 11px 0 12px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid transparent}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:28px;justify-content:center;margin:5px 1px 6px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#cce2fa;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn--active{background:#a6ccf7;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#cce2fa;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:grid;grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity .15s ease-in}.tox .tox-notification,.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{cursor:pointer;text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#222f3e}.tox .tox-notification--success p{color:#222f3e}.tox .tox-notification--success a{color:#517342}.tox .tox-notification--success svg{fill:#222f3e}.tox .tox-notification--error{background-color:#f5cccc;border-color:#f0b3b3;color:#222f3e}.tox .tox-notification--error p{color:#222f3e}.tox .tox-notification--error a{color:#77181f}.tox .tox-notification--error svg{fill:#222f3e}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fff5cc;border-color:#fff0b3;color:#222f3e}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#222f3e}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#7a6e25}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#222f3e}.tox .tox-notification--info{background-color:#d6e7fb;border-color:#c1dbf9;color:#222f3e}.tox .tox-notification--info p{color:#222f3e}.tox .tox-notification--info a{color:#2a64a6}.tox .tox-notification--info svg{fill:#222f3e}.tox .tox-notification__body{align-self:center;color:#222f3e;font-size:14px;grid-column-end:3;grid-column-start:2;grid-row-end:2;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{align-self:center;grid-column-end:2;grid-column-start:1;grid-row-end:2;grid-row-start:1;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{align-self:start;grid-column-end:4;grid-column-start:3;grid-row-end:2;grid-row-start:1;justify-self:end}.tox .tox-notification .tox-progress-bar{grid-column-end:4;grid-column-start:1;grid-row-end:3;grid-row-start:2;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar,.tox .tox-pop--resizing .tox-toolbar__group{flex-wrap:nowrap}.tox .tox-pop--transition{transition:.15s ease;transition-property:left,right,top,bottom}.tox .tox-pop--transition:after,.tox .tox-pop--transition:before{transition:all .15s,visibility 0s,opacity 75ms ease 75ms}.tox .tox-pop__dialog{background-color:#fff;border:1px solid #eee;border-radius:6px;box-shadow:0 0 2px 0 rgba(34,47,62,.2),0 4px 8px 0 rgba(34,47,62,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop:after,.tox .tox-pop:before{border-style:solid;content:"";display:block;height:0;opacity:1;position:absolute;width:0}.tox .tox-pop.tox-pop--inset:after,.tox .tox-pop.tox-pop--inset:before{opacity:0;transition:all 0s .15s,visibility 0s,opacity 75ms ease}.tox .tox-pop.tox-pop--bottom:after,.tox .tox-pop.tox-pop--bottom:before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom:after{border-color:#fff transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom:before{border-color:#eee transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top:after,.tox .tox-pop.tox-pop--top:before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top:after{border-color:transparent transparent #fff transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top:before{border-color:transparent transparent #eee transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left:after,.tox .tox-pop.tox-pop--left:before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left:after{border-color:transparent #fff transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left:before{border-color:transparent #eee transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right:after,.tox .tox-pop.tox-pop--right:before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right:after{border-color:transparent transparent transparent #fff;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right:before{border-color:transparent transparent transparent #eee;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left:after,.tox .tox-pop.tox-pop--align-left:before{left:20px}.tox .tox-pop.tox-pop--align-right:after,.tox .tox-pop.tox-pop--align-right:before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;min-height:0}.tox .tox-sidebar{background-color:#fff;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane,.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #eee;border-radius:6px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#006ce7;border:2px solid #0054b4;border-radius:6px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-form__controls-h-stack>.tox-slider:not(:first-of-type){-webkit-margin-start:8px;margin-inline-start:8px}.tox .tox-form__controls-h-stack>.tox-form__group+.tox-slider,.tox .tox-form__controls-h-stack>.tox-slider+.tox-form__group{-webkit-margin-start:32px;margin-inline-start:32px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{-webkit-animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(34,47,62,.7);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:first-child{-webkit-animation-delay:-.32s;animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){-webkit-animation-delay:-.16s;animation-delay:-.16s}@-webkit-keyframes tam-bouncing-dots{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}@keyframes tam-bouncing-dots{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#fff;border-top:1px solid #e3e3e3;color:rgba(34,47,62,.7);display:flex;flex:0 0 auto;font-size:14px;font-weight:400;height:25px;overflow:hidden;padding:0 8px;position:relative;text-transform:none}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:rgba(34,47,62,.7);text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){color:#222f3e;cursor:pointer}.tox .tox-statusbar__branding svg{fill:rgba(34,47,62,.8);height:1.14em;vertical-align:-.28em;width:3.6em}.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled=true]) svg,.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled=true]) svg{fill:#222f3e}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-bottom:3px;padding-left:1ch;padding-right:3px}.tox .tox-statusbar__resize-handle svg{display:block;fill:rgba(34,47,62,.5)}.tox .tox-statusbar__resize-handle:focus svg{background-color:#dee0e2;border-radius:1px 1px 5px 1px;box-shadow:0 0 0 2px #dee0e2}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:2ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{background-color:hsla(0,0%,100%,.6);bottom:0;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn,.tox .tox-throbber__busy-spinner{align-items:center;display:flex;justify-content:center}.tox .tox-tbtn{background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:28px;margin:6px 1px 5px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#222f3e}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus,.tox .tox-tbtn:hover{background:#cce2fa;border:0;box-shadow:none}.tox .tox-tbtn:hover{color:#222f3e}.tox .tox-tbtn:hover svg{fill:#222f3e}.tox .tox-tbtn:active{background:#a6ccf7;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:active svg{fill:#222f3e}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#a6ccf7;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#222f3e}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:42px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:56px;width:68px}.tox .tox-tbtn--return{align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:6px 1px 5px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--bespoke{background:#f7f7f7}.tox .tox-tbtn--bespoke+.tox-tbtn--bespoke{-webkit-margin-start:4px;margin-inline-start:4px}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:6px 1px 5px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:inset 0 0 0 1px #cce2fa}.tox .tox-split-button:focus{background:#cce2fa;box-shadow:none;color:#222f3e}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(34,47,62,.5)}.tox.tox-platform-touch .tox-split-button .tox-tbtn--select{padding:0 0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-toolbar-overlord{background-color:#fff}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background-color:#fff;background-image:repeating-linear-gradient(#e3e3e3 0 1px,transparent 1px 39px);background-position:center top 40px;background-repeat:no-repeat;background-size:calc(100% - 22px) calc(100% - 41px);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0;transform:perspective(1px)}.tox .tox-toolbar-overlord>.tox-toolbar,.tox .tox-toolbar-overlord>.tox-toolbar__overflow,.tox .tox-toolbar-overlord>.tox-toolbar__primary{background-position:center top 0;background-size:calc(100% - 22px) 100%}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord{border-top:1px solid transparent;margin-top:0;padding-bottom:1px;padding-top:1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child,.tox .tox-toolbar-overlord .tox-toolbar__primary{background-position:center top 39px}.tox .tox-editor-header>.tox-toolbar--scrolling,.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child{background-image:none}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#fff;background-position:center top 43px;background-size:calc(100% - 16px) calc(100% - 51px);border:none;border-radius:6px;box-shadow:0 0 2px 0 rgba(34,47,62,.2),0 4px 8px 0 rgba(34,47,62,.15);padding:4px 0}.tox-pop .tox-pop__dialog .tox-toolbar{background-position:center top 43px;background-size:calc(100% - 22px) calc(100% - 51px);padding:4px 0}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 11px 0 12px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid transparent}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid transparent}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#222f3e;border-radius:6px;box-shadow:0 2px 4px rgba(34,47,62,.3);color:hsla(0,0%,100%,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-top:8px solid #222f3e;bottom:0}.tox .tox-tooltip--down .tox-tooltip__arrow,.tox .tox-tooltip--up .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #222f3e;top:0}.tox .tox-tooltip--right .tox-tooltip__arrow{border-left:8px solid #222f3e;right:0}.tox .tox-tooltip--left .tox-tooltip__arrow,.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-top:8px solid transparent;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-right:8px solid #222f3e;left:0}.tox .tox-well{border:1px solid #eee;border-radius:6px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #eee;border-radius:6px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading:before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__body-content .tox-collection,.tox .tox-dialog__content-js{display:flex;flex:1} + +/*! + * Font Awesome Free 6.1.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2022 Fonticons, Inc. + */.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-duotone,.fa-light,.fa-regular,.fa-solid,.fa-thin,.fab,.fad,.fal,.far,.fas,.fat{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-color:var(--fa-border-color,#eee);border-radius:var(--fa-border-radius,.1em);border-style:var(--fa-border-style,solid);border-width:var(--fa-border-width,.08em);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0);animation-delay:var(--fa-animation-delay,0);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}24%,8%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}24%,8%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-a:before{content:"\41"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-anchor:before{content:"\f13d"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-anchor-lock:before{content:"\e4ad"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-ankh:before{content:"\f644"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-archway:before{content:"\f557"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-arrow-trend-down:before{content:"\e097"}.fa-arrow-trend-up:before{content:"\e098"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-arrows-spin:before{content:"\e4bb"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-asterisk:before{content:"\2a"}.fa-at:before{content:"\40"}.fa-atom:before{content:"\f5d2"}.fa-audio-description:before{content:"\f29e"}.fa-austral-sign:before{content:"\e0a9"}.fa-award:before{content:"\f559"}.fa-b:before{content:"\42"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-backward:before{content:"\f04a"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-baht-sign:before{content:"\e0ac"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-barcode:before{content:"\f02a"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-bell:before{content:"\f0f3"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bicycle:before{content:"\f206"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blog:before{content:"\f781"}.fa-bold:before{content:"\f032"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-book-bookmark:before{content:"\e0bb"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-bookmark:before{content:"\f02e"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-bore-hole:before{content:"\e4c3"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-bottle-water:before{content:"\e4c5"}.fa-bowl-food:before{content:"\e4c6"}.fa-bowl-rice:before{content:"\e2eb"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes-packing:before{content:"\e4c7"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-bread-slice:before{content:"\f7ec"}.fa-bridge:before{content:"\e4c8"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-bridge-water:before{content:"\e4ce"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broom:before{content:"\f51a"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-brush:before{content:"\f55d"}.fa-bucket:before{content:"\e4cf"}.fa-bug:before{content:"\f188"}.fa-bug-slash:before{content:"\e490"}.fa-bugs:before{content:"\e4d0"}.fa-building:before{content:"\f1ad"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-building-circle-check:before{content:"\e4d2"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-building-flag:before{content:"\e4d5"}.fa-building-lock:before{content:"\e4d6"}.fa-building-ngo:before{content:"\e4d7"}.fa-building-shield:before{content:"\e4d8"}.fa-building-un:before{content:"\e4d9"}.fa-building-user:before{content:"\e4da"}.fa-building-wheat:before{content:"\e4db"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-burst:before{content:"\e4dc"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-c:before{content:"\43"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-week:before{content:"\f784"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-camera-rotate:before{content:"\e0d8"}.fa-campground:before{content:"\f6bb"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-car-on:before{content:"\e4dd"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-car-side:before{content:"\f5e4"}.fa-car-tunnel:before{content:"\e4de"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-cart-plus:before{content:"\f217"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cedi-sign:before{content:"\e0df"}.fa-cent-sign:before{content:"\e3f5"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-charging-station:before{content:"\f5e7"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-chart-column:before{content:"\e0e3"}.fa-chart-gantt:before{content:"\e0e4"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-chart-simple:before{content:"\e473"}.fa-check:before{content:"\f00c"}.fa-check-double:before{content:"\f560"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-child-dress:before{content:"\e59c"}.fa-child-reaching:before{content:"\e59d"}.fa-child-rifle:before{content:"\e4e0"}.fa-children:before{content:"\e4e1"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-circle-nodes:before{content:"\e4e2"}.fa-circle-notch:before{content:"\f1ce"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-city:before{content:"\f64f"}.fa-clapperboard:before{content:"\e131"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clipboard-question:before{content:"\e4e3"}.fa-clipboard-user:before{content:"\f7f3"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-clover:before{content:"\e139"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-code-commit:before{content:"\f386"}.fa-code-compare:before{content:"\e13a"}.fa-code-fork:before{content:"\e13b"}.fa-code-merge:before{content:"\f387"}.fa-code-pull-request:before{content:"\e13c"}.fa-coins:before{content:"\f51e"}.fa-colon-sign:before{content:"\e140"}.fa-comment:before{content:"\f075"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-compress:before{content:"\f066"}.fa-computer:before{content:"\e4e5"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cow:before{content:"\f6c8"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-d:before{content:"\44"}.fa-database:before{content:"\f1c0"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-democrat:before{content:"\f747"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-dharmachakra:before{content:"\f655"}.fa-diagram-next:before{content:"\e476"}.fa-diagram-predecessor:before{content:"\e477"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-diagram-successor:before{content:"\e47a"}.fa-diamond:before{content:"\f219"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-disease:before{content:"\f7fa"}.fa-display:before{content:"\e163"}.fa-divide:before{content:"\f529"}.fa-dna:before{content:"\f471"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-dong-sign:before{content:"\e169"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dove:before{content:"\f4ba"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-download:before{content:"\f019"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-e:before{content:"\45"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elevator:before{content:"\e16d"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-equals:before{content:"\3d"}.fa-eraser:before{content:"\f12d"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-exclamation:before{content:"\21"}.fa-expand:before{content:"\f065"}.fa-explosion:before{content:"\e4e9"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-eye-slash:before{content:"\f070"}.fa-f:before{content:"\46"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-fan:before{content:"\f863"}.fa-faucet:before{content:"\e005"}.fa-faucet-drip:before{content:"\e006"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-ferry:before{content:"\e4ea"}.fa-file:before{content:"\f15b"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-file-audio:before{content:"\f1c7"}.fa-file-circle-check:before{content:"\e5a0"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-file-circle-plus:before{content:"\e494"}.fa-file-circle-question:before{content:"\e4ef"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-excel:before{content:"\f1c3"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-file-medical:before{content:"\f477"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-shield:before{content:"\e4f0"}.fa-file-signature:before{content:"\f573"}.fa-file-video:before{content:"\f1c8"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-file-word:before{content:"\f1c2"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-burner:before{content:"\e4f1"}.fa-fire-extinguisher:before{content:"\f134"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-fish:before{content:"\f578"}.fa-fish-fins:before{content:"\e4f2"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flask-vial:before{content:"\e4f3"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-florin-sign:before{content:"\e184"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-folder-closed:before{content:"\e185"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-folder-tree:before{content:"\f802"}.fa-font:before{content:"\f031"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-franc-sign:before{content:"\e18f"}.fa-frog:before{content:"\f52e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-g:before{content:"\47"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-glass-water:before{content:"\e4f4"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-glasses:before{content:"\f530"}.fa-globe:before{content:"\f0ac"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-greater-than:before{content:"\3e"}.fa-greater-than-equal:before{content:"\f532"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-guarani-sign:before{content:"\e19a"}.fa-guitar:before{content:"\f7a6"}.fa-gun:before{content:"\e19b"}.fa-h:before{content:"\48"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-handcuffs:before{content:"\e4f8"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-hands-bound:before{content:"\e4f9"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-hands-clapping:before{content:"\e1a8"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-handshake:before{content:"\f2b5"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-hashtag:before{content:"\23"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-heart-circle-plus:before{content:"\e500"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-helicopter-symbol:before{content:"\e502"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-helmet-un:before{content:"\e503"}.fa-highlighter:before{content:"\f591"}.fa-hill-avalanche:before{content:"\e507"}.fa-hill-rockslide:before{content:"\e508"}.fa-hippo:before{content:"\f6ed"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-house-chimney-user:before{content:"\e065"}.fa-house-chimney-window:before{content:"\e00d"}.fa-house-circle-check:before{content:"\e509"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-house-crack:before{content:"\e3b1"}.fa-house-fire:before{content:"\e50c"}.fa-house-flag:before{content:"\e50d"}.fa-house-flood-water:before{content:"\e50e"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-house-lock:before{content:"\e510"}.fa-house-medical:before{content:"\e3b2"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-house-medical-flag:before{content:"\e514"}.fa-house-signal:before{content:"\e012"}.fa-house-tsunami:before{content:"\e515"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-hurricane:before{content:"\f751"}.fa-i:before{content:"\49"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-images:before{content:"\f302"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-italic:before{content:"\f033"}.fa-j:before{content:"\4a"}.fa-jar:before{content:"\e516"}.fa-jar-wheat:before{content:"\e517"}.fa-jedi:before{content:"\f669"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-jet-fighter-up:before{content:"\e518"}.fa-joint:before{content:"\f595"}.fa-jug-detergent:before{content:"\e519"}.fa-k:before{content:"\4b"}.fa-kaaba:before{content:"\f66b"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-khanda:before{content:"\f66d"}.fa-kip-sign:before{content:"\e1c4"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-kitchen-set:before{content:"\e51a"}.fa-kiwi-bird:before{content:"\f535"}.fa-l:before{content:"\4c"}.fa-land-mine-on:before{content:"\e51b"}.fa-landmark:before{content:"\f66f"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-landmark-flag:before{content:"\e51c"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-file:before{content:"\e51d"}.fa-laptop-medical:before{content:"\f812"}.fa-lari-sign:before{content:"\e1c8"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-lemon:before{content:"\f094"}.fa-less-than:before{content:"\3c"}.fa-less-than-equal:before{content:"\f537"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-lines-leaning:before{content:"\e51e"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-lira-sign:before{content:"\f195"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-location-arrow:before{content:"\f124"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-location-pin-lock:before{content:"\e51f"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-locust:before{content:"\e520"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-m:before{content:"\4d"}.fa-magnet:before{content:"\f076"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-manat-sign:before{content:"\e1d5"}.fa-map:before{content:"\f279"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-pin:before{content:"\f276"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-and-venus:before{content:"\f224"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-mask:before{content:"\f6fa"}.fa-mask-face:before{content:"\e1d7"}.fa-mask-ventilator:before{content:"\e524"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-mattress-pillow:before{content:"\e525"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-medal:before{content:"\f5a2"}.fa-memory:before{content:"\f538"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-mill-sign:before{content:"\e1ed"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-mitten:before{content:"\f7b5"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-mobile-button:before{content:"\f10b"}.fa-mobile-retro:before{content:"\e527"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-money-bills:before{content:"\e1f3"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-mosquito-net:before{content:"\e52c"}.fa-motorcycle:before{content:"\f21c"}.fa-mound:before{content:"\e52d"}.fa-mountain:before{content:"\f6fc"}.fa-mountain-city:before{content:"\e52e"}.fa-mountain-sun:before{content:"\e52f"}.fa-mug-hot:before{content:"\f7b6"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-music:before{content:"\f001"}.fa-n:before{content:"\4e"}.fa-naira-sign:before{content:"\e1f6"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-not-equal:before{content:"\f53e"}.fa-notdef:before{content:"\e1fe"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-notes-medical:before{content:"\f481"}.fa-o:before{content:"\4f"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-oil-can:before{content:"\f613"}.fa-oil-well:before{content:"\e532"}.fa-om:before{content:"\f679"}.fa-otter:before{content:"\f700"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-p:before{content:"\50"}.fa-pager:before{content:"\f815"}.fa-paint-roller:before{content:"\f5aa"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-palette:before{content:"\f53f"}.fa-pallet:before{content:"\f482"}.fa-panorama:before{content:"\e209"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-passport:before{content:"\f5ab"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-pause:before{content:"\f04c"}.fa-paw:before{content:"\f1b0"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-people-group:before{content:"\e533"}.fa-people-line:before{content:"\e534"}.fa-people-pulling:before{content:"\e535"}.fa-people-robbery:before{content:"\e536"}.fa-people-roof:before{content:"\e537"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-person-booth:before{content:"\f756"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-person-burst:before{content:"\e53b"}.fa-person-cane:before{content:"\e53c"}.fa-person-chalkboard:before{content:"\e53d"}.fa-person-circle-check:before{content:"\e53e"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-person-circle-minus:before{content:"\e540"}.fa-person-circle-plus:before{content:"\e541"}.fa-person-circle-question:before{content:"\e542"}.fa-person-circle-xmark:before{content:"\e543"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-person-dress-burst:before{content:"\e544"}.fa-person-drowning:before{content:"\e545"}.fa-person-falling:before{content:"\e546"}.fa-person-falling-burst:before{content:"\e547"}.fa-person-half-dress:before{content:"\e548"}.fa-person-harassing:before{content:"\e549"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-person-military-pointing:before{content:"\e54a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-person-military-to-person:before{content:"\e54c"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-person-pregnant:before{content:"\e31e"}.fa-person-rays:before{content:"\e54d"}.fa-person-rifle:before{content:"\e54e"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-person-shelter:before{content:"\e54f"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-person-through-window:before{content:"\e5a9"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-person-walking-luggage:before{content:"\e554"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-peseta-sign:before{content:"\e221"}.fa-peso-sign:before{content:"\e222"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-circle-check:before{content:"\e555"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-lock:before{content:"\e558"}.fa-plane-slash:before{content:"\e069"}.fa-plane-up:before{content:"\e22d"}.fa-plant-wilt:before{content:"\e5aa"}.fa-plate-wheat:before{content:"\e55a"}.fa-play:before{content:"\f04b"}.fa-plug:before{content:"\f1e6"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-plug-circle-check:before{content:"\e55c"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-plus-minus:before{content:"\e43c"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-power-off:before{content:"\f011"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-puzzle-piece:before{content:"\f12e"}.fa-q:before{content:"\51"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\3f"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-r:before{content:"\52"}.fa-radiation:before{content:"\f7b9"}.fa-radio:before{content:"\f8d7"}.fa-rainbow:before{content:"\f75b"}.fa-ranking-star:before{content:"\e561"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-recycle:before{content:"\f1b8"}.fa-registered:before{content:"\f25d"}.fa-repeat:before{content:"\f363"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-republican:before{content:"\f75e"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-road-barrier:before{content:"\e562"}.fa-road-bridge:before{content:"\e563"}.fa-road-circle-check:before{content:"\e564"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-road-circle-xmark:before{content:"\e566"}.fa-road-lock:before{content:"\e567"}.fa-road-spikes:before{content:"\e568"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-route:before{content:"\f4d7"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-rug:before{content:"\e569"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-rupiah-sign:before{content:"\e23d"}.fa-s:before{content:"\53"}.fa-sack-dollar:before{content:"\f81d"}.fa-sack-xmark:before{content:"\e56a"}.fa-sailboat:before{content:"\e445"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-school:before{content:"\f549"}.fa-school-circle-check:before{content:"\e56b"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-school-flag:before{content:"\e56e"}.fa-school-lock:before{content:"\e56f"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-screwdriver:before{content:"\f54a"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-scroll:before{content:"\f70e"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-sd-card:before{content:"\f7c2"}.fa-section:before{content:"\e447"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-server:before{content:"\f233"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-arrow-turn-right:before,.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-sheet-plastic:before{content:"\e571"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-shield-cat:before{content:"\e572"}.fa-shield-dog:before{content:"\e573"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-shield-heart:before{content:"\e574"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-shoe-prints:before{content:"\f54b"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-shop-lock:before{content:"\e4a5"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-shower:before{content:"\f2cc"}.fa-shrimp:before{content:"\e448"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-sim-card:before{content:"\f7c4"}.fa-sink:before{content:"\e06d"}.fa-sitemap:before{content:"\f0e8"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-spa:before{content:"\f5bb"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-spray-can:before{content:"\f5bd"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-square:before{content:"\f0c8"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-square-full:before{content:"\f45c"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-square-nfi:before{content:"\e576"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-square-person-confined:before{content:"\e577"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-square-virus:before{content:"\e578"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-stairs:before{content:"\e289"}.fa-stamp:before{content:"\f5bf"}.fa-stapler:before{content:"\e5af"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-stethoscope:before{content:"\f0f1"}.fa-stop:before{content:"\f04d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-slash:before{content:"\e071"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stroopwafel:before{content:"\f551"}.fa-subscript:before{content:"\f12c"}.fa-suitcase:before{content:"\f0f2"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-superscript:before{content:"\f12b"}.fa-swatchbook:before{content:"\f5c3"}.fa-synagogue:before{content:"\f69b"}.fa-syringe:before{content:"\f48e"}.fa-t:before{content:"\54"}.fa-table:before{content:"\f0ce"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-tablet-button:before{content:"\f10a"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tarp:before{content:"\e57b"}.fa-tarp-droplet:before{content:"\e57c"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-tent:before{content:"\e57d"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tent-arrows-down:before{content:"\e581"}.fa-tents:before{content:"\e582"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-text-width:before{content:"\f035"}.fa-thermometer:before{content:"\f491"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-ticket:before{content:"\f145"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-timeline:before{content:"\e29c"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toilet-portable:before{content:"\e583"}.fa-toilets-portable:before{content:"\e584"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-torii-gate:before{content:"\f6a1"}.fa-tornado:before{content:"\f76f"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-tower-cell:before{content:"\e585"}.fa-tower-observation:before{content:"\e586"}.fa-tractor:before{content:"\f722"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-train-tram:before{content:"\e5b4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-tree-city:before{content:"\e587"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-trophy:before{content:"\f091"}.fa-trowel:before{content:"\e589"}.fa-trowel-bricks:before{content:"\e58a"}.fa-truck:before{content:"\f0d1"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-truck-droplet:before{content:"\e58c"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-truck-field:before{content:"\e58d"}.fa-truck-field-un:before{content:"\e58e"}.fa-truck-front:before{content:"\e2b7"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-truck-plane:before{content:"\e58f"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-u:before{content:"\55"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-universal-access:before{content:"\f29a"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-upload:before{content:"\f093"}.fa-user:before{content:"\f007"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-clock:before{content:"\f4fd"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-user-graduate:before{content:"\f501"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-user-injured:before{content:"\f728"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-user-lock:before{content:"\f502"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-between-lines:before{content:"\e591"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-users-line:before{content:"\e592"}.fa-users-rays:before{content:"\e593"}.fa-users-rectangle:before{content:"\e594"}.fa-users-slash:before{content:"\e073"}.fa-users-viewfinder:before{content:"\e595"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-v:before{content:"\56"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-vault:before{content:"\e2c5"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-vial:before{content:"\f492"}.fa-vial-circle-check:before{content:"\e596"}.fa-vial-virus:before{content:"\e597"}.fa-vials:before{content:"\f493"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-virus:before{content:"\e074"}.fa-virus-covid:before{content:"\e4a8"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-voicemail:before{content:"\f897"}.fa-volcano:before{content:"\f770"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-vr-cardboard:before{content:"\f729"}.fa-w:before{content:"\57"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-wallet:before{content:"\f555"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-wand-sparkles:before{content:"\f72b"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-wave-square:before{content:"\f83e"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-wheelchair:before{content:"\f193"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-wind:before{content:"\f72e"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-worm:before{content:"\e599"}.fa-wrench:before{content:"\f0ad"}.fa-x:before{content:"\58"}.fa-x-ray:before{content:"\f497"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-xmarks-lines:before{content:"\e59a"}.fa-y:before{content:"\59"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-z:before{content:"\5a"}.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:Font Awesome\ 6 Brands;font-style:normal;font-weight:400;font-display:block;src:url(/static/sapl/frontend/fonts/fa-brands-400.86c7e1fa.woff2) format("woff2"),url(/static/sapl/frontend/fonts/fa-brands-400.f5defc2e.ttf) format("truetype")}.fa-brands,.fab{font-family:Font Awesome\ 6 Brands;font-weight:400}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-alipay:before{content:"\f642"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-amilia:before{content:"\f36d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-artstation:before{content:"\f77a"}.fa-asymmetrik:before{content:"\f372"}.fa-atlassian:before{content:"\f77b"}.fa-audible:before{content:"\f373"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-bandcamp:before{content:"\f2d5"}.fa-battle-net:before{content:"\f835"}.fa-behance:before{content:"\f1b4"}.fa-bilibili:before{content:"\e3d9"}.fa-bimobject:before{content:"\f378"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bootstrap:before{content:"\f836"}.fa-bots:before{content:"\e340"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-buromobelexperte:before{content:"\f37f"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cmplid:before{content:"\e360"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cotton-bureau:before{content:"\f89e"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-critical-role:before{content:"\f6c9"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dhl:before{content:"\f790"}.fa-diaspora:before{content:"\f791"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-elementor:before{content:"\f430"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-evernote:before{content:"\f839"}.fa-expeditedssl:before{content:"\f23e"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-figma:before{content:"\f799"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-fly:before{content:"\f417"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-fulcrum:before{content:"\f50b"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-gofore:before{content:"\f3a7"}.fa-golang:before{content:"\e40f"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-wallet:before{content:"\f1ee"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-gulp:before{content:"\f3ae"}.fa-hacker-news:before{content:"\f1d4"}.fa-hackerrank:before{content:"\f5f7"}.fa-hashnode:before{content:"\e499"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-hive:before{content:"\e07f"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-hotjar:before{content:"\f3b1"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-ideal:before{content:"\e013"}.fa-imdb:before{content:"\f2d8"}.fa-instagram:before{content:"\f16d"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaggle:before{content:"\f5fa"}.fa-keybase:before{content:"\f4f5"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-leanpub:before{content:"\f212"}.fa-less:before{content:"\f41d"}.fa-line:before{content:"\f3c0"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-mailchimp:before{content:"\f59e"}.fa-mandalorian:before{content:"\f50f"}.fa-markdown:before{content:"\f60f"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medapps:before{content:"\f3c6"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-mendeley:before{content:"\f7b3"}.fa-meta:before{content:"\e49b"}.fa-microblog:before{content:"\e01a"}.fa-microsoft:before{content:"\f3ca"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-nfc-directional:before{content:"\e530"}.fa-nfc-symbol:before{content:"\e531"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-padlet:before{content:"\e4a0"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-palfed:before{content:"\f3d8"}.fa-patreon:before{content:"\f3d9"}.fa-paypal:before{content:"\f1ed"}.fa-perbyte:before{content:"\e083"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pix:before{content:"\e43a"}.fa-playstation:before{content:"\f3df"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-r-project:before{content:"\f4f7"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-redhat:before{content:"\f7bc"}.fa-renren:before{content:"\f18b"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-rev:before{content:"\f5b2"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rust:before{content:"\e07a"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-schlix:before{content:"\f3ea"}.fa-screenpal:before{content:"\e570"}.fa-scribd:before{content:"\f28a"}.fa-searchengin:before{content:"\f3eb"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-servicestack:before{content:"\f3ec"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopify:before{content:"\e057"}.fa-shopware:before{content:"\f5b5"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sith:before{content:"\f512"}.fa-sitrox:before{content:"\e44a"}.fa-sketch:before{content:"\f7c6"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-slideshare:before{content:"\f1e7"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-space-awesome:before{content:"\e5ac"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spotify:before{content:"\f1bc"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-symbol:before{content:"\f3f6"}.fa-sticker-mule:before{content:"\f3f7"}.fa-strava:before{content:"\f428"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-superpowers:before{content:"\f2dd"}.fa-supple:before{content:"\f3f9"}.fa-suse:before{content:"\f7d6"}.fa-swift:before{content:"\f8e1"}.fa-symfony:before{content:"\f83d"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-the-red-yeti:before{content:"\f69d"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-think-peaks:before{content:"\f731"}.fa-tiktok:before{content:"\e07b"}.fa-trade-federation:before{content:"\f513"}.fa-trello:before{content:"\f181"}.fa-tumblr:before{content:"\f173"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-uncharted:before{content:"\e084"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-vaadin:before{content:"\f408"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viber:before{content:"\f409"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-vuejs:before{content:"\f41f"}.fa-watchman-monitoring:before{content:"\e087"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whmcs:before{content:"\f40d"}.fa-wikipedia-w:before{content:"\f266"}.fa-windows:before{content:"\f17a"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-zhihu:before{content:"\f63f"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:Font Awesome\ 6 Free;font-style:normal;font-weight:400;font-display:block;src:url(/static/sapl/frontend/fonts/fa-regular-400.e0550912.woff2) format("woff2"),url(/static/sapl/frontend/fonts/fa-regular-400.3edb9004.ttf) format("truetype")}.fa-regular,.far{font-family:Font Awesome\ 6 Free;font-weight:400}:host,:root{--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:Font Awesome\ 6 Free;font-style:normal;font-weight:900;font-display:block;src:url(/static/sapl/frontend/fonts/fa-solid-900.64d5644d.woff2) format("woff2"),url(/static/sapl/frontend/fonts/fa-solid-900.f418d876.ttf) format("truetype")}.fa-solid,.fas{font-family:Font Awesome\ 6 Free;font-weight:900}@font-face{font-family:Font Awesome\ 5 Brands;font-display:block;font-weight:400;src:url(/static/sapl/frontend/fonts/fa-brands-400.86c7e1fa.woff2) format("woff2"),url(/static/sapl/frontend/fonts/fa-brands-400.f5defc2e.ttf) format("truetype")}@font-face{font-family:Font Awesome\ 5 Free;font-display:block;font-weight:900;src:url(/static/sapl/frontend/fonts/fa-solid-900.64d5644d.woff2) format("woff2"),url(/static/sapl/frontend/fonts/fa-solid-900.f418d876.ttf) format("truetype")}@font-face{font-family:Font Awesome\ 5 Free;font-display:block;font-weight:400;src:url(/static/sapl/frontend/fonts/fa-regular-400.e0550912.woff2) format("woff2"),url(/static/sapl/frontend/fonts/fa-regular-400.3edb9004.ttf) format("truetype")}@font-face{font-family:FontAwesome;font-display:block;src:url(/static/sapl/frontend/fonts/fa-solid-900.64d5644d.woff2) format("woff2"),url(/static/sapl/frontend/fonts/fa-solid-900.f418d876.ttf) format("truetype")}@font-face{font-family:FontAwesome;font-display:block;src:url(/static/sapl/frontend/fonts/fa-brands-400.86c7e1fa.woff2) format("woff2"),url(/static/sapl/frontend/fonts/fa-brands-400.f5defc2e.ttf) format("truetype")}@font-face{font-family:FontAwesome;font-display:block;src:url(/static/sapl/frontend/fonts/fa-regular-400.e0550912.woff2) format("woff2"),url(/static/sapl/frontend/fonts/fa-regular-400.3edb9004.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:FontAwesome;font-display:block;src:url(data:font/woff2;base64,d09GMgABAAAAABKoAAoAAAAAJCwAABJgAwEFAAAAAAAAAAAAAAAAAAAAAAAAAAAAATgCJAQgBmADgRwAghzKuSjLUAWJAAcghRUSEVW1HwKgkbJw/n4/vdPyPdnSaGRpRjiTXW8MUi0lS6ZYyia3Gx3Gx9kjzBGnxC4lKXMKxCoA/DXFL7JLYPtfr7P+XAnU6largQUkOwuwrYmwIJDW7AueTdGbshkPY5iAKKOxXwjxczPzQsr1nxPvL2f883OpZ+EHqstITjggOzk349//KfwkJ3LD3LjEKV/a5dIrpIDgRqhyV6KDAYCaAyCFwkxvakLNWLnHYNllGqiISm37dwYQoIQqrHzyHcXN/Iy/Q0X5HwCa/LJ89X0vS7NCGWEBADqA+EHZAbCYFQBKPpsBKHltph8kSfVK4ClACL5NIIcv44/wRaAC4EV4JwCsh3v7OxyAZwIooJYqLYp2/RbOvPryi6EYn/mXJ+DhjwXkeA0BgCfwbQDQAMDR9xIK0P/ZYbHZLB3yNuQg49Az/C1PT4UjsJUc5B7tSFE+PigARMm3swMQzKHuXQeGx2ksZolLAOBDCbU/dT6UUQeAU9CAMtTGZ47Xx3eOnzIejZ87fsH4RePXjN87fv/4w+MfjH82/u34D5PKJJqcmpw/uWhy1eSmyS2T2yaPm7x88q+/HPjLE2YzgPGZ4/XxHeMn1+FquA+X25zcNnn0r8UL/hn+Br7Ld/iT+RP5E/jD+Sa/md/A1/gKP8ZjTtlf2C/Y99l32VfY59hn2WfYu9kL2FFmWu+Fcc70jztCBZgVOMICfJiDQ9CAhwFgMyRa4PhS9Ju9LB04S0kcESfJSNLnilNXogw3pwWjlFKGedihxnXXja776HXxddfF1330OiwoZdNs27BglD5h+rft7Yu2t1e20dxe2d4eMH72xfaNq3AMQMZJ90sjzdJMSCE1crhtUZh0szTrplmcxIlGNCKkkO+sLiS1mqKk6WWXpami1OpJUjUYM+aqrovoutWwuN9czlZXj0E+Vppedmx1NVtumuZfT0LVddfMicwKBbCAiwBaPkctCpM4GURBX0iRpNHGOEuz/iAKkPtfbWM8WFrDVAoZ9AdRnMRrmPZ7dRREI1HQH6RZWkcRKKBvEKqqFm4ucKIZQ2JWyLqhEZ7cjJaqUrKh6xsms/DmhBPNWNeNChkaGuELt6DFzA29qJChphC+sIkWMzd0fcNkFm4ucKJoQ1KpkCFVCV/YRIuZGxDhKh2SyuLA/bsLDkEKkMVRN+SYxFFINBII2U+ztI1ZOlhqI0Ya0epItMCvo+j31lCKLM0GcfIDwzKNS2qGpWkeKmI3oITVLqFUotwNdJ3VL6VUGnBf2/Z8VOQ7KL2kRhUa7EgFPc+uXWKYliHxQMLjUHpJjREqdgMF152qwgAgQ0ff751VGd58HHUJnUQ/3w10zULOFOkN8vTuEfVmx2zPQ0V8EKODoAoNdoXSQNQ/2JHKXHHBbiFARqaG8iywTUhB/nO3bhj6XYam8eVlTjQjberdhkZec3lL17cq3MICLV65AE+2ZTaDNZxhDiFAi2hJfBInocKJWZpvNvoE/7llMlYgY+YWIVsm41jEi+rvb1iGiFa2zIlq3E0qhs4Tbsy+ArgHVWjD2XA13Afg9WRXBI6QzZ4UgU+0qBknceIsZWlf9mRXzKO/VoX4JKZX9Uk3aY/oSTGPGaykwShFji/iHhamW6EUSCkbpaEc3SjWNkZpnpsa9yhl0w9yTLIqZIgbjNKCUlYyPGeUbhZi94IBI0pZcsAmo7Rxdn/HwnpCdDqDGM4CkP1elg6WkvgIhkk8cJaydBWTLWhEI46QQrZm6CeOQqLNoy/FKgZCijVMB0vJJkry4HCL1SpitbqIr36RyRiis/UIGTNfREijv3qEXIcYpVitLs5gsVrFyW5FI3xY5WOsc6IZu8QwCD94Gy04BdAKSVebx6bTR/xRmmmWZoOlJI48xqCWB0Bt5XSfbDQH1sBG1XWRUnb3urNw+FuUGpZlfHPxAJRmsRsJ0HWr0/3SNm4ySjFHz7MXv2lYlkHptw4zsioR/oj+LlWzCWvIohDjXlexJ0Xg+EQ7gslPM83SzImTOMFrCZyP9VFR/3DrNeREq+i+PwdzmI2LK9oEgCBnBS5iAXMArSwaLMkULuTGFzAK+kF/gJJda1ZqCyiCQ1mzgadP37534xk+43hpqdRonDzvxv19rQbzda2DcDXcCdDSSPfLP07iRJai84kI2ZKijkIGQgoZ+FJk6Rqma5hmDJQk0g34l411FFnaxngN0zaGkUY00m2R8f9Moo7pIE66CmAYrpwYDk+shCHGfxemK9Q6cGIekXOk1DygK2ROl8jKzD9q85AoKtcMY47pRGfc5swoqer6YBDgkw6aqlq2NWdewQNF5ajRv7rckcSh8wsuMZzEJFpJP1CpsjI7pPuszJD4ZWLTklom5YpZsQPfc/wyLiR5y1ArFavnlHXGlo9BGQBAARxBAAehAwMAFLIrZKARjTTjJE4GaZZmTRIF/YEUsitkkD2yGjQHTfyBzyxEi/nTzdhO4p49GtmvOaZjhBngiMuBINJ63mjs5YAiPcTsV/gF3IPzAFqBRsSMJCFSEO0IoiTp9+qYJUTDEOSOUafrc5RZorIQ0btB2khklkoR4BeUYEcY8sN1wWZxN1DQUzXLqK2vi0VpsBPQMtL5dSCbdwSi59q14bDGveBpOwLR9ezauSXgYCjR2oEXOxUuo1pG3QphtfVhjZGKp3fySmMdXIrj0IeL4A4AL+336ooIfK5oUdhW4sHSmiLTfrcn2GiVS5KhJDJLVFmrUKr0DHO0/q2oqsJiVY1ZbLikXE7Yh7nns4ix6TMOnwKfHN4zd8/cdOVEUNL1UnCCkG2NeMvyPmpZ1/Ez9cpasBZTxiLme3z6jMgB4JOP3TN3z9xKtei+gzMIlnW9AWTLOaTkOAIfDkMPVuBMGMJ1AGMq9IWcD+I06w/ipDVPPR1Xh6BGLQT9RIGeFAXqwLjvREIKOSDcIo6QQqaZeu3c/9CzXaXsKorb8RC9Mkcsc+aV05xHG2MxHaHrVvNUIcciOEKOrlvd79QbiI1653jEYw/ROwc9V1FcDztl+0XoutUZ1AdPZlqNS1ElL/LMYrldodCpN0zP7BrvOxxHYR2uhfvgyRxQCEmX99Nijo8cuvQYJ1maxBzDbtw1Lkrulgr4k17WLYpFSC79Ss1kjHJpIFDKKJnWWdO9oJIj0kK1BabqJNAmFso2jz3qihrCGaXTPRvIwouDCvFeguh6BpGqA6j6YMJcuRpshsQHYQDgNWUr30ZdhmuSQ6I2B3ESc7QYIrM0GzQJXa2BuVLrbTUWL6bKLt3NGrAx1JAff0ipZRlGcT4nZZoFqJKSDUkK+3VHYjgCgE3lBWR8vFKYdOOBLgoKbNys6TQdHM08mNVcPidVe+QX7U0LzHFmak5HVddBdJ0qjmatqkG0V9zEfFoAlMCeFbiFk2e0oP3EnhM5fewoQd4R05lRZWt/Hx+Me3pbgg9NUEDOvqgsYAG1B5FWLC+FKCCaGBkiztI1Jc1EHUmvjsn3YxsdfMKruVo2HjqomJb57OeYponVh4yyyl5zDuGcnHM9Ue/xFXrVYyw1xZZUGDMefB2junb++ZpO2eseNBhT5PMtROv5vy8tP86kVzqlyv3T7wECzAossIA2gNcXUshAI2wLRCsYzWjd8kSTaUKcxIRcH7xoTCLZ2J2prSwsnjwahq6mli3TNDXD8+ZCKRABXbcKC4Uc75xcXFBQiJZlmppaLpuBaaGQYcemc8u3oEYiZipEYTJUolVMMyeRvNi8T42nCB+ikOEYVd/iOHnj4XELp2PjBZk0ETaixaw7hTazt2zIKk6ctBwmpJCOPC+KK8tiJfKdIZTi7G1CFkPb3lkxHT/BZjlEWOAe+HB8pSAlQebX0HvYX0MkD8XF8uW0iAvz+FXClsLl/KrjTE+LpzJE41FChSTTn4q0zo5f5SAwtq46ZgpO6ml/I+g4bhsJ8s2oHgaGZtRRctwgHmgwg80N7Ilp0ojCiGbcmhFWtA6zyP8yZaysa/tXRKlUfavQdNO0pZzkDNPZnM0X+KPLPu2jvJCf3VScm1rhinNnjqKOHVtaYqe5LaXQdHOcKRbJth2wy2nbnCsgBXYwoT/SGBVs4H48DLhOUG88m0K/6a9VjAzlhAiTC0uYsUz5gBkcAmyvyCj013zTRQjyvmfDYLiOzs4EEXB8DOdWekIpcQ8nYUmbsyRbPaGk4ET83h8GNyjGiy9e1jhXcb3zYv52UT+4KfJ5sZlOpaSUkrF7WVpKJVOp9AuzWc8RYkvYNuckKlQttWX67YrFjbW3aO/6bD5P+qLiPIZm3MlMPzzOZse2lIaRSkmlhJFmhpT2Ec/zM35SdjDRNmiMS7CKy3AjBsCq5YwFay7F5PnksudNO1Sk1soqoy9YqngE1jHasOsTPKI456bFzzydIvGUyTm3PTD95BdhfCh5OqYwy8k/jdtSTNDaU/BBqJCinorp3O6isIz8ZtEtne6nR5H865D5Te+XHD9SA1cvoQ37FZIBAf1N9ZKnIXCw7NMJ5eYaKxHLXELm5/2kw2vxTUxojDKehWtxGojK6y8Xf44wEWnBu0jChYiczcMUXMeNHNdga34Y5XWdHWOG6wRFYzSC/B8q0eulbWlddFO+yTS5aUkza5eVIpqdXV2dnaVMZqbsaJrjaJozQyqb9aSeMni+m9gjVOwlVsdLEHQcfN/klsWZmZOVfGF2dXa2gfCFoiP6ddvlaNOvbOUEN3OGlHauRpzbZDTYnP8oR4Tlg6+Qp+8pyCRaU8GyyHNOr67vrpIMwj4spOLhut2WQbZiD2D1Vq4iU9ctMqXXMdd7I0VCmD2LyVLvnzTI3KMIb03g2RpoA/PAqs8xx5JbFDyWqzQgZapzcl/pgUK/FOpfOQOfa5pS2V9rhVHJq29UYPSvoZVReu0qfVHZZT9EoSZCLWoaLZJ18Sf0Ehpj06fqv0hRKNSqZqgYBW0RLPtIx3WYq46QZ6pucCpKreinaEZhUN9SnO/b0krphmG/9uDsRnNlJUWCK5ubREYY3rKlOHehsx3eCpwrl+kjVcq6Ydi2tFL+4t3Zx6hcbpk2N0lwZd4SBBrn6j0MvIi1tGVCIwL9bIl8ZV6N6qOBZ+I6IB9GgbNMyriupPBUjVjJgt3iFh3XzV+7wYJo/FfzwnMKnLlq2alzNGyL9eilOojLga2bmsoQZZS2paksUVZpHcpk6Hs7H8oR5RR3KaYGmssu25xkiDIB5McYbEIHNEYORcxiESWPZFSlVM4QM33ga+RWIuYHzHcrUd4vMfpfz5TTA8vc4davmBDsV5K/8NlvuPnFtzxxy4tufMOJF72f7n7//x61rEez6h+m+Q+V3X7kkdu3t29/5JHpFz75SSAFOvilBrqIFTRxFe4EyGB1g9UN5rgGM5jhOkEYhZEThJF1X33NZ5ZHfQwWpNlNuLa9Xi6TFslCQdc1Ld2orOQb7Rxk7upeSkCDtvRSKbpNm3Nt8cV5F4Iu0vxCrda+KfLnFzQ9naZcLpun+YVatd2u1RYW6E9Fd4HgXC1qUfQjy3vgWXgV/kbX0WP0bc3UHtP+o9+rf0b/eep5qW+m2+mvGvczyR5m72K/M0PzZebnzL/wDf4O0RBftXpSk1X5oHyd/IR9zH7C/qG6E4BDCgQAAOZwEYT1v24VwU9WIzQwHItTOo7iZ9lTcFQaDcSUgTI+v07gGKeKD1hwcW8elcUimSTXhjUdlOIAmtpOnCLcQK+nNCh6IaXjbu0X2VNwVBqnNJ0ycJX2OCVwL61SFqr0PSqLtt66m3JQ9MI7e11vv3vSH3nn41HiDePhhXOdXa+/HQ+8UTfxOoNTXhLH5872k+rt3Z0L5zq718SDxDux3x3F57veXtO7Mj4/7CT9k/1z/eS53u3dnQvnOru9JBmO2rXa6XiQdPbhv4Pqdnz+7u7uqB8PvChcr15aX28F9UbLO1QrAvtMbS+s1quNw1fGw+fu9nd6iXdo+7DXfsA18SApWHyviUiBHceWHG/LfPAbijvRQxce9tHFSfgYwcN5xBghgYchYgxxAefQwS489LGNGAN4GKELdWYdDHAKHhLEiHEOZ9FHgipuRxc7pck1JcMSeDjRWtgIMc63Ld5DEx6uTNMeooMEfZxEH+fqqum58M7D95AgwRAjtFFDDadrV3dOpIqrtfO4G13sYoQ+5j/zCCHWUcWlqGMdLQSoo4EWPBzC06SmwdrwEKKKOqpo4DD+xkM8F7voYwfHQ+fhELZxGF7faZoo5LRxD01Q4988Ttfsx/uURaMFPMX8DwMDAAAA) format("woff2"),url(/static/sapl/frontend/fonts/fa-v4compatibility.7e7e1dad.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} + +/*! jQuery UI - v1.12.0 - 2016-07-08 +* http://jqueryui.com +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=deedf7&bgTextureHeader=highlight_soft&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=glass&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=3baae3&bgTextureActive=glass&bgImgOpacityActive=50&borderColorActive=2694e8&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=ffef8f&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=flat&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=eeeeee&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=90&opacityOverlay=80&bgColorShadow=000000&bgTextureShadow=highlight_hard&bgImgOpacityShadow=70&opacityShadow=30&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px +* Copyright jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-active,.ui-menu .ui-state-focus{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:active,.ui-button:hover,.ui-button:link,.ui-button:visited{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}button.ui-button::-moz-focus-inner,input.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup>.ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup>.ui-controlgroup-item.ui-visual-focus,.ui-controlgroup>.ui-controlgroup-item:focus{z-index:9999}.ui-controlgroup-vertical>.ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label+.ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label+.ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc(100% - 2.4em)}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-next-hover,.ui-datepicker .ui-datepicker-prev-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td a,.ui-datepicker td span{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw,.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url(data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==);height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:700;line-height:1.5;padding:2px .4em;margin:.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #aed0ea}.ui-widget-content{border:1px solid #ddd;background:#f2f5f7 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAABkEAIAAACY3hF0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAIpJREFUKM/tz6ENwkAUgOE/DYYJUA0KZkFUIetxqKJZgQUYguJBIQDVAQhhAESTtnf33r0mMAGakKA+/RHPZv01AYA/n2jxSMKeExXqLO9n6CI+rUYusbANkmptE8JKl/GIP8gjZviBzPWGy0OlBd0uZDqkG/u7lMlrzZaSdupTGdE0zoXw7eZP8Qbj00P2LE1L9gAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wNy0wOFQyMDowOTo0OCswMjowMDFydjoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMDctMDhUMjA6MDk6NDgrMDI6MDBAL86GAAAAAElFTkSuQmCC) 50% top repeat-x;color:#362b36}.ui-widget-content a{color:#362b36}.ui-widget-header{border:1px solid #aed0ea;background:#deedf7 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAABkEAIAAACY3hF0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAMFJREFUKM/lkD1qwgAYQB8fuHQpgpBO7eDgUByFdO0RuiX0Dj1DzqD0BmZyd9RFTKd2Kc2UQEUL5qdtSJOYCJ+Dh1Do9JYHDx7ZrFrsXwQA/g0CEipRG5cPwdYxvqjFGJ/vVTnYG6R1MW1C0nZhNq6ooQ4e8fVfr+kTdfLnOmF7kbfqiWihT8z5KrJVfcsmzh52kei7PjIVNXDwjsqMz/XPTfUrmDriTfQKh6WodazfMeSV8D7tVpcEQZKU5akvnTkO8y9eZNHr5WMAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDctMDhUMjA6MDk6NDgrMDI6MDAxcnY6AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA3LTA4VDIwOjA5OjQ4KzAyOjAwQC/OhgAAAABJRU5ErkJggg==) 50% 50% repeat-x;color:#222;font-weight:700}.ui-widget-header a{color:#222}.ui-button,.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,html .ui-button.ui-state-disabled:active,html .ui-button.ui-state-disabled:hover{border:1px solid #aed0ea;background:#d7ebf9 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQEAIAAACwqkHPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAJhJREFUSMftzyEOggAYBeD33mZz02pwYxo1GDQT5BBsJr0RBzA4TkAyOzwBBTcx6BwGHEESSPAUTsOfvvzhHr38dy4AAAzDMIxvgzQtirrGyX9Om644QoCpuOQOM2RO2Wu2uMTltcmkkAld6cgrPDHmDZ4UMoGLfF4NWgePfXVuV9KGERbimAEmwgFrDEUHfXT+Im0YhvFDPkIzLk7A/EzKAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTA4VDIwOjA5OjQ4KzAyOjAwMXJ2OgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0wOFQyMDowOTo0OCswMjowMEAvzoYAAAAASUVORK5CYII=) 50% 50% repeat-x;font-weight:700;color:#2779aa}.ui-button,.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button{color:#2779aa;text-decoration:none}.ui-button:focus,.ui-button:hover,.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{border:1px solid #74b2e2;background:#e4f1fb url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQEAIAAACwqkHPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAJxJREFUSMftz60KwmAYhuHnedEkiFGwujC2uGTRYjAurAp6Ip6BmCyLO4gVk8XgYTiTf3yD/cD2gcFjEA1vutoNN16Hamf3AgCAoiiK8m2QZcY0Da5h7rY9YYENxsIBt3CFHmL4wjVTBLjNi1n7wP1Ydq2D57Q826VwxRQBjNQTe0K+qC+2EnqM6X9ijjBhhKFghD46fzGtKIryQ95Jgy/jpWK+ggAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wNy0wOFQyMDowOTo0OCswMjowMDFydjoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMDctMDhUMjA6MDk6NDgrMDI6MDBAL86GAAAAAElFTkSuQmCC) 50% 50% repeat-x;font-weight:700;color:#0070a3}.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,a.ui-button:focus,a.ui-button:hover{color:#0070a3;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px #5e9ed6}.ui-button.ui-state-active:hover,.ui-button:active,.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active{border:1px solid #2694e8;background:#3baae3 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQEAIAAACwqkHPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAI5JREFUSMdjSJq6e/fLJiYGBgYGBoZRapQapUapUYrm1M1l79//SmRi7GZczWjBxFLJ2MRQz8Ryh2kNYx8Tix3TdYbZTKwsTLqM2yHUDibWdOYIhqNMbOlM4YzH0ORYFjIxMaxkYrVjus44m6G4/7DE6/dMTIGMjIyhTIzJDNoMfIPD06PUKDVKjVIDRwEAMuIhVFSEkAcAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDctMDhUMjA6MDk6NDgrMDI6MDAxcnY6AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA3LTA4VDIwOjA5OjQ4KzAyOjAwQC/OhgAAAABJRU5ErkJggg==) 50% 50% repeat-x;font-weight:700;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#2694e8;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #f9dd34;background:#ffef8f url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAABkEAIAAACY3hF0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAHNJREFUKM/lkM0Jg2AQBYdXyJc+tI/EJnKyEFvwbkuBCHoQ9CDiMfA8rCGCBSSQ0zD72B8WeynquwDgj/CiEzC5FDBSfswDNwG9s0AuoAtrnQIXAS1JwPNdTALv2cM69+3DBq4HG+OIWOvZlYCV5vtf+mlsEsU1wS9R7TYAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDctMDhUMjA6MDk6NDgrMDI6MDAxcnY6AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA3LTA4VDIwOjA5OjQ4KzAyOjAwQC/OhgAAAABJRU5ErkJggg==) 50% top repeat-x;color:#363636}.ui-state-checked{border:1px solid #f9dd34;background:#ffef8f}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#cd0a0a;color:#fff}.ui-state-error a,.ui-state-error-text,.ui-widget-content .ui-state-error a,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error a,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:400}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon,.ui-widget-header .ui-icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABLFBMVEVyp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp89yp8/Wi14BAAAAY3RSTlMAWEd8IjKY4b3Ld2acsomqpVpOeudAQGVmhVOLRpGUY2NhTaBobXqbc6W/fcC8463l6eSBjl3f3eC51tvSxNXU12LacP4Nzplp+DgqFhzFedHjp4FYyJPQ2K/wzZCniLC7x6vHwZbrAAAAAWJLR0QAiAUdSAAAAAd0SU1FB98KExc1Hf/+/xAAAA+BSURBVHja7V0LYxvFEd67iyQsxycZJGgDCYrBKSR1WjdJX5RCGiJICzFpmxCamFLm//+H7t5rZ2f2oeNk6Wzv58T23D7nu9m9md09WYiIiIgeIIFk213Ysv7QcwY6dy8Bv/4JZkBl3iwhxAJBwSSA9sdIV6kJvgLAGgBPA6R88etGTYJaICcgof0x0ukdZATQ4rwBljnZIAOs/3YVPOmcQUFy+2u3ZU68mdYKZsG8i/QGcwvx3mFuAZ4ObN4C7KSwLvoIYKWBmYindmKCm58DVuDjTJ8CdAht/imwdVx2RygiIiIiIiKixzhzT3DLflDCojWgzntCS9DsRoCfsAZ86wFsQUjWvlFKLB1gBLAMNLsZLiasAUqAJ7pUtW8yGGL9t/fYk2xZUUk8xUVgCRAKAja2HMAtWNhs1ojWVlgPSMzafCNq2xZgReLpcff1AD5CtjoHhHHRnwIREREREREREdtDN8c/6JoG6+8ceHSsAPh2KrTI3bl//DgA61CgNvBf4eqRZOBZzOLgSrM34O2AJdXfvq0GH0EsnVXGNODNAUkER2LNKKuPFABX4grt83AZQgTwBSDwaxAu7sliKljlJmtWZnZaoZc/aw6vCXkHkLBZCGHcUtxvouEW2qgXHOOWM0TgTw/USG4HBG9IoAEQ1jbdqdt+Cpxx+fBjMiIiIiIiIuKyovux1I5uRmI5je6u0uaHBreqAs2368BKDfjjeba3aukAShd4c2oFr05ldgcnYN3e551kVbrbt8S3VAFf3WC9qYgfgbcneW8th90TLwGBs+HCamY+Brz8JZblnsDygxHO1uFwfYHtnRMLYuGwJRpnr2yIFTpgT7UyTGqn5S024C7OCGA94N0z0+kQCxNg74DzFq6UzAJmNwHWvXW+Q++8AWwIkCESHAL2UZ44czCGvYcDeB6LgQmzAsF26AMEkEmQpLJpKbSCQ9u33CN/sr0XDgJXCd4DFsAz93s9YNvvx0RERERERPQaZ/sU544KeVXWUmK9jkW4OmiXvaX+wK/g6M9aArO20n450ZhmBqfIdnb8G1/tAey0uOk7lnuTnrfDA66+JQMwhYURfXoJAXudXQlwv99dJHk+H8C2nmHuV7P++oKDuiy4iq+dgDrcdBGQWMJh3nVPPMXTbbvTQFLBnxnWSEFi6SELdwGbKHjHsKU2uiDiPbNiJYAOibWHd3pSU4sJLDoz3++3pBPBNuwxIYyfACEhwrvDXNFh0Sl5YyQQvYYOAYXWH/zrRxcQF12/iIiIiIiLjfScP8gsbgf4tquoN/xz9O/TVoB1m8X0vtLgbiCkpFKvKESvNkPY0WWB4hWlagopCobM+C6F0gJ0fmHdAmcE9mXYAI9e6PF6qb8RnRkEQEmCEc9SEeubQL8IsGy/c4JSIlMC8E9hid3QtaQZYn0ZAitYAMtvntgoCXJYAD2vUNPdG/2ZjmwOIDmsKzSpthI6B1gOyPTG/HWfDAn/cEz5KH9qVwgsvyls8LMyWzDA6Wh3k+gz0IekhwR0RRv9IyIiIiIuFzLlJ2Sr578ykLiyqd4NZedGQ1+ONwKeG+yUrpJLxYwmZ34+rogxwFhcIRWgErtS3BUOmSaKqxVIgVol2MvzIXL2it8NQgq3aMJPP9fitNJwaujb9JjKbGdrt0qvez0Yw2AA44HRAcGCCXrW1iqUFya2FpsgLc/ztAQhZGQQgBgAZaID3eKOQYCsel+icaWhtgDXfndZna5wAIM333wLMAGz2cz/BobABIgAAbsGgaBURxckIQkmpOygSfh8/vZ87rIAGAL6oRqu5gBAHTR6PC+KzzUBb77zi18aBFy7do0dj3fL5AIlQOn/LibANCmQ+ps2Bu+l6gs1eE3BaQH7SnUY7ut1gKyw/4YAVT9aYiur0xXKIXD9Oh4CMyFvgfzeFMiKr59JgNL/6o133QQk5IK8kiT7CQph4P3Fwj0HwL5kQOqPCSj+NQQUkyAi4KYqffNmfeGgnAQPiDqoACeAvaIhCAEf4PWJyfSq/J67CKANwocFUIOHh4egTZRZQLY/HMpveggUspuAwxLVhWQM74zHt2CM3xFCQ0he+FXxhfUdUAIGhAAwLGCi9fcQ0FT3UQFicoOGAGoB2X6B+hYxGdQcOwRjTI7HzVNgXLc/dloAJyA0BHB6OQfmTeaGgMxsr6mu9APgDeEAsQD62MtY/ZPyHuAqMv3oBq5wYNL7uBA/Fo4LlICCgVysD1k2LdDC12Mcmq5LODu0Wq6h2F2r/hERERERPcft2/70FLzr2gC2o48EmQ537xSPqTu1WAXbTYw9qeRJU7Z0TXZXloX4NelP7n2uyWhrTi7JxzbWP8s0AyPlRR6Nh9oP2ZFdnuw0jpyVikxfv1O54jUDsrAC2WkyPZuxcgVXlsv70WiQK2cubZ7tqeJ2gu/pXYC7RH/luC20/so3b6JfejqcOWYCfiO/9nCHMnmfM5Tf2BuksYX4rTgWv8Px7VgKY0MWpvz24G0kq/5Pp64OQuXsV3JtcMjiZGenae251isWTXTFCShXBxAB927ef3DjJlo2yqR9Z7g/XgJ+D3+QX3/ECirXn8g4+JCx8QClT80OVs58am/vdi2ieWAEe1PJQSnsVM56tuMioJoFkAXswZ/gtu6Q1B8t2YUt4M/iE/EXvaR0SCzgkFjAobKAuZanRuwhR0A5STXxLWnv01L6tOlgEcxrAygC1AzpGybg3s0PPpRfdv0rTx0TkEKx6lTLf4XP5Nfn6MSEMcYL+S0io/Ri/Ep86CCgju5So0PEfgSGOcvDYCgWRrxICMgIw0T/5kSESQCSH35ybXTtb48qeb+ubnc1eWrePcGGQCVj8e5dLSvbb9Y7rQQIAnlBrQ+6j9CQRe47VYf1U0AdMRKuIaGGO6nOLwuiPw/gU6y/uP+FnP4mX9xvCJDjP/WUZ4pO2CRqLrKyRX7iB9BlbyLbPgHGJ0+p/vQxKMpDXTq52BG4mjflgdVgYCzOIfIWAb7hA0VEREREbAFDvDCtXDk4ZHke61/P+GhhsRXhffpBlx6ksJTfl/jRfATI1XwXvvzyq6/gEerOntK/gPzl1g24dw9u3KrTy9gNc1liSGR6oQneqN80htFw+MRgwP/hYiFMZV1jFG2CZGBJvfGF9rz+rvAP7Youh7KCKQtumnQjNmUvWVfBq84jXcdMBjt6c7BM0MGVcoyX8MRyWvZnEqBcLVRC6V78Nw1AE/D1N48ff/O17s9QQD7V7honoIxG6p2mYjEKHXhIRblUkWpfO1PrMYiAB2qvDje4VKy7CKDhJVeXpJe7e9qiloWs9U/N/FDY+m5T/KlMGiF3FQbkQIZZvtgHRRlABZ4ynhPYAiYTfF59fHKiwktNgNRfoCUwyjgNFuwiMfGm/7UNIP3LO1jPAZ/BrgQ8bTLkuVEe5n4CDuSvB+pfnawMbAgLZAEken3wYP/BCRw1FT5RvRutjwBqAd8W8jNTf63geFlgYRbXhEH63nw+Nwio7mz5Y7FYvP9wsXhIDjwsnXPAyYkaAHgSfDIcjtY4CZI54NtqDqgYUPrnRjh6S/V3oYsv9+AIMaAqOkDTXgYmAR99VP0jBuKcA4bZyckJnGAG6GNw3U+BZ+IZjv9p6LacTPSClZwB5b9UMwDGj/rX3foCfQwqiyjhmANgqIAJsN3DLgQQpMW9f1b7AZYzguYMK63lSapmysd16j//9W/zY11EMWtU0iBTS3pZfWCjvR+wfRw8f36AxOme4ip93DBGO2w8BiMiIiI6Y4hPR7/4Tk0x373Ydqc2iJcALxvh+3rW/X7b3doYrit1r1fCi/KJo75rG5jBDBf4j8WZEes7eTYr+J91r2hVvFQBVG0CrzQBr5ocxG2w+RG5poRtPdALVIaZeqbPvPWfIa6XCl9HjVPXg/UnpRdybRTl5i1SkF6YwuvBa3N3ljW3SQLkDKBC6JdG42YfJnhjrNRfby/mpv62o7vTdIr1ey2/vTYyzLZIQF7f79xNQE6GPMBxitOw/jYCUsNkioPmAyOcNgjIYDabbc7T1Qq7CeBlkP5Sd2NS7GwBm50ECwMoX5opdHiuCXiOMuX+CnB65zlgs9EanfTua/E+zkQKEQYMfjo/BYTY4BQ40wqXPTitxVOsI50DsJSv//T5VoP1H9SyLDz9YZt96NNqRURERERExBkjB5941oARcWRWekOiC3Z2qP7gEc+eACAUGAQUaSnOkI9S9c3IoELmWp6UmdzhbU5855wlQ7FDtkECTApMAsq0ps/F7ZHq0QwGATidE0CDRb4YYB7G3QgB+DAwJaBY/qg6WfwY4T5XGTABI4tOYY0NcZ1/P2AlAjZoASsRsGEL2OwcQLH1OWDDTwG+3rHlp0APsF0/ICIiIiLicsP/HtlFR/pfAT8+RGc3pZdydIk+J1e9Rwo/5uh9hnH+1PICRe2b0M8/aCv3Dkv4nyRAoNPJipURY4C+WarP67eT+4YUjoX4MRfH+G3r5UJGtOb7tVqRwXwg/zXHt2FunmdXMpjyQH0NeureZtW5+SN9h8ZTUKft9xwEFB+NluzXn68HCSSJulDL++pLf/6eSpdXkv2eElBYgMQxvuNqXlgap5MRAY9KNCbeUu4dRsUzcIrOvMhgdAiLoYOACzcJjgGOj47xtF8uR+iQFNb8Fy77hvFLeX9ensu35iMiIiIiOoO+HxCS6SGqtnLb9rrKIdD3A0IyPUbXVm7bXlc5eP+hwYtVZHqQsq3ctr2uchD0/YBXuoJaPlW+4Wkll0dpi/TnjQxUFs70Vzr9lbN9Ad50daKTpAvaf4Hfd/ABdAPQyHUlotoNPj3Fu8Oh/Dyd5ddb5LZ0vHtm/wlGf8RPP/0kzP4IcbLi/hqgd3odshq9p6TDuEMsv2AK+fMTAoL9EfV/h3xS6r8+AqboM+gsBNh+tlEo2L7FQnwWcCJK/VcmIDwE1KdvtTHx0BCBEIHeISVIfipLBk6a/EHQ9wMsk1o9CepJjE5SQGX3pGqdJGn7dJI102t+XLIaA40cxKYfY10fo23lMDbtyHR1pNrKYWzale3qSreVIyIiIiIiIjyoHIczk3sP8vcDw/IFJAD8BBRfWEHhJ0DQP3rYb5QfSQgemRAE9TeXTP78Xd8RLeDSzwGX/SkQERERERERsW4k58cTCJ6ChKz9QdeE/H2gPiMRgb6uQAC93+dJ/3VYANX3XOlvWkBxvL34chDQ7L2Z+hocqtIXdg7Iapj64zte6n9+bKCrBZT5z6/+XS3g3Ovf9Sng0P/CzgEBaP3Pjw0ELaANlN71/4iInuP/VPKCJpghgS4AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTAtMTlUMjM6NTM6MjkrMDI6MDC1OmPTAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTE5VDIzOjUzOjI5KzAyOjAwxGfbbwAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII=)}.ui-button .ui-icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABLFBMVEU9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLM9gLP5vvMoAAAAY3RSTlMAWEd8IjKY4b3Ld2acsomqpVpOeudAQGVmhVOLRpGUY2NhTaBobXqbc6W/fcC8463l6eSBjl3f3eC51tvSxNXU12LacP4Nzplp+DgqFhzFedHjp4FYyJPQ2K/wzZCniLC7x6vHwZbrAAAAAWJLR0QAiAUdSAAAAAd0SU1FB98KExc1Hf/+/xAAAA+BSURBVHja7V0LYxvFEd67iyQsxycZJGgDCYrBKSR1WjdJX5RCGiJICzFpmxCamFLm//+H7t5rZ2f2oeNk6Wzv58T23D7nu9m9md09WYiIiIgeIIFk213Ysv7QcwY6dy8Bv/4JZkBl3iwhxAJBwSSA9sdIV6kJvgLAGgBPA6R88etGTYJaICcgof0x0ukdZATQ4rwBljnZIAOs/3YVPOmcQUFy+2u3ZU68mdYKZsG8i/QGcwvx3mFuAZ4ObN4C7KSwLvoIYKWBmYindmKCm58DVuDjTJ8CdAht/imwdVx2RygiIiIiIiKixzhzT3DLflDCojWgzntCS9DsRoCfsAZ86wFsQUjWvlFKLB1gBLAMNLsZLiasAUqAJ7pUtW8yGGL9t/fYk2xZUUk8xUVgCRAKAja2HMAtWNhs1ojWVlgPSMzafCNq2xZgReLpcff1AD5CtjoHhHHRnwIREREREREREdtDN8c/6JoG6+8ceHSsAPh2KrTI3bl//DgA61CgNvBf4eqRZOBZzOLgSrM34O2AJdXfvq0GH0EsnVXGNODNAUkER2LNKKuPFABX4grt83AZQgTwBSDwaxAu7sliKljlJmtWZnZaoZc/aw6vCXkHkLBZCGHcUtxvouEW2qgXHOOWM0TgTw/USG4HBG9IoAEQ1jbdqdt+Cpxx+fBjMiIiIiIiIuKyovux1I5uRmI5je6u0uaHBreqAs2368BKDfjjeba3aukAShd4c2oFr05ldgcnYN3e551kVbrbt8S3VAFf3WC9qYgfgbcneW8th90TLwGBs+HCamY+Brz8JZblnsDygxHO1uFwfYHtnRMLYuGwJRpnr2yIFTpgT7UyTGqn5S024C7OCGA94N0z0+kQCxNg74DzFq6UzAJmNwHWvXW+Q++8AWwIkCESHAL2UZ44czCGvYcDeB6LgQmzAsF26AMEkEmQpLJpKbSCQ9u33CN/sr0XDgJXCd4DFsAz93s9YNvvx0RERERERPQaZ/sU544KeVXWUmK9jkW4OmiXvaX+wK/g6M9aArO20n450ZhmBqfIdnb8G1/tAey0uOk7lnuTnrfDA66+JQMwhYURfXoJAXudXQlwv99dJHk+H8C2nmHuV7P++oKDuiy4iq+dgDrcdBGQWMJh3nVPPMXTbbvTQFLBnxnWSEFi6SELdwGbKHjHsKU2uiDiPbNiJYAOibWHd3pSU4sJLDoz3++3pBPBNuwxIYyfACEhwrvDXNFh0Sl5YyQQvYYOAYXWH/zrRxcQF12/iIiIiIiLjfScP8gsbgf4tquoN/xz9O/TVoB1m8X0vtLgbiCkpFKvKESvNkPY0WWB4hWlagopCobM+C6F0gJ0fmHdAmcE9mXYAI9e6PF6qb8RnRkEQEmCEc9SEeubQL8IsGy/c4JSIlMC8E9hid3QtaQZYn0ZAitYAMtvntgoCXJYAD2vUNPdG/2ZjmwOIDmsKzSpthI6B1gOyPTG/HWfDAn/cEz5KH9qVwgsvyls8LMyWzDA6Wh3k+gz0IekhwR0RRv9IyIiIiIuFzLlJ2Sr578ykLiyqd4NZedGQ1+ONwKeG+yUrpJLxYwmZ34+rogxwFhcIRWgErtS3BUOmSaKqxVIgVol2MvzIXL2it8NQgq3aMJPP9fitNJwaujb9JjKbGdrt0qvez0Yw2AA44HRAcGCCXrW1iqUFya2FpsgLc/ztAQhZGQQgBgAZaID3eKOQYCsel+icaWhtgDXfndZna5wAIM333wLMAGz2cz/BobABIgAAbsGgaBURxckIQkmpOygSfh8/vZ87rIAGAL6oRqu5gBAHTR6PC+KzzUBb77zi18aBFy7do0dj3fL5AIlQOn/LibANCmQ+ps2Bu+l6gs1eE3BaQH7SnUY7ut1gKyw/4YAVT9aYiur0xXKIXD9Oh4CMyFvgfzeFMiKr59JgNL/6o133QQk5IK8kiT7CQph4P3Fwj0HwL5kQOqPCSj+NQQUkyAi4KYqffNmfeGgnAQPiDqoACeAvaIhCAEf4PWJyfSq/J67CKANwocFUIOHh4egTZRZQLY/HMpveggUspuAwxLVhWQM74zHt2CM3xFCQ0he+FXxhfUdUAIGhAAwLGCi9fcQ0FT3UQFicoOGAGoB2X6B+hYxGdQcOwRjTI7HzVNgXLc/dloAJyA0BHB6OQfmTeaGgMxsr6mu9APgDeEAsQD62MtY/ZPyHuAqMv3oBq5wYNL7uBA/Fo4LlICCgVysD1k2LdDC12Mcmq5LODu0Wq6h2F2r/hERERERPcft2/70FLzr2gC2o48EmQ537xSPqTu1WAXbTYw9qeRJU7Z0TXZXloX4NelP7n2uyWhrTi7JxzbWP8s0AyPlRR6Nh9oP2ZFdnuw0jpyVikxfv1O54jUDsrAC2WkyPZuxcgVXlsv70WiQK2cubZ7tqeJ2gu/pXYC7RH/luC20/so3b6JfejqcOWYCfiO/9nCHMnmfM5Tf2BuksYX4rTgWv8Px7VgKY0MWpvz24G0kq/5Pp64OQuXsV3JtcMjiZGenae251isWTXTFCShXBxAB927ef3DjJlo2yqR9Z7g/XgJ+D3+QX3/ECirXn8g4+JCx8QClT80OVs58am/vdi2ieWAEe1PJQSnsVM56tuMioJoFkAXswZ/gtu6Q1B8t2YUt4M/iE/EXvaR0SCzgkFjAobKAuZanRuwhR0A5STXxLWnv01L6tOlgEcxrAygC1AzpGybg3s0PPpRfdv0rTx0TkEKx6lTLf4XP5Nfn6MSEMcYL+S0io/Ri/Ep86CCgju5So0PEfgSGOcvDYCgWRrxICMgIw0T/5kSESQCSH35ybXTtb48qeb+ubnc1eWrePcGGQCVj8e5dLSvbb9Y7rQQIAnlBrQ+6j9CQRe47VYf1U0AdMRKuIaGGO6nOLwuiPw/gU6y/uP+FnP4mX9xvCJDjP/WUZ4pO2CRqLrKyRX7iB9BlbyLbPgHGJ0+p/vQxKMpDXTq52BG4mjflgdVgYCzOIfIWAb7hA0VEREREbAFDvDCtXDk4ZHke61/P+GhhsRXhffpBlx6ksJTfl/jRfATI1XwXvvzyq6/gEerOntK/gPzl1g24dw9u3KrTy9gNc1liSGR6oQneqN80htFw+MRgwP/hYiFMZV1jFG2CZGBJvfGF9rz+rvAP7Youh7KCKQtumnQjNmUvWVfBq84jXcdMBjt6c7BM0MGVcoyX8MRyWvZnEqBcLVRC6V78Nw1AE/D1N48ff/O17s9QQD7V7honoIxG6p2mYjEKHXhIRblUkWpfO1PrMYiAB2qvDje4VKy7CKDhJVeXpJe7e9qiloWs9U/N/FDY+m5T/KlMGiF3FQbkQIZZvtgHRRlABZ4ynhPYAiYTfF59fHKiwktNgNRfoCUwyjgNFuwiMfGm/7UNIP3LO1jPAZ/BrgQ8bTLkuVEe5n4CDuSvB+pfnawMbAgLZAEken3wYP/BCRw1FT5RvRutjwBqAd8W8jNTf63geFlgYRbXhEH63nw+Nwio7mz5Y7FYvP9wsXhIDjwsnXPAyYkaAHgSfDIcjtY4CZI54NtqDqgYUPrnRjh6S/V3oYsv9+AIMaAqOkDTXgYmAR99VP0jBuKcA4bZyckJnGAG6GNw3U+BZ+IZjv9p6LacTPSClZwB5b9UMwDGj/rX3foCfQwqiyjhmANgqIAJsN3DLgQQpMW9f1b7AZYzguYMK63lSapmysd16j//9W/zY11EMWtU0iBTS3pZfWCjvR+wfRw8f36AxOme4ip93DBGO2w8BiMiIiI6Y4hPR7/4Tk0x373Ydqc2iJcALxvh+3rW/X7b3doYrit1r1fCi/KJo75rG5jBDBf4j8WZEes7eTYr+J91r2hVvFQBVG0CrzQBr5ocxG2w+RG5poRtPdALVIaZeqbPvPWfIa6XCl9HjVPXg/UnpRdybRTl5i1SkF6YwuvBa3N3ljW3SQLkDKBC6JdG42YfJnhjrNRfby/mpv62o7vTdIr1ey2/vTYyzLZIQF7f79xNQE6GPMBxitOw/jYCUsNkioPmAyOcNgjIYDabbc7T1Qq7CeBlkP5Sd2NS7GwBm50ECwMoX5opdHiuCXiOMuX+CnB65zlgs9EanfTua/E+zkQKEQYMfjo/BYTY4BQ40wqXPTitxVOsI50DsJSv//T5VoP1H9SyLDz9YZt96NNqRURERERExBkjB5941oARcWRWekOiC3Z2qP7gEc+eACAUGAQUaSnOkI9S9c3IoELmWp6UmdzhbU5855wlQ7FDtkECTApMAsq0ps/F7ZHq0QwGATidE0CDRb4YYB7G3QgB+DAwJaBY/qg6WfwY4T5XGTABI4tOYY0NcZ1/P2AlAjZoASsRsGEL2OwcQLH1OWDDTwG+3rHlp0APsF0/ICIiIiLicsP/HtlFR/pfAT8+RGc3pZdydIk+J1e9Rwo/5uh9hnH+1PICRe2b0M8/aCv3Dkv4nyRAoNPJipURY4C+WarP67eT+4YUjoX4MRfH+G3r5UJGtOb7tVqRwXwg/zXHt2FunmdXMpjyQH0NeureZtW5+SN9h8ZTUKft9xwEFB+NluzXn68HCSSJulDL++pLf/6eSpdXkv2eElBYgMQxvuNqXlgap5MRAY9KNCbeUu4dRsUzcIrOvMhgdAiLoYOACzcJjgGOj47xtF8uR+iQFNb8Fy77hvFLeX9ensu35iMiIiIiOoO+HxCS6SGqtnLb9rrKIdD3A0IyPUbXVm7bXlc5eP+hwYtVZHqQsq3ctr2uchD0/YBXuoJaPlW+4Wkll0dpi/TnjQxUFs70Vzr9lbN9Ad50daKTpAvaf4Hfd/ABdAPQyHUlotoNPj3Fu8Oh/Dyd5ddb5LZ0vHtm/wlGf8RPP/0kzP4IcbLi/hqgd3odshq9p6TDuEMsv2AK+fMTAoL9EfV/h3xS6r8+AqboM+gsBNh+tlEo2L7FQnwWcCJK/VcmIDwE1KdvtTHx0BCBEIHeISVIfipLBk6a/EHQ9wMsk1o9CepJjE5SQGX3pGqdJGn7dJI102t+XLIaA40cxKYfY10fo23lMDbtyHR1pNrKYWzale3qSreVIyIiIiIiIjyoHIczk3sP8vcDw/IFJAD8BBRfWEHhJ0DQP3rYb5QfSQgemRAE9TeXTP78Xd8RLeDSzwGX/SkQERERERERsW4k58cTCJ6ChKz9QdeE/H2gPiMRgb6uQAC93+dJ/3VYANX3XOlvWkBxvL34chDQ7L2Z+hocqtIXdg7Iapj64zte6n9+bKCrBZT5z6/+XS3g3Ovf9Sng0P/CzgEBaP3Pjw0ELaANlN71/4iInuP/VPKCJpghgS4AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTAtMTlUMjM6NTM6MjkrMDI6MDC1OmPTAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTE5VDIzOjUzOjI5KzAyOjAwxGfbbwAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII=)}.ui-button:focus .ui-icon,.ui-button:hover .ui-icon,.ui-state-default .ui-icon,.ui-state-focus .ui-icon,.ui-state-hover .ui-icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABLFBMVEUmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOgmlOjN4uvkAAAAY3RSTlMAWEd8IjKY4b3Ld2acsomqpVpOeudAQGVmhVOLRpGUY2NhTaBobXqbc6W/fcC8463l6eSBjl3f3eC51tvSxNXU12LacP4Nzplp+DgqFhzFedHjp4FYyJPQ2K/wzZCniLC7x6vHwZbrAAAAAWJLR0QAiAUdSAAAAAd0SU1FB98KExc1Hf/+/xAAAA+BSURBVHja7V0LYxvFEd67iyQsxycZJGgDCYrBKSR1WjdJX5RCGiJICzFpmxCamFLm//+H7t5rZ2f2oeNk6Wzv58T23D7nu9m9md09WYiIiIgeIIFk213Ysv7QcwY6dy8Bv/4JZkBl3iwhxAJBwSSA9sdIV6kJvgLAGgBPA6R88etGTYJaICcgof0x0ukdZATQ4rwBljnZIAOs/3YVPOmcQUFy+2u3ZU68mdYKZsG8i/QGcwvx3mFuAZ4ObN4C7KSwLvoIYKWBmYindmKCm58DVuDjTJ8CdAht/imwdVx2RygiIiIiIiKixzhzT3DLflDCojWgzntCS9DsRoCfsAZ86wFsQUjWvlFKLB1gBLAMNLsZLiasAUqAJ7pUtW8yGGL9t/fYk2xZUUk8xUVgCRAKAja2HMAtWNhs1ojWVlgPSMzafCNq2xZgReLpcff1AD5CtjoHhHHRnwIREREREREREdtDN8c/6JoG6+8ceHSsAPh2KrTI3bl//DgA61CgNvBf4eqRZOBZzOLgSrM34O2AJdXfvq0GH0EsnVXGNODNAUkER2LNKKuPFABX4grt83AZQgTwBSDwaxAu7sliKljlJmtWZnZaoZc/aw6vCXkHkLBZCGHcUtxvouEW2qgXHOOWM0TgTw/USG4HBG9IoAEQ1jbdqdt+Cpxx+fBjMiIiIiIiIuKyovux1I5uRmI5je6u0uaHBreqAs2368BKDfjjeba3aukAShd4c2oFr05ldgcnYN3e551kVbrbt8S3VAFf3WC9qYgfgbcneW8th90TLwGBs+HCamY+Brz8JZblnsDygxHO1uFwfYHtnRMLYuGwJRpnr2yIFTpgT7UyTGqn5S024C7OCGA94N0z0+kQCxNg74DzFq6UzAJmNwHWvXW+Q++8AWwIkCESHAL2UZ44czCGvYcDeB6LgQmzAsF26AMEkEmQpLJpKbSCQ9u33CN/sr0XDgJXCd4DFsAz93s9YNvvx0RERERERPQaZ/sU544KeVXWUmK9jkW4OmiXvaX+wK/g6M9aArO20n450ZhmBqfIdnb8G1/tAey0uOk7lnuTnrfDA66+JQMwhYURfXoJAXudXQlwv99dJHk+H8C2nmHuV7P++oKDuiy4iq+dgDrcdBGQWMJh3nVPPMXTbbvTQFLBnxnWSEFi6SELdwGbKHjHsKU2uiDiPbNiJYAOibWHd3pSU4sJLDoz3++3pBPBNuwxIYyfACEhwrvDXNFh0Sl5YyQQvYYOAYXWH/zrRxcQF12/iIiIiIiLjfScP8gsbgf4tquoN/xz9O/TVoB1m8X0vtLgbiCkpFKvKESvNkPY0WWB4hWlagopCobM+C6F0gJ0fmHdAmcE9mXYAI9e6PF6qb8RnRkEQEmCEc9SEeubQL8IsGy/c4JSIlMC8E9hid3QtaQZYn0ZAitYAMtvntgoCXJYAD2vUNPdG/2ZjmwOIDmsKzSpthI6B1gOyPTG/HWfDAn/cEz5KH9qVwgsvyls8LMyWzDA6Wh3k+gz0IekhwR0RRv9IyIiIiIuFzLlJ2Sr578ykLiyqd4NZedGQ1+ONwKeG+yUrpJLxYwmZ34+rogxwFhcIRWgErtS3BUOmSaKqxVIgVol2MvzIXL2it8NQgq3aMJPP9fitNJwaujb9JjKbGdrt0qvez0Yw2AA44HRAcGCCXrW1iqUFya2FpsgLc/ztAQhZGQQgBgAZaID3eKOQYCsel+icaWhtgDXfndZna5wAIM333wLMAGz2cz/BobABIgAAbsGgaBURxckIQkmpOygSfh8/vZ87rIAGAL6oRqu5gBAHTR6PC+KzzUBb77zi18aBFy7do0dj3fL5AIlQOn/LibANCmQ+ps2Bu+l6gs1eE3BaQH7SnUY7ut1gKyw/4YAVT9aYiur0xXKIXD9Oh4CMyFvgfzeFMiKr59JgNL/6o133QQk5IK8kiT7CQph4P3Fwj0HwL5kQOqPCSj+NQQUkyAi4KYqffNmfeGgnAQPiDqoACeAvaIhCAEf4PWJyfSq/J67CKANwocFUIOHh4egTZRZQLY/HMpveggUspuAwxLVhWQM74zHt2CM3xFCQ0he+FXxhfUdUAIGhAAwLGCi9fcQ0FT3UQFicoOGAGoB2X6B+hYxGdQcOwRjTI7HzVNgXLc/dloAJyA0BHB6OQfmTeaGgMxsr6mu9APgDeEAsQD62MtY/ZPyHuAqMv3oBq5wYNL7uBA/Fo4LlICCgVysD1k2LdDC12Mcmq5LODu0Wq6h2F2r/hERERERPcft2/70FLzr2gC2o48EmQ537xSPqTu1WAXbTYw9qeRJU7Z0TXZXloX4NelP7n2uyWhrTi7JxzbWP8s0AyPlRR6Nh9oP2ZFdnuw0jpyVikxfv1O54jUDsrAC2WkyPZuxcgVXlsv70WiQK2cubZ7tqeJ2gu/pXYC7RH/luC20/so3b6JfejqcOWYCfiO/9nCHMnmfM5Tf2BuksYX4rTgWv8Px7VgKY0MWpvz24G0kq/5Pp64OQuXsV3JtcMjiZGenae251isWTXTFCShXBxAB927ef3DjJlo2yqR9Z7g/XgJ+D3+QX3/ECirXn8g4+JCx8QClT80OVs58am/vdi2ieWAEe1PJQSnsVM56tuMioJoFkAXswZ/gtu6Q1B8t2YUt4M/iE/EXvaR0SCzgkFjAobKAuZanRuwhR0A5STXxLWnv01L6tOlgEcxrAygC1AzpGybg3s0PPpRfdv0rTx0TkEKx6lTLf4XP5Nfn6MSEMcYL+S0io/Ri/Ep86CCgju5So0PEfgSGOcvDYCgWRrxICMgIw0T/5kSESQCSH35ybXTtb48qeb+ubnc1eWrePcGGQCVj8e5dLSvbb9Y7rQQIAnlBrQ+6j9CQRe47VYf1U0AdMRKuIaGGO6nOLwuiPw/gU6y/uP+FnP4mX9xvCJDjP/WUZ4pO2CRqLrKyRX7iB9BlbyLbPgHGJ0+p/vQxKMpDXTq52BG4mjflgdVgYCzOIfIWAb7hA0VEREREbAFDvDCtXDk4ZHke61/P+GhhsRXhffpBlx6ksJTfl/jRfATI1XwXvvzyq6/gEerOntK/gPzl1g24dw9u3KrTy9gNc1liSGR6oQneqN80htFw+MRgwP/hYiFMZV1jFG2CZGBJvfGF9rz+rvAP7Youh7KCKQtumnQjNmUvWVfBq84jXcdMBjt6c7BM0MGVcoyX8MRyWvZnEqBcLVRC6V78Nw1AE/D1N48ff/O17s9QQD7V7honoIxG6p2mYjEKHXhIRblUkWpfO1PrMYiAB2qvDje4VKy7CKDhJVeXpJe7e9qiloWs9U/N/FDY+m5T/KlMGiF3FQbkQIZZvtgHRRlABZ4ynhPYAiYTfF59fHKiwktNgNRfoCUwyjgNFuwiMfGm/7UNIP3LO1jPAZ/BrgQ8bTLkuVEe5n4CDuSvB+pfnawMbAgLZAEken3wYP/BCRw1FT5RvRutjwBqAd8W8jNTf63geFlgYRbXhEH63nw+Nwio7mz5Y7FYvP9wsXhIDjwsnXPAyYkaAHgSfDIcjtY4CZI54NtqDqgYUPrnRjh6S/V3oYsv9+AIMaAqOkDTXgYmAR99VP0jBuKcA4bZyckJnGAG6GNw3U+BZ+IZjv9p6LacTPSClZwB5b9UMwDGj/rX3foCfQwqiyjhmANgqIAJsN3DLgQQpMW9f1b7AZYzguYMK63lSapmysd16j//9W/zY11EMWtU0iBTS3pZfWCjvR+wfRw8f36AxOme4ip93DBGO2w8BiMiIiI6Y4hPR7/4Tk0x373Ydqc2iJcALxvh+3rW/X7b3doYrit1r1fCi/KJo75rG5jBDBf4j8WZEes7eTYr+J91r2hVvFQBVG0CrzQBr5ocxG2w+RG5poRtPdALVIaZeqbPvPWfIa6XCl9HjVPXg/UnpRdybRTl5i1SkF6YwuvBa3N3ljW3SQLkDKBC6JdG42YfJnhjrNRfby/mpv62o7vTdIr1ey2/vTYyzLZIQF7f79xNQE6GPMBxitOw/jYCUsNkioPmAyOcNgjIYDabbc7T1Qq7CeBlkP5Sd2NS7GwBm50ECwMoX5opdHiuCXiOMuX+CnB65zlgs9EanfTua/E+zkQKEQYMfjo/BYTY4BQ40wqXPTitxVOsI50DsJSv//T5VoP1H9SyLDz9YZt96NNqRURERERExBkjB5941oARcWRWekOiC3Z2qP7gEc+eACAUGAQUaSnOkI9S9c3IoELmWp6UmdzhbU5855wlQ7FDtkECTApMAsq0ps/F7ZHq0QwGATidE0CDRb4YYB7G3QgB+DAwJaBY/qg6WfwY4T5XGTABI4tOYY0NcZ1/P2AlAjZoASsRsGEL2OwcQLH1OWDDTwG+3rHlp0APsF0/ICIiIiLicsP/HtlFR/pfAT8+RGc3pZdydIk+J1e9Rwo/5uh9hnH+1PICRe2b0M8/aCv3Dkv4nyRAoNPJipURY4C+WarP67eT+4YUjoX4MRfH+G3r5UJGtOb7tVqRwXwg/zXHt2FunmdXMpjyQH0NeureZtW5+SN9h8ZTUKft9xwEFB+NluzXn68HCSSJulDL++pLf/6eSpdXkv2eElBYgMQxvuNqXlgap5MRAY9KNCbeUu4dRsUzcIrOvMhgdAiLoYOACzcJjgGOj47xtF8uR+iQFNb8Fy77hvFLeX9ensu35iMiIiIiOoO+HxCS6SGqtnLb9rrKIdD3A0IyPUbXVm7bXlc5eP+hwYtVZHqQsq3ctr2uchD0/YBXuoJaPlW+4Wkll0dpi/TnjQxUFs70Vzr9lbN9Ad50daKTpAvaf4Hfd/ABdAPQyHUlotoNPj3Fu8Oh/Dyd5ddb5LZ0vHtm/wlGf8RPP/0kzP4IcbLi/hqgd3odshq9p6TDuEMsv2AK+fMTAoL9EfV/h3xS6r8+AqboM+gsBNh+tlEo2L7FQnwWcCJK/VcmIDwE1KdvtTHx0BCBEIHeISVIfipLBk6a/EHQ9wMsk1o9CepJjE5SQGX3pGqdJGn7dJI102t+XLIaA40cxKYfY10fo23lMDbtyHR1pNrKYWzale3qSreVIyIiIiIiIjyoHIczk3sP8vcDw/IFJAD8BBRfWEHhJ0DQP3rYb5QfSQgemRAE9TeXTP78Xd8RLeDSzwGX/SkQERERERERsW4k58cTCJ6ChKz9QdeE/H2gPiMRgb6uQAC93+dJ/3VYANX3XOlvWkBxvL34chDQ7L2Z+hocqtIXdg7Iapj64zte6n9+bKCrBZT5z6/+XS3g3Ovf9Sng0P/CzgEBaP3Pjw0ELaANlN71/4iInuP/VPKCJpghgS4AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTAtMTlUMjM6NTM6MjkrMDI6MDC1OmPTAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTE5VDIzOjUzOjI5KzAyOjAwxGfbbwAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII=)}.ui-button:active .ui-icon,.ui-state-active .ui-icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAQAAABFnnJAAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQffChMXNR3//v8QAAAYOklEQVR42u1dbYxdx1l+jhMpKsHBfLkmcbKSfzQBIUu+SyQUhGQUoWt+BBWVwLUjPhqjdarSqgjIbqy7P8Kadu+CQlIXaV05kD83u1oXpbg/WFObVKYxFu6uA6U4pWratUO35k9p/pAi4Zcf52s+3vk459y79+7OPKPde+95Z+bMzPucOWfed2ZOQogIGbtGXYCI0SISIHBEAsjogNAZdSG2EpEAIjpYArAUEgUGTYDRXz8d1H2uTdV/FCYK5DmPvo6DBImhQ0QdgiGUgDVOxyKHJX2etmOMYz83rGndNbCfvzzqruM2CnoVzZXzIUDH2Tzm9Hlacw4uArjO7lMDd87uOm6jUKX5qyihXnofCsKRd5Oy++bsquM2CnoVmygQzuvXpwepfwX79ABuJXMtEEAP4BvqPwPU74D9c3A/A8CR1qTeAJ4BBhFG3zSdBgSz34I6BQFGXccBhiT6AiR0sISjWB51MbYOkQCBI1oCA0ckQOCIBAgckQCBIxIgcEQCBI5IgMAR5wOoaUdd/q2GZux0edPIaW23G0rNploZfAyXEbbJfACXLzIv+44yBVdvADcB3Dm4crf5E22N3/EqXV1vZV72HeoMcjd/lSaul9pvSorbXVyXnvZAAgF2yGwAdT6Ar8e+XhO7+w/f+QAda9nq3qAC7wH8Q6dmE/vQyx7cObjo6XMDCfYZYBBh9I3TdD7AqMu/xSG6gwNHNAQFjkiAwBEJEDgiAQJHJEDgiAQIHJEAgePuURdg7EBIRnjuHPXLULH8dzdLPpRGGGUJyFmCVEl1yuhOOYKay7cAgshCrgqZAdlZzWqSqqh7Dlf5U9Un1lzc5Kib2q8GPrEqpN0lRXBVP/GogDl94tFAPlUwX6E+vYetDonyWe0cucTdAvYa2glEjtSA6yKWyi/eAnyrTwaJu5GSAXTwNgW476JNSkBF6oSVimfnzpJfXuYykEVuz7usnf0yEEuZAFUfAsnj6nHF8mFnvWvcT7mJR+42BfnkW7cFbJegT97uNtDkVYaBZRfnE4uX2btAN4Ptebi6WL8u2nUFuc7u8xBZF26Ku+VSCVR3cOijgO19/hrDyDgfIHBES2DgiAQIHJEAgSMSIHBEAgSOSIDAEQkQOEQCdEAY9fJol61wuPBpAR+PaL104nqNuqieVloV47N4su7yLr8UfjnXW/vjt6zMtwX49HmMjneqqnXoWFvAvjBOLmXKFq153MV0xWlSfZ9YbgXULbdPC5hiiKsSORL5tK3fXu2dBgTQ1k7Wbf7qG0b7UaA+/dxbuPuowC8PTgE69OZv0gPJOZMzBk8ALY7sCyC4fX0A73RU7z1JhbR+JSjnIpj88a7z29K7zu9Krd97zaV0efzhlHLp01feADDsdqzO5UiAqqOAsgHqeKwSIQ8+d5I+beevg7Lc9R6y7Gc/mknzGUdHK7dBUrirE4PUljOwnElsm12rpax0C6hyH+/UyMP1EObTgbpLZ87H3oX63cHzuO6dlureguwPgfa0cinTK63i6f1O5Noiwq7EJqmrNEU1Avo8QfjTry4BfHKulEecDyAif3FcfF9ARCiIpuDAEQkQOCIBAkckQOCIBAgckQCDxjYbVqnzAVywecx9qt7JDVBjiuals61OGse6K3Ywu93IZivzsT7l5zDZ7HwtjU0tca6cqYZUtsXVSz+CUBqCRGaabGE2f5W4NNKW3uaJ83Hz2D1yrhzSGGTw1NkWuIrntaevk/vIwD8DLBk6ebu/qrw1LNWYWJYuy3R1krY9DMjb15dUOMqdlzu/e2XzWKLsAVI7eNmEtlX4nKz0Rmc5V0ibS/2WQLsXb9ffQsKmRlcP4Z+zbY+ALUbZAywLfuY6RVs2+qnzBnB5+937Z9iRCD0I30PIn1yMwVzF3Bnk3mNM1C/fApaLQnEdeNrBE2wTEmyTFo4y3/RGAuzXrx1JUQJ+SoW96cubkHl3kTxmUlEqxqg7oWY4qPCcbZusIcezvTGk2X78Pr5uqinzeT4nxyhiEDMGtjREd7CMsematwqRAIEjmoIDRyRA4IgECByRAIEjEiBwjB8B2g3tgRGVoBLAz5dtc9mQl9QUo43VLRmJj3ofhLFBte3ifbaTTnCkQXlWkZOkbY1Xd8v6EnU8ljsQMgHsVmq7tTu/qttYZSmQX/MJxKWJJdKu/0gRY9WQPv9Wb1N1sfdZQoS0QYT632Qtt813aRNRm/j183LOxMrTHExlIGsJ2fXvReho8m1mtR+uL8BvdbudSelcmyO4YJWbfPau37ajukSNJ852yOsb1BpAE8QpYQl0NakwT2XwmxBhnlSmEsg0JYMvoWv7BJngCSiqP0X5wgixyUwKLidG+bx2gYPPbvZHcAGkPUfks4n4Xfnl8vi8NiICQLVRAAmjAH7GjW0A6JIfKaSrABLtRpIIZ+ceVu3zicSdMaLyBfi/MEKeFVt+HzTMTxHN0MFSVL2OcZsPMCz1RxgwbgSI2GKMny8gYksRCRA4IgECRyRA4NhJBOgWlobuUPI/gFYWDoy6qgMEgUCLmXNkgxZruxUuNXSyEF2THDXdium7ztTdmjmn4QCBpomIaDr7ZSsBf46pTDplOIdZ7koJOqsE+xkKLeWNf5561CuIoKqxPG4mSLn6fcW6sshEkr6iwr5FvXoTu+RyCV1NwzV1i6aJqEUtIpqmlqUF+HPosLWQv0SMseJdxyJGagcgLAAA/kHqHC4I3cQXcAPAj+BEcewmJpSuJLcSngPwJOvKmSy+rzHumq/g54Tfr+IpSQokOFbI1HXGhFnMCb9nMWdcv2tyZk1Kv9UStrCGSewH8LP4U0xinckhwSYA4KdQb4VRWituDbVZIsY4V7Q7d/4pnJF+S28Pz1W/qkbIcAPAdXwPr1mK38o+nzTGuM+S+lXckAig4gxEV/IZgYopTgEFBWZxSqKD2IDmhrwPrxfff4ktw368HwnutZTy9y0y1SPJy/kXUCdMLtUolqv/z/FH4uHSG7jqyOA6vqfFkYvwE5kvj5j5PCl+3JL/MXzFev7LKF3GZ3BZI0BJgVmcYnNoK5966X7dWtIZ/C0+DeDjmGHTfxfAt4TvOmYxV/xtLXL1v4z3yRS42zMDTv0qfgwAsAt3jDH2AADOsjJXD5BTADiDy8Y4CWAcAzyqfKq4D3+VfXuakT6AHoB5ADPo4QntFqB6UusuM3XvkuCK8Qp+VzuWqv8c3gfgowCQ3fS9CcD1EGoF9zjz+KHi26Qmc/UAwIFM8ZdxAG8z8i7exiKAy+ga+gA7fhgfL76p6GAC5zGFGQB3gTCDey0TSmZxilXShPBnQgsuuGL8DkOAEzgD4Emcy56jFjCdCvwJoELn973ONJ/OPicZmasHSJWeUuBtZiTeleRcL7Bf+eSaCJhBep3Lt5gJzAP4bPF73nAbSDHXoItfaxiDn9PxWSCjACCoH8UwsO0YRrmHMJck+aXK42zVDjDYYWA+SCo/TaXosqNtDtWGuW5531h7nxhiDfn880FgTzw6Pu7gLoCfFn7fqNWNNwUBOCFc6YPPPcVopqZM4Yx09SPOBwgeO8kXEFEDkQCBIxIgcEQCBI5IgJ2F1wV/hhdkArRBcC3MNoMKR0bToUUX3KSOWWH4OqtJF5Vh76IiX1HkK8x5pwT51BDkAPAlR/v00KvdboezYEcfffSLX0KbtImoS11K1/fKYYNamRnhIk3TImsGuZYZIlbomiK3e7LV0GXjzwqebCKiWdYQkgc9vduQk8aZpuls4sfg5Xmc1KijSnqFQa6tmmsy7RCtELLatZm8bxER0S1r6+bGpD4dJ4ivjm1nVjBiKUDCyyJ87GD88nCiv8n+zhsbqEvpBJSuIX/Ty1ddCiYC/SeBbhPoHTItMJ/OJNMWOazyw9SiwwZ53vx96lduwRwrrHxFS73Cnn+RiPrULi2Jojs4d1LOYbbWRi3ick7ec/gn+DY2cB2bWMN32BhdzGE/nsE7Q7ADfgv345vYi2/iAXzbGCu1pc9Y5ZB96hLexbrRXdPPXDHHWOkRqdVM+6zwsy1+0uMIAPwKgN34bQBAGxdQ9ADXtDl11yr3AGIHZ+oBzhPRBSJ6nb1CukTs1T+oHuDfCfQNAv0rtZjzf8zRA+RyWOXmHqAvlU69BfSEUqfoVarflyXZl5kWPE7H9bOrp+hmRNCbfxAEeJ4+TK/QM9lfFfXLs+JMBEj3J2ln90tV/jUi+rfs74Ymz+tnuoeX8pMOOZ++vPem4ZmKBFDddfozgE07Iv2k42oG4qcsa9EioeBQj4lhJ4Dur6uifrV6dgLw8qfpG/Qh2qAP0X/QJxT5Ma10UwOVl+qHMcgqblvlJumt7EFQlfcpv/dv1CUAHCHfI6jtGZ9XsHnK9qzSwNwooF1UnSeImYAp/tBRuiZyONTv43LPKcCNAF6gO9mD3wrdoRcYApynvp7W9/RuhcrPofwzqG3Ssl39KgVmNalrWrddTmR/lUVTed+pftcwsKRA25C6XAtwVktt7IF83cHTDcwTEVXQA2SP/YCQmn6eUg/H+QCBI/oCAkckQOCIBAgckQCBIzwCpG5jbkzTK8ZGH/PIZzd7lLDdnqqFMeF0MUaedoxYXcaMuqmbhDYRrWff142j5YtFHdWR8p8R0Rk6Qx+hjxDRJ7SUaeucz37tFkJ65CR9hoiep+eJ6DN0UktfWkI5a4e8MJ9IXYivy10x9IX8rJ1HruAGLdIivWehgEu9wyRAPyvXNGtUSbGeqZ8vRW4OOc6aun6+CD9DnC10nRazEvQZCrnseLmXok28Gcx+pEzdNuST2hq7mTeH241dTFE4q8QIG8XV855RiaMkQG7L4s+Rq7381HO4aFER0V7aT7tpN+2nvaxCFglE1Ct8+rbriyeAeQ8RorSP6BZtrBMA0iwKnQBpriuFTZYjwG/RsSxkcvEZ4O8ArOMQruOV2vcS/XvlO1ERVKQ++mPCdxEtXAcAHAIAXGd88m08bi3D/+D7AIDv44OM9ApOgAB0cAzq9hUpJoXAY87wPS3/HIA5tDCJSXZGQRtPAFgEcJzN3b7dd4JVzGA/JvAgHsSD+WF5cWiq/pY2nw4QlzXV2ylYVWj1CSc9HMzU/yr7ENfCulX9q9K6/AVF/jW8WywIPYMrWvpfQA/As3gIvPqB+/Bu5TqVeKD4PA/gV5kYfwwgXbR6AsA7mpxQ0kq/fLoAvgPg/3AX9uOTuJQeFt8X8APckzXdBh5y7LgPp1x/H0AVKXeGacwX32cYCvwLDhbf3yk5DkBVP6fAafym8Osv8bLl7BzB0q0x/hcA8C67Bc4RaZ6V+oKL35OOE15W5PJ8oet4Tpm1lW7hn06WnWO28yecBLABIPULZNLyFjCDe/AD/DMWsYGHmC623Gid33JdPMrFSJRgl3JnmM+UV34Xkas/vRHsxy1Jmqt/AUeQsNdvD5/DoSzo6gfmcR1fAHAJwCFmhyDgAv4eX8Ju3MNOx5p1bLCxB3twFnvwo9l/Ow4xx9KL6CAOgr+gJnAXJjCBCQAnldt18WToGgaO+yjgFuVzY7lHpJ7jDOu0QivsdCpkqYl6mct2XZObf6lHp7QYrmEg0XEt8KOAlWyvMP0hcLEIRM/powC/MEoC2EObygnRt0i1A+jP3ebS8+VPRxfvUZvyiRm7tbRL9Dx1LK1EBJrKghqjlY0C0v/qNnRbYAeIAfQEXaWr9IRB2qfzBa3atJuhmG0YCPLZSnLLQ5wPEDjC8wVESIgECByRAIFDJcAiawUEgNN4s3hyeBOnR13wiMFAfgh8Cw8D+Doe0eK9ptnHP49fG3XhI5pD7AFewsMAgIfxkhLrdKH+0kL3QbYX2ARlO2Zz+O+sB3FPMR/HSeibwuhps3l2YwJhTPgWUeZnfksZLa5Jo9sca8y40m4Iso+Sy9BjrXbu5VWuGC450WYxPt9sUP5tFMqvL0kKfslQcZexw908bWeMfJmkTIFm+2jm8hepRS8ac/Cr3Q4lwFtERQ+g9gFyxW3NsEKmZWGi+jcYSa/45NTvVg4yxbczInDyF7NvL1py2AyTAD1SISrAnwB85y3ndJuZr5enM6nflwClpZ6T5xZ2fXeAEmYCdIlokzZpk8bGkDs4AnAKrkMAV8iVpKs/VbtJ/ePQA2wK598k7IwgK6C8BchquMoS4CqToasHMAWxB+LTj/4ZwE3BbRi4qumVfIGVvsBk6Gocs9R29csKHt0oII0zcqUNngCbrILFJljSpEtGNbqeAUyyur3H1oYdRgB/d/A8fhGPZd+v4B+tb8zYyaj7LqAxRZwPEDiiNzBwRAIEjkiAwBEJEDgiAQJHJICKHqi2dBtCJABhwzERgzCoV0KMCtdwzSrv4dna0u0JxUpHtGGxxoneAFWSp2sbc+jRRuYI6tGGJQcQsuVNsnxFyqmOu7bnMDb3PFLnLTD+NkuvwDefSYU2Aojp9GbuFWlS5blyMBPAlN6HADap3dGjS3eISdhUSX5ah4sAqQrL37IUhEJ5rhxMBDCndxOgqorNUm7x5TYN/EPgTSzgN2rcT25iARNIFycvCDbzBAvZ0Qks4KZHDia40m8NdpI3QGP5Tn4GcIXgnwE2HNUyE2A7BPIgSK+BdFuG6A1U0cOzli7eLt2GiAQIHNESGDgiAQJHJEDgiAQIHJEAgUMlAAkvFo8IACUB2vg8AGAvnkabjZtaDi4apBHbEjkB2lgtth99GKuskmewgCt4HKse77VTzQsrigFqZYvlESZkLbZORP9EIKIvUvpyBJPxsE0b5H6niOvNo9x++cOUx2AIuVKJbhMI9EXqEeg2md5OvU7HKXXKto2Z8jvVtugwtbL/h7UF2kSHibIYaeDlZJW3ir/WTrPZDyuk7wt4FMBXAQC/DAD4Kh7Ho7igdBYzOIhjOAtgCqv4qCa34xEA9wMA9mEX9mnyfQD2YR92AbjDjE7uz/4eAXCHyX8fgA9k8g/E0Y0vUl9AG6v4L7y/OHobe3GEVXAbq7iJCazjEOsUoWynen23+j+Qfv8FZnFqC+URJmRdwQaVi6b7xG/ikrpCF4noOC0aZ93wtwD53eL6fKNhy2MwhPxL+q6A23SRbhMZHvLEyRA9hgBEZgLEMKahdAdP48PZPoFfx1+P5T59EUNAnA8QOOLTcuCIBAgckQCBIxIgcJQEcL0PoKl8Hm8U8jeY9/4NWz7s+o1aXhdZnq+Ritek8WJTuWubuWHLh12/Uctrh/TjNHE4XURrKndtNDls+bDrN2p5g5DeAh4rOgTxla2PMd9EqPLl4tWyy8b0iSW9K381h2Gkd9XfVX57+u9KL8U1pbfJxVLwta6I1BBUWoMS7Zcs5woivk98CcBR6cjg8vdJ785fjFE1fcLkBUt+fPoyF11+DgDwpLH98qPP4ZMYzCJVAnE7/MpH/OT5fbe8H6tyUn5XzZ/PDZ6/3fmTNf/m7QPts5o8f+Pvc8wZa4a7B8ChEneE/3W46OoR7BCXo9fJIRE+66Qnj7S6o1zG5yyyk/gUPoX86h8QBn0L6AN4CvVvAc27eHP59BzqdeG2/G3lKxVPteQpBUT1D+wW4HofQCkXocqXKHcZLyly8aVTJdYYOTnlqJH+Kpueq5+r/mL5q6aXby/V5flNQJc3HgVckfiQ4wrzTYQq7yDfQ6xjTE+W9K781RyGkd5Vf1f5bekJck9VVQ5A6vz5WldFxoSdbogZtSFq2PLaofw6T28Umb9B81rUpvLT9GYhf5MxYgxbPuz6jVpeM8QJIYEjegMDRyRA4IgECByRAIEjEiBwRAIEDtEZpDsdZYy7PKIGZG/gZPFtjY3dVB4xdtBvAc1Ut+bModmVmzTOIUKCSgCXAtewZpVPYk3oB3S4FChOieJANX39EQaoBJgErAqcxKRVvoZJK0EI9gkTpPnEZLgmVERUhH4LmKyRi5zankOz69dFoIiKEJ1Bo36Kj6OAESB6AwNHNAQFjkiAwBEJEDgiAQJHJEDgiAQIHNuXAJ1oEBoEZAI0t7MRuiB0h17uDpZwdOhnCQAyAY5mf6OG6+pO1b886mLuBMgEWMr+RgvX1R3VP0D49gCEjvZXDcyqJBapes00zNUfnwEGAnlG0BKWscReWwmAZeWvGma9YuXqP2qVL8dngIFBuig72Z8eiDraHx+vS/zrWnToccT8YZTDcv4YGq0NpMYTLgizmGNf1qCPDNQ45dW/xJZBvvrjM8Bg4NkD+AZzD+CTtsrVb4oXQ6WgqqDpqx6aEMAWOPXHm8DACdC8BxhWyNWtfsbQMMQZQYFj+/oCIgaC/wcZyXzt5t67NgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0xMC0xOVQyMzo1MzoyOSswMjowMLU6Y9MAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMTAtMTlUMjM6NTM6MjkrMDI6MDDEZ9tvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAABJRU5ErkJggg==)}.ui-button .ui-state-highlight.ui-icon,.ui-state-highlight .ui-icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABLFBMVEUug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8p2Tp3AAAAY3RSTlMAWEd8IjKY4b3Ld2acsomqpVpOeudAQGVmhVOLRpGUY2NhTaBobXqbc6W/fcC8463l6eSBjl3f3eC51tvSxNXU12LacP4Nzplp+DgqFhzFedHjp4FYyJPQ2K/wzZCniLC7x6vHwZbrAAAAAWJLR0QAiAUdSAAAAAd0SU1FB98KExc1Hf/+/xAAAA+BSURBVHja7V0LYxvFEd67iyQsxycZJGgDCYrBKSR1WjdJX5RCGiJICzFpmxCamFLm//+H7t5rZ2f2oeNk6Wzv58T23D7nu9m9md09WYiIiIgeIIFk213Ysv7QcwY6dy8Bv/4JZkBl3iwhxAJBwSSA9sdIV6kJvgLAGgBPA6R88etGTYJaICcgof0x0ukdZATQ4rwBljnZIAOs/3YVPOmcQUFy+2u3ZU68mdYKZsG8i/QGcwvx3mFuAZ4ObN4C7KSwLvoIYKWBmYindmKCm58DVuDjTJ8CdAht/imwdVx2RygiIiIiIiKixzhzT3DLflDCojWgzntCS9DsRoCfsAZ86wFsQUjWvlFKLB1gBLAMNLsZLiasAUqAJ7pUtW8yGGL9t/fYk2xZUUk8xUVgCRAKAja2HMAtWNhs1ojWVlgPSMzafCNq2xZgReLpcff1AD5CtjoHhHHRnwIREREREREREdtDN8c/6JoG6+8ceHSsAPh2KrTI3bl//DgA61CgNvBf4eqRZOBZzOLgSrM34O2AJdXfvq0GH0EsnVXGNODNAUkER2LNKKuPFABX4grt83AZQgTwBSDwaxAu7sliKljlJmtWZnZaoZc/aw6vCXkHkLBZCGHcUtxvouEW2qgXHOOWM0TgTw/USG4HBG9IoAEQ1jbdqdt+Cpxx+fBjMiIiIiIiIuKyovux1I5uRmI5je6u0uaHBreqAs2368BKDfjjeba3aukAShd4c2oFr05ldgcnYN3e551kVbrbt8S3VAFf3WC9qYgfgbcneW8th90TLwGBs+HCamY+Brz8JZblnsDygxHO1uFwfYHtnRMLYuGwJRpnr2yIFTpgT7UyTGqn5S024C7OCGA94N0z0+kQCxNg74DzFq6UzAJmNwHWvXW+Q++8AWwIkCESHAL2UZ44czCGvYcDeB6LgQmzAsF26AMEkEmQpLJpKbSCQ9u33CN/sr0XDgJXCd4DFsAz93s9YNvvx0RERERERPQaZ/sU544KeVXWUmK9jkW4OmiXvaX+wK/g6M9aArO20n450ZhmBqfIdnb8G1/tAey0uOk7lnuTnrfDA66+JQMwhYURfXoJAXudXQlwv99dJHk+H8C2nmHuV7P++oKDuiy4iq+dgDrcdBGQWMJh3nVPPMXTbbvTQFLBnxnWSEFi6SELdwGbKHjHsKU2uiDiPbNiJYAOibWHd3pSU4sJLDoz3++3pBPBNuwxIYyfACEhwrvDXNFh0Sl5YyQQvYYOAYXWH/zrRxcQF12/iIiIiIiLjfScP8gsbgf4tquoN/xz9O/TVoB1m8X0vtLgbiCkpFKvKESvNkPY0WWB4hWlagopCobM+C6F0gJ0fmHdAmcE9mXYAI9e6PF6qb8RnRkEQEmCEc9SEeubQL8IsGy/c4JSIlMC8E9hid3QtaQZYn0ZAitYAMtvntgoCXJYAD2vUNPdG/2ZjmwOIDmsKzSpthI6B1gOyPTG/HWfDAn/cEz5KH9qVwgsvyls8LMyWzDA6Wh3k+gz0IekhwR0RRv9IyIiIiIuFzLlJ2Sr578ykLiyqd4NZedGQ1+ONwKeG+yUrpJLxYwmZ34+rogxwFhcIRWgErtS3BUOmSaKqxVIgVol2MvzIXL2it8NQgq3aMJPP9fitNJwaujb9JjKbGdrt0qvez0Yw2AA44HRAcGCCXrW1iqUFya2FpsgLc/ztAQhZGQQgBgAZaID3eKOQYCsel+icaWhtgDXfndZna5wAIM333wLMAGz2cz/BobABIgAAbsGgaBURxckIQkmpOygSfh8/vZ87rIAGAL6oRqu5gBAHTR6PC+KzzUBb77zi18aBFy7do0dj3fL5AIlQOn/LibANCmQ+ps2Bu+l6gs1eE3BaQH7SnUY7ut1gKyw/4YAVT9aYiur0xXKIXD9Oh4CMyFvgfzeFMiKr59JgNL/6o133QQk5IK8kiT7CQph4P3Fwj0HwL5kQOqPCSj+NQQUkyAi4KYqffNmfeGgnAQPiDqoACeAvaIhCAEf4PWJyfSq/J67CKANwocFUIOHh4egTZRZQLY/HMpveggUspuAwxLVhWQM74zHt2CM3xFCQ0he+FXxhfUdUAIGhAAwLGCi9fcQ0FT3UQFicoOGAGoB2X6B+hYxGdQcOwRjTI7HzVNgXLc/dloAJyA0BHB6OQfmTeaGgMxsr6mu9APgDeEAsQD62MtY/ZPyHuAqMv3oBq5wYNL7uBA/Fo4LlICCgVysD1k2LdDC12Mcmq5LODu0Wq6h2F2r/hERERERPcft2/70FLzr2gC2o48EmQ537xSPqTu1WAXbTYw9qeRJU7Z0TXZXloX4NelP7n2uyWhrTi7JxzbWP8s0AyPlRR6Nh9oP2ZFdnuw0jpyVikxfv1O54jUDsrAC2WkyPZuxcgVXlsv70WiQK2cubZ7tqeJ2gu/pXYC7RH/luC20/so3b6JfejqcOWYCfiO/9nCHMnmfM5Tf2BuksYX4rTgWv8Px7VgKY0MWpvz24G0kq/5Pp64OQuXsV3JtcMjiZGenae251isWTXTFCShXBxAB927ef3DjJlo2yqR9Z7g/XgJ+D3+QX3/ECirXn8g4+JCx8QClT80OVs58am/vdi2ieWAEe1PJQSnsVM56tuMioJoFkAXswZ/gtu6Q1B8t2YUt4M/iE/EXvaR0SCzgkFjAobKAuZanRuwhR0A5STXxLWnv01L6tOlgEcxrAygC1AzpGybg3s0PPpRfdv0rTx0TkEKx6lTLf4XP5Nfn6MSEMcYL+S0io/Ri/Ep86CCgju5So0PEfgSGOcvDYCgWRrxICMgIw0T/5kSESQCSH35ybXTtb48qeb+ubnc1eWrePcGGQCVj8e5dLSvbb9Y7rQQIAnlBrQ+6j9CQRe47VYf1U0AdMRKuIaGGO6nOLwuiPw/gU6y/uP+FnP4mX9xvCJDjP/WUZ4pO2CRqLrKyRX7iB9BlbyLbPgHGJ0+p/vQxKMpDXTq52BG4mjflgdVgYCzOIfIWAb7hA0VEREREbAFDvDCtXDk4ZHke61/P+GhhsRXhffpBlx6ksJTfl/jRfATI1XwXvvzyq6/gEerOntK/gPzl1g24dw9u3KrTy9gNc1liSGR6oQneqN80htFw+MRgwP/hYiFMZV1jFG2CZGBJvfGF9rz+rvAP7Youh7KCKQtumnQjNmUvWVfBq84jXcdMBjt6c7BM0MGVcoyX8MRyWvZnEqBcLVRC6V78Nw1AE/D1N48ff/O17s9QQD7V7honoIxG6p2mYjEKHXhIRblUkWpfO1PrMYiAB2qvDje4VKy7CKDhJVeXpJe7e9qiloWs9U/N/FDY+m5T/KlMGiF3FQbkQIZZvtgHRRlABZ4ynhPYAiYTfF59fHKiwktNgNRfoCUwyjgNFuwiMfGm/7UNIP3LO1jPAZ/BrgQ8bTLkuVEe5n4CDuSvB+pfnawMbAgLZAEken3wYP/BCRw1FT5RvRutjwBqAd8W8jNTf63geFlgYRbXhEH63nw+Nwio7mz5Y7FYvP9wsXhIDjwsnXPAyYkaAHgSfDIcjtY4CZI54NtqDqgYUPrnRjh6S/V3oYsv9+AIMaAqOkDTXgYmAR99VP0jBuKcA4bZyckJnGAG6GNw3U+BZ+IZjv9p6LacTPSClZwB5b9UMwDGj/rX3foCfQwqiyjhmANgqIAJsN3DLgQQpMW9f1b7AZYzguYMK63lSapmysd16j//9W/zY11EMWtU0iBTS3pZfWCjvR+wfRw8f36AxOme4ip93DBGO2w8BiMiIiI6Y4hPR7/4Tk0x373Ydqc2iJcALxvh+3rW/X7b3doYrit1r1fCi/KJo75rG5jBDBf4j8WZEes7eTYr+J91r2hVvFQBVG0CrzQBr5ocxG2w+RG5poRtPdALVIaZeqbPvPWfIa6XCl9HjVPXg/UnpRdybRTl5i1SkF6YwuvBa3N3ljW3SQLkDKBC6JdG42YfJnhjrNRfby/mpv62o7vTdIr1ey2/vTYyzLZIQF7f79xNQE6GPMBxitOw/jYCUsNkioPmAyOcNgjIYDabbc7T1Qq7CeBlkP5Sd2NS7GwBm50ECwMoX5opdHiuCXiOMuX+CnB65zlgs9EanfTua/E+zkQKEQYMfjo/BYTY4BQ40wqXPTitxVOsI50DsJSv//T5VoP1H9SyLDz9YZt96NNqRURERERExBkjB5941oARcWRWekOiC3Z2qP7gEc+eACAUGAQUaSnOkI9S9c3IoELmWp6UmdzhbU5855wlQ7FDtkECTApMAsq0ps/F7ZHq0QwGATidE0CDRb4YYB7G3QgB+DAwJaBY/qg6WfwY4T5XGTABI4tOYY0NcZ1/P2AlAjZoASsRsGEL2OwcQLH1OWDDTwG+3rHlp0APsF0/ICIiIiLicsP/HtlFR/pfAT8+RGc3pZdydIk+J1e9Rwo/5uh9hnH+1PICRe2b0M8/aCv3Dkv4nyRAoNPJipURY4C+WarP67eT+4YUjoX4MRfH+G3r5UJGtOb7tVqRwXwg/zXHt2FunmdXMpjyQH0NeureZtW5+SN9h8ZTUKft9xwEFB+NluzXn68HCSSJulDL++pLf/6eSpdXkv2eElBYgMQxvuNqXlgap5MRAY9KNCbeUu4dRsUzcIrOvMhgdAiLoYOACzcJjgGOj47xtF8uR+iQFNb8Fy77hvFLeX9ensu35iMiIiIiOoO+HxCS6SGqtnLb9rrKIdD3A0IyPUbXVm7bXlc5eP+hwYtVZHqQsq3ctr2uchD0/YBXuoJaPlW+4Wkll0dpi/TnjQxUFs70Vzr9lbN9Ad50daKTpAvaf4Hfd/ABdAPQyHUlotoNPj3Fu8Oh/Dyd5ddb5LZ0vHtm/wlGf8RPP/0kzP4IcbLi/hqgd3odshq9p6TDuEMsv2AK+fMTAoL9EfV/h3xS6r8+AqboM+gsBNh+tlEo2L7FQnwWcCJK/VcmIDwE1KdvtTHx0BCBEIHeISVIfipLBk6a/EHQ9wMsk1o9CepJjE5SQGX3pGqdJGn7dJI102t+XLIaA40cxKYfY10fo23lMDbtyHR1pNrKYWzale3qSreVIyIiIiIiIjyoHIczk3sP8vcDw/IFJAD8BBRfWEHhJ0DQP3rYb5QfSQgemRAE9TeXTP78Xd8RLeDSzwGX/SkQERERERERsW4k58cTCJ6ChKz9QdeE/H2gPiMRgb6uQAC93+dJ/3VYANX3XOlvWkBxvL34chDQ7L2Z+hocqtIXdg7Iapj64zte6n9+bKCrBZT5z6/+XS3g3Ovf9Sng0P/CzgEBaP3Pjw0ELaANlN71/4iInuP/VPKCJpghgS4AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTAtMTlUMjM6NTM6MjkrMDI6MDC1OmPTAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTE5VDIzOjUzOjI5KzAyOjAwxGfbbwAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII=)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAQAAABFnnJAAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQffChMXNR3//v8QAAAYOklEQVR42u1dbYxdx1l+jhMpKsHBfLkmcbKSfzQBIUu+SyQUhGQUoWt+BBWVwLUjPhqjdarSqgjIbqy7P8Kadu+CQlIXaV05kD83u1oXpbg/WFObVKYxFu6uA6U4pWratUO35k9p/pAi4Zcf52s+3vk459y79+7OPKPde+95Z+bMzPucOWfed2ZOQogIGbtGXYCI0SISIHBEAsjogNAZdSG2EpEAIjpYArAUEgUGTYDRXz8d1H2uTdV/FCYK5DmPvo6DBImhQ0QdgiGUgDVOxyKHJX2etmOMYz83rGndNbCfvzzqruM2CnoVzZXzIUDH2Tzm9Hlacw4uArjO7lMDd87uOm6jUKX5qyihXnofCsKRd5Oy++bsquM2CnoVmygQzuvXpwepfwX79ABuJXMtEEAP4BvqPwPU74D9c3A/A8CR1qTeAJ4BBhFG3zSdBgSz34I6BQFGXccBhiT6AiR0sISjWB51MbYOkQCBI1oCA0ckQOCIBAgckQCBIxIgcEQCBI5IgMAR5wOoaUdd/q2GZux0edPIaW23G0rNploZfAyXEbbJfACXLzIv+44yBVdvADcB3Dm4crf5E22N3/EqXV1vZV72HeoMcjd/lSaul9pvSorbXVyXnvZAAgF2yGwAdT6Ar8e+XhO7+w/f+QAda9nq3qAC7wH8Q6dmE/vQyx7cObjo6XMDCfYZYBBh9I3TdD7AqMu/xSG6gwNHNAQFjkiAwBEJEDgiAQJHJEDgiAQIHJEAgePuURdg7EBIRnjuHPXLULH8dzdLPpRGGGUJyFmCVEl1yuhOOYKay7cAgshCrgqZAdlZzWqSqqh7Dlf5U9Un1lzc5Kib2q8GPrEqpN0lRXBVP/GogDl94tFAPlUwX6E+vYetDonyWe0cucTdAvYa2glEjtSA6yKWyi/eAnyrTwaJu5GSAXTwNgW476JNSkBF6oSVimfnzpJfXuYykEVuz7usnf0yEEuZAFUfAsnj6nHF8mFnvWvcT7mJR+42BfnkW7cFbJegT97uNtDkVYaBZRfnE4uX2btAN4Ptebi6WL8u2nUFuc7u8xBZF26Ku+VSCVR3cOijgO19/hrDyDgfIHBES2DgiAQIHJEAgSMSIHBEAgSOSIDAEQkQOEQCdEAY9fJol61wuPBpAR+PaL104nqNuqieVloV47N4su7yLr8UfjnXW/vjt6zMtwX49HmMjneqqnXoWFvAvjBOLmXKFq153MV0xWlSfZ9YbgXULbdPC5hiiKsSORL5tK3fXu2dBgTQ1k7Wbf7qG0b7UaA+/dxbuPuowC8PTgE69OZv0gPJOZMzBk8ALY7sCyC4fX0A73RU7z1JhbR+JSjnIpj88a7z29K7zu9Krd97zaV0efzhlHLp01feADDsdqzO5UiAqqOAsgHqeKwSIQ8+d5I+beevg7Lc9R6y7Gc/mknzGUdHK7dBUrirE4PUljOwnElsm12rpax0C6hyH+/UyMP1EObTgbpLZ87H3oX63cHzuO6dlureguwPgfa0cinTK63i6f1O5Noiwq7EJqmrNEU1Avo8QfjTry4BfHKulEecDyAif3FcfF9ARCiIpuDAEQkQOCIBAkckQOCIBAgckQCDxjYbVqnzAVywecx9qt7JDVBjiuals61OGse6K3Ywu93IZivzsT7l5zDZ7HwtjU0tca6cqYZUtsXVSz+CUBqCRGaabGE2f5W4NNKW3uaJ83Hz2D1yrhzSGGTw1NkWuIrntaevk/vIwD8DLBk6ebu/qrw1LNWYWJYuy3R1krY9DMjb15dUOMqdlzu/e2XzWKLsAVI7eNmEtlX4nKz0Rmc5V0ibS/2WQLsXb9ffQsKmRlcP4Z+zbY+ALUbZAywLfuY6RVs2+qnzBnB5+937Z9iRCD0I30PIn1yMwVzF3Bnk3mNM1C/fApaLQnEdeNrBE2wTEmyTFo4y3/RGAuzXrx1JUQJ+SoW96cubkHl3kTxmUlEqxqg7oWY4qPCcbZusIcezvTGk2X78Pr5uqinzeT4nxyhiEDMGtjREd7CMsematwqRAIEjmoIDRyRA4IgECByRAIEjEiBwjB8B2g3tgRGVoBLAz5dtc9mQl9QUo43VLRmJj3ofhLFBte3ifbaTTnCkQXlWkZOkbY1Xd8v6EnU8ljsQMgHsVmq7tTu/qttYZSmQX/MJxKWJJdKu/0gRY9WQPv9Wb1N1sfdZQoS0QYT632Qtt813aRNRm/j183LOxMrTHExlIGsJ2fXvReho8m1mtR+uL8BvdbudSelcmyO4YJWbfPau37ajukSNJ852yOsb1BpAE8QpYQl0NakwT2XwmxBhnlSmEsg0JYMvoWv7BJngCSiqP0X5wgixyUwKLidG+bx2gYPPbvZHcAGkPUfks4n4Xfnl8vi8NiICQLVRAAmjAH7GjW0A6JIfKaSrABLtRpIIZ+ceVu3zicSdMaLyBfi/MEKeFVt+HzTMTxHN0MFSVL2OcZsPMCz1RxgwbgSI2GKMny8gYksRCRA4IgECRyRA4NhJBOgWlobuUPI/gFYWDoy6qgMEgUCLmXNkgxZruxUuNXSyEF2THDXdium7ztTdmjmn4QCBpomIaDr7ZSsBf46pTDplOIdZ7koJOqsE+xkKLeWNf5561CuIoKqxPG4mSLn6fcW6sshEkr6iwr5FvXoTu+RyCV1NwzV1i6aJqEUtIpqmlqUF+HPosLWQv0SMseJdxyJGagcgLAAA/kHqHC4I3cQXcAPAj+BEcewmJpSuJLcSngPwJOvKmSy+rzHumq/g54Tfr+IpSQokOFbI1HXGhFnMCb9nMWdcv2tyZk1Kv9UStrCGSewH8LP4U0xinckhwSYA4KdQb4VRWituDbVZIsY4V7Q7d/4pnJF+S28Pz1W/qkbIcAPAdXwPr1mK38o+nzTGuM+S+lXckAig4gxEV/IZgYopTgEFBWZxSqKD2IDmhrwPrxfff4ktw368HwnutZTy9y0y1SPJy/kXUCdMLtUolqv/z/FH4uHSG7jqyOA6vqfFkYvwE5kvj5j5PCl+3JL/MXzFev7LKF3GZ3BZI0BJgVmcYnNoK5966X7dWtIZ/C0+DeDjmGHTfxfAt4TvOmYxV/xtLXL1v4z3yRS42zMDTv0qfgwAsAt3jDH2AADOsjJXD5BTADiDy8Y4CWAcAzyqfKq4D3+VfXuakT6AHoB5ADPo4QntFqB6UusuM3XvkuCK8Qp+VzuWqv8c3gfgowCQ3fS9CcD1EGoF9zjz+KHi26Qmc/UAwIFM8ZdxAG8z8i7exiKAy+ga+gA7fhgfL76p6GAC5zGFGQB3gTCDey0TSmZxilXShPBnQgsuuGL8DkOAEzgD4Emcy56jFjCdCvwJoELn973ONJ/OPicZmasHSJWeUuBtZiTeleRcL7Bf+eSaCJhBep3Lt5gJzAP4bPF73nAbSDHXoItfaxiDn9PxWSCjACCoH8UwsO0YRrmHMJck+aXK42zVDjDYYWA+SCo/TaXosqNtDtWGuW5531h7nxhiDfn880FgTzw6Pu7gLoCfFn7fqNWNNwUBOCFc6YPPPcVopqZM4Yx09SPOBwgeO8kXEFEDkQCBIxIgcEQCBI5IgJ2F1wV/hhdkArRBcC3MNoMKR0bToUUX3KSOWWH4OqtJF5Vh76IiX1HkK8x5pwT51BDkAPAlR/v00KvdboezYEcfffSLX0KbtImoS11K1/fKYYNamRnhIk3TImsGuZYZIlbomiK3e7LV0GXjzwqebCKiWdYQkgc9vduQk8aZpuls4sfg5Xmc1KijSnqFQa6tmmsy7RCtELLatZm8bxER0S1r6+bGpD4dJ4ivjm1nVjBiKUDCyyJ87GD88nCiv8n+zhsbqEvpBJSuIX/Ty1ddCiYC/SeBbhPoHTItMJ/OJNMWOazyw9SiwwZ53vx96lduwRwrrHxFS73Cnn+RiPrULi2Jojs4d1LOYbbWRi3ick7ec/gn+DY2cB2bWMN32BhdzGE/nsE7Q7ADfgv345vYi2/iAXzbGCu1pc9Y5ZB96hLexbrRXdPPXDHHWOkRqdVM+6zwsy1+0uMIAPwKgN34bQBAGxdQ9ADXtDl11yr3AGIHZ+oBzhPRBSJ6nb1CukTs1T+oHuDfCfQNAv0rtZjzf8zRA+RyWOXmHqAvlU69BfSEUqfoVarflyXZl5kWPE7H9bOrp+hmRNCbfxAEeJ4+TK/QM9lfFfXLs+JMBEj3J2ln90tV/jUi+rfs74Ymz+tnuoeX8pMOOZ++vPem4ZmKBFDddfozgE07Iv2k42oG4qcsa9EioeBQj4lhJ4Dur6uifrV6dgLw8qfpG/Qh2qAP0X/QJxT5Ma10UwOVl+qHMcgqblvlJumt7EFQlfcpv/dv1CUAHCHfI6jtGZ9XsHnK9qzSwNwooF1UnSeImYAp/tBRuiZyONTv43LPKcCNAF6gO9mD3wrdoRcYApynvp7W9/RuhcrPofwzqG3Ssl39KgVmNalrWrddTmR/lUVTed+pftcwsKRA25C6XAtwVktt7IF83cHTDcwTEVXQA2SP/YCQmn6eUg/H+QCBI/oCAkckQOCIBAgckQCBIzwCpG5jbkzTK8ZGH/PIZzd7lLDdnqqFMeF0MUaedoxYXcaMuqmbhDYRrWff142j5YtFHdWR8p8R0Rk6Qx+hjxDRJ7SUaeucz37tFkJ65CR9hoiep+eJ6DN0UktfWkI5a4e8MJ9IXYivy10x9IX8rJ1HruAGLdIivWehgEu9wyRAPyvXNGtUSbGeqZ8vRW4OOc6aun6+CD9DnC10nRazEvQZCrnseLmXok28Gcx+pEzdNuST2hq7mTeH241dTFE4q8QIG8XV855RiaMkQG7L4s+Rq7381HO4aFER0V7aT7tpN+2nvaxCFglE1Ct8+rbriyeAeQ8RorSP6BZtrBMA0iwKnQBpriuFTZYjwG/RsSxkcvEZ4O8ArOMQruOV2vcS/XvlO1ERVKQ++mPCdxEtXAcAHAIAXGd88m08bi3D/+D7AIDv44OM9ApOgAB0cAzq9hUpJoXAY87wPS3/HIA5tDCJSXZGQRtPAFgEcJzN3b7dd4JVzGA/JvAgHsSD+WF5cWiq/pY2nw4QlzXV2ylYVWj1CSc9HMzU/yr7ENfCulX9q9K6/AVF/jW8WywIPYMrWvpfQA/As3gIvPqB+/Bu5TqVeKD4PA/gV5kYfwwgXbR6AsA7mpxQ0kq/fLoAvgPg/3AX9uOTuJQeFt8X8APckzXdBh5y7LgPp1x/H0AVKXeGacwX32cYCvwLDhbf3yk5DkBVP6fAafym8Osv8bLl7BzB0q0x/hcA8C67Bc4RaZ6V+oKL35OOE15W5PJ8oet4Tpm1lW7hn06WnWO28yecBLABIPULZNLyFjCDe/AD/DMWsYGHmC623Gid33JdPMrFSJRgl3JnmM+UV34Xkas/vRHsxy1Jmqt/AUeQsNdvD5/DoSzo6gfmcR1fAHAJwCFmhyDgAv4eX8Ju3MNOx5p1bLCxB3twFnvwo9l/Ow4xx9KL6CAOgr+gJnAXJjCBCQAnldt18WToGgaO+yjgFuVzY7lHpJ7jDOu0QivsdCpkqYl6mct2XZObf6lHp7QYrmEg0XEt8KOAlWyvMP0hcLEIRM/powC/MEoC2EObygnRt0i1A+jP3ebS8+VPRxfvUZvyiRm7tbRL9Dx1LK1EBJrKghqjlY0C0v/qNnRbYAeIAfQEXaWr9IRB2qfzBa3atJuhmG0YCPLZSnLLQ5wPEDjC8wVESIgECByRAIFDJcAiawUEgNN4s3hyeBOnR13wiMFAfgh8Cw8D+Doe0eK9ptnHP49fG3XhI5pD7AFewsMAgIfxkhLrdKH+0kL3QbYX2ARlO2Zz+O+sB3FPMR/HSeibwuhps3l2YwJhTPgWUeZnfksZLa5Jo9sca8y40m4Iso+Sy9BjrXbu5VWuGC450WYxPt9sUP5tFMqvL0kKfslQcZexw908bWeMfJmkTIFm+2jm8hepRS8ac/Cr3Q4lwFtERQ+g9gFyxW3NsEKmZWGi+jcYSa/45NTvVg4yxbczInDyF7NvL1py2AyTAD1SISrAnwB85y3ndJuZr5enM6nflwClpZ6T5xZ2fXeAEmYCdIlokzZpk8bGkDs4AnAKrkMAV8iVpKs/VbtJ/ePQA2wK598k7IwgK6C8BchquMoS4CqToasHMAWxB+LTj/4ZwE3BbRi4qumVfIGVvsBk6Gocs9R29csKHt0oII0zcqUNngCbrILFJljSpEtGNbqeAUyyur3H1oYdRgB/d/A8fhGPZd+v4B+tb8zYyaj7LqAxRZwPEDiiNzBwRAIEjkiAwBEJEDgiAQJHJICKHqi2dBtCJABhwzERgzCoV0KMCtdwzSrv4dna0u0JxUpHtGGxxoneAFWSp2sbc+jRRuYI6tGGJQcQsuVNsnxFyqmOu7bnMDb3PFLnLTD+NkuvwDefSYU2Aojp9GbuFWlS5blyMBPAlN6HADap3dGjS3eISdhUSX5ah4sAqQrL37IUhEJ5rhxMBDCndxOgqorNUm7x5TYN/EPgTSzgN2rcT25iARNIFycvCDbzBAvZ0Qks4KZHDia40m8NdpI3QGP5Tn4GcIXgnwE2HNUyE2A7BPIgSK+BdFuG6A1U0cOzli7eLt2GiAQIHNESGDgiAQJHJEDgiAQIHJEAgUMlAAkvFo8IACUB2vg8AGAvnkabjZtaDi4apBHbEjkB2lgtth99GKuskmewgCt4HKse77VTzQsrigFqZYvlESZkLbZORP9EIKIvUvpyBJPxsE0b5H6niOvNo9x++cOUx2AIuVKJbhMI9EXqEeg2md5OvU7HKXXKto2Z8jvVtugwtbL/h7UF2kSHibIYaeDlZJW3ir/WTrPZDyuk7wt4FMBXAQC/DAD4Kh7Ho7igdBYzOIhjOAtgCqv4qCa34xEA9wMA9mEX9mnyfQD2YR92AbjDjE7uz/4eAXCHyX8fgA9k8g/E0Y0vUl9AG6v4L7y/OHobe3GEVXAbq7iJCazjEOsUoWynen23+j+Qfv8FZnFqC+URJmRdwQaVi6b7xG/ikrpCF4noOC0aZ93wtwD53eL6fKNhy2MwhPxL+q6A23SRbhMZHvLEyRA9hgBEZgLEMKahdAdP48PZPoFfx1+P5T59EUNAnA8QOOLTcuCIBAgckQCBIxIgcJQEcL0PoKl8Hm8U8jeY9/4NWz7s+o1aXhdZnq+Ritek8WJTuWubuWHLh12/Uctrh/TjNHE4XURrKndtNDls+bDrN2p5g5DeAh4rOgTxla2PMd9EqPLl4tWyy8b0iSW9K381h2Gkd9XfVX57+u9KL8U1pbfJxVLwta6I1BBUWoMS7Zcs5woivk98CcBR6cjg8vdJ785fjFE1fcLkBUt+fPoyF11+DgDwpLH98qPP4ZMYzCJVAnE7/MpH/OT5fbe8H6tyUn5XzZ/PDZ6/3fmTNf/m7QPts5o8f+Pvc8wZa4a7B8ChEneE/3W46OoR7BCXo9fJIRE+66Qnj7S6o1zG5yyyk/gUPoX86h8QBn0L6AN4CvVvAc27eHP59BzqdeG2/G3lKxVPteQpBUT1D+wW4HofQCkXocqXKHcZLyly8aVTJdYYOTnlqJH+Kpueq5+r/mL5q6aXby/V5flNQJc3HgVckfiQ4wrzTYQq7yDfQ6xjTE+W9K781RyGkd5Vf1f5bekJck9VVQ5A6vz5WldFxoSdbogZtSFq2PLaofw6T28Umb9B81rUpvLT9GYhf5MxYgxbPuz6jVpeM8QJIYEjegMDRyRA4IgECByRAIEjEiBwRAIEDtEZpDsdZYy7PKIGZG/gZPFtjY3dVB4xdtBvAc1Ut+bModmVmzTOIUKCSgCXAtewZpVPYk3oB3S4FChOieJANX39EQaoBJgErAqcxKRVvoZJK0EI9gkTpPnEZLgmVERUhH4LmKyRi5zankOz69dFoIiKEJ1Bo36Kj6OAESB6AwNHNAQFjkiAwBEJEDgiAQJHJEDgiAQIHNuXAJ1oEBoEZAI0t7MRuiB0h17uDpZwdOhnCQAyAY5mf6OG6+pO1b886mLuBMgEWMr+RgvX1R3VP0D49gCEjvZXDcyqJBapes00zNUfnwEGAnlG0BKWscReWwmAZeWvGma9YuXqP2qVL8dngIFBuig72Z8eiDraHx+vS/zrWnToccT8YZTDcv4YGq0NpMYTLgizmGNf1qCPDNQ45dW/xJZBvvrjM8Bg4NkD+AZzD+CTtsrVb4oXQ6WgqqDpqx6aEMAWOPXHm8DACdC8BxhWyNWtfsbQMMQZQYFj+/oCIgaC/wcZyXzt5t67NgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0xMC0xOVQyMzo1MzoyOSswMjowMLU6Y9MAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMTAtMTlUMjM6NTM6MjkrMDI6MDDEZ9tvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAABJRU5ErkJggg==)}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-first,.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-left,.ui-corner-tl,.ui-corner-top{border-top-left-radius:6px}.ui-corner-all,.ui-corner-right,.ui-corner-top,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bl,.ui-corner-bottom,.ui-corner-left{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-br,.ui-corner-right{border-bottom-right-radius:6px}.ui-widget-overlay{background:#eee url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoEAAAAAD5BTvyAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0T//xSrMc0AAAAHdElNRQfgBwgUCTBBMMWUAAAAhElEQVRIx+3VMQrAIAyF4Wcmz+Y5e4Yey7E4dhGxIqWQf+iQN4ePgJKXrkM9rWhJPrXJ+5yx3AAproMcJxnLSalWkpseheFaMZZbNvRzD5DgJpDhBkhxHeQ4yVhOMpbbfGwfl09juc2G3lNhLLeAxCEzlotO8XPRKdEp0Snf5qJTftgpN3jsoxwYW8JUAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTA4VDIwOjA5OjQ4KzAyOjAwMXJ2OgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0wOFQyMDowOTo0OCswMjowMEAvzoYAAAAASUVORK5CYII=) 50% 50% repeat;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{box-shadow:-7px -7px 7px #000} \ No newline at end of file diff --git a/sapl/static/sapl/frontend/css/chunk-vendors.9904f9d0.css.gz b/sapl/static/sapl/frontend/css/chunk-vendors.9904f9d0.css.gz new file mode 100644 index 000000000..f0e35d842 Binary files /dev/null and b/sapl/static/sapl/frontend/css/chunk-vendors.9904f9d0.css.gz differ diff --git a/sapl/static/sapl/frontend/css/chunk-vendors.da853c1c.css b/sapl/static/sapl/frontend/css/chunk-vendors.da853c1c.css deleted file mode 100644 index 82f6ed714..000000000 --- a/sapl/static/sapl/frontend/css/chunk-vendors.da853c1c.css +++ /dev/null @@ -1,126 +0,0 @@ -/*! - * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hive:before{content:"\e07f"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-innosoft:before{content:"\e080"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-perbyte:before{content:"\e083"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-uncharted:before{content:"\e084"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-watchman-monitoring:before{content:"\e087"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;font-display:block;src:url(../fonts/fa-brands-400.592643a8.eot);src:url(../fonts/fa-brands-400.592643a8.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-brands-400.ed311c7a.woff2) format("woff2"),url(../fonts/fa-brands-400.1a575a41.woff) format("woff"),url(../fonts/fa-brands-400.513aa607.ttf) format("truetype"),url(../img/fa-brands-400.1d5619cd.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;font-display:block;src:url(../fonts/fa-regular-400.b0e2db3b.eot);src:url(../fonts/fa-regular-400.b0e2db3b.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-regular-400.b91d376b.woff2) format("woff2"),url(../fonts/fa-regular-400.d1d7e3b4.woff) format("woff"),url(../fonts/fa-regular-400.766913e6.ttf) format("truetype"),url(../img/fa-regular-400.c5d109be.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;font-display:block;src:url(../fonts/fa-solid-900.0c6bfc66.eot);src:url(../fonts/fa-solid-900.0c6bfc66.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-solid-900.d824df7e.woff2) format("woff2"),url(../fonts/fa-solid-900.d745348d.woff) format("woff"),url(../fonts/fa-solid-900.b9625119.ttf) format("truetype"),url(../img/fa-solid-900.37bc7099.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:Font Awesome\ 5 Free}.fa,.fas{font-weight:900} - -/*! - * jQuery UI CSS Framework 1.12.1 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/category/theming/ - */ - -/*! - * jQuery UI Draggable 1.12.1 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */ - -/*! - * jQuery UI Resizable 1.12.1 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */ - -/*! - * jQuery UI Button 1.12.1 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/button/#theming - */ - -/*! - * jQuery UI Checkboxradio 1.12.1 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/checkboxradio/#theming - */ - -/*! - * jQuery UI Controlgroup 1.12.1 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/controlgroup/#theming - */ - - -/*! - * jQuery UI Dialog 1.12.1 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/dialog/#theming - */ - -/*! - * jQuery UI Sortable 1.12.1 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */ - -/*! - * jQuery UI Datepicker 1.12.1 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/datepicker/#theming - */ - -/*! - * jQuery UI Autocomplete 1.12.1 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/autocomplete/#theming - */ - -/*! - * jQuery UI Menu 1.12.1 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/menu/#theming - */ - -/*! jQuery UI - v1.12.0 - 2016-07-08 -* http://jqueryui.com -* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css -* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=deedf7&bgTextureHeader=highlight_soft&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=glass&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=3baae3&bgTextureActive=glass&bgImgOpacityActive=50&borderColorActive=2694e8&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=ffef8f&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=flat&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=eeeeee&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=90&opacityOverlay=80&bgColorShadow=000000&bgTextureShadow=highlight_hard&bgImgOpacityShadow=70&opacityShadow=30&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px -* Copyright jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-active,.ui-menu .ui-state-focus{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:active,.ui-button:hover,.ui-button:link,.ui-button:visited{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}button.ui-button::-moz-focus-inner,input.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup>.ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup>.ui-controlgroup-item.ui-visual-focus,.ui-controlgroup>.ui-controlgroup-item:focus{z-index:9999}.ui-controlgroup-vertical>.ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label+.ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label+.ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc(100% - 2.4em)}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-next-hover,.ui-datepicker .ui-datepicker-prev-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td a,.ui-datepicker td span{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw,.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:700;line-height:1.5;padding:2px .4em;margin:.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #aed0ea}.ui-widget-content{border:1px solid #ddd;background:#f2f5f7 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAABkEAIAAACY3hF0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAIpJREFUKM/tz6ENwkAUgOE/DYYJUA0KZkFUIetxqKJZgQUYguJBIQDVAQhhAESTtnf33r0mMAGakKA+/RHPZv01AYA/n2jxSMKeExXqLO9n6CI+rUYusbANkmptE8JKl/GIP8gjZviBzPWGy0OlBd0uZDqkG/u7lMlrzZaSdupTGdE0zoXw7eZP8Qbj00P2LE1L9gAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wNy0wOFQyMDowOTo0OCswMjowMDFydjoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMDctMDhUMjA6MDk6NDgrMDI6MDBAL86GAAAAAElFTkSuQmCC) 50% top repeat-x;color:#362b36}.ui-widget-content a{color:#362b36}.ui-widget-header{border:1px solid #aed0ea;background:#deedf7 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAABkEAIAAACY3hF0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAMFJREFUKM/lkD1qwgAYQB8fuHQpgpBO7eDgUByFdO0RuiX0Dj1DzqD0BmZyd9RFTKd2Kc2UQEUL5qdtSJOYCJ+Dh1Do9JYHDx7ZrFrsXwQA/g0CEipRG5cPwdYxvqjFGJ/vVTnYG6R1MW1C0nZhNq6ooQ4e8fVfr+kTdfLnOmF7kbfqiWihT8z5KrJVfcsmzh52kei7PjIVNXDwjsqMz/XPTfUrmDriTfQKh6WodazfMeSV8D7tVpcEQZKU5akvnTkO8y9eZNHr5WMAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDctMDhUMjA6MDk6NDgrMDI6MDAxcnY6AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA3LTA4VDIwOjA5OjQ4KzAyOjAwQC/OhgAAAABJRU5ErkJggg==) 50% 50% repeat-x;color:#222;font-weight:700}.ui-widget-header a{color:#222}.ui-button,.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,html .ui-button.ui-state-disabled:active,html .ui-button.ui-state-disabled:hover{border:1px solid #aed0ea;background:#d7ebf9 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQEAIAAACwqkHPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAJhJREFUSMftzyEOggAYBeD33mZz02pwYxo1GDQT5BBsJr0RBzA4TkAyOzwBBTcx6BwGHEESSPAUTsOfvvzhHr38dy4AAAzDMIxvgzQtirrGyX9Om644QoCpuOQOM2RO2Wu2uMTltcmkkAld6cgrPDHmDZ4UMoGLfF4NWgePfXVuV9KGERbimAEmwgFrDEUHfXT+Im0YhvFDPkIzLk7A/EzKAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTA4VDIwOjA5OjQ4KzAyOjAwMXJ2OgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0wOFQyMDowOTo0OCswMjowMEAvzoYAAAAASUVORK5CYII=) 50% 50% repeat-x;font-weight:700;color:#2779aa}.ui-button,.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button{color:#2779aa;text-decoration:none}.ui-button:focus,.ui-button:hover,.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{border:1px solid #74b2e2;background:#e4f1fb url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQEAIAAACwqkHPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAJxJREFUSMftz60KwmAYhuHnedEkiFGwujC2uGTRYjAurAp6Ip6BmCyLO4gVk8XgYTiTf3yD/cD2gcFjEA1vutoNN16Hamf3AgCAoiiK8m2QZcY0Da5h7rY9YYENxsIBt3CFHmL4wjVTBLjNi1n7wP1Ydq2D57Q826VwxRQBjNQTe0K+qC+2EnqM6X9ijjBhhKFghD46fzGtKIryQ95Jgy/jpWK+ggAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wNy0wOFQyMDowOTo0OCswMjowMDFydjoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMDctMDhUMjA6MDk6NDgrMDI6MDBAL86GAAAAAElFTkSuQmCC) 50% 50% repeat-x;font-weight:700;color:#0070a3}.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,a.ui-button:focus,a.ui-button:hover{color:#0070a3;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px #5e9ed6}.ui-button.ui-state-active:hover,.ui-button:active,.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active{border:1px solid #2694e8;background:#3baae3 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQEAIAAACwqkHPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAI5JREFUSMdjSJq6e/fLJiYGBgYGBoZRapQapUapUYrm1M1l79//SmRi7GZczWjBxFLJ2MRQz8Ryh2kNYx8Tix3TdYbZTKwsTLqM2yHUDibWdOYIhqNMbOlM4YzH0ORYFjIxMaxkYrVjus44m6G4/7DE6/dMTIGMjIyhTIzJDNoMfIPD06PUKDVKjVIDRwEAMuIhVFSEkAcAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDctMDhUMjA6MDk6NDgrMDI6MDAxcnY6AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA3LTA4VDIwOjA5OjQ4KzAyOjAwQC/OhgAAAABJRU5ErkJggg==) 50% 50% repeat-x;font-weight:700;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#2694e8;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #f9dd34;background:#ffef8f url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAABkEAIAAACY3hF0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAHNJREFUKM/lkM0Jg2AQBYdXyJc+tI/EJnKyEFvwbkuBCHoQ9CDiMfA8rCGCBSSQ0zD72B8WeynquwDgj/CiEzC5FDBSfswDNwG9s0AuoAtrnQIXAS1JwPNdTALv2cM69+3DBq4HG+OIWOvZlYCV5vtf+mlsEsU1wS9R7TYAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDctMDhUMjA6MDk6NDgrMDI6MDAxcnY6AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA3LTA4VDIwOjA5OjQ4KzAyOjAwQC/OhgAAAABJRU5ErkJggg==) 50% top repeat-x;color:#363636}.ui-state-checked{border:1px solid #f9dd34;background:#ffef8f}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#cd0a0a;color:#fff}.ui-state-error-text,.ui-state-error a,.ui-widget-content .ui-state-error-text,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error-text,.ui-widget-header .ui-state-error a{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:400}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon,.ui-widget-header .ui-icon{background-image:url(../img/ui-icons_72a7cf_256x240.55a4c5ce.png)}.ui-button .ui-icon{background-image:url(../img/ui-icons_3d80b3_256x240.24fcd129.png)}.ui-button:focus .ui-icon,.ui-button:hover .ui-icon,.ui-state-default .ui-icon,.ui-state-focus .ui-icon,.ui-state-hover .ui-icon{background-image:url(../img/ui-icons_2694e8_256x240.274157b3.png)}.ui-button:active .ui-icon,.ui-state-active .ui-icon{background-image:url(../img/ui-icons_ffffff_256x240.bb2a88be.png)}.ui-button .ui-state-highlight.ui-icon,.ui-state-highlight .ui-icon{background-image:url(../img/ui-icons_2e83ff_256x240.602e5d4d.png)}.ui-state-error-text .ui-icon,.ui-state-error .ui-icon{background-image:url(../img/ui-icons_ffffff_256x240.bb2a88be.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-first,.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-left,.ui-corner-tl,.ui-corner-top{border-top-left-radius:6px}.ui-corner-all,.ui-corner-right,.ui-corner-top,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bl,.ui-corner-bottom,.ui-corner-left{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-br,.ui-corner-right{border-bottom-right-radius:6px}.ui-widget-overlay{background:#eee url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoEAAAAAD5BTvyAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0T//xSrMc0AAAAHdElNRQfgBwgUCTBBMMWUAAAAhElEQVRIx+3VMQrAIAyF4Wcmz+Y5e4Yey7E4dhGxIqWQf+iQN4ePgJKXrkM9rWhJPrXJ+5yx3AAproMcJxnLSalWkpseheFaMZZbNvRzD5DgJpDhBkhxHeQ4yVhOMpbbfGwfl09juc2G3lNhLLeAxCEzlotO8XPRKdEp0Snf5qJTftgpN3jsoxwYW8JUAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTA4VDIwOjA5OjQ4KzAyOjAwMXJ2OgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0wOFQyMDowOTo0OCswMjowMEAvzoYAAAAASUVORK5CYII=) 50% 50% repeat;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{box-shadow:-7px -7px 7px #000}.tox{box-shadow:none;box-sizing:content-box;color:#222f3e;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit;background:transparent;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #ccc;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox-tinymce-inline{border:none;box-shadow:none}.tox-tinymce-inline .tox-editor-header{background-color:transparent;border:1px solid #ccc;border-radius:0;box-shadow:none}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;z-index:1300}.tox-tinymce-aux :focus,.tox-tinymce :focus{outline:none}button::-moz-focus-inner{border:0}.tox[dir=rtl] .tox-icon--flip svg{transform:rotateY(180deg)}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #ccc;border-radius:3px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#ccc;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.1);border-color:rgba(32,122,183,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:rgba(32,122,183,.4)}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.1);border-color:rgba(255,165,0,.5);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.5)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.1);border-color:rgba(204,0,0,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.4)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#c00}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.1);border-color:rgba(120,171,70,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.4)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar,.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-position:0 0;background-repeat:repeat;border-radius:3px;border-style:solid;border-width:1px;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:none;padding:4px 16px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button,.tox .tox-button[disabled]{background-color:#207ab7;background-image:none;border-color:#207ab7;box-shadow:none}.tox .tox-button[disabled]{color:hsla(0,0%,100%,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled),.tox .tox-button:hover:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#185d8c;background-image:none;border-color:#185d8c;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-position:0 0;background-repeat:repeat;border-radius:3px;border-style:solid;border-width:1px;color:#222f3e;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:none;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary,.tox .tox-button--secondary[disabled]{background-color:#f0f0f0;background-image:none;border-color:#f0f0f0;box-shadow:none}.tox .tox-button--secondary[disabled]{color:rgba(34,47,62,.5)}.tox .tox-button--secondary:focus:not(:disabled),.tox .tox-button--secondary:hover:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:active:not(:disabled){background-color:#d6d6d6;background-image:none;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked[disabled]{background-color:#f0f0f0;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--naked:focus:not(:disabled),.tox .tox-button--naked:hover:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:active:not(:disabled){background-color:#d6d6d6;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#222f3e}.tox .tox-checkbox{align-items:center;border-radius:3px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:3px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:3px;width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(34,47,62,.3)}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg,.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#207ab7}.tox .tox-checkbox--disabled{color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg,.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg,.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(34,47,62,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;box-shadow:inset 0 0 0 1px #207ab7;padding:3px}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#ccc;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#e6e6e6;color:rgba(34,47,62,.7);cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none}.tox .tox-collection__group-heading,.tox .tox-collection__item{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;color:#222f3e;cursor:pointer;display:flex}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--grid .tox-collection__item,.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#fff;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#dee0e2;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled),.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;flex:1;-ms-flex-preferred-size:auto;font-style:normal;font-weight:400;word-break:break-all}.tox .tox-collection__item-accessory,.tox .tox-collection__item-label{display:inline-block;font-size:14px;line-height:24px;text-transform:none}.tox .tox-collection__item-accessory{color:rgba(34,47,62,.7);height:24px}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret:after{content:"";font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#222f3e}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg{fill:rgba(34,47,62,.5)}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark,.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--horizontal{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #ccc}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #ccc}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:none;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(180deg,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{flex-direction:column}.tox .tox-rgb-form,.tox .tox-rgb-form div{display:flex;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-hue-slider,.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-hue-slider,.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:inset 0 0 0 1px hsla(0,0%,49.8%,.3);transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:none;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#dee0e2}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#fff;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#222f3e;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(34,47,62,.7);font-size:12px}.tox .tox-comment__body{color:#222f3e;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:none}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(34,47,62,.7);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay:after{background:#fff;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient:after{background:linear-gradient(hsla(0,0%,100%,0),#fff);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#fff;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#222f3e;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#fff;box-shadow:0 0 8px 8px #fff;color:#222f3e;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#fff;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(34,47,62,.7)}.tox .tox-user__name{color:rgba(34,47,62,.7);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name,.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:hsla(0,0%,100%,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog,.tox .tox-dialog-wrap__backdrop--opaque{background-color:#fff}.tox .tox-dialog{border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#fff;border-bottom:none;color:#222f3e;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:-webkit-grab;cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:-webkit-grabbing;cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:20px;margin:0}.tox .tox-dialog__body,.tox .tox-dialog__title{font-style:normal;font-weight:400;line-height:1.3;text-transform:none}.tox .tox-dialog__body{color:#222f3e;display:flex;flex:1;-ms-flex-preferred-size:auto;font-size:16px;min-width:0;text-align:left}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(34,47,62,.7);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #207ab7;color:#207ab7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#207ab7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:active,.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#222f3e}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{font-size:20px}.tox .tox-dialog__body-content .tox-form__group h1,.tox .tox-dialog__body-content .tox-form__group h2{color:#222f3e;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{font-size:16px}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#fff;border-top:1px solid #ccc;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:hsla(0,0%,100%,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #ccc}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #ccc;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(34,47,62,.7);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;-ms-flex-preferred-size:auto;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;-ms-flex-preferred-size:auto;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #ccc}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{box-shadow:none;transition:box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter,.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(34,47,62,.2);border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#207ab7;cursor:pointer}.tox .tox-color-input span:before{background-image:linear-gradient(45deg,rgba(0,0,0,.25) 25%,transparent 0),linear-gradient(-45deg,rgba(0,0,0,.25) 25%,transparent 0),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.25) 0),linear-gradient(-45deg,transparent 75%,rgba(0,0,0,.25) 0);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #fff;border-radius:3px;box-sizing:border-box;content:"";height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(34,47,62,.7);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - 4px)}.tox .tox-form__grid--3col>.tox-form__group{width:calc(33.33333% - 4px)}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - 4px)}.tox .tox-form__controls-h-stack,.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-textarea{flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:none;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#fff;border-color:#207ab7;box-shadow:none;outline:none}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#222f3e}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#222f3e}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:none;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#fff;border-color:#207ab7;box-shadow:none;outline:none}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;filter:alpha(opacity=50);opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:8px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider,.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:8px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider,.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:32px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#ccc;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:rgba(34,47,62,.7);display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--grid,.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #ccc}.tox .tox-mbtn{align-items:center;background:transparent;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:none;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn--active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:-ms-grid;display:grid;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity .15s ease-in}.tox .tox-notification,.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{cursor:pointer;text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#222f3e}.tox .tox-notification--success p{color:#222f3e}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:#222f3e}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:#222f3e}.tox .tox-notification--error p{color:#222f3e}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:#222f3e}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:#222f3e}.tox .tox-notification--warn a,.tox .tox-notification--warning a,.tox .tox-notification--warning p,.tox .tox-notification--warn p{color:#222f3e}.tox .tox-notification--warning svg,.tox .tox-notification--warn svg{fill:#222f3e}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:#222f3e}.tox .tox-notification--info a,.tox .tox-notification--info p{color:#222f3e}.tox .tox-notification--info svg{fill:#222f3e}.tox .tox-notification__body{-ms-grid-row-align:center;align-self:center;color:#222f3e;font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar,.tox .tox-pop--resizing .tox-toolbar__group{flex-wrap:nowrap}.tox .tox-pop--transition{transition:.15s ease;transition-property:left,right,top,bottom}.tox .tox-pop--transition:after,.tox .tox-pop--transition:before{transition:all .15s,visibility 0s,opacity 75ms ease 75ms}.tox .tox-pop__dialog{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop:after,.tox .tox-pop:before{border-style:solid;content:"";display:block;height:0;opacity:1;position:absolute;width:0}.tox .tox-pop.tox-pop--inset:after,.tox .tox-pop.tox-pop--inset:before{opacity:0;transition:all 0s .15s,visibility 0s,opacity 75ms ease}.tox .tox-pop.tox-pop--bottom:after,.tox .tox-pop.tox-pop--bottom:before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom:after{border-color:#fff transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom:before{border-color:#ccc transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top:after,.tox .tox-pop.tox-pop--top:before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top:after{border-color:transparent transparent #fff transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top:before{border-color:transparent transparent #ccc transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left:after,.tox .tox-pop.tox-pop--left:before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left:after{border-color:transparent #fff transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left:before{border-color:transparent #ccc transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right:after,.tox .tox-pop.tox-pop--right:before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right:after{border-color:transparent transparent transparent #fff;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right:before{border-color:transparent transparent transparent #ccc;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left:after,.tox .tox-pop.tox-pop--align-left:before{left:20px}.tox .tox-pop.tox-pop--align-right:after,.tox .tox-pop.tox-pop--align-right:before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar{background-color:#fff;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane,.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;-ms-flex-preferred-size:auto;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #ccc;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#207ab7;border:2px solid #185d8c;border-radius:3px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{-webkit-animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(34,47,62,.7);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:first-child{-webkit-animation-delay:-.32s;animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){-webkit-animation-delay:-.16s;animation-delay:-.16s}@-webkit-keyframes tam-bouncing-dots{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}@keyframes tam-bouncing-dots{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#fff;border-top:1px solid #ccc;color:rgba(34,47,62,.7);display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount,.tox .tox-statusbar a{color:rgba(34,47,62,.7);text-decoration:none}.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:rgba(34,47,62,.7)}.tox .tox-statusbar__resize-handle:focus svg{background-color:#dee0e2;border-radius:1px;box-shadow:0 0 0 2px #dee0e2}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{background-color:hsla(0,0%,100%,.6);bottom:0;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn,.tox .tox-throbber__busy-spinner{align-items:center;display:flex;justify-content:center}.tox .tox-tbtn{background:transparent;border:0;border-radius:3px;box-shadow:none;color:#222f3e;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;margin:2px 0 3px 0;outline:none;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#222f3e}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus,.tox .tox-tbtn:hover{background:#dee0e2;border:0;box-shadow:none}.tox .tox-tbtn:hover{color:#222f3e}.tox .tox-tbtn:hover svg{fill:#222f3e}.tox .tox-tbtn:active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:active svg{fill:#222f3e}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:transparent;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn--disabled svg,.tox .tox-tbtn:disabled:hover svg,.tox .tox-tbtn:disabled svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled:hover svg,.tox .tox-tbtn--enabled svg{fill:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#222f3e}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:2px 0 3px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:inset 0 0 0 1px #dee0e2}.tox .tox-split-button:focus{background:#dee0e2;box-shadow:none;color:#222f3e}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:transparent;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-toolbar-overlord{background-color:#fff}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #ccc;margin-top:-1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #ccc}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #ccc}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #ccc}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#222f3e;border-radius:3px;box-shadow:0 2px 4px rgba(34,47,62,.3);color:hsla(0,0%,100%,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-top:8px solid #222f3e;bottom:0}.tox .tox-tooltip--down .tox-tooltip__arrow,.tox .tox-tooltip--up .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #222f3e;top:0}.tox .tox-tooltip--right .tox-tooltip__arrow{border-left:8px solid #222f3e;right:0}.tox .tox-tooltip--left .tox-tooltip__arrow,.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-top:8px solid transparent;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-right:8px solid #222f3e;left:0}.tox .tox-well{border:1px solid #ccc;border-radius:3px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #ccc;border-radius:3px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading:before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__body-content .tox-collection,.tox .tox-dialog__content-js{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel,.tox .tox-image-tools__sidebar{height:60px} \ No newline at end of file diff --git a/sapl/static/sapl/frontend/css/chunk-vendors.da853c1c.css.gz b/sapl/static/sapl/frontend/css/chunk-vendors.da853c1c.css.gz deleted file mode 100644 index e9fcda12b..000000000 Binary files a/sapl/static/sapl/frontend/css/chunk-vendors.da853c1c.css.gz and /dev/null differ diff --git a/sapl/static/sapl/frontend/css/compilacao.90ba9ac3.css b/sapl/static/sapl/frontend/css/compilacao.90ba9ac3.css deleted file mode 100644 index bcf13138c..000000000 --- a/sapl/static/sapl/frontend/css/compilacao.90ba9ac3.css +++ /dev/null @@ -1 +0,0 @@ -a:link:after,a:visited:after{content:""}.test_import:nth-child(2n){background-color:#ccc}#wait_message{display:block;position:fixed;top:0;bottom:0;left:0;right:0;background-color:hsla(0,0%,86.3%,.75);z-index:99}#wait_message #msg{position:relative;margin:20% auto;padding:1.2em 2em;max-width:600px;text-align:center;font-size:1.5em;color:#677;border:1px solid #eee;background-color:#fff!important;-webkit-box-shadow:0 1px 2px #999;box-shadow:0 1px 2px #999}.text-center{text-align:center}.cp-notify{z-index:10000;position:fixed;top:2em;left:50%;min-width:600px;-webkit-transform:translate(-50%);transform:translate(-50%);opacity:.97}.cp-notify,.cp-notify.hide{-webkit-transition:all .4s ease;transition:all .4s ease}.cp-notify.hide{opacity:0;top:-1000px;display:block!important}.cp-notify .message{padding:1em;border:2px solid rgba(0,0,0,.1);border-radius:4px;color:rgba(0,0,0,.6);line-height:1em;font-size:1.3em;text-align:center;-webkit-box-shadow:0 0 100px rgba(0,0,0,.2);box-shadow:0 0 100px rgba(0,0,0,.2)}.cp .vigencia-active{margin-top:30px;display:block}.cp .cp-linha-vigencias{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;list-style:none;margin:4rem 0 3rem;padding:0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.cp .cp-linha-vigencias ul{list-style:none;margin:0;padding:0}.cp .cp-linha-vigencias>li{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;line-height:0;background:#000;height:2px;text-align:center;max-width:4rem}.cp .cp-linha-vigencias>li .circle{display:block;width:10px;line-height:0;background:#000;height:10px;margin:-5px auto 0;border-radius:50%}.cp .cp-linha-vigencias>li>a{position:absolute;white-space:nowrap;line-height:1rem;text-align:center}.cp .cp-linha-vigencias>li:nth-child(2n)>a{top:100%;margin-top:5px}.cp .cp-linha-vigencias>li:nth-child(odd)>a{bottom:100%;margin-bottom:5px}.cp .cp-linha-vigencias>li ul{z-index:1;position:absolute;display:none;background:#fff;margin:30px 0;border:1px solid #aaa;-webkit-box-shadow:0 0 10px #aaa;box-shadow:0 0 10px #aaa;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.cp .cp-linha-vigencias>li ul:before{content:" ";width:2px;height:30px;position:absolute;display:block;background-color:#aaa;bottom:100%;left:50%;margin-left:-1px}.cp .cp-linha-vigencias>li ul li{text-align:left}.cp .cp-linha-vigencias>li ul a{display:block;white-space:nowrap;line-height:2rem;padding:0 10px;font-size:1rem}.cp .cp-linha-vigencias>li ul a:hover{background:#eee}.cp .cp-linha-vigencias>li.active .circle{display:block;width:20px;line-height:0;background:#aaa;height:20px;margin:-10px auto 0}.cp .cp-linha-vigencias>li.active:not(:last-child)>a{-webkit-transform:rotate(-90deg);transform:rotate(-90deg);margin-bottom:25px;font-weight:700}.cp .cp-linha-vigencias>li.active:first-child>a,.cp .cp-linha-vigencias>li.active:last-child>a{-webkit-transform:rotate(0deg);transform:rotate(0deg);margin-bottom:15px;font-weight:700}.cp .cp-linha-vigencias>li.active>a{margin-bottom:5px}.cp .cp-linha-vigencias>li.active:nth-child(2n)>a{bottom:100%;top:auto}.cp .cp-linha-vigencias>li.active ul{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.cp .cp-linha-vigencias>li.active ul li{text-align:left;width:100%}.cp .cp-vigencias .nav-link{padding:.5rem}.cp .cp-vigencias .dropdown-toggle:after{zoom:.8;margin:0}.cp .cp-vigencias .dropdown-menu{margin-left:.5rem}.cp .cp-vigencias .dropdown-item{padding:0}.cp .cp-vigencias .dropdown-item a{line-height:1;padding:.7rem}.cp .desativado .dpt-link,.cp .desativado .dpt-link *,.cp .desativado .dtxt,.cp .desativado .dtxt *,.cp .dpt .dptt>a.desativado .dpt-link,.cp .dpt .dptt>a.desativado .dpt-link *,.cp .dpt .dptt>a.desativado .dtxt,.cp .dpt .dptt>a.desativado .dtxt *{text-decoration:line-through;color:#999!important}.cp .desativado .dpt-link * table,.cp .desativado .dpt-link * table td,.cp .desativado .dpt-link table,.cp .desativado .dpt-link table td,.cp .desativado .dtxt * table,.cp .desativado .dtxt * table td,.cp .desativado .dtxt table,.cp .desativado .dtxt table td,.cp .dpt .dptt>a.desativado .dpt-link * table,.cp .dpt .dptt>a.desativado .dpt-link * table td,.cp .dpt .dptt>a.desativado .dpt-link table,.cp .dpt .dptt>a.desativado .dpt-link table td,.cp .dpt .dptt>a.desativado .dtxt * table,.cp .dpt .dptt>a.desativado .dtxt * table td,.cp .dpt .dptt>a.desativado .dtxt table,.cp .dpt .dptt>a.desativado .dtxt table td{border:1px dotted #ccc}.cp .desativado .dpt-img img,.cp .dpt .dptt>a.desativado .dpt-img img{-webkit-filter:grayscale(100%) contrast(110%);filter:grayscale(100%) contrast(110%);opacity:.5}.cp a{text-decoration:none;cursor:pointer}.cp .diff .desativado,.cp .diff .desativado *,.cp .diff .dpt .dptt>a.desativado,.cp .diff .dpt .dptt>a.desativado *,.cp .dpt .diff .dptt>a.desativado,.cp .dpt .diff .dptt>a.desativado *{text-decoration:line-through;color:#ddd!important;font-size:90%}.cp .diff .added{color:#04de2c}.cp .dpt{font-size:1em;position:relative}.cp .dpt.indent{padding-left:1em}.cp .dpt .dpt-img{text-align:center}.cp .dpt .dpt-img img{max-width:100%}.cp .dpt .ementa{padding:2em 0 2em 35%;font-weight:700}.cp .dpt .anexo,.cp .dpt .capitulo,.cp .dpt .disp_finais,.cp .dpt .disp_gerais,.cp .dpt .disp_preliminares,.cp .dpt .disp_transitorias,.cp .dpt .itemsecao,.cp .dpt .livro,.cp .dpt .parte,.cp .dpt .secao,.cp .dpt .subsecao,.cp .dpt .titulo,.cp .dpt .titulo_generico{text-align:center;margin-bottom:1em;font-size:1.5em;margin-top:3em;font-weight:700;font-variant:small-caps}.cp .dpt .titulo{margin-top:2em}.cp .dpt .capitulo{margin-top:1.5em;font-size:1.15em}.cp .dpt .secao{margin-top:1.2em;margin-bottom:.7em;font-weight:700;font-size:1.15em}.cp .dpt .itemsecao,.cp .dpt .subsecao{margin-top:1em;margin-bottom:.6em;font-weight:700;font-size:1.15em}.cp .dpt .artigo{font-size:1.15em;float:left}.cp .dpt .artigo .dptt{position:relative}.cp .dpt .caput,.cp .dpt .texto_n_estruturado{margin-top:.3333em;font-size:1.15em}.cp .dpt .paragrafo{font-size:1.1em;margin-top:.2222em}.cp .dpt .inciso{font-size:1.1em;margin-top:.1667em}.cp .dpt .alinea,.cp .dpt .item{font-size:1em;margin-top:2px}.cp .dpt .assinatura,.cp .dpt .fecho_lei{margin-top:.6em;font-size:1.15em}.cp .dpt .page-break{page-break-before:always}.cp .dpt .bloco_alteracao{padding-left:10%;font-style:italic;color:#018}.cp .dpt .bloco_alteracao a{text-decoration:underline}.cp .dpt .bloco_alteracao a,.cp .dpt .bloco_alteracao table,.cp .dpt .bloco_alteracao table td{color:#018!important}.cp .dpt .bloco_alteracao .desativado,.cp .dpt .bloco_alteracao .desativado a,.cp .dpt .bloco_alteracao .desativado table,.cp .dpt .bloco_alteracao .desativado table td,.cp .dpt .bloco_alteracao .dptt>a.desativado{text-decoration:line-through;color:#999!important}.cp .dpt .card-header{font-size:1.7rem}.cp .dpt .dn{font-weight:400;position:relative;font-size:80%}.cp .dpt .dn p,.cp .dpt .dn ul{font-weight:400;margin:0 0 0 0;list-style:none;padding:0}.cp .dpt .dn .dnl{display:block;text-align:left!important}.cp .dpt .dn .dnl *{display:inline}.cp .dpt .dn .dnl .bullet{padding:0 .333em;display:inline-block}.cp .dpt .dn .dnl .dnli{min-height:2.5em}.cp .dpt .dn .dnl .dnli:hover ul{font-size:1rem;clip:auto;opacity:1;background:hsla(0,0%,90.2%,.9)}.cp .dpt .dn .dnl .dnli:hover ul,.cp .dpt .dn .dnl .dnli ul{-webkit-transition:opacity .5s linear,clip 0s .3s;transition:opacity .5s linear,clip 0s .3s}.cp .dpt .dn .dnl .dnli ul{clip:rect(0,0,0,0);opacity:0;position:absolute;background:transparent;right:0;padding:.2em .5em 0 .5em;border:1px solid #c7e3d3;border-top:0;font-size:1.5rem}.cp .dpt .dn .dnl .dnli ul li{display:table-cell;color:#aaa}.cp .dpt .dn .dnl .dnli ul li:hover{color:#787}.cp .dpt .dn .dnl .dnli ul li .nowner,.cp .dpt .dn .dnl .dnli ul li:hover a{color:#27ae60!important}.cp .dpt .dn .dnl .dnli .ntitulo{font-size:.8rem;font-weight:700;color:#03a203;text-decoration:none}.cp .dpt .dn .dnl .dnli .ntitulo a{color:#294!important}.cp .dpt .dn .dnl .dnli .ntexto{font-variant:normal;font-size:.8rem;color:#018801}.cp .dpt .dn .dnl .dnli .ntexto a{color:#03a203!important}.cp .dpt .dn .dnl:hover,.cp .dpt .dn .dnl:hover *{display:block}.cp .dpt .dn .dnl:hover>.bullet{display:none}.cp .dpt .dn .dnl:hover .dnli{margin-top:.5em;border-top:1px solid #c7e3d3}.cp .dpt .dptt{clear:left}.cp .dpt .dptt>a{color:#000}.cp .dpt .dptt>a.nota-alteracao{color:#02baf2;font-size:.75em}.cp .dpt .dptt>a.nota-alteracao:hover{text-decoration:underline}.cp .dpt .dptt .dne{position:absolute;display:block;right:0;left:0;top:0;height:0;-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:right;transform-origin:right;-webkit-transition:all .3s ease;transition:all .3s ease;border-top:1px solid #2980b9}.cp .dpt .dptt .dne ul.btns-action{list-style:none;padding:0;position:absolute;right:0;background-color:#2980b9}.cp .dpt .dptt .dne ul.btns-action li{float:left}.cp .dpt .dptt .dne ul.btns-action li:hover{background-color:rgba(0,0,0,.1)}.cp .dpt .dptt .dne ul.btns-action li a{color:#fff;padding:.15em 1em 0;display:inline-block}.cp .dpt .dptt .dne-nota{position:relative;-webkit-transform:scaleX(1);transform:scaleX(1);height:auto;border-top:0}.cp .dpt .dptt .dne-nota ul.btns-action{display:none}.cp .dpt .dptt .dne-nota .dne-form{margin:1em -2em 0;text-align:left;font-size:1rem}.cp .dpt .dptt:hover .dne{height:.1667rem;-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transition-delay:1s;transition-delay:1s}.cp .dpt .dptt:hover .dne-nota{height:auto;-webkit-transition-delay:0s;transition-delay:0s}.cp .tipo-vigencias{margin-bottom:-6px;opacity:.8;list-style:none;position:fixed;bottom:0;left:50%;-webkit-transform:translate(-50%);transform:translate(-50%);margin:0;padding:0;z-index:1000;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.cp .tipo-vigencias div a{color:#fff}.cp .tipo-vigencias:hover,.cp:hover{opacity:1}.cp .revogado{color:#800}.cp .revogado .dpt-link{color:#999!important}.cp .omissis a{text-decoration:none!important}.cp-print .cp-linha-vigencias{display:none!important}.cp.cpe .desativado,.cp.cpe .dpt .dptt>a.desativado{text-decoration:line-through;color:#999!important}.cp.cpe .desativado table,.cp.cpe .desativado table td,.cp.cpe .dpt .dptt>a.desativado table,.cp.cpe .dpt .dptt>a.desativado table td{border:1px dotted #ccc}.cp.cpe a.nota-alteracao{color:#02baf2!important;font-size:.8rem}.cp.cpe .btn-sm{line-height:1rem}.cp.cpe .btn-outline-primary{background-color:#fff}.cp.cpe .btn-outline-primary:hover{background-color:#02baf2}.cp.cpe .dpt{display:block}.cp.cpe .dpt>.dpt-actions-fixed{position:absolute;right:-1em;top:-.8em;z-index:3;opacity:0}.cp.cpe .dpt>.dpt-actions-fixed.bottom{top:auto;bottom:3px;right:2px}.cp.cpe .dpt>.dpt-actions-fixed .activate{display:none}.cp.cpe .dpt>.dpt-actions-fixed .deactivate{display:inline}.cp.cpe .dpt>.dpt-actions-fixed .btn-dpt-edit.btn-outline-primary{color:#333}.cp.cpe .dpt>.dpt-actions-fixed .btn-dpt-edit.btn-outline-primary:hover{color:#fff;background-color:#02baf2}.cp.cpe .dpt>.dpt-actions,.cp.cpe .dpt>.dpt-actions-bottom{display:none}.cp.cpe .dpt>.dpt-text{cursor:text;min-height:30px;border:1px solid transparent}.cp.cpe .dpt>.dpt-text.hover-fixed,.cp.cpe .dpt>.dpt-text:hover{background-color:rgba(0,0,0,.01);color:#2980b9;border:1px solid #eee;-webkit-transition:color .3s ease;transition:color .3s ease}.cp.cpe .dpt>.dpt-text.artigo{float:none}.cp.cpe .dpt>.dpt-text a.link-rotulo{color:#000}.cp.cpe .dpt:hover>.dpt-actions-fixed{opacity:1}.cp.cpe .dpt:hover>.dpt-actions-fixed:hover~.dpt-text{background-color:rgba(0,0,0,.01);color:#2980b9;border:1px solid #eee;-webkit-transition:color .3s ease;transition:color .3s ease}.cp.cpe .dpt .semtexto{font-weight:700;color:#9aaed6}.cp.cpe .dpt .semtexto:hover{color:#5f76a4}.cp.cpe .dpt-alts{margin:0;margin-bottom:1em;padding:0;background-color:transparent;min-height:100px;border:2px dashed #fff}.cp.cpe .dpt-alts:hover{border-color:#d9ddde}.cp.cpe .dpt-alts:empty{border-color:#ddd}.cp.cpe .dpt-alts.drag{width:100%!important;border-color:#d9ddde}.cp.cpe .dpt-alts.drag .dpt{-webkit-transition-duration:0s!important;transition-duration:0s!important}.cp.cpe .dpt-alts .dpt{width:100%!important;-webkit-box-shadow:0 -1px 0 #e5e5e5,0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24);box-shadow:0 -1px 0 #e5e5e5,0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24);padding:0;margin:0;background-color:#edf0f1;height:auto!important;min-height:2em;z-index:1}.cp.cpe .dpt-alts .dpt:not(:first-child){border-top:1px solid #fff}.cp.cpe .dpt-alts .dpt>.dpt-text{padding:.3em 1em;margin-top:0;margin-bottom:0}.cp.cpe .dpt-alts .dpt>.dpt-text a.link-rotulo{text-decoration:underline}.cp.cpe .dpt-alts .dpt-selected.dpt{margin:0 -.5em}.cp.cpe .dpt-selected.dpt{width:auto!important;margin:1em -.5em;border:1px solid #ddd!important;padding:0;background-color:#fafafa;border-radius:3px;z-index:4}.cp.cpe .dpt-selected.dpt>.dpt-text{border:1px solid transparent}.cp.cpe .dpt-selected.dpt>.dpt-text:hover{border:1px solid transparent;background-color:transparent}.cp.cpe .dpt-selected.dpt>.dpt-form{margin:0 1rem}.cp.cpe .dpt-selected.dpt>.dpt-actions,.cp.cpe .dpt-selected.dpt>.dpt-actions-bottom{display:table;background-color:#e5e5e5;padding:.8rem .6rem .2rem .6rem;margin-bottom:0;width:100%}.cp.cpe .dpt-selected.dpt>.dpt-actions-bottom>.btn-action,.cp.cpe .dpt-selected.dpt>.dpt-actions>.btn-action{display:table-cell;float:none}.cp.cpe .dpt-selected.dpt>.dpt-actions-bottom .btns-excluir .btn-danger,.cp.cpe .dpt-selected.dpt>.dpt-actions .btns-excluir .btn-danger{display:inline-block;opacity:.3;color:#fff}.cp.cpe .dpt-selected.dpt>.dpt-actions-bottom .btns-excluir .btn-danger:hover,.cp.cpe .dpt-selected.dpt>.dpt-actions .btns-excluir .btn-danger:hover{opacity:1}.cp.cpe .dpt-selected.dpt>.dpt-actions-bottom{margin:0;padding-bottom:.8rem}.cp.cpe .dpt-selected .dpt-block{border-top:1px solid #e5e5e5!important;opacity:.6;-webkit-transition:opacity .4s ease;transition:opacity .4s ease}.cp.cpe .dpt-selected .dpt-block:hover{opacity:1}.cp.cpe .dpt-selected .dpt-text{opacity:.7;margin:0;padding:.7em}.cp.cpe .dpt-selected .dpt-text:hover{opacity:1;background-color:#f5f5f5}.cp.cpe .dpt-selected .dpt-alts{margin:1em}.cp.cpe .dpt-selected .dpt-alts .dpt{-webkit-box-shadow:0 0 0;box-shadow:0 0 0}.cp.cpe .dpt-selected>.dpt-actions-fixed{opacity:1;top:-15px;right:.5em}.cp.cpe .dpt-selected>.dpt-actions-fixed .activate{display:inline}.cp.cpe .dpt-selected>.dpt-actions-fixed .deactivate{display:none}.cp.cpe .dpt-selected>.dpt-actions-fixed .btn-dpt-edit{padding:0 6px;line-height:1.2rem}.cp.cpe .dpt-selected>.dpt-actions-fixed .btn-dpt-edit.btn-outline-primary,.cp.cpe .dpt-selected>.dpt-actions-fixed .btn-dpt-edit.btn-outline-primary:hover{background-color:#fad46b;border:1px solid #444}.cp.cpe .dpt-selected .btns-tipos-editor{padding:0}.cp.cpe .dpt-selected .dropdown-menu.dropdown-menu-left{right:auto!important;left:0;padding:0}.cp.cpe .dpt-selected .dropdown-menu.dropdown-menu-left:before{content:"";position:absolute;background-color:transparent;width:100%;height:3px;top:-3px;display:inline-block}.cp.cpe .dpt-selected .dropdown-menu li{line-height:1}.cp.cpe .dpt-selected .dropdown-menu li a{display:block;line-height:1.5rem;padding:0 .5rem;white-space:nowrap}.cp.cpe .dpt-selected .dropdown-menu li a:hover{background-color:#f0f0f0}.cp.cpe .dpt-selected .dropdown-menu li:not(:last-child){border-bottom:1px solid #f0f0f0}.cp.cpe .dpt-selected .btn-group .radius-right{border-bottom-right-radius:.2rem!important;border-top-right-radius:.2rem!important}.cp.cpe .dpt-selected:hover>.dpt-actions-fixed{opacity:1}.cp.cpe1_old_apagar{margin-bottom:15em}.cp.cpe1_old_apagar .desativado,.cp.cpe1_old_apagar .desativado *,.cp.cpe1_old_apagar .dpt .dptt>a.desativado,.cp.cpe1_old_apagar .dpt .dptt>a.desativado *{text-decoration:line-through;color:#999!important}.cp.cpe1_old_apagar .desativado * table,.cp.cpe1_old_apagar .desativado * table td,.cp.cpe1_old_apagar .desativado table,.cp.cpe1_old_apagar .desativado table td,.cp.cpe1_old_apagar .dpt .dptt>a.desativado * table,.cp.cpe1_old_apagar .dpt .dptt>a.desativado * table td,.cp.cpe1_old_apagar .dpt .dptt>a.desativado table,.cp.cpe1_old_apagar .dpt .dptt>a.desativado table td{border:1px dotted #ccc}.cp.cpe1_old_apagar a{text-decoration:none;cursor:pointer}.cp.cpe1_old_apagar .dpt{position:relative;display:block}.cp.cpe1_old_apagar .dpt .semtexto{font-weight:700;color:#bfd1f6}.cp.cpe1_old_apagar .dpt .artigo{float:none}.cp.cpe1_old_apagar .dpt .caput{margin-top:0}.cp.cpe1_old_apagar .dpt-selected .csform .dpt>.actions_left,.cp.cpe1_old_apagar .dpt>.actions_right{color:#fff;right:0;position:absolute;opacity:0;-webkit-transition:all .4s ease-in-out;transition:all .4s ease-in-out;z-index:1000}.cp.cpe1_old_apagar .dpt-selected .csform .dpt>.actions_left a.btn-bloco,.cp.cpe1_old_apagar .dpt>.actions_right a.btn-bloco{background-color:#3498db;color:#fff!important;padding:8px 18px 6px;display:inline-block;line-height:1;float:right}.cp.cpe1_old_apagar .dpt-selected .csform .dpt>.actions_left a.btn-bloco:hover,.cp.cpe1_old_apagar .dpt>.actions_right a.btn-bloco:hover{opacity:1;background-image:-webkit-gradient(linear,left top,left bottom,from(#1c81c4),to(#0b6dad));background-image:linear-gradient(180deg,#1c81c4,#0b6dad)}.cp.cpe1_old_apagar .dpt-selected .csform .dpt:hover>.actions_left,.cp.cpe1_old_apagar .dpt:hover>.actions_right{opacity:1}.cp.cpe1_old_apagar .dpt .bloco{display:block;clear:both}.cp.cpe1_old_apagar .dpt .bloco :hover{color:#27ae60}.cp.cpe1_old_apagar .dpt .bloco .de{cursor:pointer}.cp.cpe1_old_apagar .dpt .articulacao{border-top:2px solid #e5e5e5;margin:2em 0}.cp.cpe1_old_apagar .dpt .bloco_alteracao{margin:1em 0;padding:0;background-color:transparent;min-height:100px;border:2px dashed #fff}.cp.cpe1_old_apagar .dpt .bloco_alteracao:hover{border-color:#d9ddde}.cp.cpe1_old_apagar .dpt .bloco_alteracao.drag{width:100%!important;border-color:#d9ddde}.cp.cpe1_old_apagar .dpt .bloco_alteracao.drag .dpt{-webkit-transition-duration:0s!important;transition-duration:0s!important}.cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt{width:100%!important;-webkit-box-shadow:0 -1px 0 #e5e5e5,0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24);box-shadow:0 -1px 0 #e5e5e5,0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24);padding:.3em 1em;margin:0;background-color:#edf0f1;z-index:1}.cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt:not(:first-child){border-top:1px solid #fff}.cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt.ui-draggable div{cursor:pointer}.cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt.dpt-comp-selected{-webkit-transition:all .3s ease;transition:all .3s ease;width:auto!important;margin:2em -3.7em;-webkit-box-shadow:0 0 6px rgba(0,0,0,.16),0 6px 12px rgba(0,0,0,.32);box-shadow:0 0 6px rgba(0,0,0,.16),0 6px 12px rgba(0,0,0,.32)}.cp.cpe1_old_apagar .dpt-selected{font-size:1em;border:0 solid #ccc;margin:1em -1.8em 1em -1.8em;padding:2.2em 2.2em 1.6em 2.2em;-webkit-box-shadow:-4px 15px 15px rgba(0,0,0,.1),0 6px 6px rgba(0,0,0,.23);box-shadow:-4px 15px 15px rgba(0,0,0,.1),0 6px 6px rgba(0,0,0,.23);background-image:-webkit-gradient(linear,left top,left bottom,from(#eaeaee),to(#ddd));background-image:linear-gradient(180deg,#eaeaee,#ddd)}.cp.cpe1_old_apagar .dpt-selected ul{list-style:none;margin:0;padding:0}.cp.cpe1_old_apagar .dpt-selected .semtexto{color:#999}.cp.cpe1_old_apagar .dpt-selected .bloco{opacity:.5}.cp.cpe1_old_apagar .dpt-selected .bloco:hover{opacity:1}.cp.cpe1_old_apagar .dpt-selected .bloco a:hover{background:transparent}.cp.cpe1_old_apagar .dpt-selected>.bloco{opacity:1;margin:1em}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao{margin:0;padding:1em;border:0 transparent;background-image:-webkit-gradient(linear,left top,left bottom,from(#eaeaee),to(#ddd));background-image:linear-gradient(180deg,#eaeaee,#ddd)}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao:hover{border-color:transparent}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao.drag{width:100%!important}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao.drag .dpt{-webkit-transition-duration:0s!important;transition-duration:0s!important}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao .dpt{width:auto!important;-webkit-transition:all .3s ease;transition:all .3s ease;background-color:#fff}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao .dpt:not(:first-child){border-top:0 solid #fff}.cp.cpe1_old_apagar .dpt-selected>.dpt{padding:0}.cp.cpe1_old_apagar .dpt-selected>.dpt:last-child{padding-bottom:1em}.cp.cpe1_old_apagar .dpt-selected .csform .dpt-selected>.actions_left a.btn-bloco,.cp.cpe1_old_apagar .dpt-selected>.actions_right a.btn-bloco{display:none}.cp.cpe1_old_apagar .dpt-selected .csform{display:block;clear:both;z-index:9;position:static}.cp.cpe1_old_apagar .dpt-selected .csform .btns-action{-webkit-animation:fadeIn 1s ease-in-out;-moz-animation:fadeIn 1s ease-in-out;-o-animation:fadeIn 1s ease-in-out;opacity:1;position:absolute;display:table;-webkit-transition:all .4s ease-in-out;transition:all .4s ease-in-out}.cp.cpe1_old_apagar .dpt-selected .csform .btns-action a{color:#16407c;display:block;background:transparent;vertical-align:middle;text-align:center;font-weight:400;text-shadow:0 0 10px rgba(0,0,0,.3);padding:.33em .4em}.cp.cpe1_old_apagar .dpt-selected .csform .btns-action>li{position:relative;display:table-cell;vertical-align:top}.cp.cpe1_old_apagar .dpt-selected .csform .btns-action>li:hover{background-color:hsla(0,0%,100%,.5)}.cp.cpe1_old_apagar .dpt-selected .csform .btns-action>li:hover>a{text-shadow:0 0 5px #777;color:#0a5}.cp.cpe1_old_apagar .dpt-selected .csform .label_status{position:absolute;bottom:0;right:0;color:#889;padding:.3em;font-size:80%;text-align:right;z-index:15;display:table}.cp.cpe1_old_apagar .dpt-selected .csform .label_status li{display:table-cell;padding:0 .5em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents{z-index:11;top:0;left:0}.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents a{padding:.62em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents div,.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents li{font-size:80%;display:table-cell;vertical-align:middle;border-right:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents div{padding:0 .4em;font-stretch:condensed;font-variant:small-caps;font-weight:700;text-shadow:0 0 10px #fff}.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents>li:hover a{color:#16407c;font-weight:400}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom,.cp.cpe1_old_apagar .dpt-selected .csform .actions_top{top:0;right:0}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom a,.cp.cpe1_old_apagar .dpt-selected .csform .actions_top a{padding-right:1em;padding-left:1em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom li,.cp.cpe1_old_apagar .dpt-selected .csform .actions_top li{display:table-cell;vertical-align:middle;border-left:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom{top:auto;left:0;bottom:0;display:inline-block;border-top:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom a{padding:0 .4em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom li{border:0;border-right:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_left,.cp.cpe1_old_apagar .dpt-selected .csform .actions_right{top:2.2em;right:0;bottom:0;display:block}.cp.cpe1_old_apagar .dpt-selected .csform .actions_left li,.cp.cpe1_old_apagar .dpt-selected .csform .actions_right li{width:2.2em;display:block;border-bottom:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_left li:first-child,.cp.cpe1_old_apagar .dpt-selected .csform .actions_right li:first-child{border-top:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_left{right:auto;left:0}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts{background:transparent;position:relative;z-index:19;display:table;width:100%}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li{display:table-cell}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li:hover>a{background-image:-webkit-gradient(linear,left top,left bottom,from(#1c81c4),to(#0b6dad));background-image:linear-gradient(180deg,#1c81c4,#0b6dad)}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a{background-image:-webkit-gradient(linear,left top,left bottom,from(#3498db),to(#2980c9));background-image:linear-gradient(180deg,#3498db,#2980c9);border-right:1px solid #fff;padding:.2em;display:block;color:#fff;text-align:center;white-space:nowrap}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-excluir,.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar{text-align:left;background:#a70808;color:#c99;padding-left:1.7em;position:relative}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-excluir:hover,.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar:hover{background-color:#c70808;color:#ecc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-excluir:before,.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar:before{z-index:20;position:absolute;background:url(/static/img/icon_delete_white.png) no-repeat 50% 50%;content:"";top:0;left:0;display:block;color:#000;margin-left:.4em;height:100%;width:2em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar{background:#1f8b4d;color:#fff}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar:hover{background:#2d9c5c;color:#fff}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar:before{background:url(/static/img/icon_save_white.png) no-repeat 50% 50%}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a span{padding:0 .7em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li:last-child>a{border-right:0 solid #fff}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>ul li:nth-child(2n) a{background:#3385ca}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>ul li a{border-right:1px solid #fff;display:block;color:#fff;background:#2980c9;font-size:80%;padding:.23em 1em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>ul li a:hover{background:#0a5ea4}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior{table-layout:fixed}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior>ul{-webkit-transform:translateY(30px);transform:translateY(30px);-webkit-transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:transform .1s linear,opacity .1s linear,clip 0s .3s;transition:transform .1s linear,opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;clip:rect(0,0,0,0);opacity:0;position:absolute;margin-left:.5em;-webkit-box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);-webkit-transition-delay:.4s;transition-delay:.4s}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior>ul li a{border-right:0!important}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior>ul li:first-child:before{border-width:.375rem;border-style:inset inset solid;content:"";display:block;height:0;width:0;border-color:transparent transparent #3385ca;position:absolute;top:-.71rem;left:.9375rem}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior>ul li:first-child:hover:before{border-color:transparent transparent #0a5ea4}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior>ul:after{content:"";position:absolute;z-index:-1;left:0;top:-25px;height:25px;width:100%;-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior:hover>ul{-webkit-transform:translateY(7px);transform:translateY(7px);-webkit-transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:transform .4s linear,opacity .4s linear,clip 0s .2s;transition:transform .4s linear,opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;opacity:1;clip:rect(-100px,2000px,2000px,-100px)}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir{display:block;position:static}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul{-webkit-transform:translateY(30px);transform:translateY(30px);-webkit-transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:transform .1s linear,opacity .1s linear,clip 0s .3s;transition:transform .1s linear,opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;clip:rect(0,0,0,0);opacity:0;position:absolute;margin-left:.5em;-webkit-box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);-webkit-transition-delay:.4s;transition-delay:.4s}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li a{border-right:0!important}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li:first-child:before{border-width:.375rem;border-style:inset inset solid;content:"";display:block;height:0;width:0;border-color:transparent transparent #3385ca;position:absolute;top:-.71rem;left:.9375rem}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li:first-child:hover:before{border-color:transparent transparent #0a5ea4}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul:after{content:"";position:absolute;z-index:-1;left:0;top:-25px;height:25px;width:100%;-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir:hover>ul{-webkit-transform:translateY(7px);transform:translateY(7px);-webkit-transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:transform .4s linear,opacity .4s linear,clip 0s .2s;transition:transform .4s linear,opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;opacity:1;clip:rect(-100px,2000px,2000px,-100px)}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul{right:.5em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li a{background-color:#a70808}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li a:hover{background:#c70808}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li:first-child:before{border-color:transparent transparent #a70808;right:10%;left:auto}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li:first-child:hover:before{border-color:transparent transparent #c70808}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo{z-index:2000}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li>ul,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li>ul{-webkit-transform:translateY(30px);transform:translateY(30px);-webkit-transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:transform .1s linear,opacity .1s linear,clip 0s .3s;transition:transform .1s linear,opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;clip:rect(0,0,0,0);opacity:0;position:absolute;margin-left:.5em;-webkit-box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);-webkit-transition-delay:.4s;transition-delay:.4s}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li>ul li a,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li>ul li a{border-right:0!important}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li>ul li:first-child:before,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li>ul li:first-child:before{border-width:.375rem;border-style:inset inset solid;content:"";display:block;height:0;width:0;border-color:transparent transparent #3385ca;position:absolute;top:-.71rem;left:.9375rem}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li>ul li:first-child:hover:before,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li>ul li:first-child:hover:before{border-color:transparent transparent #0a5ea4}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li>ul:after,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li>ul:after{content:"";position:absolute;z-index:-1;left:0;top:-25px;height:25px;width:100%;-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li:hover>ul,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li:hover>ul{-webkit-transform:translateY(7px);transform:translateY(7px);-webkit-transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:transform .4s linear,opacity .4s linear,clip 0s .2s;transition:transform .4s linear,opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;opacity:1;clip:rect(-100px,2000px,2000px,-100px)}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li.menu_excluir>ul li:first-child:before,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li.menu_excluir>ul li:first-child:before{right:auto;left:.9375rem}.cp.cpe1_old_apagar .dpt-selected .csform textarea{margin:0;resize:vertical;min-height:12.6em;border:0;font-size:120%;width:100%}.cp.cpe1_old_apagar .dpt-selected .csform textarea:focus{background:#fff}.cp.cpe1_old_apagar .dpt-selected .csform textarea::-webkit-input-placeholder{color:#c70808;opacity:.6;font-size:80%}.cp.cpe1_old_apagar .dpt-selected .csform textarea:-moz-placeholder,.cp.cpe1_old_apagar .dpt-selected .csform textarea::-moz-placeholder{color:#c70808}.cp.cpe1_old_apagar .dpt-selected .csform textarea:-ms-input-placeholder{color:#c70808;opacity:.6}.cp.cpe1_old_apagar .selected{background-color:hsla(0,0%,100%,.5)}.cp.cpe1_old_apagar .selected a:hover{color:#16407c!important;font-weight:400!important}.lista-dispositivo,.result-busca-dispositivo{padding:0 0 1em;min-height:3em}.lista-dispositivo ul,.result-busca-dispositivo ul{list-style:none;margin:0;padding:1em 0 0;-webkit-transition:all 2s linear;transition:all 2s linear;clear:both;position:relative}.lista-dispositivo ul li,.result-busca-dispositivo ul li{display:table;border-collapse:separate;border-bottom:1px solid #fff;width:100%}.lista-dispositivo ul li.ta_title,.result-busca-dispositivo ul li.ta_title{background-color:rgba(0,0,0,.15);width:100%}.lista-dispositivo ul li:last-child .itemlabel,.result-busca-dispositivo ul li:last-child .itemlabel{margin:0}.lista-dispositivo ul li .iteminput,.result-busca-dispositivo ul li .iteminput{background-color:rgba(0,0,0,.1);border-right:1px solid #fff;display:table-cell;padding:.5em;vertical-align:middle;text-align:center;position:relative}.lista-dispositivo ul li .iteminput input,.result-busca-dispositivo ul li .iteminput input{margin:0}.lista-dispositivo ul li .iteminput .flag,.result-busca-dispositivo ul li .iteminput .flag{position:absolute;top:0;left:0;right:0;line-height:1;background-color:#ccc;color:#fff;cursor:default;font-size:80%}.lista-dispositivo ul li .itemlabel,.result-busca-dispositivo ul li .itemlabel{margin:0;background-color:rgba(0,0,0,.1);display:table-cell;padding:.5em;vertical-align:middle;width:100%}.lista-dispositivo ul li .itemlabel .artigo,.result-busca-dispositivo ul li .itemlabel .artigo{float:none}.lista-dispositivo .label-tip-results,.result-busca-dispositivo .label-tip-results{background-color:rgba(0,0,0,.1);padding:0 5px;top:0;z-index:1;line-height:1.3;color:#00f;font-size:.9em}.lista-dispositivo .nomenclatura_heranca,.result-busca-dispositivo .nomenclatura_heranca{font-size:90%;color:#057dba;display:inline}.lista-dispositivo.controls-radio-checkbox{border:0}.label_vigencia{border-top:1px solid #fff;display:inline-block;color:#555}.label_vigencia span{color:grey}.cp-nav-parents .dropdown-menu{left:0;right:auto;padding:0}.cp-nav-parents .dropdown-menu:before{content:"";position:absolute;top:-11px;width:100%;height:11px}.cp-nav-parents:hover .dropdown-menu{display:block}.cp-nav-parents a.active small{color:#fff!important}.table-notificacoes tbody tr td{border-top:1px solid #fff;padding:5px;vertical-align:middle}.table-notificacoes tbody tr td ul{margin:0}.table-notificacoes tbody tr td ul li:hover{background-color:rgba(0,0,0,.1)}.btn-modal-open{float:right}.modal .modal-content .alert:only-child{margin:0}.class_color_container{background:#ddd!important}.clear{clear:both}.mce-tinymce.mce-container{border:1px solid #ccc!important;margin-right:2px}.mce-btn button:hover{background-color:rgba(0,0,0,.1)!important;text-shadow:0 0 5px #fff;-webkit-box-shadow:0 0 5px #777;box-shadow:0 0 5px #777}.mce-menu{background:#eee!important}.displaynone{display:none!important}@media only screen and (max-width:991.98px){.cp .table,.cp table{width:auto!important;white-space:normal;overflow-x:auto!important}}@media only screen and (max-width:800px){.cp .fixed{z-index:98;position:relative}.cp.cpe1 .dpt-selected{margin:1em 0}.cp.cpe1 .dpt-selected .csform .actions_parents,.cp.cpe1 .dpt-selected .csform .label_status{font-size:80%;position:static!important;display:block!important;padding:0;height:auto!important;left:0;right:auto;text-align:left}.cp.cpe1 .dpt-selected .csform .actions_parents div,.cp.cpe1 .dpt-selected .csform .actions_parents li,.cp.cpe1 .dpt-selected .csform .label_status div,.cp.cpe1 .dpt-selected .csform .label_status li{display:inline-block!important}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>ul{-webkit-transform:translateY(30px);transform:translateY(30px);-webkit-transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:transform .1s linear,opacity .1s linear,clip 0s .3s;transition:transform .1s linear,opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;clip:rect(0,0,0,0);opacity:0;position:absolute;margin-left:.5em;-webkit-box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);-webkit-transition-delay:.4s;transition-delay:.4s}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>ul li a{border-right:0!important}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>ul li:first-child:before{border-width:.375rem;border-style:inset inset solid;content:"";display:block;height:0;width:0;border-color:transparent transparent #3385ca;position:absolute;top:-.71rem;left:.9375rem}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>ul li:first-child:hover:before{border-color:transparent transparent #0a5ea4}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>ul:after{content:"";position:absolute;z-index:-1;left:0;top:-25px;height:25px;width:100%;-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.cp.cpe1 .dpt-selected .csform .actions_inserts>li:hover>ul{-webkit-transform:translateY(7px);transform:translateY(7px);-webkit-transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:transform .4s linear,opacity .4s linear,clip 0s .2s;transition:transform .4s linear,opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;opacity:1;clip:rect(-100px,2000px,2000px,-100px)}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>a span{display:none}.cp.cpe1 .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar,.cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-excluir,.cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-salvar,.cp.cpe1_old_apagar .cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-salvar{padding-left:0;min-width:1em}.cp.cpe1 .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar:before,.cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-excluir:before,.cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-salvar:before,.cp.cpe1_old_apagar .cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-salvar:before{width:100%;margin:0}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_in,.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_next,.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_prior{position:static}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_in>ul{left:1em!important;right:1em!important;margin-left:0}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_in>ul li:first-child:before{left:37%}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_next>ul{left:0!important;right:1em!important}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_prior>ul{left:1em!important;right:0!important;margin-left:0;margin-right:.5em}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_prior>ul li:first-child:before{right:42%;left:auto}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.menu_excluir>ul{left:10%!important;right:0!important;margin-left:0;margin-right:.5em}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li:first-child:before{right:0;left:auto}}@media only screen and (max-width:575.98px){.cp .cp-linha-vigencias>li{height:1px}.cp .cp-linha-vigencias>li .circle{width:8px;height:8px;margin:-4px auto 0}.cp .cp-linha-vigencias>li>a{font-size:.75rem}.cp .cp-linha-vigencias>li:nth-child(2n)>a{margin-top:4px}.cp .cp-linha-vigencias>li:nth-child(odd)>a{margin-bottom:4px}.cp .cp-linha-vigencias>li ul a{line-height:1.3rem;font-size:.7rem;background:#fff}.cp .cp-linha-vigencias>li.active .circle{width:14px;height:14px;margin:-7px auto 0}.cp .cp-linha-vigencias>li.active:not(:last-child)>a{margin-bottom:15px}.cp .cp-linha-vigencias>li.active:first-child>a,.cp .cp-linha-vigencias>li.active:last-child>a{margin-bottom:10px}}@media print{.button,.cp-linha-vigencias,.cp .vigencias,.dne,.menu-icon,.tipo-vigencias,.toggle-topbar{display:none!important}#btn_font_mais,#btn_font_menos,#btn_impressao{display:none}.container{width:100%}} \ No newline at end of file diff --git a/sapl/static/sapl/frontend/css/compilacao.90ba9ac3.css.gz b/sapl/static/sapl/frontend/css/compilacao.90ba9ac3.css.gz deleted file mode 100644 index 8d6ef9763..000000000 Binary files a/sapl/static/sapl/frontend/css/compilacao.90ba9ac3.css.gz and /dev/null differ diff --git a/sapl/static/sapl/frontend/css/compilacao.f4baf459.css b/sapl/static/sapl/frontend/css/compilacao.f4baf459.css new file mode 100644 index 000000000..d20249a2f --- /dev/null +++ b/sapl/static/sapl/frontend/css/compilacao.f4baf459.css @@ -0,0 +1 @@ +a:link:after,a:visited:after{content:""}.test_import:nth-child(2n){background-color:#ccc}#wait_message{display:block;position:fixed;top:0;bottom:0;left:0;right:0;background-color:hsla(0,0%,86%,.75);z-index:99}#wait_message #msg{position:relative;margin:20% auto;padding:1.2em 2em;max-width:600px;text-align:center;font-size:1.5em;color:#677;border:1px solid #eee;background-color:#fff!important;-webkit-box-shadow:0 1px 2px #999;box-shadow:0 1px 2px #999}.text-center{text-align:center}.cp-notify{z-index:10000;position:fixed;top:2em;left:50%;min-width:600px;-webkit-transform:translate(-50%);transform:translate(-50%);opacity:.97}.cp-notify,.cp-notify.hide{-webkit-transition:all .4s ease;transition:all .4s ease}.cp-notify.hide{opacity:0;top:-1000px;display:block!important}.cp-notify .message{padding:1em;border:2px solid rgba(0,0,0,.1);border-radius:4px;color:rgba(0,0,0,.6);line-height:1em;font-size:1.3em;text-align:center;-webkit-box-shadow:0 0 100px rgba(0,0,0,.2);box-shadow:0 0 100px rgba(0,0,0,.2)}.cp .vigencia-active{margin-top:30px;display:block}.cp .cp-linha-vigencias{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;list-style:none;margin:4rem 0 3rem;padding:0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.cp .cp-linha-vigencias ul{list-style:none;margin:0;padding:0}.cp .cp-linha-vigencias>li{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;line-height:0;background:#000;height:2px;text-align:center;max-width:4rem}.cp .cp-linha-vigencias>li .circle{display:block;width:10px;line-height:0;background:#000;height:10px;margin:-5px auto 0;border-radius:50%}.cp .cp-linha-vigencias>li>a{position:absolute;white-space:nowrap;line-height:1rem;text-align:center}.cp .cp-linha-vigencias>li:nth-child(2n)>a{top:100%;margin-top:5px}.cp .cp-linha-vigencias>li:nth-child(odd)>a{bottom:100%;margin-bottom:5px}.cp .cp-linha-vigencias>li ul{z-index:1;position:absolute;display:none;background:#fff;margin:30px 0;border:1px solid #aaa;-webkit-box-shadow:0 0 10px #aaa;box-shadow:0 0 10px #aaa;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.cp .cp-linha-vigencias>li ul:before{content:" ";width:2px;height:30px;position:absolute;display:block;background-color:#aaa;bottom:100%;left:50%;margin-left:-1px}.cp .cp-linha-vigencias>li ul li{text-align:left}.cp .cp-linha-vigencias>li ul a{display:block;white-space:nowrap;line-height:2rem;padding:0 10px;font-size:1rem}.cp .cp-linha-vigencias>li ul a:hover{background:#eee}.cp .cp-linha-vigencias>li.active .circle{display:block;width:20px;line-height:0;background:#aaa;height:20px;margin:-10px auto 0}.cp .cp-linha-vigencias>li.active:not(:last-child)>a{-webkit-transform:rotate(-90deg);transform:rotate(-90deg);margin-bottom:25px;font-weight:700}.cp .cp-linha-vigencias>li.active:first-child>a,.cp .cp-linha-vigencias>li.active:last-child>a{-webkit-transform:rotate(0deg);transform:rotate(0deg);margin-bottom:15px;font-weight:700}.cp .cp-linha-vigencias>li.active>a{margin-bottom:5px}.cp .cp-linha-vigencias>li.active:nth-child(2n)>a{bottom:100%;top:auto}.cp .cp-linha-vigencias>li.active ul{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.cp .cp-linha-vigencias>li.active ul li{text-align:left;width:100%}.cp .cp-vigencias .nav-link{padding:.5rem}.cp .cp-vigencias .dropdown-toggle:after{zoom:.8;margin:0}.cp .cp-vigencias .dropdown-menu{margin-left:.5rem}.cp .cp-vigencias .dropdown-item{padding:0}.cp .cp-vigencias .dropdown-item a{line-height:1;padding:.7rem}.cp .desativado .dpt-link,.cp .desativado .dpt-link *,.cp .desativado .dtxt,.cp .desativado .dtxt *,.cp .dpt .dptt>a.desativado .dpt-link,.cp .dpt .dptt>a.desativado .dpt-link *,.cp .dpt .dptt>a.desativado .dtxt,.cp .dpt .dptt>a.desativado .dtxt *{text-decoration:line-through;color:#999!important}.cp .desativado .dpt-link * table,.cp .desativado .dpt-link * table td,.cp .desativado .dpt-link table,.cp .desativado .dpt-link table td,.cp .desativado .dtxt * table,.cp .desativado .dtxt * table td,.cp .desativado .dtxt table,.cp .desativado .dtxt table td,.cp .dpt .dptt>a.desativado .dpt-link table,.cp .dpt .dptt>a.desativado .dpt-link table td,.cp .dpt .dptt>a.desativado .dtxt table,.cp .dpt .dptt>a.desativado .dtxt table td{border:1px dotted #ccc}.cp .desativado .dpt-img img,.cp .dpt .dptt>a.desativado .dpt-img img{-webkit-filter:grayscale(100%) contrast(110%);filter:grayscale(100%) contrast(110%);opacity:.5}.cp a{text-decoration:none;cursor:pointer}.cp .diff .desativado,.cp .diff .desativado *,.cp .diff .dpt .dptt>a.desativado,.cp .diff .dpt .dptt>a.desativado *,.cp .dpt .diff .dptt>a.desativado,.cp .dpt .diff .dptt>a.desativado *{text-decoration:line-through;color:#ddd!important;font-size:90%}.cp .diff .added{color:#04de2c}.cp .dpt{font-size:1em;position:relative}.cp .dpt.indent{padding-left:1em}.cp .dpt .dpt-img{text-align:center}.cp .dpt .dpt-img img{max-width:100%}.cp .dpt .dtxt{display:inline}.cp .dpt .dtxt>:not(table):first-child{display:inline!important}.cp .dpt .ementa{padding:2em 0 2em 35%;font-weight:700}.cp .dpt .anexo,.cp .dpt .capitulo,.cp .dpt .disp_finais,.cp .dpt .disp_gerais,.cp .dpt .disp_preliminares,.cp .dpt .disp_transitorias,.cp .dpt .itemsecao,.cp .dpt .livro,.cp .dpt .parte,.cp .dpt .secao,.cp .dpt .subsecao,.cp .dpt .titulo,.cp .dpt .titulo_generico{text-align:center;margin-bottom:1em;font-size:1.5em;margin-top:3em;font-weight:700;font-variant:small-caps}.cp .dpt .titulo{margin-top:2em}.cp .dpt .capitulo{margin-top:1.5em;font-size:1.15em}.cp .dpt .secao{margin-top:1.2em;margin-bottom:.7em;font-weight:700;font-size:1.15em}.cp .dpt .itemsecao,.cp .dpt .subsecao{margin-top:1em;margin-bottom:.6em;font-weight:700;font-size:1.15em}.cp .dpt .artigo{font-size:1.15em;float:left}.cp .dpt .artigo .dptt{position:relative}.cp .dpt .caput,.cp .dpt .texto_n_estruturado{margin-top:.3333em;font-size:1.15em}.cp .dpt .paragrafo{font-size:1.1em;margin-top:.2222em}.cp .dpt .inciso{font-size:1.1em;margin-top:.1667em}.cp .dpt .alinea,.cp .dpt .item{font-size:1em;margin-top:2px}.cp .dpt .assinatura,.cp .dpt .fecho_lei{margin-top:.6em;font-size:1.15em}.cp .dpt .page-break{page-break-before:always}.cp .dpt .bloco_alteracao{padding-left:10%;font-style:italic;color:#018}.cp .dpt .bloco_alteracao a{text-decoration:underline}.cp .dpt .bloco_alteracao a,.cp .dpt .bloco_alteracao table,.cp .dpt .bloco_alteracao table td{color:#018!important}.cp .dpt .bloco_alteracao .desativado,.cp .dpt .bloco_alteracao .desativado a,.cp .dpt .bloco_alteracao .desativado table,.cp .dpt .bloco_alteracao .desativado table td,.cp .dpt .bloco_alteracao .dptt>a.desativado{text-decoration:line-through;color:#999!important}.cp .dpt .card-header{font-size:1.7rem}.cp .dpt .dn{font-weight:400;position:relative;font-size:80%}.cp .dpt .dn p,.cp .dpt .dn ul{font-weight:400;margin:0 0 0 0;list-style:none;padding:0}.cp .dpt .dn .dnl{display:block;text-align:left!important}.cp .dpt .dn .dnl *{display:inline}.cp .dpt .dn .dnl .bullet{padding:0 .333em;display:inline-block}.cp .dpt .dn .dnl .dnli{min-height:2.5em}.cp .dpt .dn .dnl .dnli:hover ul{font-size:1rem;clip:auto;opacity:1;background:hsla(0,0%,90%,.9)}.cp .dpt .dn .dnl .dnli ul,.cp .dpt .dn .dnl .dnli:hover ul{-webkit-transition:opacity .5s linear,clip 0s .3s;transition:opacity .5s linear,clip 0s .3s}.cp .dpt .dn .dnl .dnli ul{clip:rect(0,0,0,0);opacity:0;position:absolute;background:transparent;right:0;padding:.2em .5em 0 .5em;border:1px solid #c7e3d3;border-top:0;font-size:1.5rem}.cp .dpt .dn .dnl .dnli ul li{display:table-cell;color:#aaa}.cp .dpt .dn .dnl .dnli ul li:hover{color:#787}.cp .dpt .dn .dnl .dnli ul li .nowner,.cp .dpt .dn .dnl .dnli ul li:hover a{color:#27ae60!important}.cp .dpt .dn .dnl .dnli .ntitulo{font-size:.8rem;font-weight:700;color:#03a203;text-decoration:none}.cp .dpt .dn .dnl .dnli .ntitulo a{color:#294!important}.cp .dpt .dn .dnl .dnli .ntexto{font-variant:normal;font-size:.8rem;color:#018801}.cp .dpt .dn .dnl .dnli .ntexto a{color:#03a203!important}.cp .dpt .dn .dnl:hover,.cp .dpt .dn .dnl:hover *{display:block}.cp .dpt .dn .dnl:hover>.bullet{display:none}.cp .dpt .dn .dnl:hover .dnli{margin-top:.5em;border-top:1px solid #c7e3d3}.cp .dpt .dptt{clear:left}.cp .dpt .dptt>a{color:#000}.cp .dpt .dptt>a.nota-alteracao{color:#02baf2;font-size:.75em}.cp .dpt .dptt>a.nota-alteracao:hover{text-decoration:underline}.cp .dpt .dptt .dne{position:absolute;display:block;right:0;left:0;top:0;height:0;-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:right;transform-origin:right;-webkit-transition:all .3s ease;transition:all .3s ease;border-top:1px solid #2980b9}.cp .dpt .dptt .dne ul.btns-action{list-style:none;padding:0;position:absolute;right:0;background-color:#2980b9}.cp .dpt .dptt .dne ul.btns-action li{float:left}.cp .dpt .dptt .dne ul.btns-action li:hover{background-color:rgba(0,0,0,.1)}.cp .dpt .dptt .dne ul.btns-action li a{color:#fff;padding:.15em 1em 0;display:inline-block}.cp .dpt .dptt .dne-nota{position:relative;-webkit-transform:scaleX(1);transform:scaleX(1);height:auto;border-top:0}.cp .dpt .dptt .dne-nota ul.btns-action{display:none}.cp .dpt .dptt .dne-nota .dne-form{margin:1em -2em 0;text-align:left;font-size:1rem}.cp .dpt .dptt:hover .dne{height:.1667rem;-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transition-delay:1s;transition-delay:1s}.cp .dpt .dptt:hover .dne-nota{height:auto;-webkit-transition-delay:0s;transition-delay:0s}.cp .tipo-vigencias{margin-bottom:-6px;opacity:.8;list-style:none;position:fixed;bottom:0;left:50%;-webkit-transform:translate(-50%);transform:translate(-50%);margin:0;padding:0;z-index:1000;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.cp .tipo-vigencias div a{color:#fff}.cp .tipo-vigencias:hover,.cp:hover{opacity:1}.cp .revogado{color:#800}.cp .revogado .dpt-link{color:#999!important}.cp .omissis a{text-decoration:none!important}.cp-print .cp-linha-vigencias{display:none!important}.cp.cpe .desativado,.cp.cpe .dpt .dptt>a.desativado{text-decoration:line-through;color:#999!important}.cp.cpe .desativado table,.cp.cpe .desativado table td,.cp.cpe .dpt .dptt>a.desativado table,.cp.cpe .dpt .dptt>a.desativado table td{border:1px dotted #ccc}.cp.cpe a.nota-alteracao{color:#02baf2!important;font-size:.8rem}.cp.cpe .btn-sm{line-height:1rem}.cp.cpe .btn-outline-primary{background-color:#fff}.cp.cpe .btn-outline-primary:hover{background-color:#02baf2}.cp.cpe .dpt{display:block}.cp.cpe .dpt>.dpt-actions-fixed{position:absolute;right:-1em;top:-.8em;z-index:3;opacity:0}.cp.cpe .dpt>.dpt-actions-fixed.bottom{top:auto;bottom:3px;right:2px}.cp.cpe .dpt>.dpt-actions-fixed .activate{display:none}.cp.cpe .dpt>.dpt-actions-fixed .deactivate{display:inline}.cp.cpe .dpt>.dpt-actions-fixed .btn-dpt-edit.btn-outline-primary{color:#333}.cp.cpe .dpt>.dpt-actions-fixed .btn-dpt-edit.btn-outline-primary:hover{color:#fff;background-color:#02baf2}.cp.cpe .dpt>.dpt-actions,.cp.cpe .dpt>.dpt-actions-bottom{display:none}.cp.cpe .dpt>.dpt-text{cursor:text;min-height:30px;border:1px solid transparent}.cp.cpe .dpt>.dpt-text.hover-fixed,.cp.cpe .dpt>.dpt-text:hover{background-color:rgba(0,0,0,.01);color:#2980b9;border:1px solid #eee;-webkit-transition:color .3s ease;transition:color .3s ease}.cp.cpe .dpt>.dpt-text.artigo{float:none}.cp.cpe .dpt>.dpt-text a.link-rotulo{color:#000}.cp.cpe .dpt:hover>.dpt-actions-fixed{opacity:1}.cp.cpe .dpt:hover>.dpt-actions-fixed:hover~.dpt-text{background-color:rgba(0,0,0,.01);color:#2980b9;border:1px solid #eee;-webkit-transition:color .3s ease;transition:color .3s ease}.cp.cpe .dpt .semtexto{font-weight:700;color:#9aaed6}.cp.cpe .dpt .semtexto:hover{color:#5f76a4}.cp.cpe .dpt-alts{margin:0;margin-bottom:1em;padding:0;background-color:transparent;min-height:100px;border:2px dashed #fff}.cp.cpe .dpt-alts:hover{border-color:#d9ddde}.cp.cpe .dpt-alts:empty{border-color:#ddd}.cp.cpe .dpt-alts.drag{width:100%!important;border-color:#d9ddde}.cp.cpe .dpt-alts.drag .dpt{-webkit-transition-duration:0s!important;transition-duration:0s!important}.cp.cpe .dpt-alts .dpt{width:100%!important;-webkit-box-shadow:0 -1px 0 #e5e5e5,0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24);box-shadow:0 -1px 0 #e5e5e5,0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24);padding:0;margin:0;background-color:#edf0f1;height:auto!important;min-height:2em;z-index:1}.cp.cpe .dpt-alts .dpt:not(:first-child){border-top:1px solid #fff}.cp.cpe .dpt-alts .dpt>.dpt-text{padding:.3em 1em;margin-top:0;margin-bottom:0}.cp.cpe .dpt-alts .dpt>.dpt-text a.link-rotulo{text-decoration:underline}.cp.cpe .dpt-alts .dpt-selected.dpt{margin:0 -.5em}.cp.cpe .dpt-selected.dpt{width:auto!important;margin:1em -.5em;border:1px solid #ddd!important;padding:0;background-color:#fafafa;border-radius:3px;z-index:4}.cp.cpe .dpt-selected.dpt>.dpt-text{border:1px solid transparent}.cp.cpe .dpt-selected.dpt>.dpt-text:hover{border:1px solid transparent;background-color:transparent}.cp.cpe .dpt-selected.dpt>.dpt-form{margin:0 1rem}.cp.cpe .dpt-selected.dpt>.dpt-actions,.cp.cpe .dpt-selected.dpt>.dpt-actions-bottom{display:table;background-color:#e5e5e5;padding:.8rem .6rem .2rem .6rem;margin-bottom:0;width:100%}.cp.cpe .dpt-selected.dpt>.dpt-actions-bottom>.btn-action,.cp.cpe .dpt-selected.dpt>.dpt-actions>.btn-action{display:table-cell;float:none}.cp.cpe .dpt-selected.dpt>.dpt-actions .btns-excluir .btn-danger,.cp.cpe .dpt-selected.dpt>.dpt-actions-bottom .btns-excluir .btn-danger{display:inline-block;opacity:.3;color:#fff}.cp.cpe .dpt-selected.dpt>.dpt-actions .btns-excluir .btn-danger:hover,.cp.cpe .dpt-selected.dpt>.dpt-actions-bottom .btns-excluir .btn-danger:hover{opacity:1}.cp.cpe .dpt-selected.dpt>.dpt-actions-bottom{margin:0;padding-bottom:.8rem}.cp.cpe .dpt-selected .dpt-block{border-top:1px solid #e5e5e5!important;opacity:.6;-webkit-transition:opacity .4s ease;transition:opacity .4s ease}.cp.cpe .dpt-selected .dpt-block:hover{opacity:1}.cp.cpe .dpt-selected .dpt-text{opacity:.7;margin:0;padding:.7em}.cp.cpe .dpt-selected .dpt-text:hover{opacity:1;background-color:#f5f5f5}.cp.cpe .dpt-selected .dpt-alts{margin:1em}.cp.cpe .dpt-selected .dpt-alts .dpt{-webkit-box-shadow:0 0 0;box-shadow:0 0 0}.cp.cpe .dpt-selected>.dpt-actions-fixed{opacity:1;top:-15px;right:.5em}.cp.cpe .dpt-selected>.dpt-actions-fixed .activate{display:inline}.cp.cpe .dpt-selected>.dpt-actions-fixed .deactivate{display:none}.cp.cpe .dpt-selected>.dpt-actions-fixed .btn-dpt-edit{padding:0 6px;line-height:1.2rem}.cp.cpe .dpt-selected>.dpt-actions-fixed .btn-dpt-edit.btn-outline-primary,.cp.cpe .dpt-selected>.dpt-actions-fixed .btn-dpt-edit.btn-outline-primary:hover{background-color:#fad46b;border:1px solid #444}.cp.cpe .dpt-selected .btns-tipos-editor{padding:0}.cp.cpe .dpt-selected .dropdown-menu.dropdown-menu-left{right:auto!important;left:0;padding:0}.cp.cpe .dpt-selected .dropdown-menu.dropdown-menu-left:before{content:"";position:absolute;background-color:transparent;width:100%;height:3px;top:-3px;display:inline-block}.cp.cpe .dpt-selected .dropdown-menu li{line-height:1}.cp.cpe .dpt-selected .dropdown-menu li a{display:block;line-height:1.5rem;padding:0 .5rem;white-space:nowrap}.cp.cpe .dpt-selected .dropdown-menu li a:hover{background-color:#f0f0f0}.cp.cpe .dpt-selected .dropdown-menu li:not(:last-child){border-bottom:1px solid #f0f0f0}.cp.cpe .dpt-selected .btn-group .radius-right{border-bottom-right-radius:.2rem!important;border-top-right-radius:.2rem!important}.cp.cpe .dpt-selected:hover>.dpt-actions-fixed{opacity:1}.cp.cpe1_old_apagar{margin-bottom:15em}.cp.cpe1_old_apagar .desativado,.cp.cpe1_old_apagar .desativado *,.cp.cpe1_old_apagar .dpt .dptt>a.desativado,.cp.cpe1_old_apagar .dpt .dptt>a.desativado *{text-decoration:line-through;color:#999!important}.cp.cpe1_old_apagar .desativado * table,.cp.cpe1_old_apagar .desativado * table td,.cp.cpe1_old_apagar .desativado table,.cp.cpe1_old_apagar .desativado table td,.cp.cpe1_old_apagar .dpt .dptt>a.desativado table,.cp.cpe1_old_apagar .dpt .dptt>a.desativado table td{border:1px dotted #ccc}.cp.cpe1_old_apagar a{text-decoration:none;cursor:pointer}.cp.cpe1_old_apagar .dpt{position:relative;display:block}.cp.cpe1_old_apagar .dpt .semtexto{font-weight:700;color:#bfd1f6}.cp.cpe1_old_apagar .dpt .artigo{float:none}.cp.cpe1_old_apagar .dpt .caput{margin-top:0}.cp.cpe1_old_apagar .dpt-selected .csform .dpt>.actions_left,.cp.cpe1_old_apagar .dpt>.actions_right{color:#fff;right:0;position:absolute;opacity:0;-webkit-transition:all .4s ease-in-out;transition:all .4s ease-in-out;z-index:1000}.cp.cpe1_old_apagar .dpt-selected .csform .dpt>.actions_left a.btn-bloco,.cp.cpe1_old_apagar .dpt>.actions_right a.btn-bloco{background-color:#3498db;color:#fff!important;padding:8px 18px 6px;display:inline-block;line-height:1;float:right}.cp.cpe1_old_apagar .dpt-selected .csform .dpt>.actions_left a.btn-bloco:hover,.cp.cpe1_old_apagar .dpt>.actions_right a.btn-bloco:hover{opacity:1;background-image:-webkit-gradient(linear,left top,left bottom,from(#1c81c4),to(#0b6dad));background-image:linear-gradient(180deg,#1c81c4,#0b6dad)}.cp.cpe1_old_apagar .dpt-selected .csform .dpt:hover>.actions_left,.cp.cpe1_old_apagar .dpt:hover>.actions_right{opacity:1}.cp.cpe1_old_apagar .dpt .bloco{display:block;clear:both}.cp.cpe1_old_apagar .dpt .bloco :hover{color:#27ae60}.cp.cpe1_old_apagar .dpt .bloco .de{cursor:pointer}.cp.cpe1_old_apagar .dpt .articulacao{border-top:2px solid #e5e5e5;margin:2em 0}.cp.cpe1_old_apagar .dpt .bloco_alteracao{margin:1em 0;padding:0;background-color:transparent;min-height:100px;border:2px dashed #fff}.cp.cpe1_old_apagar .dpt .bloco_alteracao:hover{border-color:#d9ddde}.cp.cpe1_old_apagar .dpt .bloco_alteracao.drag{width:100%!important;border-color:#d9ddde}.cp.cpe1_old_apagar .dpt .bloco_alteracao.drag .dpt{-webkit-transition-duration:0s!important;transition-duration:0s!important}.cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt{width:100%!important;-webkit-box-shadow:0 -1px 0 #e5e5e5,0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24);box-shadow:0 -1px 0 #e5e5e5,0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24);padding:.3em 1em;margin:0;background-color:#edf0f1;z-index:1}.cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt:not(:first-child){border-top:1px solid #fff}.cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt.ui-draggable div{cursor:pointer}.cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt.dpt-comp-selected{-webkit-transition:all .3s ease;transition:all .3s ease;width:auto!important;margin:2em -3.7em;-webkit-box-shadow:0 0 6px rgba(0,0,0,.16),0 6px 12px rgba(0,0,0,.32);box-shadow:0 0 6px rgba(0,0,0,.16),0 6px 12px rgba(0,0,0,.32)}.cp.cpe1_old_apagar .dpt-selected{font-size:1em;border:0 solid #ccc;margin:1em -1.8em 1em -1.8em;padding:2.2em 2.2em 1.6em 2.2em;-webkit-box-shadow:-4px 15px 15px rgba(0,0,0,.1),0 6px 6px rgba(0,0,0,.23);box-shadow:-4px 15px 15px rgba(0,0,0,.1),0 6px 6px rgba(0,0,0,.23);background-image:-webkit-gradient(linear,left top,left bottom,from(#eaeaee),to(#ddd));background-image:linear-gradient(180deg,#eaeaee,#ddd)}.cp.cpe1_old_apagar .dpt-selected ul{list-style:none;margin:0;padding:0}.cp.cpe1_old_apagar .dpt-selected .semtexto{color:#999}.cp.cpe1_old_apagar .dpt-selected .bloco{opacity:.5}.cp.cpe1_old_apagar .dpt-selected .bloco:hover{opacity:1}.cp.cpe1_old_apagar .dpt-selected .bloco a:hover{background:transparent}.cp.cpe1_old_apagar .dpt-selected>.bloco{opacity:1;margin:1em}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao{margin:0;padding:1em;border:0 transparent;background-image:-webkit-gradient(linear,left top,left bottom,from(#eaeaee),to(#ddd));background-image:linear-gradient(180deg,#eaeaee,#ddd)}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao:hover{border-color:transparent}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao.drag{width:100%!important}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao.drag .dpt{-webkit-transition-duration:0s!important;transition-duration:0s!important}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao .dpt{width:auto!important;-webkit-transition:all .3s ease;transition:all .3s ease;background-color:#fff}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao .dpt:not(:first-child){border-top:0 solid #fff}.cp.cpe1_old_apagar .dpt-selected>.dpt{padding:0}.cp.cpe1_old_apagar .dpt-selected>.dpt:last-child{padding-bottom:1em}.cp.cpe1_old_apagar .dpt-selected .csform .dpt-selected>.actions_left a.btn-bloco,.cp.cpe1_old_apagar .dpt-selected>.actions_right a.btn-bloco{display:none}.cp.cpe1_old_apagar .dpt-selected .csform{display:block;clear:both;z-index:9;position:static}.cp.cpe1_old_apagar .dpt-selected .csform .btns-action{-webkit-animation:fadeIn 1s ease-in-out;-moz-animation:fadeIn 1s ease-in-out;-o-animation:fadeIn 1s ease-in-out;opacity:1;position:absolute;display:table;-webkit-transition:all .4s ease-in-out;transition:all .4s ease-in-out}.cp.cpe1_old_apagar .dpt-selected .csform .btns-action a{color:#16407c;display:block;background:transparent;vertical-align:middle;text-align:center;font-weight:400;text-shadow:0 0 10px rgba(0,0,0,.3);padding:.33em .4em}.cp.cpe1_old_apagar .dpt-selected .csform .btns-action>li{position:relative;display:table-cell;vertical-align:top}.cp.cpe1_old_apagar .dpt-selected .csform .btns-action>li:hover{background-color:hsla(0,0%,100%,.5)}.cp.cpe1_old_apagar .dpt-selected .csform .btns-action>li:hover>a{text-shadow:0 0 5px #777;color:#0a5}.cp.cpe1_old_apagar .dpt-selected .csform .label_status{position:absolute;bottom:0;right:0;color:#889;padding:.3em;font-size:80%;text-align:right;z-index:15;display:table}.cp.cpe1_old_apagar .dpt-selected .csform .label_status li{display:table-cell;padding:0 .5em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents{z-index:11;top:0;left:0}.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents a{padding:.62em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents div,.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents li{font-size:80%;display:table-cell;vertical-align:middle;border-right:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents div{padding:0 .4em;font-stretch:condensed;font-variant:small-caps;font-weight:700;text-shadow:0 0 10px #fff}.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents>li:hover a{color:#16407c;font-weight:400}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom,.cp.cpe1_old_apagar .dpt-selected .csform .actions_top{top:0;right:0}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom a,.cp.cpe1_old_apagar .dpt-selected .csform .actions_top a{padding-right:1em;padding-left:1em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom li,.cp.cpe1_old_apagar .dpt-selected .csform .actions_top li{display:table-cell;vertical-align:middle;border-left:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom{top:auto;left:0;bottom:0;display:inline-block;border-top:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom a{padding:0 .4em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom li{border:0;border-right:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_left,.cp.cpe1_old_apagar .dpt-selected .csform .actions_right{top:2.2em;right:0;bottom:0;display:block}.cp.cpe1_old_apagar .dpt-selected .csform .actions_left li,.cp.cpe1_old_apagar .dpt-selected .csform .actions_right li{width:2.2em;display:block;border-bottom:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_left li:first-child,.cp.cpe1_old_apagar .dpt-selected .csform .actions_right li:first-child{border-top:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_left{right:auto;left:0}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts{background:transparent;position:relative;z-index:19;display:table;width:100%}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li{display:table-cell}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li:hover>a{background-image:-webkit-gradient(linear,left top,left bottom,from(#1c81c4),to(#0b6dad));background-image:linear-gradient(180deg,#1c81c4,#0b6dad)}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a{background-image:-webkit-gradient(linear,left top,left bottom,from(#3498db),to(#2980c9));background-image:linear-gradient(180deg,#3498db,#2980c9);border-right:1px solid #fff;padding:.2em;display:block;color:#fff;text-align:center;white-space:nowrap}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-excluir,.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar{text-align:left;background:#a70808;color:#c99;padding-left:1.7em;position:relative}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-excluir:hover,.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar:hover{background-color:#c70808;color:#ecc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-excluir:before,.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar:before{z-index:20;position:absolute;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAKRWlDQ1BJQ0MgUHJvZmlsZQAAeNqdU2dUU+kWPffe9EJLiICUS29SFQggUkKLgBSRJiohCRBKiCGh2RVRwRFFRQQbyKCIA46OgIwVUSwMigrYB+Qhoo6Do4iKyvvhe6Nr1rz35s3+tdc+56zznbPPB8AIDJZIM1E1gAypQh4R4IPHxMbh5C5AgQokcAAQCLNkIXP9IwEA+H48PCsiwAe+AAF40wsIAMBNm8AwHIf/D+pCmVwBgIQBwHSROEsIgBQAQHqOQqYAQEYBgJ2YJlMAoAQAYMtjYuMAUC0AYCd/5tMAgJ34mXsBAFuUIRUBoJEAIBNliEQAaDsArM9WikUAWDAAFGZLxDkA2C0AMElXZkgAsLcAwM4QC7IACAwAMFGIhSkABHsAYMgjI3gAhJkAFEbyVzzxK64Q5yoAAHiZsjy5JDlFgVsILXEHV1cuHijOSRcrFDZhAmGaQC7CeZkZMoE0D+DzzAAAoJEVEeCD8/14zg6uzs42jrYOXy3qvwb/ImJi4/7lz6twQAAA4XR+0f4sL7MagDsGgG3+oiXuBGheC6B194tmsg9AtQCg6dpX83D4fjw8RaGQudnZ5eTk2ErEQlthyld9/mfCX8BX/Wz5fjz89/XgvuIkgTJdgUcE+ODCzPRMpRzPkgmEYtzmj0f8twv//B3TIsRJYrlYKhTjURJxjkSajPMypSKJQpIpxSXS/2Ti3yz7Az7fNQCwaj4Be5EtqF1jA/ZLJxBYdMDi9wAA8rtvwdQoCAOAaIPhz3f/7z/9R6AlAIBmSZJxAABeRCQuVMqzP8cIAABEoIEqsEEb9MEYLMAGHMEF3MEL/GA2hEIkxMJCEEIKZIAccmAprIJCKIbNsB0qYC/UQB00wFFohpNwDi7CVbgOPXAP+mEInsEovIEJBEHICBNhIdqIAWKKWCOOCBeZhfghwUgEEoskIMmIFFEiS5E1SDFSilQgVUgd8j1yAjmHXEa6kTvIADKC/Ia8RzGUgbJRPdQMtUO5qDcahEaiC9BkdDGajxagm9BytBo9jDah59CraA/ajz5DxzDA6BgHM8RsMC7Gw0KxOCwJk2PLsSKsDKvGGrBWrAO7ifVjz7F3BBKBRcAJNgR3QiBhHkFIWExYTthIqCAcJDQR2gk3CQOEUcInIpOoS7QmuhH5xBhiMjGHWEgsI9YSjxMvEHuIQ8Q3JBKJQzInuZACSbGkVNIS0kbSblIj6SypmzRIGiOTydpka7IHOZQsICvIheSd5MPkM+Qb5CHyWwqdYkBxpPhT4ihSympKGeUQ5TTlBmWYMkFVo5pS3aihVBE1j1pCraG2Uq9Rh6gTNHWaOc2DFklLpa2ildMaaBdo92mv6HS6Ed2VHk6X0FfSy+lH6JfoA/R3DA2GFYPHiGcoGZsYBxhnGXcYr5hMphnTixnHVDA3MeuY55kPmW9VWCq2KnwVkcoKlUqVJpUbKi9Uqaqmqt6qC1XzVctUj6leU32uRlUzU+OpCdSWq1WqnVDrUxtTZ6k7qIeqZ6hvVD+kfln9iQZZw0zDT0OkUaCxX+O8xiALYxmzeCwhaw2rhnWBNcQmsc3ZfHYqu5j9HbuLPaqpoTlDM0ozV7NS85RmPwfjmHH4nHROCecop5fzforeFO8p4ikbpjRMuTFlXGuqlpeWWKtIq1GrR+u9Nq7tp52mvUW7WfuBDkHHSidcJ0dnj84FnedT2VPdpwqnFk09OvWuLqprpRuhu0R3v26n7pievl6Ankxvp955vef6HH0v/VT9bfqn9UcMWAazDCQG2wzOGDzFNXFvPB0vx9vxUUNdw0BDpWGVYZfhhJG50Tyj1UaNRg+MacZc4yTjbcZtxqMmBiYhJktN6k3umlJNuaYppjtMO0zHzczNos3WmTWbPTHXMueb55vXm9+3YFp4Wiy2qLa4ZUmy5FqmWe62vG6FWjlZpVhVWl2zRq2drSXWu627pxGnuU6TTque1mfDsPG2ybaptxmw5dgG2662bbZ9YWdiF2e3xa7D7pO9k326fY39PQcNh9kOqx1aHX5ztHIUOlY63prOnO4/fcX0lukvZ1jPEM/YM+O2E8spxGmdU5vTR2cXZ7lzg/OIi4lLgssulz4umxvG3ci95Ep09XFd4XrS9Z2bs5vC7ajbr+427mnuh9yfzDSfKZ5ZM3PQw8hD4FHl0T8Ln5Uwa9+sfk9DT4FntecjL2MvkVet17C3pXeq92HvFz72PnKf4z7jPDfeMt5ZX8w3wLfIt8tPw2+eX4XfQ38j/2T/ev/RAKeAJQFnA4mBQYFbAvv4enwhv44/Ottl9rLZ7UGMoLlBFUGPgq2C5cGtIWjI7JCtIffnmM6RzmkOhVB+6NbQB2HmYYvDfgwnhYeFV4Y/jnCIWBrRMZc1d9HcQ3PfRPpElkTem2cxTzmvLUo1Kj6qLmo82je6NLo/xi5mWczVWJ1YSWxLHDkuKq42bmy+3/zt84fineIL43sXmC/IXXB5oc7C9IWnFqkuEiw6lkBMiE44lPBBECqoFowl8hN3JY4KecIdwmciL9E20YjYQ1wqHk7ySCpNepLskbw1eSTFM6Us5bmEJ6mQvEwNTN2bOp4WmnYgbTI9Or0xg5KRkHFCqiFNk7Zn6mfmZnbLrGWFsv7Fbou3Lx6VB8lrs5CsBVktCrZCpuhUWijXKgeyZ2VXZr/Nico5lqueK83tzLPK25A3nO+f/+0SwhLhkralhktXLR1Y5r2sajmyPHF52wrjFQUrhlYGrDy4irYqbdVPq+1Xl65+vSZ6TWuBXsHKgsG1AWvrC1UK5YV969zX7V1PWC9Z37Vh+oadGz4ViYquFNsXlxV/2CjceOUbh2/Kv5nclLSpq8S5ZM9m0mbp5t4tnlsOlqqX5pcObg3Z2rQN31a07fX2Rdsvl80o27uDtkO5o788uLxlp8nOzTs/VKRU9FT6VDbu0t21Ydf4btHuG3u89jTs1dtbvPf9Psm+21UBVU3VZtVl+0n7s/c/romq6fiW+21drU5tce3HA9ID/QcjDrbXudTVHdI9VFKP1ivrRw7HH77+ne93LQ02DVWNnMbiI3BEeeTp9wnf9x4NOtp2jHus4QfTH3YdZx0vakKa8ppGm1Oa+1tiW7pPzD7R1ureevxH2x8PnDQ8WXlK81TJadrpgtOTZ/LPjJ2VnX1+LvncYNuitnvnY87fag9v77oQdOHSRf+L5zu8O85c8rh08rLb5RNXuFearzpfbep06jz+k9NPx7ucu5quuVxrue56vbV7ZvfpG543zt30vXnxFv/W1Z45Pd2983pv98X39d8W3X5yJ/3Oy7vZdyfurbxPvF/0QO1B2UPdh9U/W/7c2O/cf2rAd6Dz0dxH9waFg8/+kfWPD0MFj5mPy4YNhuueOD45OeI/cv3p/KdDz2TPJp4X/qL+y64XFi9++NXr187RmNGhl/KXk79tfKX96sDrGa/bxsLGHr7JeDMxXvRW++3Bd9x3He+j3w9P5Hwgfyj/aPmx9VPQp/uTGZOT/wQDmPP8ELrHaAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB98KFhAeAjYX6TsAAABuSURBVDjLtZNBDoAgDAQbP0Y0/v8KT9BXjBcPGlFoWXsk3Wm6bA3IQLJgAQkoBszAFoGdkB1Yrw8u2KvGA2v29sC6B341ui2oCSI+PoRhSAXWhEz2d0lWk5gt+X5JICUnIjnakbDdtEABlsGY5AOFFEzNHUegwgAAAABJRU5ErkJggg==) no-repeat 50% 50%;content:"";top:0;left:0;display:block;color:#000;margin-left:.4em;height:100%;width:2em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar{background:#1f8b4d;color:#fff}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar:hover{background:#2d9c5c;color:#fff}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar:before{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAKRWlDQ1BJQ0MgUHJvZmlsZQAAeNqdU2dUU+kWPffe9EJLiICUS29SFQggUkKLgBSRJiohCRBKiCGh2RVRwRFFRQQbyKCIA46OgIwVUSwMigrYB+Qhoo6Do4iKyvvhe6Nr1rz35s3+tdc+56zznbPPB8AIDJZIM1E1gAypQh4R4IPHxMbh5C5AgQokcAAQCLNkIXP9IwEA+H48PCsiwAe+AAF40wsIAMBNm8AwHIf/D+pCmVwBgIQBwHSROEsIgBQAQHqOQqYAQEYBgJ2YJlMAoAQAYMtjYuMAUC0AYCd/5tMAgJ34mXsBAFuUIRUBoJEAIBNliEQAaDsArM9WikUAWDAAFGZLxDkA2C0AMElXZkgAsLcAwM4QC7IACAwAMFGIhSkABHsAYMgjI3gAhJkAFEbyVzzxK64Q5yoAAHiZsjy5JDlFgVsILXEHV1cuHijOSRcrFDZhAmGaQC7CeZkZMoE0D+DzzAAAoJEVEeCD8/14zg6uzs42jrYOXy3qvwb/ImJi4/7lz6twQAAA4XR+0f4sL7MagDsGgG3+oiXuBGheC6B194tmsg9AtQCg6dpX83D4fjw8RaGQudnZ5eTk2ErEQlthyld9/mfCX8BX/Wz5fjz89/XgvuIkgTJdgUcE+ODCzPRMpRzPkgmEYtzmj0f8twv//B3TIsRJYrlYKhTjURJxjkSajPMypSKJQpIpxSXS/2Ti3yz7Az7fNQCwaj4Be5EtqF1jA/ZLJxBYdMDi9wAA8rtvwdQoCAOAaIPhz3f/7z/9R6AlAIBmSZJxAABeRCQuVMqzP8cIAABEoIEqsEEb9MEYLMAGHMEF3MEL/GA2hEIkxMJCEEIKZIAccmAprIJCKIbNsB0qYC/UQB00wFFohpNwDi7CVbgOPXAP+mEInsEovIEJBEHICBNhIdqIAWKKWCOOCBeZhfghwUgEEoskIMmIFFEiS5E1SDFSilQgVUgd8j1yAjmHXEa6kTvIADKC/Ia8RzGUgbJRPdQMtUO5qDcahEaiC9BkdDGajxagm9BytBo9jDah59CraA/ajz5DxzDA6BgHM8RsMC7Gw0KxOCwJk2PLsSKsDKvGGrBWrAO7ifVjz7F3BBKBRcAJNgR3QiBhHkFIWExYTthIqCAcJDQR2gk3CQOEUcInIpOoS7QmuhH5xBhiMjGHWEgsI9YSjxMvEHuIQ8Q3JBKJQzInuZACSbGkVNIS0kbSblIj6SypmzRIGiOTydpka7IHOZQsICvIheSd5MPkM+Qb5CHyWwqdYkBxpPhT4ihSympKGeUQ5TTlBmWYMkFVo5pS3aihVBE1j1pCraG2Uq9Rh6gTNHWaOc2DFklLpa2ildMaaBdo92mv6HS6Ed2VHk6X0FfSy+lH6JfoA/R3DA2GFYPHiGcoGZsYBxhnGXcYr5hMphnTixnHVDA3MeuY55kPmW9VWCq2KnwVkcoKlUqVJpUbKi9Uqaqmqt6qC1XzVctUj6leU32uRlUzU+OpCdSWq1WqnVDrUxtTZ6k7qIeqZ6hvVD+kfln9iQZZw0zDT0OkUaCxX+O8xiALYxmzeCwhaw2rhnWBNcQmsc3ZfHYqu5j9HbuLPaqpoTlDM0ozV7NS85RmPwfjmHH4nHROCecop5fzforeFO8p4ikbpjRMuTFlXGuqlpeWWKtIq1GrR+u9Nq7tp52mvUW7WfuBDkHHSidcJ0dnj84FnedT2VPdpwqnFk09OvWuLqprpRuhu0R3v26n7pievl6Ankxvp955vef6HH0v/VT9bfqn9UcMWAazDCQG2wzOGDzFNXFvPB0vx9vxUUNdw0BDpWGVYZfhhJG50Tyj1UaNRg+MacZc4yTjbcZtxqMmBiYhJktN6k3umlJNuaYppjtMO0zHzczNos3WmTWbPTHXMueb55vXm9+3YFp4Wiy2qLa4ZUmy5FqmWe62vG6FWjlZpVhVWl2zRq2drSXWu627pxGnuU6TTque1mfDsPG2ybaptxmw5dgG2662bbZ9YWdiF2e3xa7D7pO9k326fY39PQcNh9kOqx1aHX5ztHIUOlY63prOnO4/fcX0lukvZ1jPEM/YM+O2E8spxGmdU5vTR2cXZ7lzg/OIi4lLgssulz4umxvG3ci95Ep09XFd4XrS9Z2bs5vC7ajbr+427mnuh9yfzDSfKZ5ZM3PQw8hD4FHl0T8Ln5Uwa9+sfk9DT4FntecjL2MvkVet17C3pXeq92HvFz72PnKf4z7jPDfeMt5ZX8w3wLfIt8tPw2+eX4XfQ38j/2T/ev/RAKeAJQFnA4mBQYFbAvv4enwhv44/Ottl9rLZ7UGMoLlBFUGPgq2C5cGtIWjI7JCtIffnmM6RzmkOhVB+6NbQB2HmYYvDfgwnhYeFV4Y/jnCIWBrRMZc1d9HcQ3PfRPpElkTem2cxTzmvLUo1Kj6qLmo82je6NLo/xi5mWczVWJ1YSWxLHDkuKq42bmy+3/zt84fineIL43sXmC/IXXB5oc7C9IWnFqkuEiw6lkBMiE44lPBBECqoFowl8hN3JY4KecIdwmciL9E20YjYQ1wqHk7ySCpNepLskbw1eSTFM6Us5bmEJ6mQvEwNTN2bOp4WmnYgbTI9Or0xg5KRkHFCqiFNk7Zn6mfmZnbLrGWFsv7Fbou3Lx6VB8lrs5CsBVktCrZCpuhUWijXKgeyZ2VXZr/Nico5lqueK83tzLPK25A3nO+f/+0SwhLhkralhktXLR1Y5r2sajmyPHF52wrjFQUrhlYGrDy4irYqbdVPq+1Xl65+vSZ6TWuBXsHKgsG1AWvrC1UK5YV969zX7V1PWC9Z37Vh+oadGz4ViYquFNsXlxV/2CjceOUbh2/Kv5nclLSpq8S5ZM9m0mbp5t4tnlsOlqqX5pcObg3Z2rQN31a07fX2Rdsvl80o27uDtkO5o788uLxlp8nOzTs/VKRU9FT6VDbu0t21Ydf4btHuG3u89jTs1dtbvPf9Psm+21UBVU3VZtVl+0n7s/c/romq6fiW+21drU5tce3HA9ID/QcjDrbXudTVHdI9VFKP1ivrRw7HH77+ne93LQ02DVWNnMbiI3BEeeTp9wnf9x4NOtp2jHus4QfTH3YdZx0vakKa8ppGm1Oa+1tiW7pPzD7R1ureevxH2x8PnDQ8WXlK81TJadrpgtOTZ/LPjJ2VnX1+LvncYNuitnvnY87fag9v77oQdOHSRf+L5zu8O85c8rh08rLb5RNXuFearzpfbep06jz+k9NPx7ucu5quuVxrue56vbV7ZvfpG543zt30vXnxFv/W1Z45Pd2983pv98X39d8W3X5yJ/3Oy7vZdyfurbxPvF/0QO1B2UPdh9U/W/7c2O/cf2rAd6Dz0dxH9waFg8/+kfWPD0MFj5mPy4YNhuueOD45OeI/cv3p/KdDz2TPJp4X/qL+y64XFi9++NXr187RmNGhl/KXk79tfKX96sDrGa/bxsLGHr7JeDMxXvRW++3Bd9x3He+j3w9P5Hwgfyj/aPmx9VPQp/uTGZOT/wQDmPP8ELrHaAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB98KFg0aKnMwtOYAAAClSURBVDjL7ZXBDYMwDEV/qizCGlUP3YCBulwP0DWqnmCL1wuRQkRKaAwn/tGxnr4tOxbQAgP1eijWBL0mMVSoCdoAnxl8CbIGDhbj3BTuZSTn3Bu4S3oCdo6jtwbAHBxi/s+y3VpODvzaMBldtiwZC+CinXQMGOgrVrrP9rim3ylnt1b4EgdbZ/gnuBRg5rjUwOl4tiBjepoq/4mbpFGGxzRoANovsziEeT4TJZEAAAAASUVORK5CYII=) no-repeat 50% 50%}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a span{padding:0 .7em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li:last-child>a{border-right:0 solid #fff}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>ul li:nth-child(2n) a{background:#3385ca}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>ul li a{border-right:1px solid #fff;display:block;color:#fff;background:#2980c9;font-size:80%;padding:.23em 1em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>ul li a:hover{background:#0a5ea4}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior{table-layout:fixed}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior>ul{-webkit-transform:translateY(30px);transform:translateY(30px);-webkit-transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:transform .1s linear,opacity .1s linear,clip 0s .3s;transition:transform .1s linear,opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;clip:rect(0,0,0,0);opacity:0;position:absolute;margin-left:.5em;-webkit-box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);-webkit-transition-delay:.4s;transition-delay:.4s}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior>ul li a{border-right:0!important}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior>ul li:first-child:before{border-width:.375rem;border-style:inset inset solid;content:"";display:block;height:0;width:0;border-color:transparent transparent #3385ca;position:absolute;top:-.71rem;left:.9375rem}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior>ul li:first-child:hover:before{border-color:transparent transparent #0a5ea4}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior>ul:after{content:"";position:absolute;z-index:-1;left:0;top:-25px;height:25px;width:100%;-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior:hover>ul{-webkit-transform:translateY(7px);transform:translateY(7px);-webkit-transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:transform .4s linear,opacity .4s linear,clip 0s .2s;transition:transform .4s linear,opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;opacity:1;clip:rect(-100px,2000px,2000px,-100px)}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir{display:block;position:static}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul{-webkit-transform:translateY(30px);transform:translateY(30px);-webkit-transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:transform .1s linear,opacity .1s linear,clip 0s .3s;transition:transform .1s linear,opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;clip:rect(0,0,0,0);opacity:0;position:absolute;margin-left:.5em;-webkit-box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);-webkit-transition-delay:.4s;transition-delay:.4s}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li a{border-right:0!important}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li:first-child:before{border-width:.375rem;border-style:inset inset solid;content:"";display:block;height:0;width:0;border-color:transparent transparent #3385ca;position:absolute;top:-.71rem;left:.9375rem}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li:first-child:hover:before{border-color:transparent transparent #0a5ea4}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul:after{content:"";position:absolute;z-index:-1;left:0;top:-25px;height:25px;width:100%;-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir:hover>ul{-webkit-transform:translateY(7px);transform:translateY(7px);-webkit-transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:transform .4s linear,opacity .4s linear,clip 0s .2s;transition:transform .4s linear,opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;opacity:1;clip:rect(-100px,2000px,2000px,-100px)}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul{right:.5em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li a{background-color:#a70808}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li a:hover{background:#c70808}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li:first-child:before{border-color:transparent transparent #a70808;right:10%;left:auto}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li:first-child:hover:before{border-color:transparent transparent #c70808}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo{z-index:2000}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li>ul,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li>ul{-webkit-transform:translateY(30px);transform:translateY(30px);-webkit-transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:transform .1s linear,opacity .1s linear,clip 0s .3s;transition:transform .1s linear,opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;clip:rect(0,0,0,0);opacity:0;position:absolute;margin-left:.5em;-webkit-box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);-webkit-transition-delay:.4s;transition-delay:.4s}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li>ul li a,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li>ul li a{border-right:0!important}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li>ul li:first-child:before,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li>ul li:first-child:before{border-width:.375rem;border-style:inset inset solid;content:"";display:block;height:0;width:0;border-color:transparent transparent #3385ca;position:absolute;top:-.71rem;left:.9375rem}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li>ul li:first-child:hover:before,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li>ul li:first-child:hover:before{border-color:transparent transparent #0a5ea4}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li>ul:after,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li>ul:after{content:"";position:absolute;z-index:-1;left:0;top:-25px;height:25px;width:100%;-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li:hover>ul,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li:hover>ul{-webkit-transform:translateY(7px);transform:translateY(7px);-webkit-transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:transform .4s linear,opacity .4s linear,clip 0s .2s;transition:transform .4s linear,opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;opacity:1;clip:rect(-100px,2000px,2000px,-100px)}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li.menu_excluir>ul li:first-child:before,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li.menu_excluir>ul li:first-child:before{right:auto;left:.9375rem}.cp.cpe1_old_apagar .dpt-selected .csform textarea{margin:0;resize:vertical;min-height:12.6em;border:0;font-size:120%;width:100%}.cp.cpe1_old_apagar .dpt-selected .csform textarea:focus{background:#fff}.cp.cpe1_old_apagar .dpt-selected .csform textarea::-webkit-input-placeholder{color:#c70808;opacity:.6;font-size:80%}.cp.cpe1_old_apagar .dpt-selected .csform textarea:-moz-placeholder,.cp.cpe1_old_apagar .dpt-selected .csform textarea::-moz-placeholder{color:#c70808}.cp.cpe1_old_apagar .dpt-selected .csform textarea:-ms-input-placeholder{color:#c70808;opacity:.6}.cp.cpe1_old_apagar .selected{background-color:hsla(0,0%,100%,.5)}.cp.cpe1_old_apagar .selected a:hover{color:#16407c!important;font-weight:400!important}.lista-dispositivo,.result-busca-dispositivo{padding:0 0 1em;min-height:3em}.lista-dispositivo ul,.result-busca-dispositivo ul{list-style:none;margin:0;padding:1em 0 0;-webkit-transition:all 2s linear;transition:all 2s linear;clear:both;position:relative}.lista-dispositivo ul li,.result-busca-dispositivo ul li{display:table;border-collapse:separate;border-bottom:1px solid #fff;width:100%}.lista-dispositivo ul li.ta_title,.result-busca-dispositivo ul li.ta_title{background-color:rgba(0,0,0,.15);width:100%}.lista-dispositivo ul li:last-child .itemlabel,.result-busca-dispositivo ul li:last-child .itemlabel{margin:0}.lista-dispositivo ul li .iteminput,.result-busca-dispositivo ul li .iteminput{background-color:rgba(0,0,0,.1);border-right:1px solid #fff;display:table-cell;padding:.5em;vertical-align:middle;text-align:center;position:relative}.lista-dispositivo ul li .iteminput input,.result-busca-dispositivo ul li .iteminput input{margin:0}.lista-dispositivo ul li .iteminput .flag,.result-busca-dispositivo ul li .iteminput .flag{position:absolute;top:0;left:0;right:0;line-height:1;background-color:#ccc;color:#fff;cursor:default;font-size:80%}.lista-dispositivo ul li .itemlabel,.result-busca-dispositivo ul li .itemlabel{margin:0;background-color:rgba(0,0,0,.1);display:table-cell;padding:.5em;vertical-align:middle;width:100%}.lista-dispositivo ul li .itemlabel .artigo,.result-busca-dispositivo ul li .itemlabel .artigo{float:none}.lista-dispositivo .label-tip-results,.result-busca-dispositivo .label-tip-results{background-color:rgba(0,0,0,.1);padding:0 5px;top:0;z-index:1;line-height:1.3;color:blue;font-size:.9em}.lista-dispositivo .nomenclatura_heranca,.result-busca-dispositivo .nomenclatura_heranca{font-size:90%;color:#057dba;display:inline}.lista-dispositivo.controls-radio-checkbox{border:0}.label_vigencia{border-top:1px solid #fff;display:inline-block;color:#555}.label_vigencia span{color:gray}.cp-nav-parents .dropdown-menu{left:0;right:auto;padding:0}.cp-nav-parents .dropdown-menu:before{content:"";position:absolute;top:-11px;width:100%;height:11px}.cp-nav-parents:hover .dropdown-menu{display:block}.cp-nav-parents a.active small{color:#fff!important}.table-notificacoes tbody tr td{border-top:1px solid #fff;padding:5px;vertical-align:middle}.table-notificacoes tbody tr td ul{margin:0}.table-notificacoes tbody tr td ul li:hover{background-color:rgba(0,0,0,.1)}.btn-modal-open{float:right}.modal .modal-content .alert:only-child{margin:0}.class_color_container{background:#ddd!important}.clear{clear:both}.mce-tinymce.mce-container{border:1px solid #ccc!important;margin-right:2px}.mce-btn button:hover{background-color:rgba(0,0,0,.1)!important;text-shadow:0 0 5px #fff;-webkit-box-shadow:0 0 5px #777;box-shadow:0 0 5px #777}.mce-menu{background:#eee!important}.displaynone{display:none!important}@media only screen and (max-width:991.98px){.cp .table,.cp table{width:auto!important;white-space:normal;overflow-x:auto!important}}@media only screen and (max-width:800px){.cp .fixed{z-index:98;position:relative}.cp.cpe1 .dpt-selected{margin:1em 0}.cp.cpe1 .dpt-selected .csform .actions_parents,.cp.cpe1 .dpt-selected .csform .label_status{font-size:80%;position:static!important;display:block!important;padding:0;height:auto!important;left:0;right:auto;text-align:left}.cp.cpe1 .dpt-selected .csform .actions_parents div,.cp.cpe1 .dpt-selected .csform .actions_parents li,.cp.cpe1 .dpt-selected .csform .label_status div,.cp.cpe1 .dpt-selected .csform .label_status li{display:inline-block!important}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>ul{-webkit-transform:translateY(30px);transform:translateY(30px);-webkit-transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:transform .1s linear,opacity .1s linear,clip 0s .3s;transition:transform .1s linear,opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;clip:rect(0,0,0,0);opacity:0;position:absolute;margin-left:.5em;-webkit-box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);-webkit-transition-delay:.4s;transition-delay:.4s}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>ul li a{border-right:0!important}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>ul li:first-child:before{border-width:.375rem;border-style:inset inset solid;content:"";display:block;height:0;width:0;border-color:transparent transparent #3385ca;position:absolute;top:-.71rem;left:.9375rem}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>ul li:first-child:hover:before{border-color:transparent transparent #0a5ea4}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>ul:after{content:"";position:absolute;z-index:-1;left:0;top:-25px;height:25px;width:100%;-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.cp.cpe1 .dpt-selected .csform .actions_inserts>li:hover>ul{-webkit-transform:translateY(7px);transform:translateY(7px);-webkit-transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:transform .4s linear,opacity .4s linear,clip 0s .2s;transition:transform .4s linear,opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;opacity:1;clip:rect(-100px,2000px,2000px,-100px)}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>a span{display:none}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-excluir,.cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-salvar{padding-left:0;min-width:1em}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-excluir:before,.cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-salvar:before{width:100%;margin:0}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_in,.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_next,.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_prior{position:static}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_in>ul{left:1em!important;right:1em!important;margin-left:0}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_in>ul li:first-child:before{left:37%}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_next>ul{left:0!important;right:1em!important}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_prior>ul{left:1em!important;right:0!important;margin-left:0;margin-right:.5em}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_prior>ul li:first-child:before{right:42%;left:auto}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.menu_excluir>ul{left:10%!important;right:0!important;margin-left:0;margin-right:.5em}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li:first-child:before{right:0;left:auto}}@media only screen and (max-width:575.98px){.cp .cp-linha-vigencias>li{height:1px}.cp .cp-linha-vigencias>li .circle{width:8px;height:8px;margin:-4px auto 0}.cp .cp-linha-vigencias>li>a{font-size:.75rem}.cp .cp-linha-vigencias>li:nth-child(2n)>a{margin-top:4px}.cp .cp-linha-vigencias>li:nth-child(odd)>a{margin-bottom:4px}.cp .cp-linha-vigencias>li ul a{line-height:1.3rem;font-size:.7rem;background:#fff}.cp .cp-linha-vigencias>li.active .circle{width:14px;height:14px;margin:-7px auto 0}.cp .cp-linha-vigencias>li.active:not(:last-child)>a{margin-bottom:15px}.cp .cp-linha-vigencias>li.active:first-child>a,.cp .cp-linha-vigencias>li.active:last-child>a{margin-bottom:10px}}@media print{.button,.cp .vigencias,.cp-linha-vigencias,.dne,.menu-icon,.tipo-vigencias,.toggle-topbar{display:none!important}#btn_font_mais,#btn_font_menos,#btn_impressao{display:none}.container{width:100%}} \ No newline at end of file diff --git a/sapl/static/sapl/frontend/css/compilacao.f4baf459.css.gz b/sapl/static/sapl/frontend/css/compilacao.f4baf459.css.gz new file mode 100644 index 000000000..5bf021050 Binary files /dev/null and b/sapl/static/sapl/frontend/css/compilacao.f4baf459.css.gz differ diff --git a/sapl/static/sapl/frontend/css/global.45591136.css b/sapl/static/sapl/frontend/css/global.45591136.css new file mode 100644 index 000000000..2f3d375d8 --- /dev/null +++ b/sapl/static/sapl/frontend/css/global.45591136.css @@ -0,0 +1,8 @@ +.jcrop-holder{-ms-touch-action:none;direction:ltr;text-align:left}.jcrop-hline,.jcrop-vline{background:#fff url(data:image/gif;base64,R0lGODlhCAAIAJEAAKqqqv///wAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAACAAIAAACDZQFCadrzVRMB9FZ5SwAIfkECQoAAAAsAAAAAAgACAAAAg+ELqCYaudeW9ChyOyltQAAIfkECQoAAAAsAAAAAAgACAAAAg8EhGKXm+rQYtC0WGl9oAAAIfkECQoAAAAsAAAAAAgACAAAAg+EhWKQernaYmjCWLF7qAAAIfkECQoAAAAsAAAAAAgACAAAAg2EISmna81UTAfRWeUsACH5BAkKAAAALAAAAAAIAAgAAAIPFA6imGrnXlvQocjspbUAACH5BAkKAAAALAAAAAAIAAgAAAIPlIBgl5vq0GLQtFhpfaIAACH5BAUKAAAALAAAAAAIAAgAAAIPlIFgknq52mJowlixe6gAADs=);font-size:0;position:absolute}.jcrop-vline{height:100%;width:1px!important}.jcrop-vline.right{right:0}.jcrop-hline{height:1px!important;width:100%}.jcrop-hline.bottom{bottom:0}.jcrop-tracker{-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-select:none;height:100%;width:100%}.jcrop-handle{background-color:#333;border:1px solid #eee;font-size:1px;height:7px;width:7px}.jcrop-handle.ord-n{left:50%;margin-left:-4px;margin-top:-4px;top:0}.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-4px;margin-left:-4px}.jcrop-handle.ord-e{margin-right:-4px;margin-top:-4px;right:0;top:50%}.jcrop-handle.ord-w{left:0;margin-left:-4px;margin-top:-4px;top:50%}.jcrop-handle.ord-nw{left:0;margin-left:-4px;margin-top:-4px;top:0}.jcrop-handle.ord-ne{margin-right:-4px;margin-top:-4px;right:0;top:0}.jcrop-handle.ord-se{bottom:0;margin-bottom:-4px;margin-right:-4px;right:0}.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-4px;margin-left:-4px}.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{height:7px;width:100%}.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{height:100%;width:7px}.jcrop-dragbar.ord-n{margin-top:-4px}.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-4px}.jcrop-dragbar.ord-e{margin-right:-4px;right:0}.jcrop-dragbar.ord-w{margin-left:-4px}.jcrop-light .jcrop-hline,.jcrop-light .jcrop-vline{background:#fff;filter:alpha(opacity=70)!important;opacity:.7!important}.jcrop-light .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#000;border-color:#fff;border-radius:3px}.jcrop-dark .jcrop-hline,.jcrop-dark .jcrop-vline{background:#000;filter:alpha(opacity=70)!important;opacity:.7!important}.jcrop-dark .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#fff;border-color:#000;border-radius:3px}.solid-line .jcrop-hline,.solid-line .jcrop-vline{background:#fff}.jcrop-holder img,img.jcrop-preview{max-width:none}div.jcrop-image.size-warning .jcrop-hline,div.jcrop-image.size-warning .jcrop-vline{border:1px solid red;background:none}body.change-form .allow-fullsize+.help,body.change-form .jcrop-holder+.help{clear:left}body.change-form .jcrop-holder{float:left}div.allow-fullsize{padding:5px 0 0 10px} + +/*! + * Bootstrap v4.6.2 (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors + * Copyright 2011-2022 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--blue:#02baf2;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#f84545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#02baf2;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#f84545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}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{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#02baf2;text-decoration:none;background-color:transparent}a:hover{color:#0180a6;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}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,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[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}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:.875em;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:.875em;color:#6c757d}.blockquote-footer:before{content:"— "}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media(min-width:576px){.container,.container-sm{max-width:540px}}@media(min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media(min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media(min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1,.col-auto{-webkit-box-flex:0}.col-1{-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-2,.col-3{-webkit-box-flex:0}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-4,.col-5{-webkit-box-flex:0}.col-5{-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-6,.col-7{-webkit-box-flex:0}.col-7{-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-8,.col-9{-webkit-box-flex:0}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-10,.col-11{-webkit-box-flex:0}.col-11{-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media(min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media(min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media(min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media(min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8ecfb}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7bdbf8}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#a0e6fa}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#fdcbcb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#fb9e9e}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#fcb2b2}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:hsla(0,0%,100%,.075)}@media(max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media(max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media(max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media(max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control{-webkit-transition:none;transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#76defe;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.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;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;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{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.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:#28a745;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{padding-right:3rem!important;background-position:right 1.5rem center}.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)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#f84545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(248,69,69,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.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:#f84545;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23f84545'%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='%23f84545' 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:#f84545;-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.25);box-shadow:0 0 0 .2rem rgba(248,69,69,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{padding-right:3rem!important;background-position:right 1.5rem center}.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)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#f84545;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23f84545'%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='%23f84545' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#f84545;-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.25);box-shadow:0 0 0 .2rem rgba(248,69,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#f84545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#f84545}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#f84545}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{border-color:#fa7676;background-color:#fa7676}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.25);box-shadow:0 0 0 .2rem rgba(248,69,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before{border-color:#f84545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#f84545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#f84545;-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.25);box-shadow:0 0 0 .2rem rgba(248,69,69,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media(min-width:576px){.form-inline label{-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .form-group,.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;align-items:center;margin-bottom:0}.form-inline .form-group{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;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:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.btn{-webkit-transition:none;transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#02baf2;border-color:#02baf2}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{color:#fff;background-color:#029dcc;border-color:#0293bf}.btn-primary.focus,.btn-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,196,244,.5);box-shadow:0 0 0 .2rem rgba(40,196,244,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#02baf2;border-color:#02baf2}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0293bf;border-color:#0189b3}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,196,244,.5);box-shadow:0 0 0 .2rem rgba(40,196,244,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,6%,54%,.5);box-shadow:0 0 0 .2rem hsla(208,6%,54%,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,6%,54%,.5);box-shadow:0 0 0 .2rem hsla(208,6%,54%,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success.focus,.btn-success:focus,.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{-webkit-box-shadow:0 0 0 .2rem rgba(72,180,97,.5);box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(72,180,97,.5);box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info.focus,.btn-info:focus,.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{-webkit-box-shadow:0 0 0 .2rem rgba(58,176,195,.5);box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(58,176,195,.5);box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{-webkit-box-shadow:0 0 0 .2rem rgba(222,170,12,.5);box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(222,170,12,.5);box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#f84545;border-color:#f84545}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{color:#fff;background-color:#f72020;border-color:#f61414}.btn-danger.focus,.btn-danger:focus{-webkit-box-shadow:0 0 0 .2rem rgba(249,97,97,.5);box-shadow:0 0 0 .2rem rgba(249,97,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#f84545;border-color:#f84545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#f61414;border-color:#f40909}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(249,97,97,.5);box-shadow:0 0 0 .2rem rgba(249,97,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light.focus,.btn-light:focus,.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{-webkit-box-shadow:0 0 0 .2rem hsla(220,4%,85%,.5);box-shadow:0 0 0 .2rem hsla(220,4%,85%,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem hsla(220,4%,85%,.5);box-shadow:0 0 0 .2rem hsla(220,4%,85%,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{-webkit-box-shadow:0 0 0 .2rem rgba(82,88,93,.5);box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(82,88,93,.5);box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-link{font-weight:400;color:#02baf2;text-decoration:none}.btn-link:hover{color:#0180a6}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{-webkit-transition:opacity .15s linear;transition:opacity .15s linear}@media(prefers-reduced-motion:reduce){.fade{-webkit-transition:none;transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@media(prefers-reduced-motion:reduce){.collapsing{-webkit-transition:none;transition:none}}.collapsing.width{width:0;height:auto;-webkit-transition:width .35s ease;transition:width .35s ease}@media(prefers-reduced-motion:reduce){.collapsing.width{-webkit-transition:none;transition:none}}.dropdown,.dropleft,.dropright,.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%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;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-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media(min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media(min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media(min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media(min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{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}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .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}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .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}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#02baf2}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;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:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .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{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;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:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;border-color:#02baf2;background-color:#02baf2}.custom-control-input:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#76defe}.custom-control-input:not(:disabled):active~.custom-control-label:before{color:#fff;background-color:#a8eafe;border-color:#a8eafe}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label:before{pointer-events:none;background-color:#fff;border:1px solid #adb5bd}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='m6.564.75-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{border-color:#02baf2;background-color:#02baf2}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(2,186,242,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(2,186,242,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(2,186,242,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label:after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-transform .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-transform .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{-webkit-transition:none;transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(2,186,242,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#76defe;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(1.5em + .75rem + 2px)}.custom-file-input{z-index:2;margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#76defe;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{left:0;z-index:1;height:calc(1.5em + .75rem + 2px);overflow:hidden;font-weight:400;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.5;color:#495057}.custom-file-label:after{bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(2,186,242,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(2,186,242,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(2,186,242,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#02baf2;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media(prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#a8eafe}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#02baf2;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media(prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#a8eafe}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#02baf2;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;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){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#a8eafe}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label:before,.custom-file-label,.custom-select{-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{-webkit-transition:none;transition:none}}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background-color:transparent;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:none;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#02baf2}.nav-fill .nav-item,.nav-fill>.nav-link{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;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;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;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}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media(max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media(min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm,.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;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>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media(max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media(min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md,.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;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>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media(max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media(min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg,.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;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>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media(max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media(min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl,.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;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>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;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>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.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,.5)}.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 .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' 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,.5)}.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,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.5);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;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{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;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:.75rem 1.25rem;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-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;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-deck .card{margin-bottom:15px}@media(min-width:576px){.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media(min-width:576px){.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;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-columns .card{margin-bottom:.75rem}@media(min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#02baf2;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0180a6;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.page-item:first-child .page-link{margin-left:0;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}.page-item.active .page-link{z-index:3;color:#fff;background-color:#02baf2;border-color:#02baf2}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;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:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.badge{-webkit-transition:none;transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#02baf2}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0293bf}a.badge-primary.focus,a.badge-primary:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.5);box-shadow:0 0 0 .2rem rgba(2,186,242,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#f84545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#f61414}a.badge-danger.focus,a.badge-danger:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.5);box-shadow:0 0 0 .2rem rgba(248,69,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media(min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#01617e;background-color:#ccf1fc;border-color:#b8ecfb}.alert-primary hr{border-top-color:#a0e6fa}.alert-primary .alert-link{color:#013a4b}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#812424;background-color:#fedada;border-color:#fdcbcb}.alert-danger hr{border-top-color:#fcb2b2}.alert-danger .alert-link{color:#591919}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress,.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;overflow:hidden}.progress-bar{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#02baf2;-webkit-transition:width .6s ease;transition:width .6s ease}@media(prefers-reduced-motion:reduce){.progress-bar{-webkit-transition:none;transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media(prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;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:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#02baf2;border-color:#02baf2}.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{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;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{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;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{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;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{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;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{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;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}}.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:#01617e;background-color:#b8ecfb}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#01617e;background-color:#a0e6fa}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#01617e;border-color:#01617e}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#812424;background-color:#fdcbcb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#812424;background-color:#fcb2b2}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#812424;border-color:#812424}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{-ms-flex-preferred-size:350px;flex-basis:350px;max-width:350px;font-size:.875rem;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);-webkit-box-shadow:0 .25rem .75rem rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:hsla(0,0%,100%,.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-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;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{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translateY(-50px);transform:translateY(-50px)}@media(prefers-reduced-motion:reduce){.modal.fade .modal-dialog{-webkit-transition:none;transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-webkit-box;display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;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:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 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{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.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}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;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{top:0;left:0;z-index:1060;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-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 #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;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%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media(prefers-reduced-motion:reduce){.carousel-item{-webkit-transition:none;transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;-webkit-transition:opacity 0s .6s;transition:opacity 0s .6s}@media(prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{-webkit-transition:none;transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;-webkit-transition:opacity .15s ease;transition:opacity .15s ease}@media(prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{-webkit-transition:none;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:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m5.25 0-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m2.75 0-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;-webkit-transition:opacity .6s ease;transition:opacity .6s ease}@media(prefers-reduced-motion:reduce){.carousel-indicators li{-webkit-transition:none;transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spinner-border{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentcolor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentcolor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}@media(prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.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}.bg-primary{background-color:#02baf2!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0293bf!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#f84545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#f61414!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#02baf2!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#f84545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media(min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media(min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media(min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media(min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.85714286%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column,.flex-row{-webkit-box-direction:normal!important}.flex-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse,.flex-row-reverse{-webkit-box-direction:reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media(min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column,.flex-sm-row{-webkit-box-direction:normal!important}.flex-sm-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media(min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column,.flex-md-row{-webkit-box-direction:normal!important}.flex-md-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media(min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column,.flex-lg-row{-webkit-box-direction:normal!important}.flex-lg-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media(min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column,.flex-xl-row{-webkit-box-direction:normal!important}.flex-xl-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media(min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media(min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media(min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media(min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!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}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports(position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{-webkit-box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{-webkit-box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important;box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{-webkit-box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important;box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{-webkit-box-shadow:none!important;box-shadow:none!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}.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}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media(min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media(min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media(min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media(min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:transparent}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media(min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media(min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media(min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media(min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#02baf2!important}a.text-primary:focus,a.text-primary:hover{color:#0180a6!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#f84545!important}a.text-danger:focus,a.text-danger:hover{color:#e80909!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd}blockquote,img,pre,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}.btn-outline-primary{color:#02baf2;border-color:#02baf2;border-color:#d6e1e5}.btn-outline-primary:hover{color:#fff;background-color:#02baf2;border-color:#02baf2}.btn-outline-primary.focus,.btn-outline-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.5);box-shadow:0 0 0 .2rem rgba(2,186,242,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#02baf2;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#02baf2;border-color:#02baf2}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.5);box-shadow:0 0 0 .2rem rgba(2,186,242,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d;border-color:#d6e1e5}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-outline-success{color:#28a745;border-color:#28a745;border-color:#d6e1e5}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8;border-color:#d6e1e5}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107;border-color:#d6e1e5}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#f84545;border-color:#f84545;border-color:#d6e1e5}.btn-outline-danger:hover{color:#fff;background-color:#f84545;border-color:#f84545}.btn-outline-danger.focus,.btn-outline-danger:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.5);box-shadow:0 0 0 .2rem rgba(248,69,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#f84545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#f84545;border-color:#f84545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.5);box-shadow:0 0 0 .2rem rgba(248,69,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa;border-color:#d6e1e5}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40;border-color:#d6e1e5}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.navbar{padding:0}.navbar-nav{-ms-flex-preferred-size:100%;flex-basis:100%}.navbar-nav a{white-space:nowrap;color:#93a4aa}.navbar-nav .nav-link{padding-top:0;padding-bottom:0;line-height:4.5rem}.navbar-nav .dropdown-menu{background-color:#20282a;margin:0;border:0;border-radius:0;padding:0}.navbar-nav .dropdown-item{padding:0}.navbar-nav .dropdown-item:first-child,.navbar-nav .dropdown-item:last-child{border-radius:0}.navbar-nav .dropdown-item a{padding:0 15px;line-height:2.3rem;display:block;text-decoration:none;min-width:15rem}.navbar-nav .dropdown-item:hover{background-color:#364347}.navbar-nav .dropdown-item:hover a{color:#fff}.navbar-nav .pesquisa .dropdown-menu{min-width:15rem}.navbar-nav .search-form{padding:10px;min-width:20%}.navbar-nav a:not([href]):not([tabindex]){color:#777}.navbar-nav.justify-content-end .dropdown-menu{left:auto;right:0}.nav-pills .dropdown-menu{padding:0}.nav-pills .dropdown-item a{display:block}.nav-pills .dropdown-item.active a{color:#fff}@media(max-width:1199px){nav .container{max-width:none;-ms-flex-preferred-size:100%;flex-basis:100%}nav .caret{margin-left:-3px}}@media(max-width:1091px){.navbar-expand-lg .navbar-nav .nav-link{padding-left:4px;padding-right:4px;font-size:.95rem}}@media(max-width:991px){.navbar{padding:5px}.navbar-nav .nav-link{line-height:2.5rem}.navbar-nav.justify-content-end{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.navbar-nav.justify-content-end>li{display:inline-block}}@media(max-width:767px){.table{width:auto;white-space:normal;display:block;overflow-x:auto}}html{position:relative;min-height:100%}a,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,img,p{margin:0;padding:0}.h1,h1{font-size:30px}.h2,h2{font-size:24px}.h3,h3{font-size:20px}.h4,h4{font-size:16px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:.25em 0}p.control-label{font-weight:700}label{margin-bottom:0;line-height:1}input[type=checkbox],input[type=radio]{margin:0 5px 0 0;position:relative}fieldset fieldset{font-size:95%}fieldset fieldset legend{font-size:18px}ul{margin:0}.hidden{display:none}.form-control-static{padding:.2em 0;padding-left:12px;background-color:#f7f7f7}.form-control-static:empty{display:none}.legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5;clear:both}.page-header{margin:20px 0 10px}.caret.top{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.lista-parlamentares .table td{vertical-align:middle}small{color:#777}.container-tabaux .sidebar-tabaux{background:#fafafa;margin-top:-70px;padding:10px;border:1px solid #eee}.container-tabaux .sidebar-tabaux .navbar-right{margin:0}.container-tabaux .sidebar-tabaux .nav-pills>li+li{margin-left:0}.container-tabaux .sidebar-tabaux li{width:100%}.container-tabaux .sidebar-tabaux span{display:none}.container-tabaux .sidebar-tabaux .dropdown-menu{padding:0;right:10px;margin-top:-5px;overflow:hidden}.container-tabaux .sidebar-tabaux .dropdown-menu a{border:0}.container-tabaux ul{list-style:none;padding:0}.container-tabaux .list{font-family:SourceSansProSemiBold,Helvetica,Arial,sans-serif;font-size:0}.container-tabaux .list,.container-tabaux .list ul{display:table;width:100%;margin:0}.container-tabaux .list li{width:50%;display:inline-block;position:relative}.container-tabaux .list>li{width:100%;border-bottom:1px solid #eee;padding-bottom:20px;margin-bottom:20px}.container-tabaux .list .head_title{color:#364347;font-size:1.7rem;text-transform:none}.container-tabaux .list a span,.mce-branding.mce-label{display:none}.dont-break-out{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}@media print{a[href]:after{content:none!important}}.container-home{position:relative;padding:2em 1.5em 1.5em 1.5em;max-width:1000px;margin:0 auto}.container-home a:hover{color:#444;-webkit-transition:.3s ease-in;-moz-transition:.3s ease-in;-o-transition:.3s ease-in}.container-home #homeIndex{text-align:center}.container-home .homeBanner span{color:#fff;font-size:32px;font-weight:600;display:inline-block;vertical-align:middle;padding:2px 45px 4px;border:2px solid}.container-home .homeBanner:after{display:inline-block;vertical-align:middle;height:100%}.container-home .homeBlock{display:inline-block;position:relative;background-color:#f3f3f3;width:190px;height:260px;margin:3px;text-align:center;font-size:0;overflow:hidden}.container-home .homeBlock>a{display:block;position:absolute;width:100%;height:100%;top:0;left:0}.container-home .homeBlock:after{content:"";display:inline-block;vertical-align:middle;height:100%;overflow:visible;clear:none;visibility:initial}.container-home .homeContent{position:relative;padding:10px;text-align:justify;font-size:14px;color:#fff;opacity:0;-webkit-transition:opacity .5s ease;transition:opacity .5s ease;display:inline-block;vertical-align:middle}.container-home .homeContent p{display:block;line-height:13px;font-size:80%;color:#fff}.container-home .homeIcon{position:relative;display:inline-block;width:105px;height:105px;border-radius:50%;background:#364347;z-index:1}.container-home .homeIcon:before{content:"";position:absolute;width:100%;height:100%;border-radius:50%;background:#364347;top:0;left:0;-webkit-transform:scale(.95);transform:scale(.95);-webkit-transition:-webkit-transform .6s ease;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease}.container-home .homeIcon img{position:absolute;margin:auto;top:0;bottom:0;right:0;left:0;-webkit-transition:opacity .4s ease .4s;transition:opacity .4s ease .4s}.container-home .homeFront{position:absolute;top:46%;width:100%;font-size:0;-webkit-transform:translateY(-60%);transform:translateY(-60%)}.container-home .homeFront h2{position:absolute;margin-top:18px;font-size:22px;font-weight:700;color:#595959!important;width:100%;padding:0 6%;z-index:0}.container-home .homeTitle{display:block;height:32px;text-align:center;width:100%;opacity:0;-webkit-transition:opacity .4s ease;transition:opacity .4s ease}.container-home .homeTitle:before{content:"";display:inline-block;vertical-align:middle;height:100%}.container-home .homeTitle h2{display:inline-block;vertical-align:middle;max-width:110px;font-size:14px;color:#fff!important;line-height:1em}.container-home .homeTitle img{display:inline-block;vertical-align:middle;height:30px;margin-right:5px}.container-home .homeBlock:hover .homeIcon:before{-webkit-transform:scale(3.6) translateY(7px);transform:scale(3.6) translateY(7px)}.container-home .homeBlock:hover .homeContent{opacity:1;-webkit-transition-delay:.2s;transition-delay:.2s}.container-home .homeBlock:hover .homeIcon img{opacity:0;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-delay:0s;transition-delay:0s}.container-home .homeBlock:hover .homeTitle{opacity:1}.masthead{padding:10px}.masthead .navbar-brand{padding:0;font-size:24px}.masthead .navbar-brand img.img-responsive{height:95px;display:inline-block}.masthead .navbar-brand small{color:#93a4aa;font-size:75%;line-height:25px}.masthead .navbar-brand .vcenter{display:inline-block;vertical-align:middle;float:none;padding:10px;line-height:1.5rem}.masthead .nav-link{padding:.3rem .5rem;margin:0 1px}.masthead .nav-link:hover{background-color:#b2c6cd;color:#fff}@media(max-width:1091px){.masthead .navbar-brand{font-size:22px}.masthead .navbar-brand img.img-responsive{height:60px}}@media(max-width:767px){.masthead{text-align:center}.masthead .container{max-width:100%;padding:0}.masthead .navbar-brand{white-space:normal;margin:0}.masthead .navbar-brand .vcenter{display:block;line-height:1em}}@media(max-width:576px){.masthead .navbar-brand{font-size:1.2rem}}@media(max-width:360px){.masthead .navbar-brand{font-size:1rem}}body{margin-bottom:160px}.footer{background:#364347;color:#fff;text-align:center;position:absolute;width:100%;bottom:0}.footer p{color:#fff;margin-top:10px}.footer .container{padding-top:25px}@media(max-width:991px){.footer{position:relative}} \ No newline at end of file diff --git a/sapl/static/sapl/frontend/css/global.45591136.css.gz b/sapl/static/sapl/frontend/css/global.45591136.css.gz new file mode 100644 index 000000000..2d4cac284 Binary files /dev/null and b/sapl/static/sapl/frontend/css/global.45591136.css.gz differ diff --git a/sapl/static/sapl/frontend/css/global.cfffff0f.css b/sapl/static/sapl/frontend/css/global.cfffff0f.css deleted file mode 100644 index 4b57c8511..000000000 --- a/sapl/static/sapl/frontend/css/global.cfffff0f.css +++ /dev/null @@ -1 +0,0 @@ -*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}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{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#02baf2;text-decoration:none;background-color:transparent}a:hover{color:#0180a6;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}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,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[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}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer:before{content:"\2014\00A0"}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.row-cols-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1,.col-auto{-webkit-box-flex:0}.col-1{-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-2{-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-2,.col-3{-webkit-box-flex:0}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-4,.col-5{-webkit-box-flex:0}.col-5{-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-6,.col-7{-webkit-box-flex:0}.col-7{-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-8{-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-8,.col-9{-webkit-box-flex:0}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-10,.col-11{-webkit-box-flex:0}.col-11{-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.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%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.row-cols-sm-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.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%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.row-cols-md-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.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%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.row-cols-lg-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.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%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.row-cols-xl-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.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%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8ecfb}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7bdbf8}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#a0e6fa}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#fdcbcb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#fb9e9e}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#fcb2b2}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:hsla(0,0%,100%,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{-webkit-transition:none;transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#76defe;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.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;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;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{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.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:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' 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:#28a745;-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,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)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' 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") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#f84545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(248,69,69,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.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:#f84545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23f84545'%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='%23f84545' 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:#f84545;-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.25);box-shadow:0 0 0 .2rem rgba(248,69,69,.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)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#f84545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23f84545'%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='%23f84545' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#f84545;-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.25);box-shadow:0 0 0 .2rem rgba(248,69,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#f84545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#f84545}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#f84545}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{border-color:#fa7676;background-color:#fa7676}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.25);box-shadow:0 0 0 .2rem rgba(248,69,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#f84545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#f84545;-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.25);box-shadow:0 0 0 .2rem rgba(248,69,69,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .form-group,.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;align-items:center;margin-bottom:0}.form-inline .form-group{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;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:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{-webkit-transition:none;transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#02baf2;border-color:#02baf2}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{color:#fff;background-color:#029dcc;border-color:#0293bf}.btn-primary.focus,.btn-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,196,244,.5);box-shadow:0 0 0 .2rem rgba(40,196,244,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#02baf2;border-color:#02baf2}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0293bf;border-color:#0189b3}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,196,244,.5);box-shadow:0 0 0 .2rem rgba(40,196,244,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(130,138,145,.5);box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(130,138,145,.5);box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success.focus,.btn-success:focus,.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{-webkit-box-shadow:0 0 0 .2rem rgba(72,180,97,.5);box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(72,180,97,.5);box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info.focus,.btn-info:focus,.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{-webkit-box-shadow:0 0 0 .2rem rgba(58,176,195,.5);box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(58,176,195,.5);box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{-webkit-box-shadow:0 0 0 .2rem rgba(222,170,12,.5);box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(222,170,12,.5);box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#f84545;border-color:#f84545}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{color:#fff;background-color:#f72020;border-color:#f61414}.btn-danger.focus,.btn-danger:focus{-webkit-box-shadow:0 0 0 .2rem rgba(249,97,97,.5);box-shadow:0 0 0 .2rem rgba(249,97,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#f84545;border-color:#f84545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#f61414;border-color:#f40909}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(249,97,97,.5);box-shadow:0 0 0 .2rem rgba(249,97,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light.focus,.btn-light:focus,.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{-webkit-box-shadow:0 0 0 .2rem rgba(216,217,219,.5);box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(216,217,219,.5);box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{-webkit-box-shadow:0 0 0 .2rem rgba(82,88,93,.5);box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(82,88,93,.5);box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-link{font-weight:400;color:#02baf2;text-decoration:none}.btn-link:hover{color:#0180a6}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{-webkit-transition:opacity .15s linear;transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{-webkit-transition:none;transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{-webkit-transition:none;transition:none}}.dropdown,.dropleft,.dropright,.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%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;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-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{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}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .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}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .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}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#02baf2}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;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:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .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{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;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:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;border-color:#02baf2;background-color:#02baf2}.custom-control-input:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#76defe}.custom-control-input:not(:disabled):active~.custom-control-label:before{color:#fff;background-color:#a8eafe;border-color:#a8eafe}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label:before{pointer-events:none;background-color:#fff;border:1px solid #adb5bd}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{border-color:#02baf2;background-color:#02baf2}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(2,186,242,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(2,186,242,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(2,186,242,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label:after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-transform .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-transform .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{-webkit-transition:none;transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(2,186,242,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#76defe;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(1.5em + .75rem + 2px)}.custom-file-input{z-index:2;margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#76defe;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{left:0;z-index:1;height:calc(1.5em + .75rem + 2px);overflow:hidden;font-weight:400;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.5;color:#495057}.custom-file-label:after{bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(2,186,242,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(2,186,242,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(2,186,242,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#02baf2;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#a8eafe}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#02baf2;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#a8eafe}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#02baf2;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;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){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#a8eafe}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label:before,.custom-file-label,.custom-select{-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{-webkit-transition:none;transition:none}}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;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:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#02baf2}.nav-fill .nav-item,.nav-fill>.nav-link{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;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;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;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}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm,.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;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>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md,.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;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>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg,.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;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>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl,.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;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>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;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>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.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,.5)}.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 .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0,0,0,0.5)' 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,.5)}.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,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.5);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255,255,255,0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;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{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;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:.75rem 1.25rem;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-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;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-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;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-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#02baf2;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0180a6;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.page-item:first-child .page-link{margin-left:0;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}.page-item.active .page-link{z-index:3;color:#fff;background-color:#02baf2;border-color:#02baf2}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;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:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{-webkit-transition:none;transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#02baf2}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0293bf}a.badge-primary.focus,a.badge-primary:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.5);box-shadow:0 0 0 .2rem rgba(2,186,242,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(108,117,125,.5);box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#f84545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#f61414}a.badge-danger.focus,a.badge-danger:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.5);box-shadow:0 0 0 .2rem rgba(248,69,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#01617e;background-color:#ccf1fc;border-color:#b8ecfb}.alert-primary hr{border-top-color:#a0e6fa}.alert-primary .alert-link{color:#013a4b}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#812424;background-color:#fedada;border-color:#fdcbcb}.alert-danger hr{border-top-color:#fcb2b2}.alert-danger .alert-link{color:#591919}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress,.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;overflow:hidden}.progress-bar{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#02baf2;-webkit-transition:width .6s ease;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{-webkit-transition:none;transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;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:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#02baf2;border-color:#02baf2}.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{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;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{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;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{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;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{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;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{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;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}}.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:#01617e;background-color:#b8ecfb}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#01617e;background-color:#a0e6fa}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#01617e;border-color:#01617e}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#812424;background-color:#fdcbcb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#812424;background-color:#fcb2b2}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#812424;border-color:#812424}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{-ms-flex-preferred-size:350px;flex-basis:350px;max-width:350px;font-size:.875rem;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);-webkit-box-shadow:0 .25rem .75rem rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:hsla(0,0%,100%,.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-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;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{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translateY(-50px);transform:translateY(-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{-webkit-transition:none;transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-webkit-box;display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;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:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 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{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.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}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;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 .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;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{top:0;left:0;z-index:1060;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;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:.3rem}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-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 #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;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%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{-webkit-transition:none;transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;-webkit-transition:opacity 0s .6s;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{-webkit-transition:none;transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;-webkit-transition:opacity .15s ease;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{-webkit-transition:none;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:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;-webkit-transition:opacity .6s ease;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{-webkit-transition:none;transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spinner-border{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.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}.bg-primary{background-color:#02baf2!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0293bf!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#f84545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#f61414!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#02baf2!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#f84545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.85714%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column,.flex-row{-webkit-box-direction:normal!important}.flex-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse,.flex-row-reverse{-webkit-box-direction:reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column,.flex-sm-row{-webkit-box-direction:normal!important}.flex-sm-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column,.flex-md-row{-webkit-box-direction:normal!important}.flex-md-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column,.flex-lg-row{-webkit-box-direction:normal!important}.flex-lg-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column,.flex-xl-row{-webkit-box-direction:normal!important}.flex-xl-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;-ms-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!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}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports (position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{-webkit-box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{-webkit-box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important;box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{-webkit-box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important;box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{-webkit-box-shadow:none!important;box-shadow:none!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}.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}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:transparent}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#02baf2!important}a.text-primary:focus,a.text-primary:hover{color:#0180a6!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#f84545!important}a.text-danger:focus,a.text-danger:hover{color:#e80909!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}.btn-outline-primary{color:#02baf2;border-color:#02baf2;border-color:#d6e1e5}.btn-outline-primary:hover{color:#fff;background-color:#02baf2;border-color:#02baf2}.btn-outline-primary.focus,.btn-outline-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.5);box-shadow:0 0 0 .2rem rgba(2,186,242,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#02baf2;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#02baf2;border-color:#02baf2}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.5);box-shadow:0 0 0 .2rem rgba(2,186,242,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d;border-color:#d6e1e5}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(108,117,125,.5);box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(108,117,125,.5);box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745;border-color:#d6e1e5}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8;border-color:#d6e1e5}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107;border-color:#d6e1e5}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#f84545;border-color:#f84545;border-color:#d6e1e5}.btn-outline-danger:hover{color:#fff;background-color:#f84545;border-color:#f84545}.btn-outline-danger.focus,.btn-outline-danger:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.5);box-shadow:0 0 0 .2rem rgba(248,69,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#f84545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#f84545;border-color:#f84545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.5);box-shadow:0 0 0 .2rem rgba(248,69,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa;border-color:#d6e1e5}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40;border-color:#d6e1e5}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.navbar{padding:0}.navbar-nav{-ms-flex-preferred-size:100%;flex-basis:100%}.navbar-nav a{white-space:nowrap;color:#93a4aa}.navbar-nav .nav-link{padding-top:0;padding-bottom:0;line-height:4.5rem}.navbar-nav .dropdown-menu{background-color:#20282a;margin:0;border:0;border-radius:0;padding:0}.navbar-nav .dropdown-item{padding:0}.navbar-nav .dropdown-item:first-child,.navbar-nav .dropdown-item:last-child{border-radius:0}.navbar-nav .dropdown-item a{padding:0 15px;line-height:2.3rem;display:block;text-decoration:none;min-width:15rem}.navbar-nav .dropdown-item:hover{background-color:#364347}.navbar-nav .dropdown-item:hover a{color:#fff}.navbar-nav .pesquisa .dropdown-menu{min-width:15rem}.navbar-nav .search-form{padding:10px;min-width:20%}.navbar-nav a:not([href]):not([tabindex]){color:#777}.navbar-nav.justify-content-end .dropdown-menu{left:auto;right:0}.nav-pills .dropdown-menu{padding:0}.nav-pills .dropdown-item a{display:block}.nav-pills .dropdown-item.active a{color:#fff}@media (max-width:1199px){nav .container{max-width:none;-ms-flex-preferred-size:100%;flex-basis:100%}nav .caret{margin-left:-3px}}@media (max-width:1091px){.navbar-expand-lg .navbar-nav .nav-link{padding-left:4px;padding-right:4px;font-size:.95rem}}@media (max-width:991px){.navbar{padding:5px}.navbar-nav .nav-link{line-height:2.5rem}.navbar-nav.justify-content-end{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.navbar-nav.justify-content-end>li{display:inline-block}}@media (max-width:767px){.table{width:auto;white-space:normal;display:block;overflow-x:auto}}html{position:relative;min-height:100%}a,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,img,p{margin:0;padding:0}.h1,h1{font-size:30px}.h2,h2{font-size:24px}.h3,h3{font-size:20px}.h4,h4{font-size:16px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:.25em 0}p.control-label{font-weight:700}label{margin-bottom:0;line-height:1}input[type=checkbox],input[type=radio]{margin:0 5px 0 0;position:relative}fieldset fieldset{font-size:95%}fieldset fieldset legend{font-size:18px}ul{margin:0}.hidden{display:none}.form-control-static{padding:.2em 0;padding-left:12px;background-color:#f7f7f7}.form-control-static:empty{display:none}.legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5;clear:both}.page-header{margin:20px 0 10px}.caret.top{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.lista-parlamentares .table td{vertical-align:middle}small{color:#777}.container-tabaux .sidebar-tabaux{background:#fafafa;margin-top:-70px;padding:10px;border:1px solid #eee}.container-tabaux .sidebar-tabaux .navbar-right{margin:0}.container-tabaux .sidebar-tabaux .nav-pills>li+li{margin-left:0}.container-tabaux .sidebar-tabaux li{width:100%}.container-tabaux .sidebar-tabaux span{display:none}.container-tabaux .sidebar-tabaux .dropdown-menu{padding:0;right:10px;margin-top:-5px;overflow:hidden}.container-tabaux .sidebar-tabaux .dropdown-menu a{border:0}.container-tabaux ul{list-style:none;padding:0}.container-tabaux .list{font-family:SourceSansProSemiBold,Helvetica,Arial,sans-serif;font-size:0}.container-tabaux .list,.container-tabaux .list ul{display:table;width:100%;margin:0}.container-tabaux .list li{width:50%;display:inline-block;position:relative}.container-tabaux .list>li{width:100%;border-bottom:1px solid #eee;padding-bottom:20px;margin-bottom:20px}.container-tabaux .list .head_title{color:#364347;font-size:1.7rem;text-transform:none}.container-tabaux .list a span,.mce-branding.mce-label{display:none}.dont-break-out{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}@media print{a[href]:after{content:none!important}}.container-home{position:relative;padding:2em 1.5em 1.5em 1.5em;max-width:1000px;margin:0 auto}.container-home a:hover{color:#444;-webkit-transition:.3s ease-in;-moz-transition:.3s ease-in;-o-transition:.3s ease-in}.container-home #homeIndex{text-align:center}.container-home .homeBanner span{color:#fff;font-size:32px;font-weight:600;display:inline-block;vertical-align:middle;padding:2px 45px 4px;border:2px solid}.container-home .homeBanner:after{display:inline-block;vertical-align:middle;height:100%}.container-home .homeBlock{display:inline-block;position:relative;background-color:#f3f3f3;width:190px;height:260px;margin:3px;text-align:center;font-size:0;overflow:hidden}.container-home .homeBlock>a{display:block;position:absolute;width:100%;height:100%;top:0;left:0}.container-home .homeBlock:after{content:"";display:inline-block;vertical-align:middle;height:100%;overflow:visible;clear:none;visibility:initial}.container-home .homeContent{position:relative;padding:10px;text-align:justify;font-size:14px;color:#fff;opacity:0;-webkit-transition:opacity .5s ease;transition:opacity .5s ease;display:inline-block;vertical-align:middle}.container-home .homeContent p{display:block;line-height:13px;font-size:80%;color:#fff}.container-home .homeIcon{position:relative;display:inline-block;width:105px;height:105px;border-radius:50%;background:#364347;z-index:1}.container-home .homeIcon:before{content:"";position:absolute;width:100%;height:100%;border-radius:50%;background:#364347;top:0;left:0;-webkit-transform:scale(.95);transform:scale(.95);-webkit-transition:-webkit-transform .6s ease;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease}.container-home .homeIcon img{position:absolute;margin:auto;top:0;bottom:0;right:0;left:0;-webkit-transition:opacity .4s ease .4s;transition:opacity .4s ease .4s}.container-home .homeFront{position:absolute;top:46%;width:100%;font-size:0;-webkit-transform:translateY(-60%);transform:translateY(-60%)}.container-home .homeFront h2{position:absolute;margin-top:18px;font-size:22px;font-weight:700;color:#595959!important;width:100%;padding:0 6%;z-index:0}.container-home .homeTitle{display:block;height:32px;text-align:center;width:100%;opacity:0;-webkit-transition:opacity .4s ease;transition:opacity .4s ease}.container-home .homeTitle:before{content:"";display:inline-block;vertical-align:middle;height:100%}.container-home .homeTitle h2{display:inline-block;vertical-align:middle;max-width:110px;font-size:14px;color:#fff!important;line-height:1em}.container-home .homeTitle img{display:inline-block;vertical-align:middle;height:30px;margin-right:5px}.container-home .homeBlock:hover .homeIcon:before{-webkit-transform:scale(3.6) translateY(7px);transform:scale(3.6) translateY(7px)}.container-home .homeBlock:hover .homeContent{opacity:1;-webkit-transition-delay:.2s;transition-delay:.2s}.container-home .homeBlock:hover .homeIcon img{opacity:0;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-delay:0s;transition-delay:0s}.container-home .homeBlock:hover .homeTitle{opacity:1}.masthead{padding:10px}.masthead .navbar-brand{padding:0;font-size:24px}.masthead .navbar-brand img.img-responsive{height:95px;display:inline-block}.masthead .navbar-brand small{color:#93a4aa;font-size:75%;line-height:25px}.masthead .navbar-brand .vcenter{display:inline-block;vertical-align:middle;float:none;padding:10px;line-height:1.5rem}.masthead .nav-link{padding:.3rem .5rem;margin:0 1px}.masthead .nav-link:hover{background-color:#b2c6cd;color:#fff}@media (max-width:1091px){.masthead .navbar-brand{font-size:22px}.masthead .navbar-brand img.img-responsive{height:60px}}@media (max-width:767px){.masthead{text-align:center}.masthead .container{max-width:100%;padding:0}.masthead .navbar-brand{white-space:normal;margin:0}.masthead .navbar-brand .vcenter{display:block;line-height:1em}}@media (max-width:576px){.masthead .navbar-brand{font-size:1.2rem}}@media (max-width:360px){.masthead .navbar-brand{font-size:1rem}}body{margin-bottom:160px}.footer{background:#364347;color:#fff;text-align:center;position:absolute;width:100%;bottom:0}.footer p{color:#fff;margin-top:10px}.footer .container{padding-top:25px}@media (max-width:991px){.footer{position:relative}}.jcrop-holder{-ms-touch-action:none;direction:ltr;text-align:left}.jcrop-hline,.jcrop-vline{background:#fff url(data:image/gif;base64,R0lGODlhCAAIAJEAAKqqqv///wAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAACAAIAAACDZQFCadrzVRMB9FZ5SwAIfkECQoAAAAsAAAAAAgACAAAAg+ELqCYaudeW9ChyOyltQAAIfkECQoAAAAsAAAAAAgACAAAAg8EhGKXm+rQYtC0WGl9oAAAIfkECQoAAAAsAAAAAAgACAAAAg+EhWKQernaYmjCWLF7qAAAIfkECQoAAAAsAAAAAAgACAAAAg2EISmna81UTAfRWeUsACH5BAkKAAAALAAAAAAIAAgAAAIPFA6imGrnXlvQocjspbUAACH5BAkKAAAALAAAAAAIAAgAAAIPlIBgl5vq0GLQtFhpfaIAACH5BAUKAAAALAAAAAAIAAgAAAIPlIFgknq52mJowlixe6gAADs=);font-size:0;position:absolute}.jcrop-vline{height:100%;width:1px!important}.jcrop-vline.right{right:0}.jcrop-hline{height:1px!important;width:100%}.jcrop-hline.bottom{bottom:0}.jcrop-tracker{-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-select:none;height:100%;width:100%}.jcrop-handle{background-color:#333;border:1px solid #eee;font-size:1px;height:7px;width:7px}.jcrop-handle.ord-n{left:50%;margin-left:-4px;margin-top:-4px;top:0}.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-4px;margin-left:-4px}.jcrop-handle.ord-e{margin-right:-4px;margin-top:-4px;right:0;top:50%}.jcrop-handle.ord-w{left:0;margin-left:-4px;margin-top:-4px;top:50%}.jcrop-handle.ord-nw{left:0;margin-left:-4px;margin-top:-4px;top:0}.jcrop-handle.ord-ne{margin-right:-4px;margin-top:-4px;right:0;top:0}.jcrop-handle.ord-se{bottom:0;margin-bottom:-4px;margin-right:-4px;right:0}.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-4px;margin-left:-4px}.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{height:7px;width:100%}.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{height:100%;width:7px}.jcrop-dragbar.ord-n{margin-top:-4px}.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-4px}.jcrop-dragbar.ord-e{margin-right:-4px;right:0}.jcrop-dragbar.ord-w{margin-left:-4px}.jcrop-light .jcrop-hline,.jcrop-light .jcrop-vline{background:#fff;filter:alpha(opacity=70)!important;opacity:.7!important}.jcrop-light .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#000;border-color:#fff;border-radius:3px}.jcrop-dark .jcrop-hline,.jcrop-dark .jcrop-vline{background:#000;filter:alpha(opacity=70)!important;opacity:.7!important}.jcrop-dark .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#fff;border-color:#000;border-radius:3px}.solid-line .jcrop-hline,.solid-line .jcrop-vline{background:#fff}.jcrop-holder img,img.jcrop-preview{max-width:none}div.jcrop-image.size-warning .jcrop-hline,div.jcrop-image.size-warning .jcrop-vline{border:1px solid red;background:none}body.change-form .allow-fullsize+.help,body.change-form .jcrop-holder+.help{clear:left}body.change-form .jcrop-holder{float:left}div.allow-fullsize{padding:5px 0 0 10px} \ No newline at end of file diff --git a/sapl/static/sapl/frontend/css/global.cfffff0f.css.gz b/sapl/static/sapl/frontend/css/global.cfffff0f.css.gz deleted file mode 100644 index fb063665c..000000000 Binary files a/sapl/static/sapl/frontend/css/global.cfffff0f.css.gz and /dev/null differ diff --git a/sapl/static/sapl/frontend/css/painel.5d957a9b.css b/sapl/static/sapl/frontend/css/painel.e2b9504e.css similarity index 100% rename from sapl/static/sapl/frontend/css/painel.5d957a9b.css rename to sapl/static/sapl/frontend/css/painel.e2b9504e.css diff --git a/sapl/static/sapl/frontend/css/painel.5d957a9b.css.gz b/sapl/static/sapl/frontend/css/painel.e2b9504e.css.gz similarity index 100% rename from sapl/static/sapl/frontend/css/painel.5d957a9b.css.gz rename to sapl/static/sapl/frontend/css/painel.e2b9504e.css.gz diff --git a/sapl/static/sapl/frontend/css/parlamentar.0e433876.css b/sapl/static/sapl/frontend/css/parlamentar.0e433876.css deleted file mode 100644 index e69de29bb..000000000 diff --git a/sapl/legacy/__init__.py b/sapl/static/sapl/frontend/css/parlamentar.cd5dc5a8.css similarity index 100% rename from sapl/legacy/__init__.py rename to sapl/static/sapl/frontend/css/parlamentar.cd5dc5a8.css diff --git a/sapl/static/sapl/frontend/fonts/fa-brands-400.1a575a41.woff b/sapl/static/sapl/frontend/fonts/fa-brands-400.1a575a41.woff deleted file mode 100644 index 3375bef09..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-brands-400.1a575a41.woff and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-brands-400.513aa607.ttf b/sapl/static/sapl/frontend/fonts/fa-brands-400.513aa607.ttf deleted file mode 100644 index 8d75dedda..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-brands-400.513aa607.ttf and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-brands-400.513aa607.ttf.gz b/sapl/static/sapl/frontend/fonts/fa-brands-400.513aa607.ttf.gz deleted file mode 100644 index 3f66426a4..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-brands-400.513aa607.ttf.gz and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-brands-400.592643a8.eot b/sapl/static/sapl/frontend/fonts/fa-brands-400.592643a8.eot deleted file mode 100644 index cba6c6cce..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-brands-400.592643a8.eot and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-brands-400.592643a8.eot.gz b/sapl/static/sapl/frontend/fonts/fa-brands-400.592643a8.eot.gz deleted file mode 100644 index 4ba691c50..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-brands-400.592643a8.eot.gz and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-brands-400.86c7e1fa.woff2 b/sapl/static/sapl/frontend/fonts/fa-brands-400.86c7e1fa.woff2 new file mode 100644 index 000000000..e67e5cd53 Binary files /dev/null and b/sapl/static/sapl/frontend/fonts/fa-brands-400.86c7e1fa.woff2 differ diff --git a/sapl/static/sapl/frontend/fonts/fa-brands-400.ed311c7a.woff2 b/sapl/static/sapl/frontend/fonts/fa-brands-400.ed311c7a.woff2 deleted file mode 100644 index 402f81c0b..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-brands-400.ed311c7a.woff2 and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-brands-400.f5defc2e.ttf b/sapl/static/sapl/frontend/fonts/fa-brands-400.f5defc2e.ttf new file mode 100644 index 000000000..24ca8b17c Binary files /dev/null and b/sapl/static/sapl/frontend/fonts/fa-brands-400.f5defc2e.ttf differ diff --git a/sapl/static/sapl/frontend/fonts/fa-brands-400.f5defc2e.ttf.gz b/sapl/static/sapl/frontend/fonts/fa-brands-400.f5defc2e.ttf.gz new file mode 100644 index 000000000..f51a96d4f Binary files /dev/null and b/sapl/static/sapl/frontend/fonts/fa-brands-400.f5defc2e.ttf.gz differ diff --git a/sapl/static/sapl/frontend/fonts/fa-regular-400.3edb9004.ttf b/sapl/static/sapl/frontend/fonts/fa-regular-400.3edb9004.ttf new file mode 100644 index 000000000..c5ac00957 Binary files /dev/null and b/sapl/static/sapl/frontend/fonts/fa-regular-400.3edb9004.ttf differ diff --git a/sapl/static/sapl/frontend/fonts/fa-regular-400.3edb9004.ttf.gz b/sapl/static/sapl/frontend/fonts/fa-regular-400.3edb9004.ttf.gz new file mode 100644 index 000000000..10b934033 Binary files /dev/null and b/sapl/static/sapl/frontend/fonts/fa-regular-400.3edb9004.ttf.gz differ diff --git a/sapl/static/sapl/frontend/fonts/fa-regular-400.766913e6.ttf b/sapl/static/sapl/frontend/fonts/fa-regular-400.766913e6.ttf deleted file mode 100644 index 7157aafba..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-regular-400.766913e6.ttf and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-regular-400.766913e6.ttf.gz b/sapl/static/sapl/frontend/fonts/fa-regular-400.766913e6.ttf.gz deleted file mode 100644 index 804694a91..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-regular-400.766913e6.ttf.gz and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-regular-400.b0e2db3b.eot b/sapl/static/sapl/frontend/fonts/fa-regular-400.b0e2db3b.eot deleted file mode 100644 index a4e598936..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-regular-400.b0e2db3b.eot and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-regular-400.b0e2db3b.eot.gz b/sapl/static/sapl/frontend/fonts/fa-regular-400.b0e2db3b.eot.gz deleted file mode 100644 index 0f55c865b..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-regular-400.b0e2db3b.eot.gz and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-regular-400.b91d376b.woff2 b/sapl/static/sapl/frontend/fonts/fa-regular-400.b91d376b.woff2 deleted file mode 100644 index 56328948b..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-regular-400.b91d376b.woff2 and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-regular-400.d1d7e3b4.woff b/sapl/static/sapl/frontend/fonts/fa-regular-400.d1d7e3b4.woff deleted file mode 100644 index ad077c6be..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-regular-400.d1d7e3b4.woff and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-regular-400.e0550912.woff2 b/sapl/static/sapl/frontend/fonts/fa-regular-400.e0550912.woff2 new file mode 100644 index 000000000..7dca1d907 Binary files /dev/null and b/sapl/static/sapl/frontend/fonts/fa-regular-400.e0550912.woff2 differ diff --git a/sapl/static/sapl/frontend/fonts/fa-solid-900.0c6bfc66.eot b/sapl/static/sapl/frontend/fonts/fa-solid-900.0c6bfc66.eot deleted file mode 100644 index e99417197..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-solid-900.0c6bfc66.eot and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-solid-900.0c6bfc66.eot.gz b/sapl/static/sapl/frontend/fonts/fa-solid-900.0c6bfc66.eot.gz deleted file mode 100644 index 3ec94a255..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-solid-900.0c6bfc66.eot.gz and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-solid-900.64d5644d.woff2 b/sapl/static/sapl/frontend/fonts/fa-solid-900.64d5644d.woff2 new file mode 100644 index 000000000..4a7f96652 Binary files /dev/null and b/sapl/static/sapl/frontend/fonts/fa-solid-900.64d5644d.woff2 differ diff --git a/sapl/static/sapl/frontend/fonts/fa-solid-900.b9625119.ttf b/sapl/static/sapl/frontend/fonts/fa-solid-900.b9625119.ttf deleted file mode 100644 index 25abf389e..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-solid-900.b9625119.ttf and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-solid-900.b9625119.ttf.gz b/sapl/static/sapl/frontend/fonts/fa-solid-900.b9625119.ttf.gz deleted file mode 100644 index 5a00f3f06..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-solid-900.b9625119.ttf.gz and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-solid-900.d745348d.woff b/sapl/static/sapl/frontend/fonts/fa-solid-900.d745348d.woff deleted file mode 100644 index 23ee66344..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-solid-900.d745348d.woff and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-solid-900.d824df7e.woff2 b/sapl/static/sapl/frontend/fonts/fa-solid-900.d824df7e.woff2 deleted file mode 100644 index 2217164f0..000000000 Binary files a/sapl/static/sapl/frontend/fonts/fa-solid-900.d824df7e.woff2 and /dev/null differ diff --git a/sapl/static/sapl/frontend/fonts/fa-solid-900.f418d876.ttf b/sapl/static/sapl/frontend/fonts/fa-solid-900.f418d876.ttf new file mode 100644 index 000000000..43ba1cc7d Binary files /dev/null and b/sapl/static/sapl/frontend/fonts/fa-solid-900.f418d876.ttf differ diff --git a/sapl/static/sapl/frontend/fonts/fa-solid-900.f418d876.ttf.gz b/sapl/static/sapl/frontend/fonts/fa-solid-900.f418d876.ttf.gz new file mode 100644 index 000000000..7927583ca Binary files /dev/null and b/sapl/static/sapl/frontend/fonts/fa-solid-900.f418d876.ttf.gz differ diff --git a/sapl/static/sapl/frontend/fonts/fa-v4compatibility.7e7e1dad.ttf b/sapl/static/sapl/frontend/fonts/fa-v4compatibility.7e7e1dad.ttf new file mode 100644 index 000000000..243bc25bd Binary files /dev/null and b/sapl/static/sapl/frontend/fonts/fa-v4compatibility.7e7e1dad.ttf differ diff --git a/sapl/static/sapl/frontend/fonts/fa-v4compatibility.7e7e1dad.ttf.gz b/sapl/static/sapl/frontend/fonts/fa-v4compatibility.7e7e1dad.ttf.gz new file mode 100644 index 000000000..d35115e9c Binary files /dev/null and b/sapl/static/sapl/frontend/fonts/fa-v4compatibility.7e7e1dad.ttf.gz differ diff --git a/sapl/static/sapl/frontend/img/bg.png b/sapl/static/sapl/frontend/img/bg.png new file mode 100644 index 000000000..97407ffd2 Binary files /dev/null and b/sapl/static/sapl/frontend/img/bg.png differ diff --git a/sapl/static/sapl/frontend/img/fa-brands-400.1d5619cd.svg b/sapl/static/sapl/frontend/img/fa-brands-400.1d5619cd.svg deleted file mode 100644 index b9881a43b..000000000 --- a/sapl/static/sapl/frontend/img/fa-brands-400.1d5619cd.svg +++ /dev/null @@ -1,3717 +0,0 @@ - - - - -Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sapl/static/sapl/frontend/img/fa-brands-400.1d5619cd.svg.gz b/sapl/static/sapl/frontend/img/fa-brands-400.1d5619cd.svg.gz deleted file mode 100644 index fa7bddb86..000000000 Binary files a/sapl/static/sapl/frontend/img/fa-brands-400.1d5619cd.svg.gz and /dev/null differ diff --git a/sapl/static/sapl/frontend/img/fa-regular-400.c5d109be.svg b/sapl/static/sapl/frontend/img/fa-regular-400.c5d109be.svg deleted file mode 100644 index 463af27c0..000000000 --- a/sapl/static/sapl/frontend/img/fa-regular-400.c5d109be.svg +++ /dev/null @@ -1,801 +0,0 @@ - - - - -Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sapl/static/sapl/frontend/img/fa-regular-400.c5d109be.svg.gz b/sapl/static/sapl/frontend/img/fa-regular-400.c5d109be.svg.gz deleted file mode 100644 index 4e1b4eae3..000000000 Binary files a/sapl/static/sapl/frontend/img/fa-regular-400.c5d109be.svg.gz and /dev/null differ diff --git a/sapl/static/sapl/frontend/img/fa-solid-900.37bc7099.svg b/sapl/static/sapl/frontend/img/fa-solid-900.37bc7099.svg deleted file mode 100644 index 00296e959..000000000 --- a/sapl/static/sapl/frontend/img/fa-solid-900.37bc7099.svg +++ /dev/null @@ -1,5034 +0,0 @@ - - - - -Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sapl/static/sapl/frontend/img/fa-solid-900.37bc7099.svg.gz b/sapl/static/sapl/frontend/img/fa-solid-900.37bc7099.svg.gz deleted file mode 100644 index cce986b69..000000000 Binary files a/sapl/static/sapl/frontend/img/fa-solid-900.37bc7099.svg.gz and /dev/null differ diff --git a/sapl/static/sapl/frontend/img/icon_normas_juridicas_destaque.png b/sapl/static/sapl/frontend/img/icon_normas_juridicas_destaque.png new file mode 100644 index 000000000..81b19017f Binary files /dev/null and b/sapl/static/sapl/frontend/img/icon_normas_juridicas_destaque.png differ diff --git a/sapl/static/sapl/frontend/img/ui-icons_2694e8_256x240.274157b3.png b/sapl/static/sapl/frontend/img/ui-icons_2694e8_256x240.274157b3.png deleted file mode 100644 index 8e978c867..000000000 Binary files a/sapl/static/sapl/frontend/img/ui-icons_2694e8_256x240.274157b3.png and /dev/null differ diff --git a/sapl/static/sapl/frontend/img/ui-icons_2e83ff_256x240.602e5d4d.png b/sapl/static/sapl/frontend/img/ui-icons_2e83ff_256x240.602e5d4d.png deleted file mode 100644 index b900add60..000000000 Binary files a/sapl/static/sapl/frontend/img/ui-icons_2e83ff_256x240.602e5d4d.png and /dev/null differ diff --git a/sapl/static/sapl/frontend/img/ui-icons_3d80b3_256x240.24fcd129.png b/sapl/static/sapl/frontend/img/ui-icons_3d80b3_256x240.24fcd129.png deleted file mode 100644 index 94496c7cd..000000000 Binary files a/sapl/static/sapl/frontend/img/ui-icons_3d80b3_256x240.24fcd129.png and /dev/null differ diff --git a/sapl/static/sapl/frontend/img/ui-icons_72a7cf_256x240.55a4c5ce.png b/sapl/static/sapl/frontend/img/ui-icons_72a7cf_256x240.55a4c5ce.png deleted file mode 100644 index 520d9a590..000000000 Binary files a/sapl/static/sapl/frontend/img/ui-icons_72a7cf_256x240.55a4c5ce.png and /dev/null differ diff --git a/sapl/static/sapl/frontend/img/ui-icons_ffffff_256x240.bb2a88be.png b/sapl/static/sapl/frontend/img/ui-icons_ffffff_256x240.bb2a88be.png deleted file mode 100644 index 395dc0935..000000000 Binary files a/sapl/static/sapl/frontend/img/ui-icons_ffffff_256x240.bb2a88be.png and /dev/null differ diff --git a/sapl/static/sapl/frontend/js/chunk-vendors.874df7f4.js b/sapl/static/sapl/frontend/js/chunk-vendors.874df7f4.js new file mode 100644 index 000000000..55ae1ba97 --- /dev/null +++ b/sapl/static/sapl/frontend/js/chunk-vendors.874df7f4.js @@ -0,0 +1,13 @@ +/*! For license information please see chunk-vendors.874df7f4.js.LICENSE.txt */ +(self.webpackChunksapl_frontend=self.webpackChunksapl_frontend||[]).push([[998],{9669:(e,t,n)=>{e.exports=n(1609)},5448:(e,t,n)=>{"use strict";var h=n(4867),f=n(6026),p=n(4372),m=n(5327),g=n(4097),v=n(4109),b=n(7985),y=n(7874),_=n(2648),w=n(644),x=n(205);e.exports=function(d){return new Promise(function(t,n){var e,r=d.data,i=d.headers,o=d.responseType;function s(){d.cancelToken&&d.cancelToken.unsubscribe(e),d.signal&&d.signal.removeEventListener("abort",e)}h.isFormData(r)&&h.isStandardBrowserEnv()&&delete i["Content-Type"];var a=new XMLHttpRequest,l=(d.auth&&(l=d.auth.username||"",u=d.auth.password?unescape(encodeURIComponent(d.auth.password)):"",i.Authorization="Basic "+btoa(l+":"+u)),g(d.baseURL,d.url));function c(){var e;a&&(e="getAllResponseHeaders"in a?v(a.getAllResponseHeaders()):null,e={data:o&&"text"!==o&&"json"!==o?a.response:a.responseText,status:a.status,statusText:a.statusText,headers:e,config:d,request:a},f(function(e){t(e),s()},function(e){n(e),s()},e),a=null)}a.open(d.method.toUpperCase(),m(l,d.params,d.paramsSerializer),!0),a.timeout=d.timeout,"onloadend"in a?a.onloadend=c:a.onreadystatechange=function(){a&&4===a.readyState&&(0!==a.status||a.responseURL&&0===a.responseURL.indexOf("file:"))&&setTimeout(c)},a.onabort=function(){a&&(n(new _("Request aborted",_.ECONNABORTED,d,a)),a=null)},a.onerror=function(){n(new _("Network Error",_.ERR_NETWORK,d,a,a)),a=null},a.ontimeout=function(){var e=d.timeout?"timeout of "+d.timeout+"ms exceeded":"timeout exceeded",t=d.transitional||y;d.timeoutErrorMessage&&(e=d.timeoutErrorMessage),n(new _(e,t.clarifyTimeoutError?_.ETIMEDOUT:_.ECONNABORTED,d,a)),a=null},h.isStandardBrowserEnv()&&(u=(d.withCredentials||b(l))&&d.xsrfCookieName?p.read(d.xsrfCookieName):void 0)&&(i[d.xsrfHeaderName]=u),"setRequestHeader"in a&&h.forEach(i,function(e,t){void 0===r&&"content-type"===t.toLowerCase()?delete i[t]:a.setRequestHeader(t,e)}),h.isUndefined(d.withCredentials)||(a.withCredentials=!!d.withCredentials),o&&"json"!==o&&(a.responseType=d.responseType),"function"==typeof d.onDownloadProgress&&a.addEventListener("progress",d.onDownloadProgress),"function"==typeof d.onUploadProgress&&a.upload&&a.upload.addEventListener("progress",d.onUploadProgress),(d.cancelToken||d.signal)&&(e=function(e){a&&(n(!e||e.type?new w:e),a.abort(),a=null)},d.cancelToken&&d.cancelToken.subscribe(e),d.signal&&(d.signal.aborted?e():d.signal.addEventListener("abort",e)));var r=r||null,u=x(l);u&&-1===["http","https","file"].indexOf(u)?n(new _("Unsupported protocol "+u+":",_.ERR_BAD_REQUEST,d)):a.send(r)})}},1609:(e,t,n)=>{"use strict";var i=n(4867),o=n(1849),s=n(321),a=n(7185);var r=function t(n){var e=new s(n),r=o(s.prototype.request,e);return i.extend(r,s.prototype,e),i.extend(r,e),r.create=function(e){return t(a(n,e))},r}(n(5546));r.Axios=s,r.CanceledError=n(644),r.CancelToken=n(4972),r.isCancel=n(6502),r.VERSION=n(7288).version,r.toFormData=n(7675),r.AxiosError=n(2648),r.Cancel=r.CanceledError,r.all=function(e){return Promise.all(e)},r.spread=n(8713),r.isAxiosError=n(6268),e.exports=r,e.exports.default=r},4972:(e,t,n)=>{"use strict";var i=n(644);function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");this.promise=new Promise(function(e){t=e});var t,r=this;this.promise.then(function(e){if(r._listeners){for(var t=r._listeners.length,n=0;n{"use strict";var r=n(2648);function i(e){r.call(this,null==e?"canceled":e,r.ERR_CANCELED),this.name="CanceledError"}n(4867).inherits(i,r,{__CANCEL__:!0}),e.exports=i},6502:e=>{"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},321:(e,t,n)=>{"use strict";var r=n(4867),i=n(5327),o=n(782),u=n(3572),d=n(7185),s=n(4097),h=n(4875),f=h.validators;function a(e){this.defaults=e,this.interceptors={request:new o,response:new o}}a.prototype.request=function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},(t=d(this.defaults,t)).method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var n,e=t.transitional,r=(void 0!==e&&h.assertOptions(e,{silentJSONParsing:f.transitional(f.boolean),forcedJSONParsing:f.transitional(f.boolean),clarifyTimeoutError:f.transitional(f.boolean)},!1),[]),i=!0,o=(this.interceptors.request.forEach(function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(i=i&&e.synchronous,r.unshift(e.fulfilled,e.rejected))}),[]);if(this.interceptors.response.forEach(function(e){o.push(e.fulfilled,e.rejected)}),i){for(var s=t;r.length;){var a=r.shift(),l=r.shift();try{s=a(s)}catch(e){l(e);break}}try{n=u(s)}catch(e){return Promise.reject(e)}for(;o.length;)n=n.then(o.shift(),o.shift())}else{var c=[u,void 0];for(Array.prototype.unshift.apply(c,r),c=c.concat(o),n=Promise.resolve(t);c.length;)n=n.then(c.shift(),c.shift())}return n},a.prototype.getUri=function(e){e=d(this.defaults,e);var t=s(e.baseURL,e.url);return i(t,e.params,e.paramsSerializer)},r.forEach(["delete","get","head","options"],function(n){a.prototype[n]=function(e,t){return this.request(d(t||{},{method:n,url:e,data:(t||{}).data}))}}),r.forEach(["post","put","patch"],function(i){function e(r){return function(e,t,n){return this.request(d(n||{},{method:i,headers:r?{"Content-Type":"multipart/form-data"}:{},url:e,data:t}))}}a.prototype[i]=e(),a.prototype[i+"Form"]=e(!0)}),e.exports=a},2648:(e,t,n)=>{"use strict";var a=n(4867);function l(e,t,n,r,i){Error.call(this),this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),i&&(this.response=i)}a.inherits(l,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var c=l.prototype,r={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED"].forEach(function(e){r[e]={value:e}}),Object.defineProperties(l,r),Object.defineProperty(c,"isAxiosError",{value:!0}),l.from=function(e,t,n,r,i,o){var s=Object.create(c);return a.toFlatObject(e,s,function(e){return e!==Error.prototype}),l.call(s,e.message,t,n,r,i),s.name=e.name,o&&Object.assign(s,o),s},e.exports=l},782:(e,t,n)=>{"use strict";var r=n(4867);function i(){this.handlers=[]}i.prototype.use=function(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1},i.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},i.prototype.forEach=function(t){r.forEach(this.handlers,function(e){null!==e&&t(e)})},e.exports=i},4097:(e,t,n)=>{"use strict";var r=n(1793),i=n(7303);e.exports=function(e,t){return e&&!r(t)?i(e,t):t}},3572:(e,t,n)=>{"use strict";var r=n(4867),i=n(8527),o=n(6502),s=n(5546),a=n(644);function l(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new a}e.exports=function(t){return l(t),t.headers=t.headers||{},t.data=i.call(t,t.data,t.headers,t.transformRequest),t.headers=r.merge(t.headers.common||{},t.headers[t.method]||{},t.headers),r.forEach(["delete","get","head","post","put","patch","common"],function(e){delete t.headers[e]}),(t.adapter||s.adapter)(t).then(function(e){return l(t),e.data=i.call(t,e.data,e.headers,t.transformResponse),e},function(e){return o(e)||(l(t),e&&e.response&&(e.response.data=i.call(t,e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)})}},7185:(e,t,n)=>{"use strict";var c=n(4867);e.exports=function(t,n){n=n||{};var r={};function i(e,t){return c.isPlainObject(e)&&c.isPlainObject(t)?c.merge(e,t):c.isPlainObject(t)?c.merge({},t):c.isArray(t)?t.slice():t}function o(e){return c.isUndefined(n[e])?c.isUndefined(t[e])?void 0:i(void 0,t[e]):i(t[e],n[e])}function e(e){if(!c.isUndefined(n[e]))return i(void 0,n[e])}function s(e){return c.isUndefined(n[e])?c.isUndefined(t[e])?void 0:i(void 0,t[e]):i(void 0,n[e])}function a(e){return e in n?i(t[e],n[e]):e in t?i(void 0,t[e]):void 0}var l={url:e,method:e,data:e,baseURL:s,transformRequest:s,transformResponse:s,paramsSerializer:s,timeout:s,timeoutMessage:s,withCredentials:s,adapter:s,responseType:s,xsrfCookieName:s,xsrfHeaderName:s,onUploadProgress:s,onDownloadProgress:s,decompress:s,maxContentLength:s,maxBodyLength:s,beforeRedirect:s,transport:s,httpAgent:s,httpsAgent:s,cancelToken:s,socketPath:s,responseEncoding:s,validateStatus:a};return c.forEach(Object.keys(t).concat(Object.keys(n)),function(e){var t=l[e]||o,n=t(e);c.isUndefined(n)&&t!==a||(r[e]=n)}),r}},6026:(e,t,n)=>{"use strict";var i=n(2648);e.exports=function(e,t,n){var r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new i("Request failed with status code "+n.status,[i.ERR_BAD_REQUEST,i.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n)):e(n)}},8527:(e,t,n)=>{"use strict";var i=n(4867),o=n(5546);e.exports=function(t,n,e){var r=this||o;return i.forEach(e,function(e){t=e.call(r,t,n)}),t}},5546:(e,t,n)=>{"use strict";var s=n(4867),a=n(6016),r=n(2648),i=n(7874),l=n(7675),o={"Content-Type":"application/x-www-form-urlencoded"};function c(e,t){!s.isUndefined(e)&&s.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var u,d={transitional:i,adapter:u="undefined"!=typeof XMLHttpRequest||"undefined"!=typeof process&&"[object process]"===Object.prototype.toString.call(process)?n(5448):u,transformRequest:[function(e,t){if(a(t,"Accept"),a(t,"Content-Type"),!(s.isFormData(e)||s.isArrayBuffer(e)||s.isBuffer(e)||s.isStream(e)||s.isFile(e)||s.isBlob(e))){if(s.isArrayBufferView(e))return e.buffer;if(s.isURLSearchParams(e))return c(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString();var n=s.isObject(e),r=t&&t["Content-Type"];if((i=s.isFileList(e))||n&&"multipart/form-data"===r)return o=this.env&&this.env.FormData,l(i?{"files[]":e}:e,o&&new o);if(n||"application/json"===r){c(t,"application/json");var i=e,o=void 0,n=void 0;if(s.isString(i))try{return(o||JSON.parse)(i),s.trim(i)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(i)}}return e}],transformResponse:[function(e){var t=this.transitional||d.transitional,n=t&&t.silentJSONParsing,t=t&&t.forcedJSONParsing,n=!n&&"json"===this.responseType;if(n||t&&s.isString(e)&&e.length)try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw r.from(e,r.ERR_BAD_RESPONSE,this,null,this.response);throw e}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:n(1623)},validateStatus:function(e){return 200<=e&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};s.forEach(["delete","get","head"],function(e){d.headers[e]={}}),s.forEach(["post","put","patch"],function(e){d.headers[e]=s.merge(o)}),e.exports=d},7874:e=>{"use strict";e.exports={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1}},7288:e=>{e.exports={version:"0.27.2"}},1849:e=>{"use strict";e.exports=function(n,r){return function(){for(var e=new Array(arguments.length),t=0;t{"use strict";var i=n(4867);function o(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,n){var r;return!t||(n=n?n(t):i.isURLSearchParams(t)?t.toString():(r=[],i.forEach(t,function(e,t){null!=e&&(i.isArray(e)?t+="[]":e=[e],i.forEach(e,function(e){i.isDate(e)?e=e.toISOString():i.isObject(e)&&(e=JSON.stringify(e)),r.push(o(t)+"="+o(e))}))}),r.join("&")))&&(-1!==(t=e.indexOf("#"))&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+n),e}},7303:e=>{"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},4372:(e,t,n)=>{"use strict";var a=n(4867);e.exports=a.isStandardBrowserEnv()?{write:function(e,t,n,r,i,o){var s=[];s.push(e+"="+encodeURIComponent(t)),a.isNumber(n)&&s.push("expires="+new Date(n).toGMTString()),a.isString(r)&&s.push("path="+r),a.isString(i)&&s.push("domain="+i),!0===o&&s.push("secure"),document.cookie=s.join("; ")},read:function(e){e=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},1793:e=>{"use strict";e.exports=function(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}},6268:(e,t,n)=>{"use strict";var r=n(4867);e.exports=function(e){return r.isObject(e)&&!0===e.isAxiosError}},7985:(e,t,n)=>{"use strict";var r,i,o,s=n(4867);function a(e){return i&&(o.setAttribute("href",e),e=o.href),o.setAttribute("href",e),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}e.exports=s.isStandardBrowserEnv()?(i=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a"),r=a(window.location.href),function(e){e=s.isString(e)?a(e):e;return e.protocol===r.protocol&&e.host===r.host}):function(){return!0}},6016:(e,t,n)=>{"use strict";var i=n(4867);e.exports=function(n,r){i.forEach(n,function(e,t){t!==r&&t.toUpperCase()===r.toUpperCase()&&(n[r]=e,delete n[t])})}},1623:e=>{e.exports=null},4109:(e,t,n)=>{"use strict";var i=n(4867),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,r={};return e&&i.forEach(e.split("\n"),function(e){n=e.indexOf(":"),t=i.trim(e.substr(0,n)).toLowerCase(),n=i.trim(e.substr(n+1)),!t||r[t]&&0<=o.indexOf(t)||(r[t]="set-cookie"===t?(r[t]||[]).concat([n]):r[t]?r[t]+", "+n:n)}),r}},205:e=>{"use strict";e.exports=function(e){e=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return e&&e[1]||""}},8713:e=>{"use strict";e.exports=function(t){return function(e){return t.apply(null,e)}}},7675:(e,t,n)=>{"use strict";var a=n(4867);e.exports=function(e,o){o=o||new FormData;var t=[];function s(e){return null===e?"":a.isDate(e)?e.toISOString():a.isArrayBuffer(e)||a.isTypedArray(e)?"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}return function r(e,i){if(a.isPlainObject(e)||a.isArray(e)){if(-1!==t.indexOf(e))throw Error("Circular reference detected in "+i);t.push(e),a.forEach(e,function(e,t){if(!a.isUndefined(e)){var n=i?i+"."+t:t;if(e&&!i&&"object"==typeof e)if(a.endsWith(t,"{}"))e=JSON.stringify(e);else if(a.endsWith(t,"[]")&&(t=a.toArray(e)))return void t.forEach(function(e){a.isUndefined(e)||o.append(n,s(e))});r(e,n)}}),t.pop()}else o.append(i,s(e))}(e),o}},4875:(e,t,n)=>{"use strict";var s=n(7288).version,l=n(2648),r={},a=(["object","boolean","number","function","string","symbol"].forEach(function(t,n){r[t]=function(e){return typeof e===t||"a"+(n<1?"n ":" ")+t}}),{});r.transitional=function(r,i,n){function o(e,t){return"[Axios v"+s+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(e,t,n){if(!1===r)throw new l(o(t," has been removed"+(i?" in "+i:"")),l.ERR_DEPRECATED);return i&&!a[t]&&(a[t]=!0,console.warn(o(t," has been deprecated since v"+i+" and will be removed in the near future"))),!r||r(e,t,n)}},e.exports={assertOptions:function(e,t,n){if("object"!=typeof e)throw new l("options must be an object",l.ERR_BAD_OPTION_VALUE);for(var r=Object.keys(e),i=r.length;0{"use strict";var r,i=n(1849),o=Object.prototype.toString,s=(r=Object.create(null),function(e){e=o.call(e);return r[e]||(r[e]=e.slice(8,-1).toLowerCase())});function a(t){return t=t.toLowerCase(),function(e){return s(e)===t}}function l(e){return Array.isArray(e)}function c(e){return void 0===e}var u=a("ArrayBuffer");function d(e){return null!==e&&"object"==typeof e}function h(e){return"object"===s(e)&&(null===(e=Object.getPrototypeOf(e))||e===Object.prototype)}var n=a("Date"),f=a("File"),p=a("Blob"),m=a("FileList");function g(e){return"[object Function]"===o.call(e)}var v,b=a("URLSearchParams");function y(e,t){if(null!=e)if(l(e="object"!=typeof e?[e]:e))for(var n=0,r=e.length;ne.length)&&(n=e.length),n-=t.length,-1!==(e=e.indexOf(t,n))&&e===n},toArray:function(e){if(!e)return null;var t=e.length;if(c(t))return null;for(var n=new Array(t);0{"use strict";t.d(e,{v5:()=>Pe});var a=t(538),e="BFormSelect",n="BFormSelectOption",r="BFormSelectOptionGroup",l=t(3294),c=t(2299),i="default",u=t(1572),o="undefined"!=typeof window,s="undefined"!=typeof document,d="undefined"!=typeof navigator,h=o&&s&&d,f=o?window:{},p=s?document:{},s=d?navigator:{},d=(s.userAgent||"").toLowerCase(),H=0{"use strict";n.d(t,{A1:()=>r,JJ:()=>o,KB:()=>i});var r="BvConfig",i="$bvConfig",o=161==n.j?["xs","sm","md","lg","xl"]:null},3294:(e,t,n)=>{"use strict";n.d(t,{gn:()=>i,z2:()=>r});var r="change",i="input"},2299:(e,t,n)=>{"use strict";n.d(t,{N0:()=>s,U5:()=>i,XO:()=>a,gL:()=>l,jg:()=>o,r1:()=>r});var r=161==n.j?void 0:null,t=Array,i=Boolean,o=(Date,Function,Number),n=Object,s=(RegExp,String),a=[t,n],l=[i,s]},824:(e,t,n)=>{"use strict";n.d(t,{OX:()=>r,ny:()=>i});var r=/\[(\d+)]/g,i=/(<([^>]+)>)/gi},1572:(e,t,n)=>{"use strict";n.d(t,{Dp:()=>r,zo:()=>i});var r=function(){return Array.from.apply(Array,arguments)},i=function(){for(var e=arguments.length,t=new Array(e),n=0;n{"use strict";var i,o;function r(t,e){var n,r=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)),r}function s(t){for(var e=1;ee.length)&&(t=e.length);for(var n=0,r=new Array(t);nu}),161==n.j&&(i=n(3284)),161==n.j&&(o=n(7040));var u=function n(r){var e=1{"use strict";var r,i,o,s,a,l,c;function u(e,t){for(var n=0;np}),161==n.j&&(r=n(538)),161==n.j&&(i=n(8750)),161==n.j&&(o=n(158)),161==n.j&&(s=n(7668)),161==n.j&&(a=n(3284)),161==n.j&&(l=n(7040)),161==n.j&&(c=n(7568));var d,h=161==n.j?(t=f,(n=[{key:"setConfig",value:function(){var t=this,r=0{"use strict";n.d(t,{b:()=>i});function r(e){var t="undefined"!=typeof process&&process?{NODE_ENV:"production",BASE_URL:"/static/sapl/frontend/"}:{};return e?t[e]||(1{"use strict";n.d(t,{U:()=>a,o:()=>s}),161==n.j&&(r=n(824)),161==n.j&&(i=n(8265)),161==n.j&&(o=n(3284));var r,i,o,s=function(t,e){var n=2{"use strict";n.d(t,{y:()=>r});var r=function(e){return e}},3284:(e,t,n)=>{"use strict";function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}n.d(t,{Ft:()=>s,HD:()=>u,Jp:()=>a,Kn:()=>h,PO:()=>f,jn:()=>c,kJ:()=>d,mf:()=>l,o8:()=>o});function i(e){return r(e)}var o=function(e){return void 0===e},s=function(e){return null===e},a=function(e){return o(e)||s(e)},l=function(e){return"function"===i(e)},c=function(e){return"boolean"===i(e)},u=function(e){return"string"===i(e)},d=function(e){return Array.isArray(e)},h=function(e){return null!==e&&"object"===r(e)},f=function(e){return"[object Object]"===Object.prototype.toString.call(e)}},7040:(e,t,n)=>{"use strict";function r(t,e){var n,r=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)),r}function i(t){for(var e=1;ec,Sv:()=>a,Ue:()=>s,XP:()=>l});var s=function(e,t){return Object.create(e,t)},a=function(e){return Object.getOwnPropertyNames(e)},l=function(e){return Object.keys(e)},c=function(n){return l(n).sort().reduce(function(e,t){return i(i({},e),{},o({},t,n[t]))},{})}},3020:(e,t,n)=>{"use strict";n.d(t,{pi:()=>y,y2:()=>_});function r(i){var o=(0,u.Ue)(null);return function(){for(var e=arguments.length,t=new Array(e),n=0;n{"use strict";n.d(t,{ZK:()=>i}),161==n.j&&(r=n(8077));var r,i=function(e){var t=1=s)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}},t=(g.jQueryDetection(),K(),"alert"),G="4.6.2",X="bs.alert",J="."+X,Q,ee=m["default"].fn[t],te="alert",ne="fade",re="show",ie="close"+J,oe="closed"+J,se="click"+J+".data-api",ae='[data-dismiss="alert"]',r=function(){function r(e){this._element=e}var e=r.prototype;e.close=function e(t){var n=this._element;if(t)n=this._getRootElement(t);var r=this._triggerCloseEvent(n);if(r.isDefaultPrevented())return;this._removeElement(n)};e.dispose=function e(){m["default"].removeData(this._element,X);this._element=null};e._getRootElement=function e(t){var n=g.getSelectorFromElement(t);var r=false;if(n)r=document.querySelector(n);if(!r)r=m["default"](t).closest("."+te)[0];return r};e._triggerCloseEvent=function e(t){var n=m["default"].Event(ie);m["default"](t).trigger(n);return n};e._removeElement=function e(t){var n=this;m["default"](t).removeClass(re);if(!m["default"](t).hasClass(ne)){this._destroyElement(t);return}var r=g.getTransitionDurationFromElement(t);m["default"](t).one(g.TRANSITION_END,function(e){return n._destroyElement(t,e)}).emulateTransitionEnd(r)};e._destroyElement=function e(t){m["default"](t).detach().trigger(oe).remove()};r._jQueryInterface=function e(n){return this.each(function(){var e=m["default"](this);var t=e.data(X);if(!t){t=new r(this);e.data(X,t)}if(n==="close")t[n](this)})};r._handleDismiss=function e(t){return function(e){if(e)e.preventDefault();t.close(this)}};n(r,null,[{key:"VERSION",get:function e(){return G}}]);return r}(),i=(m["default"](document).on(se,ae,r._handleDismiss(new r)),m["default"].fn[t]=r._jQueryInterface,m["default"].fn[t].Constructor=r,m["default"].fn[t].noConflict=function(){m["default"].fn[t]=ee;return r._jQueryInterface},"button"),le="4.6.2",ce="bs.button",ue="."+ce,de=".data-api",he=m["default"].fn[i],l="active",fe="btn",pe="focus",me="click"+ue+de,ge="focus"+ue+de+" "+("blur"+ue+de),ve="load"+ue+de,be='[data-toggle^="button"]',ye='[data-toggle="buttons"]',_e='[data-toggle="button"]',we='[data-toggle="buttons"] .btn',xe='input:not([type="hidden"])',Ce=".active",ke=".btn",o=function(){function i(e){this._element=e;this.shouldAvoidTriggerChange=false}var e=i.prototype;e.toggle=function e(){var t=true;var n=true;var r=m["default"](this._element).closest(ye)[0];if(r){var i=this._element.querySelector(xe);if(i){if(i.type==="radio")if(i.checked&&this._element.classList.contains(l))t=false;else{var o=r.querySelector(Ce);if(o)m["default"](o).removeClass(l)}if(t){if(i.type==="checkbox"||i.type==="radio")i.checked=!this._element.classList.contains(l);if(!this.shouldAvoidTriggerChange)m["default"](i).trigger("change")}i.focus();n=false}}if(!(this._element.hasAttribute("disabled")||this._element.classList.contains("disabled"))){if(n)this._element.setAttribute("aria-pressed",!this._element.classList.contains(l));if(t)m["default"](this._element).toggleClass(l)}};e.dispose=function e(){m["default"].removeData(this._element,ce);this._element=null};i._jQueryInterface=function e(n,r){return this.each(function(){var e=m["default"](this);var t=e.data(ce);if(!t){t=new i(this);e.data(ce,t)}t.shouldAvoidTriggerChange=r;if(n==="toggle")t[n]()})};n(i,null,[{key:"VERSION",get:function e(){return le}}]);return i}(),c=(m["default"](document).on(me,be,function(e){var t=e.target;var n=t;if(!m["default"](t).hasClass(fe))t=m["default"](t).closest(ke)[0];if(!t||t.hasAttribute("disabled")||t.classList.contains("disabled"))e.preventDefault();else{var r=t.querySelector(xe);if(r&&(r.hasAttribute("disabled")||r.classList.contains("disabled"))){e.preventDefault();return}if(n.tagName==="INPUT"||t.tagName!=="LABEL")o._jQueryInterface.call(m["default"](t),"toggle",n.tagName==="INPUT")}}).on(ge,be,function(e){var t=m["default"](e.target).closest(ke)[0];m["default"](t).toggleClass(pe,/^focus(in)?$/.test(e.type))}),m["default"](window).on(ve,function(){var e=[].slice.call(document.querySelectorAll(we));for(var t=0,n=e.length;t0;this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent);this._addEventListeners()}var e=s.prototype;e.next=function e(){if(!this._isSliding)this._slide(Fe)};e.nextWhenVisible=function e(){var t=m["default"](this._element);if(!document.hidden&&t.is(":visible")&&t.css("visibility")!=="hidden")this.next()};e.prev=function e(){if(!this._isSliding)this._slide(ze)};e.pause=function e(t){if(!t)this._isPaused=true;if(this._element.querySelector(st)){g.triggerTransitionEnd(this._element);this.cycle(true)}clearInterval(this._interval);this._interval=null};e.cycle=function e(t){if(!t)this._isPaused=false;if(this._interval){clearInterval(this._interval);this._interval=null}if(this._config.interval&&!this._isPaused){this._updateInterval();this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval)}};e.to=function e(t){var n=this;this._activeElement=this._element.querySelector(rt);var r=this._getItemIndex(this._activeElement);if(t>this._items.length-1||t<0)return;if(this._isSliding){m["default"](this._element).one(Ue,function(){return n.to(t)});return}if(r===t){this.pause();this.cycle();return}var i=t>r?Fe:ze;this._slide(i,this._items[t])};e.dispose=function e(){m["default"](this._element).off(d);m["default"].removeData(this._element,u);this._items=null;this._config=null;this._element=null;this._interval=null;this._isPaused=null;this._isSliding=null;this._activeElement=null;this._indicatorsElement=null};e._getConfig=function e(t){t=a({},ut,t);g.typeCheckConfig(c,t,dt);return t};e._handleSwipe=function e(){var t=Math.abs(this.touchDeltaX);if(t<=Ae)return;var n=t/this.touchDeltaX;this.touchDeltaX=0;if(n>0)this.prev();if(n<0)this.next()};e._addEventListeners=function e(){var t=this;if(this._config.keyboard)m["default"](this._element).on($e,function(e){return t._keydown(e)});if(this._config.pause==="hover")m["default"](this._element).on(Ze,function(e){return t.pause(e)}).on(Ye,function(e){return t.cycle(e)});if(this._config.touch)this._addTouchEventListeners()};e._addTouchEventListeners=function e(){var n=this;if(!this._touchSupported)return;var t=function e(t){if(n._pointerEvent&&ht[t.originalEvent.pointerType.toUpperCase()])n.touchStartX=t.originalEvent.clientX;else if(!n._pointerEvent)n.touchStartX=t.originalEvent.touches[0].clientX};var r=function e(t){n.touchDeltaX=t.originalEvent.touches&&t.originalEvent.touches.length>1?0:t.originalEvent.touches[0].clientX-n.touchStartX};var i=function e(t){if(n._pointerEvent&&ht[t.originalEvent.pointerType.toUpperCase()])n.touchDeltaX=t.originalEvent.clientX-n.touchStartX;n._handleSwipe();if(n._config.pause==="hover"){n.pause();if(n.touchTimeout)clearTimeout(n.touchTimeout);n.touchTimeout=setTimeout(function(e){return n.cycle(e)},Me+n._config.interval)}};m["default"](this._element.querySelectorAll(ot)).on(Qe,function(e){return e.preventDefault()});if(this._pointerEvent){m["default"](this._element).on(Xe,function(e){return t(e)});m["default"](this._element).on(Je,function(e){return i(e)});this._element.classList.add(Be)}else{m["default"](this._element).on(qe,function(e){return t(e)});m["default"](this._element).on(Ke,function(e){return r(e)});m["default"](this._element).on(Ge,function(e){return i(e)})}};e._keydown=function e(t){if(/input|textarea/i.test(t.target.tagName))return;switch(t.which){case Oe:t.preventDefault();this.prev();break;case Ee:t.preventDefault();this.next();break}};e._getItemIndex=function e(t){this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(it)):[];return this._items.indexOf(t)};e._getItemByDirection=function e(t,n){var r=t===Fe;var i=t===ze;var o=this._getItemIndex(n);var s=this._items.length-1;var a=i&&o===0||r&&o===s;if(a&&!this._config.wrap)return n;var l=t===ze?-1:1;var c=(o+l)%this._items.length;return c===-1?this._items[this._items.length-1]:this._items[c]};e._triggerSlideEvent=function e(t,n){var r=this._getItemIndex(t);var i=this._getItemIndex(this._element.querySelector(rt));var o=m["default"].Event(We,{relatedTarget:t,direction:n,from:i,to:r});m["default"](this._element).trigger(o);return o};e._setActiveIndicatorElement=function e(t){if(this._indicatorsElement){var n=[].slice.call(this._indicatorsElement.querySelectorAll(nt));m["default"](n).removeClass(v);var r=this._indicatorsElement.children[this._getItemIndex(t)];if(r)m["default"](r).addClass(v)}};e._updateInterval=function e(){var t=this._activeElement||this._element.querySelector(rt);if(!t)return;var n=parseInt(t.getAttribute("data-interval"),10);if(n){this._config.defaultInterval=this._config.defaultInterval||this._config.interval;this._config.interval=n}else this._config.interval=this._config.defaultInterval||this._config.interval};e._slide=function e(t,n){var r=this;var i=this._element.querySelector(rt);var o=this._getItemIndex(i);var s=n||i&&this._getItemByDirection(t,i);var a=this._getItemIndex(s);var l=Boolean(this._interval);var c;var u;var d;if(t===Fe){c=Re;u=Le;d=je}else{c=Ie;u=He;d=Ve}if(s&&m["default"](s).hasClass(v)){this._isSliding=false;return}var h=this._triggerSlideEvent(s,d);if(h.isDefaultPrevented())return;if(!i||!s)return;this._isSliding=true;if(l)this.pause();this._setActiveIndicatorElement(s);this._activeElement=s;var f=m["default"].Event(Ue,{relatedTarget:s,direction:d,from:o,to:a});if(m["default"](this._element).hasClass(Pe)){m["default"](s).addClass(u);g.reflow(s);m["default"](i).addClass(c);m["default"](s).addClass(c);var p=g.getTransitionDurationFromElement(i);m["default"](i).one(g.TRANSITION_END,function(){m["default"](s).removeClass(c+" "+u).addClass(v);m["default"](i).removeClass(v+" "+u+" "+c);r._isSliding=false;setTimeout(function(){return m["default"](r._element).trigger(f)},0)}).emulateTransitionEnd(p)}else{m["default"](i).removeClass(v);m["default"](s).addClass(v);this._isSliding=false;m["default"](this._element).trigger(f)}if(l)this.cycle()};s._jQueryInterface=function e(r){return this.each(function(){var e=m["default"](this).data(u);var t=a({},ut,m["default"](this).data());if(typeof r==="object")t=a({},t,r);var n=typeof r==="string"?r:t.slide;if(!e){e=new s(this,t);m["default"](this).data(u,e)}if(typeof r==="number")e.to(r);else if(typeof n==="string"){if(typeof e[n]==="undefined")throw new TypeError('No method named "'+n+'"');e[n]()}else if(t.interval&&t.ride){e.pause();e.cycle()}})};s._dataApiClickHandler=function e(t){var n=g.getSelectorFromElement(this);if(!n)return;var r=m["default"](n)[0];if(!r||!m["default"](r).hasClass(Ne))return;var i=a({},m["default"](r).data(),m["default"](this).data());var o=this.getAttribute("data-slide-to");if(o)i.interval=false;s._jQueryInterface.call(m["default"](r),i);if(o)m["default"](r).data(u).to(o);t.preventDefault()};n(s,null,[{key:"VERSION",get:function e(){return Se}},{key:"Default",get:function e(){return ut}}]);return s}(),h=(m["default"](document).on(tt,lt,s._dataApiClickHandler),m["default"](window).on(et,function(){var e=[].slice.call(document.querySelectorAll(ct));for(var t=0,n=e.length;t0){this._selector=s;this._triggerArray.push(o)}}this._parent=this._config.parent?this._getParent():null;if(!this._config.parent)this._addAriaAndCollapsedClass(this._element,this._triggerArray);if(this._config.toggle)this.toggle()}var e=u.prototype;e.toggle=function e(){if(m["default"](this._element).hasClass(b))this.hide();else this.show()};e.show=function e(){var t=this;if(this._isTransitioning||m["default"](this._element).hasClass(b))return;var n;var r;if(this._parent){n=[].slice.call(this._parent.querySelectorAll(St)).filter(function(e){if(typeof t._config.parent==="string")return e.getAttribute("data-parent")===t._config.parent;return e.classList.contains(y)});if(n.length===0)n=null}if(n){r=m["default"](n).not(this._selector).data(f);if(r&&r._isTransitioning)return}var i=m["default"].Event(_t);m["default"](this._element).trigger(i);if(i.isDefaultPrevented())return;if(n){u._jQueryInterface.call(m["default"](n).not(this._selector),"hide");if(!r)m["default"](n).data(f,null)}var o=this._getDimension();m["default"](this._element).removeClass(y).addClass(gt);this._element.style[o]=0;if(this._triggerArray.length)m["default"](this._triggerArray).removeClass(vt).attr("aria-expanded",true);this.setTransitioning(true);var s=function e(){m["default"](t._element).removeClass(gt).addClass(y+" "+b);t._element.style[o]="";t.setTransitioning(false);m["default"](t._element).trigger(wt)};var a=o[0].toUpperCase()+o.slice(1);var l="scroll"+a;var c=g.getTransitionDurationFromElement(this._element);m["default"](this._element).one(g.TRANSITION_END,s).emulateTransitionEnd(c);this._element.style[o]=this._element[l]+"px"};e.hide=function e(){var t=this;if(this._isTransitioning||!m["default"](this._element).hasClass(b))return;var n=m["default"].Event(xt);m["default"](this._element).trigger(n);if(n.isDefaultPrevented())return;var r=this._getDimension();this._element.style[r]=this._element.getBoundingClientRect()[r]+"px";g.reflow(this._element);m["default"](this._element).addClass(gt).removeClass(y+" "+b);var i=this._triggerArray.length;if(i>0)for(var o=0;o0};e._getOffset=function e(){var t=this;var n={};if(typeof this._config.offset==="function")n.fn=function(e){e.offsets=a({},e.offsets,t._config.offset(e.offsets,t._element));return e};else n.offset=this._config.offset;return n};e._getPopperConfig=function e(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};if(this._config.display==="static")t.modifiers.applyStyle={enabled:false};return a({},t,this._config.popperConfig)};u._jQueryInterface=function e(n){return this.each(function(){var e=m["default"](this).data(Mt);var t=typeof n==="object"?n:null;if(!e){e=new u(this,t);m["default"](this).data(Mt,e)}if(typeof n==="string"){if(typeof e[n]==="undefined")throw new TypeError('No method named "'+n+'"');e[n]()}})};u._clearMenus=function e(t){if(t&&(t.which===Bt||t.type==="keyup"&&t.which!==Rt))return;var n=[].slice.call(document.querySelectorAll(en));for(var r=0,i=n.length;r0)o--;if(t.which===Ht&&odocument.documentElement.clientHeight;if(!r)this._element.style.overflowY="hidden";this._element.classList.add(kn);var i=g.getTransitionDurationFromElement(this._dialog);m["default"](this._element).off(g.TRANSITION_END);m["default"](this._element).one(g.TRANSITION_END,function(){t._element.classList.remove(kn);if(!r)m["default"](t._element).one(g.TRANSITION_END,function(){t._element.style.overflowY=""}).emulateTransitionEnd(t._element,i)}).emulateTransitionEnd(i);this._element.focus()};e._showElement=function e(t){var n=this;var r=m["default"](this._element).hasClass(T);var i=this._dialog?this._dialog.querySelector(Bn):null;if(!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",true);this._element.setAttribute("role","dialog");if(m["default"](this._dialog).hasClass(yn)&&i)i.scrollTop=0;else this._element.scrollTop=0;if(r)g.reflow(this._element);m["default"](this._element).addClass(Cn);if(this._config.focus)this._enforceFocus();var o=m["default"].Event(En,{relatedTarget:t});var s=function e(){if(n._config.focus)n._element.focus();n._isTransitioning=false;m["default"](n._element).trigger(o)};if(r){var a=g.getTransitionDurationFromElement(this._dialog);m["default"](this._dialog).one(g.TRANSITION_END,s).emulateTransitionEnd(a)}else s()};e._enforceFocus=function e(){var t=this;m["default"](document).off(Mn).on(Mn,function(e){if(document!==e.target&&t._element!==e.target&&m["default"](t._element).has(e.target).length===0)t._element.focus()})};e._setEscapeEvent=function e(){var t=this;if(this._isShown)m["default"](this._element).on(Pn,function(e){if(t._config.keyboard&&e.which===bn){e.preventDefault();t.hide()}else if(!t._config.keyboard&&e.which===bn)t._triggerBackdropTransition()});else if(!this._isShown)m["default"](this._element).off(Pn)};e._setResizeEvent=function e(){var t=this;if(this._isShown)m["default"](window).on(An,function(e){return t.handleUpdate(e)});else m["default"](window).off(An)};e._hideModal=function e(){var t=this;this._element.style.display="none";this._element.setAttribute("aria-hidden",true);this._element.removeAttribute("aria-modal");this._element.removeAttribute("role");this._isTransitioning=false;this._showBackdrop(function(){m["default"](document.body).removeClass(xn);t._resetAdjustments();t._resetScrollbar();m["default"](t._element).trigger(Tn)})};e._removeBackdrop=function e(){if(this._backdrop){m["default"](this._backdrop).remove();this._backdrop=null}};e._showBackdrop=function e(t){var n=this;var r=m["default"](this._element).hasClass(T)?T:"";if(this._isShown&&this._config.backdrop){this._backdrop=document.createElement("div");this._backdrop.className=wn;if(r)this._backdrop.classList.add(r);m["default"](this._backdrop).appendTo(document.body);m["default"](this._element).on(Nn,function(e){if(n._ignoreBackdropClick){n._ignoreBackdropClick=false;return}if(e.target!==e.currentTarget)return;if(n._config.backdrop==="static")n._triggerBackdropTransition();else n.hide()});if(r)g.reflow(this._backdrop);m["default"](this._backdrop).addClass(Cn);if(!t)return;if(!r){t();return}var i=g.getTransitionDurationFromElement(this._backdrop);m["default"](this._backdrop).one(g.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){m["default"](this._backdrop).removeClass(Cn);var o=function e(){n._removeBackdrop();if(t)t()};if(m["default"](this._element).hasClass(T)){var s=g.getTransitionDurationFromElement(this._backdrop);m["default"](this._backdrop).one(g.TRANSITION_END,o).emulateTransitionEnd(s)}else o()}else if(t)t()};e._adjustDialog=function e(){var t=this._element.scrollHeight>document.documentElement.clientHeight;if(!this._isBodyOverflowing&&t)this._element.style.paddingLeft=this._scrollbarWidth+"px";if(this._isBodyOverflowing&&!t)this._element.style.paddingRight=this._scrollbarWidth+"px"};e._resetAdjustments=function e(){this._element.style.paddingLeft="";this._element.style.paddingRight=""};e._checkScrollbar=function e(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)'+'
'+'
',trigger:"hover focus",title:"",delay:0,html:false,selector:false,placement:"top",offset:0,container:false,fallbackPlacement:"flip",boundary:"scrollParent",customClass:"",sanitize:true,sanitizeFn:null,whiteList:qn,popperConfig:null},vr={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object",popperConfig:"(null|object)"},br={HIDE:"hide"+E,HIDDEN:"hidden"+E,SHOW:"show"+E,SHOWN:"shown"+E,INSERTED:"inserted"+E,CLICK:"click"+E,FOCUSIN:"focusin"+E,FOCUSOUT:"focusout"+E,MOUSEENTER:"mouseenter"+E,MOUSELEAVE:"mouseleave"+E},M=function(){function i(e,t){if(typeof F["default"]==="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");this._isEnabled=true;this._timeout=0;this._hoverState="";this._activeTrigger={};this._popper=null;this.element=e;this.config=this._getConfig(t);this.tip=null;this._setListeners()}var e=i.prototype;e.enable=function e(){this._isEnabled=true};e.disable=function e(){this._isEnabled=false};e.toggleEnabled=function e(){this._isEnabled=!this._isEnabled};e.toggle=function e(t){if(!this._isEnabled)return;if(t){var n=this.constructor.DATA_KEY;var r=m["default"](t.currentTarget).data(n);if(!r){r=new this.constructor(t.currentTarget,this._getDelegateConfig());m["default"](t.currentTarget).data(n,r)}r._activeTrigger.click=!r._activeTrigger.click;if(r._isWithActiveTrigger())r._enter(null,r);else r._leave(null,r)}else{if(m["default"](this.getTipElement()).hasClass(sr)){this._leave(null,this);return}this._enter(null,this)}};e.dispose=function e(){clearTimeout(this._timeout);m["default"].removeData(this.element,this.constructor.DATA_KEY);m["default"](this.element).off(this.constructor.EVENT_KEY);m["default"](this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler);if(this.tip)m["default"](this.tip).remove();this._isEnabled=null;this._timeout=null;this._hoverState=null;this._activeTrigger=null;if(this._popper)this._popper.destroy();this._popper=null;this.element=null;this.config=null;this.tip=null};e.show=function e(){var n=this;if(m["default"](this.element).css("display")==="none")throw new Error("Please use show on visible elements");var t=m["default"].Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){m["default"](this.element).trigger(t);var r=g.findShadowRoot(this.element);var i=m["default"].contains(r!==null?r:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement();var s=g.getUID(this.constructor.NAME);o.setAttribute("id",s);this.element.setAttribute("aria-describedby",s);this.setContent();if(this.config.animation)m["default"](o).addClass(or);var a=typeof this.config.placement==="function"?this.config.placement.call(this,o,this.element):this.config.placement;var l=this._getAttachment(a);this.addAttachmentClass(l);var c=this._getContainer();m["default"](o).data(this.constructor.DATA_KEY,this);if(!m["default"].contains(this.element.ownerDocument.documentElement,this.tip))m["default"](o).appendTo(c);m["default"](this.element).trigger(this.constructor.Event.INSERTED);this._popper=new F["default"](this.element,o,this._getPopperConfig(l));m["default"](o).addClass(sr);m["default"](o).addClass(this.config.customClass);if("ontouchstart"in document.documentElement)m["default"](document.body).children().on("mouseover",null,m["default"].noop);var u=function e(){if(n.config.animation)n._fixTransition();var t=n._hoverState;n._hoverState=null;m["default"](n.element).trigger(n.constructor.Event.SHOWN);if(t===lr)n._leave(null,n)};if(m["default"](this.tip).hasClass(or)){var d=g.getTransitionDurationFromElement(this.tip);m["default"](this.tip).one(g.TRANSITION_END,u).emulateTransitionEnd(d)}else u()}};e.hide=function e(t){var n=this;var r=this.getTipElement();var i=m["default"].Event(this.constructor.Event.HIDE);var o=function e(){if(n._hoverState!==ar&&r.parentNode)r.parentNode.removeChild(r);n._cleanTipClass();n.element.removeAttribute("aria-describedby");m["default"](n.element).trigger(n.constructor.Event.HIDDEN);if(n._popper!==null)n._popper.destroy();if(t)t()};m["default"](this.element).trigger(i);if(i.isDefaultPrevented())return;m["default"](r).removeClass(sr);if("ontouchstart"in document.documentElement)m["default"](document.body).children().off("mouseover",null,m["default"].noop);this._activeTrigger[fr]=false;this._activeTrigger[hr]=false;this._activeTrigger[dr]=false;if(m["default"](this.tip).hasClass(or)){var s=g.getTransitionDurationFromElement(r);m["default"](r).one(g.TRANSITION_END,o).emulateTransitionEnd(s)}else o();this._hoverState=""};e.update=function e(){if(this._popper!==null)this._popper.scheduleUpdate()};e.isWithContent=function e(){return Boolean(this.getTitle())};e.addAttachmentClass=function e(t){m["default"](this.getTipElement()).addClass(nr+"-"+t)};e.getTipElement=function e(){this.tip=this.tip||m["default"](this.config.template)[0];return this.tip};e.setContent=function e(){var t=this.getTipElement();this.setElementContent(m["default"](t.querySelectorAll(cr)),this.getTitle());m["default"](t).removeClass(or+" "+sr)};e.setElementContent=function e(t,n){if(typeof n==="object"&&(n.nodeType||n.jquery)){if(this.config.html){if(!m["default"](n).parent().is(t))t.empty().append(n)}else t.text(m["default"](n).text());return}if(this.config.html){if(this.config.sanitize)n=Jn(n,this.config.whiteList,this.config.sanitizeFn);t.html(n)}else t.text(n)};e.getTitle=function e(){var t=this.element.getAttribute("data-original-title");if(!t)t=typeof this.config.title==="function"?this.config.title.call(this.element):this.config.title;return t};e._getPopperConfig=function e(t){var n=this;var r={placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:ur},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function e(t){if(t.originalPlacement!==t.placement)n._handlePopperPlacementChange(t)},onUpdate:function e(t){return n._handlePopperPlacementChange(t)}};return a({},r,this.config.popperConfig)};e._getOffset=function e(){var t=this;var n={};if(typeof this.config.offset==="function")n.fn=function(e){e.offsets=a({},e.offsets,t.config.offset(e.offsets,t.element));return e};else n.offset=this.config.offset;return n};e._getContainer=function e(){if(this.config.container===false)return document.body;if(g.isElement(this.config.container))return m["default"](this.config.container);return m["default"](document).find(this.config.container)};e._getAttachment=function e(t){return mr[t.toUpperCase()]};e._setListeners=function e(){var r=this;var t=this.config.trigger.split(" ");t.forEach(function(e){if(e==="click")m["default"](r.element).on(r.constructor.Event.CLICK,r.config.selector,function(e){return r.toggle(e)});else if(e!==pr){var t=e===dr?r.constructor.Event.MOUSEENTER:r.constructor.Event.FOCUSIN;var n=e===dr?r.constructor.Event.MOUSELEAVE:r.constructor.Event.FOCUSOUT;m["default"](r.element).on(t,r.config.selector,function(e){return r._enter(e)}).on(n,r.config.selector,function(e){return r._leave(e)})}});this._hideModalHandler=function(){if(r.element)r.hide()};m["default"](this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler);if(this.config.selector)this.config=a({},this.config,{trigger:"manual",selector:""});else this._fixTitle()};e._fixTitle=function e(){var t=typeof this.element.getAttribute("data-original-title");if(this.element.getAttribute("title")||t!=="string"){this.element.setAttribute("data-original-title",this.element.getAttribute("title")||"");this.element.setAttribute("title","")}};e._enter=function e(t,n){var r=this.constructor.DATA_KEY;n=n||m["default"](t.currentTarget).data(r);if(!n){n=new this.constructor(t.currentTarget,this._getDelegateConfig());m["default"](t.currentTarget).data(r,n)}if(t)n._activeTrigger[t.type==="focusin"?hr:dr]=true;if(m["default"](n.getTipElement()).hasClass(sr)||n._hoverState===ar){n._hoverState=ar;return}clearTimeout(n._timeout);n._hoverState=ar;if(!n.config.delay||!n.config.delay.show){n.show();return}n._timeout=setTimeout(function(){if(n._hoverState===ar)n.show()},n.config.delay.show)};e._leave=function e(t,n){var r=this.constructor.DATA_KEY;n=n||m["default"](t.currentTarget).data(r);if(!n){n=new this.constructor(t.currentTarget,this._getDelegateConfig());m["default"](t.currentTarget).data(r,n)}if(t)n._activeTrigger[t.type==="focusout"?hr:dr]=false;if(n._isWithActiveTrigger())return;clearTimeout(n._timeout);n._hoverState=lr;if(!n.config.delay||!n.config.delay.hide){n.hide();return}n._timeout=setTimeout(function(){if(n._hoverState===lr)n.hide()},n.config.delay.hide)};e._isWithActiveTrigger=function e(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return true;return false};e._getConfig=function e(t){var n=m["default"](this.element).data();Object.keys(n).forEach(function(e){if(ir.indexOf(e)!==-1)delete n[e]});t=a({},this.constructor.Default,n,typeof t==="object"&&t?t:{});if(typeof t.delay==="number")t.delay={show:t.delay,hide:t.delay};if(typeof t.title==="number")t.title=t.title.toString();if(typeof t.content==="number")t.content=t.content.toString();g.typeCheckConfig(O,t,this.constructor.DefaultType);if(t.sanitize)t.template=Jn(t.template,t.whiteList,t.sanitizeFn);return t};e._getDelegateConfig=function e(){var t={};if(this.config)for(var n in this.config)if(this.constructor.Default[n]!==this.config[n])t[n]=this.config[n];return t};e._cleanTipClass=function e(){var t=m["default"](this.getTipElement());var n=t.attr("class").match(rr);if(n!==null&&n.length)t.removeClass(n.join(""))};e._handlePopperPlacementChange=function e(t){this.tip=t.instance.popper;this._cleanTipClass();this.addAttachmentClass(this._getAttachment(t.placement))};e._fixTransition=function e(){var t=this.getTipElement();var n=this.config.animation;if(t.getAttribute("x-placement")!==null)return;m["default"](t).removeClass(or);this.config.animation=false;this.hide();this.show();this.config.animation=n};i._jQueryInterface=function e(r){return this.each(function(){var e=m["default"](this);var t=e.data(er);var n=typeof r==="object"&&r;if(!t&&/dispose|hide/.test(r))return;if(!t){t=new i(this,n);e.data(er,t)}if(typeof r==="string"){if(typeof t[r]==="undefined")throw new TypeError('No method named "'+r+'"');t[r]()}})};n(i,null,[{key:"VERSION",get:function e(){return Qn}},{key:"Default",get:function e(){return gr}},{key:"NAME",get:function e(){return O}},{key:"DATA_KEY",get:function e(){return er}},{key:"Event",get:function e(){return br}},{key:"EVENT_KEY",get:function e(){return E}},{key:"DefaultType",get:function e(){return vr}}]);return i}(),A=(m["default"].fn[O]=M._jQueryInterface,m["default"].fn[O].Constructor=M,m["default"].fn[O].noConflict=function(){m["default"].fn[O]=tr;return M._jQueryInterface},"popover"),yr="4.6.2",_r="bs.popover",N="."+_r,wr=m["default"].fn[A],xr="bs-popover",Cr=new RegExp("(^|\\s)"+xr+"\\S+","g"),kr="fade",Sr="show",Dr=".popover-header",Tr=".popover-body",Or=a({},M.Default,{placement:"right",trigger:"click",content:"",template:''}),Er=a({},M.DefaultType,{content:"(string|element|function)"}),Mr={HIDE:"hide"+N,HIDDEN:"hidden"+N,SHOW:"show"+N,SHOWN:"shown"+N,INSERTED:"inserted"+N,CLICK:"click"+N,FOCUSIN:"focusin"+N,FOCUSOUT:"focusout"+N,MOUSEENTER:"mouseenter"+N,MOUSELEAVE:"mouseleave"+N},Ar=function(e){j(r,e);function r(){return e.apply(this,arguments)||this}var t=r.prototype;t.isWithContent=function e(){return this.getTitle()||this._getContent()};t.addAttachmentClass=function e(t){m["default"](this.getTipElement()).addClass(xr+"-"+t)};t.getTipElement=function e(){this.tip=this.tip||m["default"](this.config.template)[0];return this.tip};t.setContent=function e(){var t=m["default"](this.getTipElement());this.setElementContent(t.find(Dr),this.getTitle());var n=this._getContent();if(typeof n==="function")n=n.call(this.element);this.setElementContent(t.find(Tr),n);t.removeClass(kr+" "+Sr)};t._getContent=function e(){return this.element.getAttribute("data-content")||this.config.content};t._cleanTipClass=function e(){var t=m["default"](this.getTipElement());var n=t.attr("class").match(Cr);if(n!==null&&n.length>0)t.removeClass(n.join(""))};r._jQueryInterface=function e(n){return this.each(function(){var e=m["default"](this).data(_r);var t=typeof n==="object"?n:null;if(!e&&/dispose|hide/.test(n))return;if(!e){e=new r(this,t);m["default"](this).data(_r,e)}if(typeof n==="string"){if(typeof e[n]==="undefined")throw new TypeError('No method named "'+n+'"');e[n]()}})};n(r,null,[{key:"VERSION",get:function e(){return yr}},{key:"Default",get:function e(){return Or}},{key:"NAME",get:function e(){return A}},{key:"DATA_KEY",get:function e(){return _r}},{key:"Event",get:function e(){return Mr}},{key:"EVENT_KEY",get:function e(){return N}},{key:"DefaultType",get:function e(){return Er}}]);return r}(M),P=(m["default"].fn[A]=Ar._jQueryInterface,m["default"].fn[A].Constructor=Ar,m["default"].fn[A].noConflict=function(){m["default"].fn[A]=wr;return Ar._jQueryInterface},"scrollspy"),Nr="4.6.2",Pr="bs.scrollspy",Ir="."+Pr,Rr,Lr=m["default"].fn[P],Hr="dropdown-item",I="active",Br="activate"+Ir,Fr="scroll"+Ir,zr="load"+Ir+".data-api",jr="offset",Vr="position",Wr='[data-spy="scroll"]',Ur=".nav, .list-group",$r=".nav-link",Zr=".nav-item",Yr=".list-group-item",qr=".dropdown",Kr=".dropdown-item",Gr=".dropdown-toggle",Xr={offset:10,method:"auto",target:""},Jr={offset:"number",method:"string",target:"(string|element)"},Qr=function(){function r(e,t){var n=this;this._element=e;this._scrollElement=e.tagName==="BODY"?window:e;this._config=this._getConfig(t);this._selector=this._config.target+" "+$r+","+(this._config.target+" "+Yr+",")+(this._config.target+" "+Kr);this._offsets=[];this._targets=[];this._activeTarget=null;this._scrollHeight=0;m["default"](this._scrollElement).on(Fr,function(e){return n._process(e)});this.refresh();this._process()}var e=r.prototype;e.refresh=function e(){var t=this;var n=this._scrollElement===this._scrollElement.window?jr:Vr;var i=this._config.method==="auto"?n:this._config.method;var o=i===Vr?this._getScrollTop():0;this._offsets=[];this._targets=[];this._scrollHeight=this._getScrollHeight();var r=[].slice.call(document.querySelectorAll(this._selector));r.map(function(e){var t;var n=g.getSelectorFromElement(e);if(n)t=document.querySelector(n);if(t){var r=t.getBoundingClientRect();if(r.width||r.height)return[m["default"](t)[i]().top+o,n]}return null}).filter(Boolean).sort(function(e,t){return e[0]-t[0]}).forEach(function(e){t._offsets.push(e[0]);t._targets.push(e[1])})};e.dispose=function e(){m["default"].removeData(this._element,Pr);m["default"](this._scrollElement).off(Ir);this._element=null;this._scrollElement=null;this._config=null;this._selector=null;this._offsets=null;this._targets=null;this._activeTarget=null;this._scrollHeight=null};e._getConfig=function e(t){t=a({},Xr,typeof t==="object"&&t?t:{});if(typeof t.target!=="string"&&g.isElement(t.target)){var n=m["default"](t.target).attr("id");if(!n){n=g.getUID(P);m["default"](t.target).attr("id",n)}t.target="#"+n}g.typeCheckConfig(P,t,Jr);return t};e._getScrollTop=function e(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop};e._getScrollHeight=function e(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)};e._getOffsetHeight=function e(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height};e._process=function e(){var t=this._getScrollTop()+this._config.offset;var n=this._getScrollHeight();var r=this._config.offset+n-this._getOffsetHeight();if(this._scrollHeight!==n)this.refresh();if(t>=r){var i=this._targets[this._targets.length-1];if(this._activeTarget!==i)this._activate(i);return}if(this._activeTarget&&t0){this._activeTarget=null;this._clear();return}for(var o=this._offsets.length;o--;){var s=this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(typeof this._offsets[o+1]==="undefined"||t{var r=n(614),i=n(6330),o=TypeError;e.exports=function(e){if(r(e))return e;throw o(i(e)+" is not a function")}},9483:(e,t,n)=>{var r=n(4411),i=n(6330),o=TypeError;e.exports=function(e){if(r(e))return e;throw o(i(e)+" is not a constructor")}},6077:(e,t,n)=>{var r=n(614),i=String,o=TypeError;e.exports=function(e){if("object"==typeof e||r(e))return e;throw o("Can't set "+i(e)+" as a prototype")}},1223:(e,t,n)=>{var r=n(5112),i=n(30),n=n(3070).f,o=r("unscopables"),s=Array.prototype;null==s[o]&&n(s,o,{configurable:!0,value:i(null)}),e.exports=function(e){s[o][e]=!0}},1530:(e,t,n)=>{"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:(e,t,n)=>{var r=n(7976),i=TypeError;e.exports=function(e,t){if(r(t,e))return e;throw i("Incorrect invocation")}},9670:(e,t,n)=>{var r=n(111),i=String,o=TypeError;e.exports=function(e){if(r(e))return e;throw o(i(e)+" is not an object")}},8533:(e,t,n)=>{"use strict";var r=n(2092).forEach,n=n(9341)("forEach");e.exports=n?[].forEach:function(e){return r(this,e,1{"use strict";var h=n(9974),f=n(6916),p=n(7908),m=n(3002),g=n(7659),v=n(4411),b=n(6244),y=n(6135),_=n(8554),w=n(1246),x=Array;e.exports=function(e){var t,n,r,i,o,s,a=p(e),e=v(this),l=arguments.length,c=1{function r(a){return function(e,t,n){var r,i=l(e),o=u(i),s=c(n,o);if(a&&t!=t){for(;s{function r(h){var f=1==h,p=2==h,m=3==h,g=4==h,v=6==h,b=7==h,y=5==h||v;return function(e,t,n,r){for(var i,o,s=x(e),a=w(s),l=_(t,n),c=C(a),u=0,t=r||k,d=f?t(e,c):p||b?t(e,0):void 0;u{var r=n(7293),i=n(5112),o=n(7392),s=i("species");e.exports=function(t){return 51<=o||!r(function(){var e=[];return(e.constructor={})[s]=function(){return{foo:1}},1!==e[t](Boolean).foo})}},9341:(e,t,n)=>{"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r(function(){n.call(null,t||function(){return 1},1)})}},3671:(e,t,n)=>{function r(c){return function(e,t,n,r){u(t);var i=d(e),o=h(i),s=f(i),a=c?s-1:0,l=c?-1:1;if(n<2)for(;;){if(a in o){r=o[a],a+=l;break}if(a+=l,c?a<0:s<=a)throw p("Reduce of empty array with no initial value")}for(;c?0<=a:a{var l=n(1400),c=n(6244),u=n(6135),d=Array,h=Math.max;e.exports=function(e,t,n){for(var r=c(e),i=l(t,r),o=l(void 0===n?r:n,r),s=d(h(o-i,0)),a=0;i{n=n(1702);e.exports=n([].slice)},7475:(e,t,n)=>{var r=n(3157),i=n(4411),o=n(111),s=n(5112)("species"),a=Array;e.exports=function(e){var t;return r(e)&&(t=e.constructor,(i(t)&&(t===a||r(t.prototype))||o(t)&&null===(t=t[s]))&&(t=void 0)),void 0===t?a:t}},5417:(e,t,n)=>{var r=n(7475);e.exports=function(e,t){return new(r(e))(0===t?0:t)}},3002:(e,t,n)=>{var i=n(9670),o=n(9212);e.exports=function(t,e,n,r){try{return r?e(i(n)[0],n[1]):e(n)}catch(e){o(t,"throw",e)}}},7072:(e,t,n)=>{var i=n(5112)("iterator"),o=!1;try{var r=0,s={next:function(){return{done:!!r++}},return:function(){o=!0}};s[i]=function(){return this},Array.from(s,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var r={};r[i]=function(){return{next:function(){return{done:n=!0}}}},e(r)}catch(e){}return n}},4326:(e,t,n)=>{var n=n(1702),r=n({}.toString),i=n("".slice);e.exports=function(e){return i(r(e),8,-1)}},648:(e,t,n)=>{var r=n(1694),i=n(614),o=n(4326),s=n(5112)("toStringTag"),a=Object,l="Arguments"==o(function(){return arguments}());e.exports=r?o:function(e){var t;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(t=function(e,t){try{return e[t]}catch(e){}}(e=a(e),s))?t:l?o(e):"Object"==(t=o(e))&&i(e.callee)?"Arguments":t}},7741:(e,t,n)=>{var n=n(1702),r=Error,i=n("".replace),n=String(r("zxcasd").stack),o=/\n\s*at [^:]*:[^\n]*/,s=o.test(n);e.exports=function(e,t){if(s&&"string"==typeof e&&!r.prepareStackTrace)for(;t--;)e=i(e,o,"");return e}},9920:(e,t,n)=>{var l=n(2597),c=n(3887),u=n(1236),d=n(3070);e.exports=function(e,t,n){for(var r=c(t),i=d.f,o=u.f,s=0;s{n=n(7293);e.exports=!n(function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})},4994:(e,t,n)=>{"use strict";function i(){return this}var o=n(3383).IteratorPrototype,s=n(30),a=n(9114),l=n(8003),c=n(7497);e.exports=function(e,t,n,r){t+=" Iterator";return e.prototype=s(o,{next:a(+!r,n)}),l(e,t,!1,!0),c[t]=i,e}},8880:(e,t,n)=>{var r=n(9781),i=n(3070),o=n(9114);e.exports=r?function(e,t,n){return i.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},9114:e=>{e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},6135:(e,t,n)=>{"use strict";var r=n(4948),i=n(3070),o=n(9114);e.exports=function(e,t,n){t=r(t);t in e?i.f(e,t,o(0,n)):e[t]=n}},8052:(e,t,n)=>{var s=n(614),a=n(3070),l=n(6339),c=n(3072);e.exports=function(e,t,n,r){var i=(r=r||{}).enumerable,o=void 0!==r.name?r.name:t;if(s(n)&&l(n,o,r),r.global)i?e[t]=n:c(t,n);else{try{r.unsafe?e[t]&&(i=!0):delete e[t]}catch(e){}i?e[t]=n:a.f(e,t,{value:n,enumerable:!1,configurable:!r.nonConfigurable,writable:!r.nonWritable})}return e}},3072:(e,t,n)=>{var r=n(7854),i=Object.defineProperty;e.exports=function(t,n){try{i(r,t,{value:n,configurable:!0,writable:!0})}catch(e){r[t]=n}return n}},654:(e,t,n)=>{"use strict";function m(){return this}var g=n(2109),v=n(6916),b=n(1913),r=n(6530),y=n(614),_=n(4994),w=n(9518),x=n(7674),C=n(8003),k=n(8880),S=n(8052),i=n(5112),D=n(7497),n=n(3383),T=r.PROPER,O=r.CONFIGURABLE,E=n.IteratorPrototype,M=n.BUGGY_SAFARI_ITERATORS,A=i("iterator"),N="values",P="entries";e.exports=function(e,t,n,r,i,o,s){_(n,t,r);function a(e){if(e===i&&f)return f;if(!M&&e in d)return d[e];switch(e){case"keys":case N:case P:return function(){return new n(this,e)}}return function(){return new n(this)}}var l,c,r=t+" Iterator",u=!1,d=e.prototype,h=d[A]||d["@@iterator"]||i&&d[i],f=!M&&h||a(i),p="Array"==t&&d.entries||h;if(p&&(p=w(p.call(new e)))!==Object.prototype&&p.next&&(b||w(p)===E||(x?x(p,E):y(p[A])||S(p,A,m)),C(p,r,!0,!0),b&&(D[r]=m)),T&&i==N&&h&&h.name!==N&&(!b&&O?k(d,"name",N):(u=!0,f=function(){return v(h,this)})),i)if(l={values:a(N),keys:o?f:a("keys"),entries:a(P)},s)for(c in l)!M&&!u&&c in d||S(d,c,l[c]);else g({target:t,proto:!0,forced:M||u},l);return b&&!s||d[A]===f||S(d,A,f,{name:i}),D[t]=f,l}},7235:(e,t,n)=>{var r=n(857),i=n(2597),o=n(6061),s=n(3070).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});i(t,e)||s(t,e,{value:o.f(e)})}},9781:(e,t,n)=>{n=n(7293);e.exports=!n(function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})},317:(e,t,n)=>{var r=n(7854),n=n(111),i=r.document,o=n(i)&&n(i.createElement);e.exports=function(e){return o?i.createElement(e):{}}},8324:e=>{e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},8509:(e,t,n)=>{n=n(317)("span").classList,n=n&&n.constructor&&n.constructor.prototype;e.exports=n===Object.prototype?void 0:n},7871:(e,t,n)=>{var r=n(3823),n=n(5268);e.exports=!r&&!n&&"object"==typeof window&&"object"==typeof document},3823:e=>{e.exports="object"==typeof Deno&&Deno&&"object"==typeof Deno.version},1528:(e,t,n)=>{var r=n(8113),n=n(7854);e.exports=/ipad|iphone|ipod/i.test(r)&&void 0!==n.Pebble},6833:(e,t,n)=>{n=n(8113);e.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(n)},5268:(e,t,n)=>{var r=n(4326),n=n(7854);e.exports="process"==r(n.process)},1036:(e,t,n)=>{n=n(8113);e.exports=/web0s(?!.*chrome)/i.test(n)},8113:(e,t,n)=>{n=n(5005);e.exports=n("navigator","userAgent")||""},7392:(e,t,n)=>{var r,i,o=n(7854),n=n(8113),s=o.process,o=o.Deno,s=s&&s.versions||o&&o.version,o=s&&s.v8;!(i=o?0<(r=o.split("."))[0]&&r[0]<4?1:+(r[0]+r[1]):i)&&n&&(!(r=n.match(/Edge\/(\d+)/))||74<=r[1])&&(r=n.match(/Chrome\/(\d+)/))&&(i=+r[1]),e.exports=i},748:e=>{e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2914:(e,t,n)=>{var r=n(7293),i=n(9114);e.exports=!r(function(){var e=Error("a");return!("stack"in e)||(Object.defineProperty(e,"stack",i(1,7)),7!==e.stack)})},7762:(e,t,n)=>{"use strict";var r=n(9781),i=n(7293),o=n(9670),s=n(30),a=n(6277),l=Error.prototype.toString,n=i(function(){if(r){var e=s(Object.defineProperty({},"name",{get:function(){return this===e}}));if("true"!==l.call(e))return!0}return"2: 1"!==l.call({message:1,name:2})||"Error"!==l.call({})});e.exports=n?function(){var e=o(this),t=a(e.name,"Error"),e=a(e.message);return t?e?t+": "+e:t:e}:l},2109:(e,t,n)=>{var c=n(7854),u=n(1236).f,d=n(8880),h=n(8052),f=n(3072),p=n(9920),m=n(4705);e.exports=function(e,t){var n,r,i,o=e.target,s=e.global,a=e.stat,l=s?c:a?c[o]||f(o,{}):(c[o]||{}).prototype;if(l)for(n in t){if(r=t[n],i=e.dontCallGetSet?(i=u(l,n))&&i.value:l[n],!m(s?n:o+(a?".":"#")+n,e.forced)&&void 0!==i){if(typeof r==typeof i)continue;p(r,i)}(e.sham||i&&i.sham)&&d(r,"sham",!0),h(l,n,r,e)}}},7293:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:(e,t,n)=>{"use strict";n(4916);var l=n(1702),c=n(8052),u=n(2261),d=n(7293),h=n(5112),f=n(8880),p=h("species"),m=RegExp.prototype;e.exports=function(n,e,t,r){var s,i=h(n),a=!d(function(){var e={};return e[i]=function(){return 7},7!=""[n](e)}),o=a&&!d(function(){var e=!1,t=/a/;return"split"===n&&((t={constructor:{}}).constructor[p]=function(){return t},t.flags="",t[i]=/./[i]),t.exec=function(){return e=!0,null},t[i](""),!e});a&&o&&!t||(s=l(/./[i]),o=e(i,""[n],function(e,t,n,r,i){var e=l(e),o=t.exec;return o===u||o===m.exec?a&&!i?{done:!0,value:s(t,n,r)}:{done:!0,value:e(n,t,r)}:{done:!1}}),c(String.prototype,n,o[0]),c(m,i,o[1])),r&&f(m[i],"sham",!0)}},2104:(e,t,n)=>{var n=n(4374),r=Function.prototype,i=r.apply,o=r.call;e.exports="object"==typeof Reflect&&Reflect.apply||(n?o.bind(i):function(){return o.apply(i,arguments)})},9974:(e,t,n)=>{var r=n(1702),i=n(9662),o=n(4374),s=r(r.bind);e.exports=function(e,t){return i(e),void 0===t?e:o?s(e,t):function(){return e.apply(t,arguments)}}},4374:(e,t,n)=>{n=n(7293);e.exports=!n(function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")})},7065:(e,t,n)=>{"use strict";var r=n(1702),i=n(9662),o=n(111),u=n(2597),d=n(206),n=n(4374),h=Function,f=r([].concat),p=r([].join),m={};e.exports=n?h.bind:function(s){var a=i(this),e=a.prototype,l=d(arguments,1),c=function(){var e=f(l,d(arguments));if(this instanceof c){var t=a,n=e.length,r=e;if(!u(m,n)){for(var i=[],o=0;o{var n=n(4374),r=Function.prototype.call;e.exports=n?r.bind(r):function(){return r.apply(r,arguments)}},6530:(e,t,n)=>{var r=n(9781),n=n(2597),i=Function.prototype,o=r&&Object.getOwnPropertyDescriptor,n=n(i,"name"),s=n&&"something"===function(){}.name,r=n&&(!r||o(i,"name").configurable);e.exports={EXISTS:n,PROPER:s,CONFIGURABLE:r}},1702:(e,t,n)=>{var n=n(4374),r=Function.prototype,i=r.bind,o=r.call,s=n&&i.bind(o,o);e.exports=n?function(e){return e&&s(e)}:function(e){return e&&function(){return o.apply(e,arguments)}}},5005:(e,t,n)=>{var r=n(7854),i=n(614);e.exports=function(e,t){return arguments.length<2?(n=r[e],i(n)?n:void 0):r[e]&&r[e][t];var n}},1246:(e,t,n)=>{var r=n(648),i=n(8173),o=n(7497),s=n(5112)("iterator");e.exports=function(e){if(null!=e)return i(e,s)||i(e,"@@iterator")||o[r(e)]}},8554:(e,t,n)=>{var r=n(6916),i=n(9662),o=n(9670),s=n(6330),a=n(1246),l=TypeError;e.exports=function(e,t){var n=arguments.length<2?a(e):t;if(i(n))return o(r(n,e));throw l(s(e)+" is not iterable")}},8173:(e,t,n)=>{var r=n(9662);e.exports=function(e,t){e=e[t];return null==e?void 0:r(e)}},647:(e,t,n)=>{var r=n(1702),i=n(7908),h=Math.floor,f=r("".charAt),p=r("".replace),m=r("".slice),g=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,v=/\$([$&'`]|\d{1,2})/g;e.exports=function(o,s,a,l,c,e){var u=a+o.length,d=l.length,t=v;return void 0!==c&&(c=i(c),t=g),p(e,t,function(e,t){var n;switch(f(t,0)){case"$":return"$";case"&":return o;case"`":return m(s,0,a);case"'":return m(s,u);case"<":n=c[m(t,1,-1)];break;default:var r,i=+t;if(0==i)return e;if(d{function r(e){return e&&e.Math==Math&&e}e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},2597:(e,t,n)=>{var r=n(1702),i=n(7908),o=r({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return o(i(e),t)}},3501:e=>{e.exports={}},842:(e,t,n)=>{var r=n(7854);e.exports=function(e,t){var n=r.console;n&&n.error&&(1==arguments.length?n.error(e):n.error(e,t))}},490:(e,t,n)=>{n=n(5005);e.exports=n("document","documentElement")},4664:(e,t,n)=>{var r=n(9781),i=n(7293),o=n(317);e.exports=!r&&!i(function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a})},8361:(e,t,n)=>{var r=n(1702),i=n(7293),o=n(4326),s=Object,a=r("".split);e.exports=i(function(){return!s("z").propertyIsEnumerable(0)})?function(e){return"String"==o(e)?a(e,""):s(e)}:s},9587:(e,t,n)=>{var r=n(614),i=n(111),o=n(7674);e.exports=function(e,t,n){return o&&r(t=t.constructor)&&t!==n&&i(t=t.prototype)&&t!==n.prototype&&o(e,t),e}},2788:(e,t,n)=>{var r=n(1702),i=n(614),n=n(5465),o=r(Function.toString);i(n.inspectSource)||(n.inspectSource=function(e){return o(e)}),e.exports=n.inspectSource},8340:(e,t,n)=>{var r=n(111),i=n(8880);e.exports=function(e,t){r(t)&&"cause"in t&&i(e,"cause",t.cause)}},9909:(e,t,n)=>{var r,i,o,s,a,l,c,u,d=n(8536),h=n(7854),f=n(1702),p=n(111),m=n(8880),g=n(2597),v=n(5465),b=n(6200),n=n(3501),y="Object already initialized",_=h.TypeError,h=h.WeakMap;c=d||v.state?(r=v.state||(v.state=new h),i=f(r.get),o=f(r.has),s=f(r.set),a=function(e,t){if(o(r,e))throw new _(y);return t.facade=e,s(r,e,t),t},l=function(e){return i(r,e)||{}},function(e){return o(r,e)}):(n[u=b("state")]=!0,a=function(e,t){if(g(e,u))throw new _(y);return t.facade=e,m(e,u,t),t},l=function(e){return g(e,u)?e[u]:{}},function(e){return g(e,u)}),e.exports={set:a,get:l,has:c,enforce:function(e){return c(e)?l(e):a(e,{})},getterFor:function(t){return function(e){if(p(e)&&(e=l(e)).type===t)return e;throw _("Incompatible receiver, "+t+" required")}}}},7659:(e,t,n)=>{var r=n(5112),i=n(7497),o=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||s[o]===e)}},3157:(e,t,n)=>{var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},614:e=>{e.exports=function(e){return"function"==typeof e}},4411:(e,t,n)=>{function r(){}function i(e){if(!l(e))return!1;try{return f(r,h,e),!0}catch(e){return!1}}function o(e){if(!l(e))return!1;switch(c(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return g||!!m(p,d(e))}catch(e){return!0}}var s=n(1702),a=n(7293),l=n(614),c=n(648),u=n(5005),d=n(2788),h=[],f=u("Reflect","construct"),p=/^\s*(?:class|function)\b/,m=s(p.exec),g=!p.exec(r);o.sham=!0,e.exports=!f||a(function(){var e;return i(i.call)||!i(Object)||!i(function(){e=!0})||e})?o:i},4705:(e,t,n)=>{function r(e,t){return(e=l[a(e)])==u||e!=c&&(o(t)?i(t):!!t)}var i=n(7293),o=n(614),s=/#|\.prototype\./,a=r.normalize=function(e){return String(e).replace(s,".").toLowerCase()},l=r.data={},c=r.NATIVE="N",u=r.POLYFILL="P";e.exports=r},111:(e,t,n)=>{var r=n(614);e.exports=function(e){return"object"==typeof e?null!==e:r(e)}},1913:e=>{e.exports=!1},7850:(e,t,n)=>{var r=n(111),i=n(4326),o=n(5112)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},2190:(e,t,n)=>{var r=n(5005),i=n(614),o=n(7976),n=n(3307),s=Object;e.exports=n?function(e){return"symbol"==typeof e}:function(e){var t=r("Symbol");return i(t)&&o(t.prototype,s(e))}},408:(e,t,n)=>{function v(e,t){this.stopped=e,this.result=t}var b=n(9974),y=n(6916),_=n(9670),w=n(6330),x=n(7659),C=n(6244),k=n(7976),S=n(8554),D=n(1246),T=n(9212),O=TypeError,E=v.prototype;e.exports=function(e,t,n){function r(e){return o&&T(o,"normal",e),new v(!0,e)}function i(e){return h?(_(e),m?g(e[0],e[1],r):g(e[0],e[1])):m?g(e,r):g(e)}var o,s,a,l,c,u,d=n&&n.that,h=!(!n||!n.AS_ENTRIES),f=!(!n||!n.IS_RECORD),p=!(!n||!n.IS_ITERATOR),m=!(!n||!n.INTERRUPTED),g=b(t,d);if(f)o=e.iterator;else if(p)o=e;else{if(!(n=D(e)))throw O(w(e)+" is not iterable");if(x(n)){for(s=0,a=C(e);s{var o=n(6916),s=n(9670),a=n(8173);e.exports=function(e,t,n){var r,i;s(e);try{if(!(r=a(e,"return"))){if("throw"===t)throw n;return n}r=o(r,e)}catch(e){i=!0,r=e}if("throw"===t)throw n;if(i)throw r;return s(r),n}},3383:(e,t,n)=>{"use strict";var r,i,o=n(7293),s=n(614),a=n(30),l=n(9518),c=n(8052),u=n(5112),n=n(1913),d=u("iterator"),u=!1;[].keys&&("next"in(i=[].keys())?(l=l(l(i)))!==Object.prototype&&(r=l):u=!0),null==r||o(function(){var e={};return r[d].call(e)!==e})?r={}:n&&(r=a(r)),s(r[d])||c(r,d,function(){return this}),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:u}},7497:e=>{e.exports={}},6244:(e,t,n)=>{var r=n(7466);e.exports=function(e){return r(e.length)}},6339:(e,t,n)=>{var r=n(7293),i=n(614),o=n(2597),s=n(9781),a=n(6530).CONFIGURABLE,l=n(2788),n=n(9909),c=n.enforce,u=n.get,d=Object.defineProperty,h=s&&!r(function(){return 8!==d(function(){},"length",{value:8}).length}),f=String(String).split("String"),n=e.exports=function(e,t,n){"Symbol("===String(t).slice(0,7)&&(t="["+String(t).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),n&&n.getter&&(t="get "+t),n&&n.setter&&(t="set "+t),(!o(e,"name")||a&&e.name!==t)&&(s?d(e,"name",{value:t,configurable:!0}):e.name=t),h&&n&&o(n,"arity")&&e.length!==n.arity&&d(e,"length",{value:n.arity});try{n&&o(n,"constructor")&&n.constructor?s&&d(e,"prototype",{writable:!1}):e.prototype&&(e.prototype=void 0)}catch(e){}n=c(e);return o(n,"source")||(n.source=f.join("string"==typeof t?t:"")),e};Function.prototype.toString=n(function(){return i(this)&&u(this).source||l(this)},"toString")},4758:e=>{var t=Math.ceil,n=Math.floor;e.exports=Math.trunc||function(e){e=+e;return(0{var r,i,o,s,a,l,c,u=n(7854),d=n(9974),h=n(1236).f,f=n(261).set,p=n(6833),m=n(1528),g=n(1036),v=n(5268),n=u.MutationObserver||u.WebKitMutationObserver,b=u.document,y=u.process,_=u.Promise,h=h(u,"queueMicrotask"),h=h&&h.value;h||(r=function(){var e,t;for(v&&(e=y.domain)&&e.exit();i;){t=i.fn,i=i.next;try{t()}catch(e){throw i?s():o=void 0,e}}o=void 0,e&&e.enter()},s=p||v||g||!n||!b?!m&&_&&_.resolve?((p=_.resolve(void 0)).constructor=_,c=d(p.then,p),function(){c(r)}):v?function(){y.nextTick(r)}:(f=d(f,u),function(){f(r)}):(a=!0,l=b.createTextNode(""),new n(r).observe(l,{characterData:!0}),function(){l.data=a=!a})),e.exports=h||function(e){e={fn:e,next:void 0};o&&(o.next=e),i||(i=e,s()),o=e}},735:(e,t,n)=>{n=n(133);e.exports=n&&!!Symbol.for&&!!Symbol.keyFor},133:(e,t,n)=>{var r=n(7392),n=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!n(function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41})},8536:(e,t,n)=>{var r=n(7854),i=n(614),n=n(2788),r=r.WeakMap;e.exports=i(r)&&/native code/.test(n(r))},8523:(e,t,n)=>{"use strict";function r(e){var n,r;this.promise=new e(function(e,t){if(void 0!==n||void 0!==r)throw TypeError("Bad Promise constructor");n=e,r=t}),this.resolve=i(n),this.reject=i(r)}var i=n(9662);e.exports.f=function(e){return new r(e)}},6277:(e,t,n)=>{var r=n(1340);e.exports=function(e,t){return void 0===e?arguments.length<2?"":t:r(e)}},3009:(e,t,n)=>{var r=n(7854),i=n(7293),o=n(1702),s=n(1340),a=n(3111).trim,n=n(1361),l=r.parseInt,r=r.Symbol,c=r&&r.iterator,u=/^[+-]?0x/i,d=o(u.exec),r=8!==l(n+"08")||22!==l(n+"0x16")||c&&!i(function(){l(Object(c))});e.exports=r?function(e,t){e=a(s(e));return l(e,t>>>0||(d(u,e)?16:10))}:l},1574:(e,t,n)=>{"use strict";var h=n(9781),r=n(1702),f=n(6916),i=n(7293),p=n(1956),m=n(5181),g=n(5296),v=n(7908),b=n(8361),o=Object.assign,s=Object.defineProperty,y=r([].concat);e.exports=!o||i(function(){var e,t,n,r;return!(!h||1===o({b:1},o(s({},"a",{enumerable:!0,get:function(){s(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)||(t={},r="abcdefghijklmnopqrst",(e={})[n=Symbol()]=7,r.split("").forEach(function(e){t[e]=e}),7!=o({},e)[n]||p(o({},t)).join("")!=r)})?function(e,t){for(var n=v(e),r=arguments.length,i=1,o=m.f,s=g.f;i{function r(){}function i(e){e.write(m("")),e.close();var t=e.parentWindow.Object;return e=null,t}var o,s=n(9670),a=n(6048),l=n(748),c=n(3501),u=n(490),d=n(317),n=n(6200),h="prototype",f="script",p=n("IE_PROTO"),m=function(e){return"<"+f+">"+e+""},g=function(){try{o=new ActiveXObject("htmlfile")}catch(e){}g="undefined"==typeof document||document.domain&&o?i(o):(e=d("iframe"),t="java"+f+":",e.style.display="none",u.appendChild(e),e.src=String(t),(t=e.contentWindow.document).open(),t.write(m("document.F=Object")),t.close(),t.F);for(var e,t,n=l.length;n--;)delete g[h][l[n]];return g()};c[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(r[h]=s(e),n=new r,r[h]=null,n[p]=e):n=g(),void 0===t?n:a.f(n,t)}},6048:(e,t,n)=>{var r=n(9781),i=n(3353),a=n(3070),l=n(9670),c=n(5656),u=n(1956);t.f=r&&!i?Object.defineProperties:function(e,t){l(e);for(var n,r=c(t),i=u(t),o=i.length,s=0;s{var r=n(9781),i=n(4664),o=n(3353),s=n(9670),a=n(4948),l=TypeError,c=Object.defineProperty,u=Object.getOwnPropertyDescriptor,d="enumerable",h="configurable",f="writable";t.f=r?o?function(e,t,n){var r;return s(e),t=a(t),s(n),"function"==typeof e&&"prototype"===t&&"value"in n&&f in n&&!n[f]&&((r=u(e,t))&&r[f]&&(e[t]=n.value,n={configurable:(h in n?n:r)[h],enumerable:(d in n?n:r)[d],writable:!1})),c(e,t,n)}:c:function(e,t,n){if(s(e),t=a(t),s(n),i)try{return c(e,t,n)}catch(e){}if("get"in n||"set"in n)throw l("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:(e,t,n)=>{var r=n(9781),i=n(6916),o=n(5296),s=n(9114),a=n(5656),l=n(4948),c=n(2597),u=n(4664),d=Object.getOwnPropertyDescriptor;t.f=r?d:function(e,t){if(e=a(e),t=l(t),u)try{return d(e,t)}catch(e){}if(c(e,t))return s(!i(o.f,e,t),e[t])}},1156:(e,t,n)=>{var r=n(4326),i=n(5656),o=n(8006).f,s=n(1589),a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){if(!a||"Window"!=r(e))return o(i(e));try{return o(e)}catch(e){return s(a)}}},8006:(e,t,n)=>{var r=n(6324),i=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},5181:(e,t)=>{t.f=Object.getOwnPropertySymbols},9518:(e,t,n)=>{var r=n(2597),i=n(614),o=n(7908),s=n(6200),n=n(8544),a=s("IE_PROTO"),l=Object,c=l.prototype;e.exports=n?l.getPrototypeOf:function(e){var t,e=o(e);return r(e,a)?e[a]:(t=e.constructor,i(t)&&e instanceof t?t.prototype:e instanceof l?c:null)}},7976:(e,t,n)=>{n=n(1702);e.exports=n({}.isPrototypeOf)},6324:(e,t,n)=>{var r=n(1702),s=n(2597),a=n(5656),l=n(1318).indexOf,c=n(3501),u=r([].push);e.exports=function(e,t){var n,r=a(e),i=0,o=[];for(n in r)!s(c,n)&&s(r,n)&&u(o,n);for(;t.length>i;)!s(r,n=t[i++])||~l(o,n)||u(o,n);return o}},1956:(e,t,n)=>{var r=n(6324),i=n(748);e.exports=Object.keys||function(e){return r(e,i)}},5296:(e,t)=>{"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,i=r&&!n.call({1:2},1);t.f=i?function(e){e=r(this,e);return!!e&&e.enumerable}:n},7674:(e,t,n)=>{var i=n(1702),o=n(9670),s=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var n,r=!1,e={};try{(n=i(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(e,[]),r=e instanceof Array}catch(e){}return function(e,t){return o(e),s(t),r?n(e,t):e.__proto__=t,e}}():void 0)},288:(e,t,n)=>{"use strict";var r=n(1694),i=n(648);e.exports=r?{}.toString:function(){return"[object "+i(this)+"]"}},2140:(e,t,n)=>{var i=n(6916),o=n(614),s=n(111),a=TypeError;e.exports=function(e,t){var n,r;if("string"===t&&o(n=e.toString)&&!s(r=i(n,e)))return r;if(o(n=e.valueOf)&&!s(r=i(n,e)))return r;if("string"!==t&&o(n=e.toString)&&!s(r=i(n,e)))return r;throw a("Can't convert object to primitive value")}},3887:(e,t,n)=>{var r=n(5005),i=n(1702),o=n(8006),s=n(5181),a=n(9670),l=i([].concat);e.exports=r("Reflect","ownKeys")||function(e){var t=o.f(a(e)),n=s.f;return n?l(t,n(e)):t}},857:(e,t,n)=>{n=n(7854);e.exports=n},2534:e=>{e.exports=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}}},3702:(e,t,n)=>{var r=n(7854),i=n(2492),o=n(614),s=n(4705),a=n(2788),l=n(5112),c=n(7871),u=n(3823),d=n(1913),h=n(7392),f=i&&i.prototype,p=l("species"),m=!1,g=o(r.PromiseRejectionEvent),n=s("Promise",function(){var e=a(i),t=e!==String(i);if(!t&&66===h)return!0;if(d&&(!f.catch||!f.finally))return!0;if(!h||h<51||!/native code/.test(e)){function n(e){e(function(){},function(){})}e=new i(function(e){e(1)});if((e.constructor={})[p]=n,!(m=e.then(function(){})instanceof n))return!0}return!t&&(c||u)&&!g});e.exports={CONSTRUCTOR:n,REJECTION_EVENT:g,SUBCLASSING:m}},2492:(e,t,n)=>{n=n(7854);e.exports=n.Promise},9478:(e,t,n)=>{var r=n(9670),i=n(111),o=n(8523);e.exports=function(e,t){return r(e),i(t)&&t.constructor===e?t:((0,(e=o.f(e)).resolve)(t),e.promise)}},612:(e,t,n)=>{var r=n(2492),i=n(7072),n=n(3702).CONSTRUCTOR;e.exports=n||!i(function(e){r.all(e).then(void 0,function(){})})},2626:(e,t,n)=>{var r=n(3070).f;e.exports=function(e,t,n){n in e||r(e,n,{configurable:!0,get:function(){return t[n]},set:function(e){t[n]=e}})}},8572:e=>{function t(){this.head=null,this.tail=null}t.prototype={add:function(e){e={item:e,next:null};this.head?this.tail.next=e:this.head=e,this.tail=e},get:function(){var e=this.head;if(e)return this.head=e.next,this.tail===e&&(this.tail=null),e.item}},e.exports=t},7651:(e,t,n)=>{var r=n(6916),i=n(9670),o=n(614),s=n(4326),a=n(2261),l=TypeError;e.exports=function(e,t){var n=e.exec;if(o(n))return null!==(n=r(n,e,t))&&i(n),n;if("RegExp"===s(e))return r(a,e,t);throw l("RegExp#exec called on incompatible receiver")}},2261:(e,t,n)=>{"use strict";var p=n(6916),r=n(1702),m=n(1340),g=n(7066),i=n(2999),o=n(2309),v=n(30),b=n(9909).get,s=n(9441),n=n(7168),y=o("native-string-replace",String.prototype.replace),_=RegExp.prototype.exec,w=_,x=r("".charAt),C=r("".indexOf),k=r("".replace),S=r("".slice),D=(o=/b*/g,p(_,r=/a/,"a"),p(_,o,"a"),0!==r.lastIndex||0!==o.lastIndex),T=i.BROKEN_CARET,O=void 0!==/()??/.exec("")[1];(D||O||T||s||n)&&(w=function(e){var t,n,r,i,o,s,a=this,l=b(a),e=m(e),c=l.raw;if(c)return c.lastIndex=a.lastIndex,d=p(w,c,e),a.lastIndex=c.lastIndex,d;var u=l.groups,c=T&&a.sticky,d=p(g,a),l=a.source,h=0,f=e;if(c&&(d=k(d,"y",""),-1===C(d,"g")&&(d+="g"),f=S(e,a.lastIndex),0{"use strict";var r=n(9670);e.exports=function(){var e=r(this),t="";return e.hasIndices&&(t+="d"),e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.unicodeSets&&(t+="v"),e.sticky&&(t+="y"),t}},4706:(e,t,n)=>{var r=n(6916),i=n(2597),o=n(7976),s=n(7066),a=RegExp.prototype;e.exports=function(e){var t=e.flags;return void 0!==t||"flags"in a||i(e,"flags")||!o(a,e)?t:r(s,e)}},2999:(e,t,n)=>{var r=n(7293),i=n(7854).RegExp,n=r(function(){var e=i("a","y");return e.lastIndex=2,null!=e.exec("abcd")}),o=n||r(function(){return!i("a","y").sticky}),r=n||r(function(){var e=i("^r","gy");return e.lastIndex=2,null!=e.exec("str")});e.exports={BROKEN_CARET:r,MISSED_STICKY:o,UNSUPPORTED_Y:n}},9441:(e,t,n)=>{var r=n(7293),i=n(7854).RegExp;e.exports=r(function(){var e=i(".","s");return!(e.dotAll&&e.exec("\n")&&"s"===e.flags)})},7168:(e,t,n)=>{var r=n(7293),i=n(7854).RegExp;e.exports=r(function(){var e=i("(?b)","g");return"b"!==e.exec("b").groups.a||"bc"!=="b".replace(e,"$c")})},4488:e=>{var t=TypeError;e.exports=function(e){if(null==e)throw t("Can't call method on "+e);return e}},1150:e=>{e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},7152:(e,t,n)=>{function r(o){return u?function(e,t){var n=2{"use strict";var r=n(5005),i=n(3070),o=n(5112),s=n(9781),a=o("species");e.exports=function(e){var e=r(e),t=i.f;s&&e&&!e[a]&&t(e,a,{configurable:!0,get:function(){return this}})}},8003:(e,t,n)=>{var r=n(3070).f,i=n(2597),o=n(5112)("toStringTag");e.exports=function(e,t,n){(e=e&&!n?e.prototype:e)&&!i(e,o)&&r(e,o,{configurable:!0,value:t})}},6200:(e,t,n)=>{var r=n(2309),i=n(9711),o=r("keys");e.exports=function(e){return o[e]||(o[e]=i(e))}},5465:(e,t,n)=>{var r=n(7854),n=n(3072),i="__core-js_shared__",r=r[i]||n(i,{});e.exports=r},2309:(e,t,n)=>{var r=n(1913),i=n(5465);(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.24.1",mode:r?"pure":"global",copyright:"© 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.24.1/LICENSE",source:"https://github.com/zloirock/core-js"})},6707:(e,t,n)=>{var r=n(9670),i=n(9483),o=n(5112)("species");e.exports=function(e,t){var e=r(e).constructor;return void 0===e||null==(e=r(e)[o])?t:i(e)}},8710:(e,t,n)=>{function r(i){return function(e,t){var n,e=s(a(e)),t=o(t),r=e.length;return t<0||r<=t?i?"":void 0:(n=c(e,t))<55296||56319{var r=n(6530).PROPER,i=n(7293),o=n(1361);e.exports=function(e){return i(function(){return!!o[e]()||"​…᠎"!=="​…᠎"[e]()||r&&o[e].name!==e})}},3111:(e,t,n)=>{function r(t){return function(e){e=s(o(e));return 1&t&&(e=a(e,l,"")),e=2&t?a(e,c,""):e}}var i=n(1702),o=n(4488),s=n(1340),n=n(1361),a=i("".replace),i="["+n+"]",l=RegExp("^"+i+i+"*"),c=RegExp(i+i+"*$");e.exports={start:r(1),end:r(2),trim:r(3)}},6532:(e,t,n)=>{var r=n(6916),i=n(5005),o=n(5112),s=n(8052);e.exports=function(){var e=i("Symbol"),e=e&&e.prototype,t=e&&e.valueOf,n=o("toPrimitive");e&&!e[n]&&s(e,n,function(e){return r(t,this)},{arity:1})}},261:(e,t,n)=>{var r,i,o=n(7854),s=n(2104),a=n(9974),l=n(614),c=n(2597),u=n(7293),d=n(490),h=n(206),f=n(317),p=n(8053),m=n(6833),n=n(5268),g=o.setImmediate,v=o.clearImmediate,b=o.process,y=o.Dispatch,_=o.Function,w=o.MessageChannel,x=o.String,C=0,k={},S="onreadystatechange";try{r=o.location}catch(e){}function D(e){return function(){E(e)}}function T(e){E(e.data)}function O(e){o.postMessage(x(e),r.protocol+"//"+r.host)}var E=function(e){var t;c(k,e)&&(t=k[e],delete k[e],t())};g&&v||(g=function(e){p(arguments.length,1);var t=l(e)?e:_(e),n=h(arguments,1);return k[++C]=function(){s(t,void 0,n)},i(C),C},v=function(e){delete k[e]},n?i=function(e){b.nextTick(D(e))}:y&&y.now?i=function(e){y.now(D(e))}:w&&!m?(m=(n=new w).port2,n.port1.onmessage=T,i=a(m.postMessage,m)):o.addEventListener&&l(o.postMessage)&&!o.importScripts&&r&&"file:"!==r.protocol&&!u(O)?(i=O,o.addEventListener("message",T,!1)):i=S in f("script")?function(e){d.appendChild(f("script"))[S]=function(){d.removeChild(this),E(e)}}:function(e){setTimeout(D(e),0)}),e.exports={set:g,clear:v}},1400:(e,t,n)=>{var r=n(9303),i=Math.max,o=Math.min;e.exports=function(e,t){e=r(e);return e<0?i(e+t,0):o(e,t)}},5656:(e,t,n)=>{var r=n(8361),i=n(4488);e.exports=function(e){return r(i(e))}},9303:(e,t,n)=>{var r=n(4758);e.exports=function(e){e=+e;return e!=e||0==e?0:r(e)}},7466:(e,t,n)=>{var r=n(9303),i=Math.min;e.exports=function(e){return 0{var r=n(4488),i=Object;e.exports=function(e){return i(r(e))}},7593:(e,t,n)=>{var r=n(6916),i=n(111),o=n(2190),s=n(8173),a=n(2140),n=n(5112),l=TypeError,c=n("toPrimitive");e.exports=function(e,t){if(!i(e)||o(e))return e;var n=s(e,c);if(n){if(n=r(n,e,t=void 0===t?"default":t),!i(n)||o(n))return n;throw l("Can't convert object to primitive value")}return a(e,t=void 0===t?"number":t)}},4948:(e,t,n)=>{var r=n(7593),i=n(2190);e.exports=function(e){e=r(e,"string");return i(e)?e:e+""}},1694:(e,t,n)=>{var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},1340:(e,t,n)=>{var r=n(648),i=String;e.exports=function(e){if("Symbol"===r(e))throw TypeError("Cannot convert a Symbol value to a string");return i(e)}},6330:e=>{var t=String;e.exports=function(e){try{return t(e)}catch(e){return"Object"}}},9711:(e,t,n)=>{var n=n(1702),r=0,i=Math.random(),o=n(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+o(++r+i,36)}},3307:(e,t,n)=>{n=n(133);e.exports=n&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3353:(e,t,n)=>{var r=n(9781),n=n(7293);e.exports=r&&n(function(){return 42!=Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype})},8053:e=>{var n=TypeError;e.exports=function(e,t){if(e{n=n(5112);t.f=n},5112:(e,t,n)=>{var r=n(7854),i=n(2309),o=n(2597),s=n(9711),a=n(133),l=n(3307),c=i("wks"),u=r.Symbol,d=u&&u.for,h=l?u:u&&u.withoutSetter||s;e.exports=function(e){var t;return o(c,e)&&(a||"string"==typeof c[e])||(t="Symbol."+e,a&&o(u,e)?c[e]=u[e]:c[e]=(l&&d?d:h)(t)),c[e]}},1361:e=>{e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},9191:(e,t,n)=>{"use strict";var u=n(5005),d=n(2597),h=n(8880),f=n(7976),p=n(7674),m=n(9920),g=n(2626),v=n(9587),b=n(6277),y=n(8340),_=n(7741),w=n(2914),x=n(9781),C=n(1913);e.exports=function(e,t,n,r){var i="stackTraceLimit",o=r?2:1,e=e.split("."),s=e[e.length-1],a=u.apply(null,e);if(a){var l=a.prototype;if(!C&&d(l,"cause")&&delete l.cause,!n)return a;var e=u("Error"),c=t(function(e,t){t=b(r?t:e,void 0),e=r?new a(e):new a;return void 0!==t&&h(e,"message",t),w&&h(e,"stack",_(e.stack,2)),this&&f(l,this)&&v(e,this,c),o{"use strict";var r=n(2109),i=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return i(this,e,1{"use strict";var r=n(2109),i=n(2092).find,n=n(1223),o=!0;"find"in[]&&Array(1).find(function(){o=!1}),r({target:"Array",proto:!0,forced:o},{find:function(e){return i(this,e,1{"use strict";var r=n(2109),n=n(8533);r({target:"Array",proto:!0,forced:[].forEach!=n},{forEach:n})},1038:(e,t,n)=>{var r=n(2109),i=n(8457);r({target:"Array",stat:!0,forced:!n(7072)(function(e){Array.from(e)})},{from:i})},2772:(e,t,n)=>{"use strict";var r=n(2109),i=n(1702),o=n(1318).indexOf,n=n(9341),s=i([].indexOf),a=!!s&&1/s([1],1,-0)<0,i=n("indexOf");r({target:"Array",proto:!0,forced:a||!i},{indexOf:function(e){var t=1{"use strict";var r=n(5656),i=n(1223),o=n(7497),s=n(9909),a=n(3070).f,l=n(654),c=n(1913),n=n(9781),u="Array Iterator",d=s.set,h=s.getterFor(u),s=(e.exports=l(Array,"Array",function(e,t){d(this,{type:u,target:r(e),index:0,kind:t})},function(){var e=h(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?{value:e.target=void 0,done:!0}:"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},"values"),o.Arguments=o.Array);if(i("keys"),i("values"),i("entries"),!c&&n&&"values"!==s.name)try{a(s,"name",{value:"values"})}catch(e){}},9600:(e,t,n)=>{"use strict";var r=n(2109),i=n(1702),o=n(8361),s=n(5656),n=n(9341),a=i([].join),i=o!=Object,o=n("join",",");r({target:"Array",proto:!0,forced:i||!o},{join:function(e){return a(s(this),void 0===e?",":e)}})},1249:(e,t,n)=>{"use strict";var r=n(2109),i=n(2092).map;r({target:"Array",proto:!0,forced:!n(1194)("map")},{map:function(e){return i(this,e,1{"use strict";var r=n(2109),i=n(3671).left,o=n(9341),s=n(7392),n=n(5268);r({target:"Array",proto:!0,forced:!o("reduce")||!n&&79{n(2109)({target:"Date",proto:!0},{toGMTString:Date.prototype.toUTCString})},3710:(e,t,n)=>{var r=n(1702),n=n(8052),i=Date.prototype,o="Invalid Date",s=r(i.toString),a=r(i.getTime);String(new Date(NaN))!=o&&n(i,"toString",function(){var e=a(this);return e==e?s(this):o})},1703:(e,t,n)=>{function r(e,t){var n={};n[e]=l(e,t,d),o({global:!0,constructor:!0,arity:1,forced:d},n)}function i(e,t){var n;u&&u[e]&&((n={})[e]=l(c+"."+e,t,d),o({target:c,stat:!0,constructor:!0,arity:1,forced:d},n))}var o=n(2109),s=n(7854),a=n(2104),l=n(9191),c="WebAssembly",u=s[c],d=7!==Error("e",{cause:7}).cause;r("Error",function(t){return function(e){return a(t,this,arguments)}}),r("EvalError",function(t){return function(e){return a(t,this,arguments)}}),r("RangeError",function(t){return function(e){return a(t,this,arguments)}}),r("ReferenceError",function(t){return function(e){return a(t,this,arguments)}}),r("SyntaxError",function(t){return function(e){return a(t,this,arguments)}}),r("TypeError",function(t){return function(e){return a(t,this,arguments)}}),r("URIError",function(t){return function(e){return a(t,this,arguments)}}),i("CompileError",function(t){return function(e){return a(t,this,arguments)}}),i("LinkError",function(t){return function(e){return a(t,this,arguments)}}),i("RuntimeError",function(t){return function(e){return a(t,this,arguments)}})},6647:(e,t,n)=>{var r=n(8052),n=n(7762),i=Error.prototype;i.toString!==n&&r(i,"toString",n)},2130:(e,t,n)=>{"use strict";function s(e,t){for(var n=o(e,16);n.length{var r=n(2109),n=n(7065);r({target:"Function",proto:!0,forced:Function.bind!==n},{bind:n})},8309:(e,t,n)=>{var r=n(9781),i=n(6530).EXISTS,o=n(1702),n=n(3070).f,s=Function.prototype,a=o(s.toString),l=/function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/,c=o(l.exec);r&&!i&&n(s,"name",{configurable:!0,get:function(){try{return c(l,a(this))[1]}catch(e){return""}}})},8862:(e,t,n)=>{function i(e,t){var n=m(arguments),r=t;if((f(t)||void 0!==e)&&!p(e))return d(t)||(t=function(e,t){if(h(r)&&(t=l(r,this,e,t)),!p(t))return t}),n[1]=t,a(g,null,n)}function o(e,t,n){var r=b(n,t-1),n=b(n,t+1);return v(C,e)&&!v(k,n)||v(k,e)&&!v(C,r)?"\\u"+w(y(e,0),16):e}var r=n(2109),s=n(5005),a=n(2104),l=n(6916),c=n(1702),u=n(7293),d=n(3157),h=n(614),f=n(111),p=n(2190),m=n(206),n=n(133),g=s("JSON","stringify"),v=c(/./.exec),b=c("".charAt),y=c("".charCodeAt),_=c("".replace),w=c(1..toString),x=/[\uD800-\uDFFF]/g,C=/^[\uD800-\uDBFF]$/,k=/^[\uDC00-\uDFFF]$/,S=!n||u(function(){var e=s("Symbol")();return"[null]"!=g([e])||"{}"!=g({a:e})||"{}"!=g(Object(e))}),D=u(function(){return'"\\udf06\\ud834"'!==g("\udf06\ud834")||'"\\udead"'!==g("\udead")});g&&r({target:"JSON",stat:!0,arity:3,forced:S||D},{stringify:function(e,t,n){var r=m(arguments),r=a(S?i:g,null,r);return D&&"string"==typeof r?_(r,x,o):r}})},9601:(e,t,n)=>{var r=n(2109),n=n(1574);r({target:"Object",stat:!0,arity:2,forced:Object.assign!==n},{assign:n})},9660:(e,t,n)=>{var r=n(2109),i=n(133),o=n(7293),s=n(5181),a=n(7908);r({target:"Object",stat:!0,forced:!i||o(function(){s.f(1)})},{getOwnPropertySymbols:function(e){var t=s.f;return t?t(a(e)):[]}})},1539:(e,t,n)=>{var r=n(1694),i=n(8052),n=n(288);r||i(Object.prototype,"toString",n,{unsafe:!0})},1058:(e,t,n)=>{var r=n(2109),n=n(3009);r({global:!0,forced:parseInt!=n},{parseInt:n})},821:(e,t,n)=>{"use strict";var r=n(2109),u=n(6916),d=n(9662),i=n(8523),o=n(2534),h=n(408);r({target:"Promise",stat:!0,forced:n(612)},{all:function(e){var a=this,t=i.f(a),l=t.resolve,c=t.reject,n=o(function(){var r=d(a.resolve),i=[],o=0,s=1;h(e,function(e){var t=o++,n=!1;s++,u(r,a,e).then(function(e){n||(n=!0,i[t]=e,--s||l(i))},c)}),--s||l(i)});return n.error&&c(n.value),t.promise}})},4164:(e,t,n)=>{"use strict";var r=n(2109),i=n(1913),o=n(3702).CONSTRUCTOR,s=n(2492),a=n(5005),l=n(614),n=n(8052),c=s&&s.prototype;r({target:"Promise",proto:!0,forced:o,real:!0},{catch:function(e){return this.then(void 0,e)}}),!i&&l(s)&&(r=a("Promise").prototype.catch,c.catch!==r&&n(c,"catch",r,{unsafe:!0}))},3401:(L,H,e)=>{"use strict";function o(e,t){var n,r,i,o,s=t.value,a=t.state==D,l=a?e.ok:e.fail,c=e.resolve,u=e.reject,d=e.domain;try{l?(a||(t.rejection===O&&(o=t,p(m,f,function(){var e=o.facade;h?C.emit("rejectionHandled",e):A(Q,e,o.value)})),t.rejection=T),!0===l?n=s:(d&&d.enter(),n=l(s),d&&(d.exit(),i=!0)),n===e.promise?u(w("Promise-chain cycle")):(r=E(n))?p(r,n,c,u):c(n)):u(s)}catch(e){d&&!i&&d.exit(),u(e)}}var n,t,r,B=e(2109),F=e(1913),h=e(5268),f=e(7854),p=e(6916),i=e(8052),s=e(7674),z=e(8003),j=e(6340),V=e(9662),a=e(614),W=e(111),U=e(5787),$=e(6707),m=e(261).set,l=e(5948),Z=e(842),Y=e(2534),q=e(8572),c=e(9909),u=e(2492),d=e(3702),e=e(8523),g="Promise",v=d.CONSTRUCTOR,K=d.REJECTION_EVENT,d=d.SUBCLASSING,b=c.getterFor(g),G=c.set,c=u&&u.prototype,y=u,_=c,w=f.TypeError,x=f.document,C=f.process,k=e.f,X=k,J=!!(x&&x.createEvent&&f.dispatchEvent),S="unhandledrejection",Q="rejectionhandled",D=1,ee=2,T=1,O=2,E=function(e){var t;return!(!W(e)||!a(t=e.then))&&t},M=function(n,i){n.notified||(n.notified=!0,l(function(){for(var e,r,t=n.reactions;e=t.get();)o(e,n);n.notified=!1,i&&!n.rejection&&(r=n,p(m,f,function(){var e=r.facade,t=r.value,n=N(r);if(n&&(n=Y(function(){h?C.emit("unhandledRejection",t,e):A(S,e,t)}),r.rejection=h||N(r)?O:T,n.error))throw n.value}))}))},A=function(e,t,n){var r;J?((r=x.createEvent("Event")).promise=t,r.reason=n,r.initEvent(e,!1,!0),f.dispatchEvent(r)):r={promise:t,reason:n},!K&&(t=f["on"+e])?t(r):e===S&&Z("Unhandled promise rejection",n)},N=function(e){return e.rejection!==T&&!e.parent},P=function(t,n,r){return function(e){t(n,e,r)}},I=function(e,t,n){e.done||(e.done=!0,(e=n?n:e).value=t,e.state=ee,M(e,!0))},R=function(n,e,t){if(!n.done){n.done=!0,t&&(n=t);try{if(n.facade===e)throw w("Promise can't be resolved itself");var r=E(e);r?l(function(){var t={done:!1};try{p(r,e,P(R,t,n),P(I,t,n))}catch(e){I(t,e,n)}}):(n.value=e,n.state=D,M(n,!1))}catch(e){I({done:!1},e,n)}}};if(v&&(_=(y=function(e){U(this,_),V(e),p(n,this);var t=b(this);try{e(P(R,t),P(I,t))}catch(e){I(t,e)}}).prototype,(n=function(e){G(this,{type:g,done:!1,notified:!1,parent:!1,reactions:new q,rejection:!1,state:0,value:void 0})}).prototype=i(_,"then",function(e,t){var n=b(this),r=k($(this,y));return n.parent=!0,r.ok=!a(e)||e,r.fail=a(t)&&t,r.domain=h?C.domain:void 0,0==n.state?n.reactions.add(r):l(function(){o(r,n)}),r.promise}),t=function(){var e=new n,t=b(e);this.promise=e,this.resolve=P(R,t),this.reject=P(I,t)},e.f=k=function(e){return e===y||void 0===e?new t:X(e)},!F&&a(u)&&c!==Object.prototype)){r=c.then,d||i(c,"then",function(e,t){var n=this;return new y(function(e,t){p(r,n,e,t)}).then(e,t)},{unsafe:!0});try{delete c.constructor}catch(e){}s&&s(c,_)}B({global:!0,constructor:!0,wrap:!0,forced:v},{Promise:y}),z(y,g,!1,!0),j(g)},7727:(e,t,n)=>{"use strict";var r=n(2109),i=n(1913),o=n(2492),s=n(7293),a=n(5005),l=n(614),c=n(6707),u=n(9478),n=n(8052),d=o&&o.prototype;r({target:"Promise",proto:!0,real:!0,forced:!!o&&s(function(){d.finally.call({then:function(){}},function(){})})},{finally:function(t){var n=c(this,a("Promise")),e=l(t);return this.then(e?function(e){return u(n,t()).then(function(){return e})}:t,e?function(e){return u(n,t()).then(function(){throw e})}:t)}}),!i&&l(o)&&(r=a("Promise").prototype.finally,d.finally!==r&&n(d,"finally",r,{unsafe:!0}))},8674:(e,t,n)=>{n(3401),n(821),n(4164),n(6027),n(683),n(6294)},6027:(e,t,n)=>{"use strict";var r=n(2109),o=n(6916),s=n(9662),a=n(8523),l=n(2534),c=n(408);r({target:"Promise",stat:!0,forced:n(612)},{race:function(e){var n=this,r=a.f(n),i=r.reject,t=l(function(){var t=s(n.resolve);c(e,function(e){o(t,n,e).then(r.resolve,i)})});return t.error&&i(t.value),r.promise}})},683:(e,t,n)=>{"use strict";var r=n(2109),i=n(6916),o=n(8523);r({target:"Promise",stat:!0,forced:n(3702).CONSTRUCTOR},{reject:function(e){var t=o.f(this);return i(t.reject,void 0,e),t.promise}})},6294:(e,t,n)=>{"use strict";var r=n(2109),i=n(5005),o=n(1913),s=n(2492),a=n(3702).CONSTRUCTOR,l=n(9478),c=i("Promise"),u=o&&!a;r({target:"Promise",stat:!0,forced:o||a},{resolve:function(e){return l(u&&this===c?s:this,e)}})},4916:(e,t,n)=>{"use strict";var r=n(2109),n=n(2261);r({target:"RegExp",proto:!0,forced:/./.exec!==n},{exec:n})},7601:(e,t,n)=>{"use strict";n(4916);var r,i=n(2109),o=n(6916),s=n(1702),a=n(614),l=n(111),n=(r=!1,(n=/[ac]/).exec=function(){return r=!0,/./.exec.apply(this,arguments)},!0===n.test("abc")&&r),c=TypeError,u=s(/./.test);i({target:"RegExp",proto:!0,forced:!n},{test:function(e){var t=this.exec;if(!a(t))return u(this,e);t=o(t,this,e);if(null===t||l(t))return!!t;throw new c("RegExp exec method returned something other than an Object or null")}})},9714:(e,t,n)=>{"use strict";var r=n(6530).PROPER,i=n(8052),o=n(9670),s=n(1340),a=n(7293),l=n(4706),n="toString",c=RegExp.prototype[n],a=a(function(){return"/a/b"!=c.call({source:"a",flags:"b"})}),r=r&&c.name!=n;(a||r)&&i(RegExp.prototype,n,function(){var e=o(this);return"/"+s(e.source)+"/"+s(l(e))},{unsafe:!0})},8783:(e,t,n)=>{"use strict";var r=n(8710).charAt,i=n(1340),o=n(9909),n=n(654),s="String Iterator",a=o.set,l=o.getterFor(s);n(String,"String",function(e){a(this,{type:s,string:i(e),index:0})},function(){var e=l(this),t=e.string,n=e.index;return n>=t.length?{value:void 0,done:!0}:(t=r(t,n),e.index+=t.length,{value:t,done:!1})})},5306:(e,t,n)=>{"use strict";var x=n(2104),i=n(6916),r=n(1702),o=n(7007),s=n(7293),C=n(9670),k=n(614),S=n(9303),D=n(7466),T=n(1340),a=n(4488),O=n(1530),l=n(8173),E=n(647),M=n(7651),c=n(5112)("replace"),A=Math.max,N=Math.min,P=r([].concat),I=r([].push),R=r("".indexOf),L=r("".slice),n="$0"==="a".replace(/./,"$0"),u=!!/./[c]&&""===/./[c]("a","$0");o("replace",function(e,y,_){var w=u?"$":"$0";return[function(e,t){var n=a(this),r=null==e?void 0:l(e,c);return r?i(r,e,n,t):i(y,T(n),e,t)},function(e,t){var n=C(this),r=T(e);if("string"==typeof t&&-1===R(t,w)&&-1===R(t,"$<")){e=_(y,n,r,t);if(e.done)return e.value}for(var i,o=k(t),s=(o||(t=T(t)),n.global),a=(s&&(i=n.unicode,n.lastIndex=0),[]);null!==(h=M(n,r))&&(I(a,h),s);)""===T(h[0])&&(n.lastIndex=O(r,D(n.lastIndex),i));for(var l,c="",u=0,d=0;d")})||!n||u)},4765:(e,t,n)=>{"use strict";var s=n(6916),r=n(7007),a=n(9670),l=n(4488),c=n(1150),u=n(1340),d=n(8173),h=n(7651);r("search",function(r,i,o){return[function(e){var t=l(this),n=null==e?void 0:d(e,r);return n?s(n,e,t):new RegExp(e)[r](u(t))},function(e){var t=a(this),e=u(e),n=o(i,t,e);return n.done?n.value:(n=t.lastIndex,c(n,0)||(t.lastIndex=0),e=h(t,e),c(t.lastIndex,n)||(t.lastIndex=n),null===e?-1:e.index)}]})},3123:(e,t,n)=>{"use strict";var u=n(2104),d=n(6916),r=n(1702),i=n(7007),h=n(7850),v=n(9670),f=n(4488),b=n(6707),y=n(1530),_=n(7466),w=n(1340),o=n(8173),x=n(1589),C=n(7651),k=n(2261),s=n(2999),n=n(7293),S=s.UNSUPPORTED_Y,D=Math.min,T=[].push,O=r(/./.exec),E=r(T),M=r("".slice);i("split",function(i,p,m){var g="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||1<".".split(/()()/).length||"".split(/.?/).length?function(e,t){var n=w(f(this)),r=void 0===t?4294967295:t>>>0;if(0==r)return[];if(void 0===e)return[n];if(!h(e))return d(p,n,e,r);for(var i,o,s,a=[],t=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),l=0,c=new RegExp(e.source,t+"g");(i=d(k,c,n))&&!(l<(o=c.lastIndex)&&(E(a,M(n,l,i.index)),1>>0;if(0==a)return[];if(0===r.length)return null===C(s,r)?[r]:[];for(var l=0,c=0,u=[];c{"use strict";var r=n(2109),i=n(1702),o=n(4488),s=n(9303),a=n(1340),l=i("".slice),c=Math.max,u=Math.min;r({target:"String",proto:!0,forced:!"".substr||"b"!=="ab".substr(-1)},{substr:function(e,t){var n=a(o(this)),r=n.length,e=s(e);return(e=e===1/0?0:e)<0&&(e=c(r+e,0)),(t=void 0===t?r:s(t))<=0||t===1/0||(t=u(e+t,r))<=e?"":l(n,e,t)}})},3210:(e,t,n)=>{"use strict";var r=n(2109),i=n(3111).trim;r({target:"String",proto:!0,forced:n(6091)("trim")},{trim:function(){return i(this)}})},4032:(L,H,e)=>{"use strict";function r(e,t){var n=N[e]=b(M);return te(n,{type:O,tag:e,description:t}),d||(n.description=t),n}function i(e,t,n){return e===E&&i(P,t,n),p(e),t=g(t),p(n),(f(N,t)?(n.enumerable?(f(e,T)&&e[T][t]&&(e[T][t]=!1),n=b(n,{enumerable:v(0,!1)})):(f(e,T)||A(e,T,v(1,{})),e[T][t]=!0),R):A)(e,t,n)}function n(t,e){p(t);var n=m(e),e=y(n).concat(a(n));return D(e,function(e){d&&!u(o,n,e)||i(t,e,n[e])}),t}function o(e){var e=g(e),t=u(se,this,e);return!(this===E&&f(N,e)&&!f(P,e))&&(!(t||!f(this,e)||!f(N,e)||f(this,T)&&this[T][e])||t)}function t(e,t){var n,e=m(e),t=g(t);if(e!==E||!f(N,t)||f(P,t))return!(n=ie(e,t))||!f(N,t)||f(e,T)&&e[T][t]||(n.enumerable=!0),n}function s(e){var e=oe(m(e)),t=[];return D(e,function(e){f(N,e)||f(q,e)||ae(t,e)}),t}function a(e){var t=e===E,e=oe(t?P:m(e)),n=[];return D(e,function(e){!f(N,e)||t&&!f(E,e)||ae(n,N[e])}),n}var l=e(2109),c=e(7854),u=e(6916),B=e(1702),F=e(1913),d=e(9781),h=e(133),z=e(7293),f=e(2597),j=e(7976),p=e(9670),m=e(5656),g=e(4948),V=e(1340),v=e(9114),b=e(30),y=e(1956),W=e(8006),_=e(1156),U=e(5181),w=e(1236),$=e(3070),Z=e(6048),Y=e(5296),x=e(8052),C=e(2309),k=e(6200),q=e(3501),K=e(9711),G=e(5112),X=e(6061),J=e(7235),Q=e(6532),ee=e(8003),S=e(9909),D=e(2092).forEach,T=k("hidden"),O="Symbol",e="prototype",te=S.set,ne=S.getterFor(O),E=Object[e],k=c.Symbol,M=k&&k[e],re=c.TypeError,S=c.QObject,ie=w.f,A=$.f,oe=_.f,se=Y.f,ae=B([].push),N=C("symbols"),P=C("op-symbols"),c=C("wks"),I=!S||!S[e]||!S[e].findChild,R=d&&z(function(){return 7!=b(A({},"a",{get:function(){return A(this,"a",{value:7}).a}})).a})?function(e,t,n){var r=ie(E,t);r&&delete E[t],A(e,t,n),r&&e!==E&&A(E,t,r)}:A;h||(x(M=(k=function(){if(j(M,this))throw re("Symbol is not a constructor");var e=arguments.length&&void 0!==arguments[0]?V(arguments[0]):void 0,t=K(e),n=function(e){this===E&&u(n,P,e),f(this,T)&&f(this[T],t)&&(this[T][t]=!1),R(this,t,v(1,e))};return d&&I&&R(E,t,{configurable:!0,set:n}),r(t,e)})[e],"toString",function(){return ne(this).tag}),x(k,"withoutSetter",function(e){return r(K(e),e)}),Y.f=o,$.f=i,Z.f=n,w.f=t,W.f=_.f=s,U.f=a,X.f=function(e){return r(G(e),e)},d&&(A(M,"description",{configurable:!0,get:function(){return ne(this).description}}),F||x(E,"propertyIsEnumerable",o,{unsafe:!0}))),l({global:!0,constructor:!0,wrap:!0,forced:!h,sham:!h},{Symbol:k}),D(y(c),function(e){J(e)}),l({target:O,stat:!0,forced:!h},{useSetter:function(){I=!0},useSimple:function(){I=!1}}),l({target:"Object",stat:!0,forced:!h,sham:!d},{create:function(e,t){return void 0===t?b(e):n(b(e),t)},defineProperty:i,defineProperties:n,getOwnPropertyDescriptor:t}),l({target:"Object",stat:!0,forced:!h},{getOwnPropertyNames:s}),Q(),ee(k,O),q[T]=!0},1817:(e,t,n)=>{"use strict";var r,i,o,s,a,l,c,u=n(2109),d=n(9781),h=n(7854),f=n(1702),p=n(2597),m=n(614),g=n(7976),v=n(1340),b=n(3070).f,n=n(9920),y=h.Symbol,_=y&&y.prototype;!d||!m(y)||"description"in _&&void 0===y().description||(r={},n(h=function(){var e=arguments.length<1||void 0===arguments[0]?void 0:v(arguments[0]),t=g(_,this)?new y(e):void 0===e?y():y(e);return""===e&&(r[t]=!0),t},y),(h.prototype=_).constructor=h,i="Symbol(test)"==String(y("test")),o=f(_.toString),s=f(_.valueOf),a=/^Symbol\((.*)\)[^)]+$/,l=f("".replace),c=f("".slice),b(_,"description",{configurable:!0,get:function(){var e=s(this),t=o(e);return p(r,e)?"":""===(e=i?c(t,7,-1):l(t,a,"$1"))?void 0:e}}),u({global:!0,constructor:!0,forced:!0},{Symbol:h}))},763:(e,t,n)=>{var r=n(2109),i=n(5005),o=n(2597),s=n(1340),a=n(2309),n=n(735),l=a("string-to-symbol-registry"),c=a("symbol-to-string-registry");r({target:"Symbol",stat:!0,forced:!n},{for:function(e){var t,e=s(e);return o(l,e)?l[e]:(t=i("Symbol")(e),l[e]=t,c[t]=e,t)}})},2165:(e,t,n)=>{n(7235)("iterator")},3230:(e,t,n)=>{n(4032),n(763),n(6620),n(8862),n(9660)},6620:(e,t,n)=>{var r=n(2109),i=n(2597),o=n(2190),s=n(6330),a=n(2309),n=n(735),l=a("symbol-to-string-registry");r({target:"Symbol",stat:!0,forced:!n},{keyFor:function(e){if(!o(e))throw TypeError(s(e)+" is not a symbol");if(i(l,e))return l[e]}})},8221:(e,t,n)=>{"use strict";var r=n(2109),i=n(1702),a=n(1340),l=String.fromCharCode,c=i("".charAt),u=i(/./.exec),d=i("".slice),h=/^[\da-f]{2}$/i,f=/^[\da-f]{4}$/i;r({global:!0},{unescape:function(e){for(var t,n,r=a(e),i="",o=r.length,s=0;s{function r(t){if(t&&t.forEach!==l)try{c(t,"forEach",l)}catch(e){t.forEach=l}}var i,o=n(7854),s=n(8324),a=n(8509),l=n(8533),c=n(8880);for(i in s)s[i]&&r(o[i]&&o[i].prototype);r(a)},3948:(e,t,n)=>{function r(t,e){if(t){if(t[u]!==h)try{c(t,u,h)}catch(e){t[u]=h}if(t[d]||c(t,d,e),s[e])for(var n in l)if(t[n]!==l[n])try{c(t,n,l[n])}catch(e){t[n]=l[n]}}}var i,o=n(7854),s=n(8324),a=n(8509),l=n(6992),c=n(8880),n=n(5112),u=n("iterator"),d=n("toStringTag"),h=l.values;for(i in s)r(o[i]&&o[i].prototype,i);r(a,"DOMTokenList")},6815:(e,t,n)=>{var r=n(2109),i=n(7854),n=n(7152).setInterval;r({global:!0,bind:!0,forced:i.setInterval!==n},{setInterval:n})},8417:(e,t,n)=>{var r=n(2109),i=n(7854),n=n(7152).setTimeout;r({global:!0,bind:!0,forced:i.setTimeout!==n},{setTimeout:n})},2564:(e,t,n)=>{n(6815),n(8417)},696:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.convertChangesToDMP=function(e){for(var t,n,r=[],i=0;i{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.convertChangesToXML=function(e){for(var t=[],n=0;n"):r.removed&&t.push(""),t.push(function(e){return e=(e=(e=(e=e.replace(/&/g,"&")).replace(//g,">")).replace(/"/g,""")}(r.value)),r.added?t.push(""):r.removed&&t.push("")}return t.join("")}},6976:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.diffArrays=function(e,t,n){return r.diff(e,t,n)},t.arrayDiff=void 0;var r=new((n=n(5913))&&n.__esModule?n:{default:n}).default;(t.arrayDiff=r).tokenize=function(e){return e.slice()},r.join=r.removeEmpty=function(e){return e}},5913:(e,t)=>{"use strict";function n(){}Object.defineProperty(t,"__esModule",{value:!0}),(t.default=n).prototype={diff:function(a,l){var e=2=d&&h<=e+1)return u([{value:this.join(l),count:l.length}]);function r(){for(var e=-1*f;e<=f;e+=2){var t=void 0,n=p[e-1],r=p[e+1],i=(r?r.newPos:0)-e,o=(n&&(p[e-1]=void 0),n&&n.newPos+1=d&&h<=i+1)return u(function(e,t,n,r,i){for(var o=0,s=t.length,a=0,l=0;oe.length?t:e}),u.value=e.join(c)):u.value=e.join(n.slice(a,a+u.count)),a+=u.count,u.added||(l+=u.count))}var d=t[s-1];1{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.diffChars=function(e,t,n){return r.diff(e,t,n)},t.characterDiff=void 0;var r=new((n=n(5913))&&n.__esModule?n:{default:n}).default;t.characterDiff=r},3900:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.diffCss=function(e,t,n){return r.diff(e,t,n)},t.cssDiff=void 0;var r=new((n=n(5913))&&n.__esModule?n:{default:n}).default;(t.cssDiff=r).tokenize=function(e){return e.split(/([{}:;,]|\s+)/)}},4276:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.diffJson=function(e,t,n){return o.diff(e,t,n)},t.canonicalize=d,t.jsonDiff=void 0;var r=(i=n(5913))&&i.__esModule?i:{default:i},i=n(8187);function c(e){return(c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var u=Object.prototype.toString,o=new r.default;function d(e,t,n,r,i){var o,s;for(t=t||[],n=n||[],r&&(e=r(i,e)),o=0;o{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.diffLines=function(e,t,n){return o.diff(e,t,n)},t.diffTrimmedLines=function(e,t,n){n=(0,i.generateOptions)(n,{ignoreWhitespace:!0});return o.diff(e,t,n)},t.lineDiff=void 0;var r=(r=n(5913))&&r.__esModule?r:{default:r},i=n(8009);var o=new r.default;(t.lineDiff=o).tokenize=function(e){var t=[],n=e.split(/(\n|\r\n)/);n[n.length-1]||n.pop();for(var r=0;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.diffSentences=function(e,t,n){return r.diff(e,t,n)},t.sentenceDiff=void 0;var r=new((n=n(5913))&&n.__esModule?n:{default:n}).default;(t.sentenceDiff=r).tokenize=function(e){return e.split(/(\S.+?[.!?])(?=\s+|$)/)}},5303:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.diffWords=function(e,t,n){return n=(0,i.generateOptions)(n,{ignoreWhitespace:!0}),a.diff(e,t,n)},t.diffWordsWithSpace=function(e,t,n){return a.diff(e,t,n)},t.wordDiff=void 0;var r=(r=n(5913))&&r.__esModule?r:{default:r},i=n(8009);var o=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,s=/\S/,a=new r.default;(t.wordDiff=a).equals=function(e,t){return this.options.ignoreCase&&(e=e.toLowerCase(),t=t.toLowerCase()),e===t||this.options.ignoreWhitespace&&!s.test(e)&&!s.test(t)},a.tokenize=function(e){for(var t=e.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/),n=0;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"Diff",{enumerable:!0,get:function(){return r.default}}),Object.defineProperty(t,"diffChars",{enumerable:!0,get:function(){return i.diffChars}}),Object.defineProperty(t,"diffWords",{enumerable:!0,get:function(){return o.diffWords}}),Object.defineProperty(t,"diffWordsWithSpace",{enumerable:!0,get:function(){return o.diffWordsWithSpace}}),Object.defineProperty(t,"diffLines",{enumerable:!0,get:function(){return s.diffLines}}),Object.defineProperty(t,"diffTrimmedLines",{enumerable:!0,get:function(){return s.diffTrimmedLines}}),Object.defineProperty(t,"diffSentences",{enumerable:!0,get:function(){return a.diffSentences}}),Object.defineProperty(t,"diffCss",{enumerable:!0,get:function(){return l.diffCss}}),Object.defineProperty(t,"diffJson",{enumerable:!0,get:function(){return c.diffJson}}),Object.defineProperty(t,"canonicalize",{enumerable:!0,get:function(){return c.canonicalize}}),Object.defineProperty(t,"diffArrays",{enumerable:!0,get:function(){return u.diffArrays}}),Object.defineProperty(t,"applyPatch",{enumerable:!0,get:function(){return d.applyPatch}}),Object.defineProperty(t,"applyPatches",{enumerable:!0,get:function(){return d.applyPatches}}),Object.defineProperty(t,"parsePatch",{enumerable:!0,get:function(){return h.parsePatch}}),Object.defineProperty(t,"merge",{enumerable:!0,get:function(){return f.merge}}),Object.defineProperty(t,"structuredPatch",{enumerable:!0,get:function(){return p.structuredPatch}}),Object.defineProperty(t,"createTwoFilesPatch",{enumerable:!0,get:function(){return p.createTwoFilesPatch}}),Object.defineProperty(t,"createPatch",{enumerable:!0,get:function(){return p.createPatch}}),Object.defineProperty(t,"convertChangesToDMP",{enumerable:!0,get:function(){return m.convertChangesToDMP}}),Object.defineProperty(t,"convertChangesToXML",{enumerable:!0,get:function(){return g.convertChangesToXML}});var r=(t=n(5913))&&t.__esModule?t:{default:t},i=n(7630),o=n(5303),s=n(8187),a=n(4146),l=n(3900),c=n(4276),u=n(6976),d=n(3690),h=n(3719),f=n(3051),p=n(1286),m=n(696),g=n(5826)},3690:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.applyPatch=o,t.applyPatches=function(e,i){"string"==typeof e&&(e=(0,O.parsePatch)(e));var t=0;!function n(){var r=e[t++];if(!r)return i.complete();i.loadFile(r,function(e,t){if(e)return i.complete(e);e=o(t,r,i),i.patched(r,e,function(e){if(e)return i.complete(e);n()})})}()};var O=n(3719),E=(t=n(8169))&&t.__esModule?t:{default:t};function o(e,t){var n=2{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.structuredPatch=a,t.formatPatch=l,t.createTwoFilesPatch=s,t.createPatch=function(e,t,n,r,i,o){return s(e,e,t,n,r,i,o)};var o=n(8187);function v(e){return function(e){if(Array.isArray(e))return r(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){var n;if(e)return"string"==typeof e?r(e,t):"Map"===(n="Object"===(n=Object.prototype.toString.call(e).slice(8,-1))&&e.constructor?e.constructor.name:n)||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=c.length-2&&o.length<=l.context&&(e=/\n$/.test(s),n=/\n$/.test(a),r=0==o.length&&f.length>t.oldLines,!e&&r&&0{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.calcLineCount=f,t.merge=function(e,t,n){e=p(e,n),t=p(t,n);var r={};(e.index||t.index)&&(r.index=e.index||t.index);(e.newFileName||t.newFileName)&&(m(e)?m(t)?(r.oldFileName=g(r,e.oldFileName,t.oldFileName),r.newFileName=g(r,e.newFileName,t.newFileName),r.oldHeader=g(r,e.oldHeader,t.oldHeader),r.newHeader=g(r,e.newHeader,t.newHeader)):(r.oldFileName=e.oldFileName,r.newFileName=e.newFileName,r.oldHeader=e.oldHeader,r.newHeader=e.newHeader):(r.oldFileName=t.oldFileName||e.oldFileName,r.newFileName=t.newFileName||e.newFileName,r.oldHeader=t.oldHeader||e.oldHeader,r.newHeader=t.newHeader||e.newHeader));r.hunks=[];var i=0,o=0,s=0,a=0;for(;ie.length)&&(t=e.length);for(var n=0,r=new Array(t);n{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.parsePatch=function(e){var s=1{"use strict";function n(e,t){if(t.length>e.length)return!1;for(var n=0;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(t,n,r){var i=!0,o=!1,s=!1,a=1;return function e(){if(i&&!s){if(o?a++:i=!1,t+a<=r)return a;s=!0}if(!o)return s||(i=!0),n<=t-a?-a++:(o=!0,e())}}},8009:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.generateOptions=function(e,t){if("function"==typeof e)t.callback=e;else if(e)for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}},6688:(e,t,n)=>{var r;n(9755);window.Zepto,n=[n(9755)],void 0!==(t="function"==typeof(r=function(a){"use strict";var l=function(h,w,x){var C={invalid:[],getCaret:function(){try{var e,t=0,n=h.get(0),r=document.selection,i=n.selectionStart;if(r&&navigator.appVersion.indexOf("MSIE 10")===-1){e=r.createRange();e.moveStart("character",-C.val().length);t=e.text.length}else if(i||i==="0")t=i;return t}catch(e){}},setCaret:function(e){try{if(h.is(":focus")){var t,n=h.get(0);if(n.setSelectionRange)n.setSelectionRange(e,e);else{t=n.createTextRange();t.collapse(true);t.moveEnd("character",e);t.moveStart("character",e);t.select()}}}catch(e){}},events:function(){h.on("keydown.mask",function(e){h.data("mask-keycode",e.keyCode||e.which);h.data("mask-previus-value",h.val());h.data("mask-previus-caret-pos",C.getCaret());C.maskDigitPosMapOld=C.maskDigitPosMap}).on(a.jMaskGlobals.useInput?"input.mask":"keyup.mask",C.behaviour).on("paste.mask drop.mask",function(){setTimeout(function(){h.keydown().keyup()},100)}).on("change.mask",function(){h.data("changed",true)}).on("blur.mask",function(){if(o!==C.val()&&!h.data("changed"))h.trigger("change");h.data("changed",false)}).on("blur.mask",function(){o=C.val()}).on("focus.mask",function(e){if(x.selectOnFocus===true)a(e.target).select()}).on("focusout.mask",function(){if(x.clearIfNotMatch&&!s.test(C.val()))C.val("")})},getRegexMask:function(){var e=[],t,n,r,i,o,s;for(var a=0;a0){if(h[n]()!==e)h[n](e);r=h}else r=h[n]();return r},calculateCaretPosition:function(e){var t=C.getMasked(),n=C.getCaret();if(e!==t){var r=h.data("mask-previus-caret-pos")||0,i=t.length,o=e.length,s=0,a=0,l=0,c=0,u=0;for(u=n;u=0;u--){if(!C.maskDigitPosMap[u])break;s++}for(u=n-1;u>=0;u--)if(C.maskDigitPosMap[u])l++;for(u=r-1;u>=0;u--)if(C.maskDigitPosMapOld[u])c++;if(n>o)n=i*10;else if(r>=n&&r!==o){if(!C.maskDigitPosMapOld[n]){var d=n;n-=c-l;n-=s;if(C.maskDigitPosMap[n])n=d}}else if(n>r){n+=l-c;n+=a}}return n},behaviour:function(e){e=e||window.event;C.invalid=[];var t=h.data("mask-keycode");if(a.inArray(t,k.byPassKeys)===-1){var n=C.getMasked(),r=C.getCaret(),i=h.data("mask-previus-value")||"";setTimeout(function(){C.setCaret(C.calculateCaretPosition(i))},a.jMaskGlobals.keyStrokeCompensation);C.val(n);C.setCaret(r);return C.callbacks(e)}},getMasked:function(e,t){var n=[],r=t===undefined?C.val():t+"",i=0,o=w.length,s=0,a=r.length,l=1,c="push",u=-1,d=0,h=[],f,p;if(x.reverse){c="unshift";l=-1;f=0;i=o-1;s=a-1;p=function(){return i>-1&&s>-1}}else{f=o-1;p=function(){return i0,[t,e,h,C.invalid,x])}};h=a(h);var k=this,o=C.val(),s;w=typeof w==="function"?w(C.val(),undefined,h,x):w;k.mask=w;k.options=x;k.remove=function(){var e=C.getCaret();if(k.options.placeholder)h.removeAttr("placeholder");if(h.data("mask-maxlength"))h.removeAttr("maxlength");C.destroyEvents();C.val(k.getCleanVal());C.setCaret(e);return h};k.getCleanVal=function(){return C.getMasked(true)};k.getMaskedVal=function(e){return C.getMasked(false,e)};k.init=function(e){e=e||false;x=x||{};k.clearIfNotMatch=a.jMaskGlobals.clearIfNotMatch;k.byPassKeys=a.jMaskGlobals.byPassKeys;k.translation=a.extend({},a.jMaskGlobals.translation,x.translation);k=a.extend(true,{},k,x);s=C.getRegexMask();if(e){C.events();C.val(C.getMasked())}else{if(x.placeholder)h.attr("placeholder",x.placeholder);if(h.data("mask"))h.attr("autocomplete","off");for(var t=0,n=true;t{var r,i;!function(){"use strict";i=[n(9755)],void 0!==(i="function"==typeof(r=function(te){"use strict";te.ui=te.ui||{};var R=te.ui.version="1.13.2",L=0,H=Array.prototype.hasOwnProperty,a=Array.prototype.slice,B=(te.cleanData=function(i){return function(e){var t,n,r;for(r=0;(n=e[r])!=null;r++){t=te._data(n,"events");if(t&&t.remove)te(n).triggerHandler("remove")}i(e)}}(te.cleanData),te.widget=function(e,n,t){var r,i,o;var s={};var a=e.split(".")[0];e=e.split(".")[1];var l=a+"-"+e;if(!t){t=n;n=te.Widget}if(Array.isArray(t))t=te.extend.apply(null,[{}].concat(t));te.expr.pseudos[l.toLowerCase()]=function(e){return!!te.data(e,l)};te[a]=te[a]||{};r=te[a][e];i=te[a][e]=function(e,t){if(!this||!this._createWidget)return new i(e,t);if(arguments.length)this._createWidget(e,t)};te.extend(i,r,{version:t.version,_proto:te.extend({},t),_childConstructors:[]});o=new n;o.options=te.widget.extend({},o.options);te.each(t,function(t,o){if(typeof o!=="function"){s[t]=o;return}s[t]=function(){function r(){return n.prototype[t].apply(this,arguments)}function i(e){return n.prototype[t].apply(this,e)}return function(){var e=this._super;var t=this._superApply;var n;this._super=r;this._superApply=i;n=o.apply(this,arguments);this._super=e;this._superApply=t;return n}}()});i.prototype=te.widget.extend(o,{widgetEventPrefix:r?o.widgetEventPrefix||e:e},s,{constructor:i,namespace:a,widgetName:e,widgetFullName:l});if(r){te.each(r._childConstructors,function(e,t){var n=t.prototype;te.widget(n.namespace+"."+n.widgetName,i,t._proto)});delete r._childConstructors}else n._childConstructors.push(i);te.widget.bridge(e,i);return i},te.widget.extend=function(e){var t=a.call(arguments,1);var n=0;var r=t.length;var i;var o;for(;n",options:{classes:{},disabled:false,create:null},_createWidget:function(e,t){t=te(t||this.defaultElement||this)[0];this.element=te(t);this.uuid=L++;this.eventNamespace="."+this.widgetName+this.uuid;this.bindings=te();this.hoverable=te();this.focusable=te();this.classesElementLookup={};if(t!==this){te.data(t,this.widgetFullName,this);this._on(true,this.element,{remove:function(e){if(e.target===t)this.destroy()}});this.document=te(t.style?t.ownerDocument:t.document||t);this.window=te(this.document[0].defaultView||this.document[0].parentWindow)}this.options=te.widget.extend({},this.options,this._getCreateOptions(),e);this._create();if(this.options.disabled)this._setOptionDisabled(this.options.disabled);this._trigger("create",null,this._getCreateEventData());this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:te.noop,_create:te.noop,_init:te.noop,destroy:function(){var n=this;this._destroy();te.each(this.classesElementLookup,function(e,t){n._removeClass(t,e)});this.element.off(this.eventNamespace).removeData(this.widgetFullName);this.widget().off(this.eventNamespace).removeAttr("aria-disabled");this.bindings.off(this.eventNamespace)},_destroy:te.noop,widget:function(){return this.element},option:function(e,t){var n=e;var r;var i;var o;if(arguments.length===0)return te.widget.extend({},this.options);if(typeof e==="string"){n={};r=e.split(".");e=r.shift();if(r.length){i=n[e]=te.widget.extend({},this.options[e]);for(o=0;o"+"
"),r=n.children()[0];te("body").append(n);e=r.offsetWidth;n.css("overflow","scroll");t=r.offsetWidth;if(e===t)t=n[0].clientWidth;n.remove();return i=e-t},getScrollInfo:function(e){var t=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),n=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),r=t==="scroll"||t==="auto"&&e.width0?"right":"center",vertical:i<0?"top":r>0?"bottom":"middle"};if(fx(C(r),C(i)))o.important="horizontal";else o.important="vertical";d.using.call(this,e,o)};s.offset(te.extend(c,{using:e}))})},te.ui.position={fit:{left:function(e,t){var n=t.within,r=n.isWindow?n.scrollLeft:n.offset.left,i=n.width,o=e.left-t.collisionPosition.marginLeft,s=r-o,a=o+t.collisionWidth-i-r,l;if(t.collisionWidth>i)if(s>0&&a<=0){l=e.left+s+t.collisionWidth-i-r;e.left+=s-l}else if(a>0&&s<=0)e.left=r;else if(s>a)e.left=r+i-t.collisionWidth;else e.left=r;else if(s>0)e.left+=s;else if(a>0)e.left-=a;else e.left=x(e.left-o,e.left)},top:function(e,t){var n=t.within,r=n.isWindow?n.scrollTop:n.offset.top,i=t.within.height,o=e.top-t.collisionPosition.marginTop,s=r-o,a=o+t.collisionHeight-i-r,l;if(t.collisionHeight>i)if(s>0&&a<=0){l=e.top+s+t.collisionHeight-i-r;e.top+=s-l}else if(a>0&&s<=0)e.top=r;else if(s>a)e.top=r+i-t.collisionHeight;else e.top=r;else if(s>0)e.top+=s;else if(a>0)e.top-=a;else e.top=x(e.top-o,e.top)}},flip:{left:function(e,t){var n=t.within,r=n.offset.left+n.scrollLeft,i=n.width,o=n.isWindow?n.scrollLeft:n.offset.left,s=e.left-t.collisionPosition.marginLeft,a=s-o,l=s+t.collisionWidth-i-o,c=t.my[0]==="left"?-t.elemWidth:t.my[0]==="right"?t.elemWidth:0,u=t.at[0]==="left"?t.targetWidth:t.at[0]==="right"?-t.targetWidth:0,d=-2*t.offset[0],h,f;if(a<0){h=e.left+c+u+d+t.collisionWidth-i-r;if(h<0||h0){f=e.left-t.collisionPosition.marginLeft+c+u+d-o;if(f>0||C(f)0){f=e.top-t.collisionPosition.marginTop+u+d+h-o;if(f>0||C(f)")[0],g,v=d.each;function b(e){if(e==null)return e+"";return typeof e==="object"?n[$.call(e)]||"object":typeof e}function y(e,t,n){var r=p[t.type]||{};if(e==null)return n||!t.def?null:t.def;e=r.floor?~~e:parseFloat(e);if(isNaN(e))return t.def;if(r.mod)return(e+r.mod)%r.mod;return Math.min(r.max,Math.max(0,e))}function _(s){var a=h(),l=a._rgba=[];s=s.toLowerCase();v(Y,function(e,t){var n,r=t.re.exec(s),i=r&&t.parse(r),o=t.space||"rgba";if(i){n=a[o](i);a[f[o].cache]=n[f[o].cache];l=a._rgba=n._rgba;return false}});if(l.length){if(l.join()==="0,0,0,0")d.extend(l,g.transparent);return a}return g[s]}function w(e,t,n){n=(n+1)%1;if(n*6<1)return e+(t-e)*n*6;if(n*2<1)return t;if(n*3<2)return e+(t-e)*(2/3-n)*6;return e}e.style.cssText="background-color:rgba(1,1,1,.5)",m.rgba=e.style.backgroundColor.indexOf("rgba")>-1,v(f,function(e,t){t.cache="_"+e;t.props.alpha={idx:3,type:"percent",def:1}}),d.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()}),(h.fn=d.extend(h.prototype,{parse:function(i,e,t,n){if(i===undefined){this._rgba=[null,null,null,null];return this}if(i.jquery||i.nodeType){i=d(i).css(e);e=undefined}var o=this,r=b(i),s=this._rgba=[];if(e!==undefined){i=[i,e,t,n];r="array"}if(r==="string")return this.parse(_(i)||g._default);if(r==="array"){v(f.rgba.props,function(e,t){s[t.idx]=y(i[t.idx],t)});return this}if(r==="object"){if(i instanceof h)v(f,function(e,t){if(i[t.cache])o[t.cache]=i[t.cache].slice()});else v(f,function(e,n){var r=n.cache;v(n.props,function(e,t){if(!o[r]&&n.to){if(e==="alpha"||i[e]==null)return;o[r]=n.to(o._rgba)}o[r][t.idx]=y(i[e],t,true)});if(o[r]&&d.inArray(null,o[r].slice(0,3))<0){if(o[r][3]==null)o[r][3]=1;if(n.from)o._rgba=n.from(o[r])}});return this}},is:function(e){var i=h(e),o=true,s=this;v(f,function(e,t){var n,r=i[t.cache];if(r){n=s[t.cache]||t.to&&t.to(s._rgba)||[];v(t.props,function(e,t){if(r[t.idx]!=null){o=r[t.idx]===n[t.idx];return o}})}return o});return o},_space:function(){var n=[],r=this;v(f,function(e,t){if(r[t.cache])n.push(e)});return n.pop()},transition:function(e,s){var a=h(e),t=a._space(),n=f[t],r=this.alpha()===0?h("transparent"):this,l=r[n.cache]||n.to(r._rgba),c=l.slice();a=a[n.cache];v(n.props,function(e,t){var n=t.idx,r=l[n],i=a[n],o=p[t.type]||{};if(i===null)return;if(r===null)c[n]=i;else{if(o.mod)if(i-r>o.mod/2)r+=o.mod;else if(r-i>o.mod/2)r-=o.mod;c[n]=y((i-r)*s+r,t)}});return this[t](c)},blend:function(e){if(this._rgba[3]===1)return this;var t=this._rgba.slice(),n=t.pop(),r=h(e)._rgba;return h(d.map(t,function(e,t){return(1-n)*r[t]+n*e}))},toRgbaString:function(){var e="rgba(",t=d.map(this._rgba,function(e,t){if(e!=null)return e;return t>2?1:0});if(t[3]===1){t.pop();e="rgb("}return e+t.join()+")"},toHslaString:function(){var e="hsla(",t=d.map(this.hsla(),function(e,t){if(e==null)e=t>2?1:0;if(t&&t<3)e=Math.round(e*100)+"%";return e});if(t[3]===1){t.pop();e="hsl("}return e+t.join()+")"},toHexString:function(e){var t=this._rgba.slice(),n=t.pop();if(e)t.push(~~(n*255));return"#"+d.map(t,function(e){e=(e||0).toString(16);return e.length===1?"0"+e:e}).join("")},toString:function(){return this._rgba[3]===0?"transparent":this.toRgbaString()}})).parse.prototype=h.fn,f.hsla.to=function(e){if(e[0]==null||e[1]==null||e[2]==null)return[null,null,null,e[3]];var t=e[0]/255,n=e[1]/255,r=e[2]/255,i=e[3],o=Math.max(t,n,r),s=Math.min(t,n,r),a=o-s,l=o+s,c=l*.5,u,d;if(s===o)u=0;else if(t===o)u=60*(n-r)/a+360;else if(n===o)u=60*(r-t)/a+120;else u=60*(t-n)/a+240;if(a===0)d=0;else if(c<=.5)d=a/l;else d=a/(2-l);return[Math.round(u)%360,d,c,i==null?1:i]},f.hsla.from=function(e){if(e[0]==null||e[1]==null||e[2]==null)return[null,null,null,e[3]];var t=e[0]/360,n=e[1],r=e[2],i=e[3],o=r<=.5?r*(1+n):r+n-r*n,s=2*r-o;return[Math.round(w(s,o,t+1/3)*255),Math.round(w(s,o,t)*255),Math.round(w(s,o,t-1/3)*255),i]},v(f,function(l,e){var n=e.props,s=e.cache,a=e.to,c=e.from;h.fn[l]=function(e){if(a&&!this[s])this[s]=a(this._rgba);if(e===undefined)return this[s].slice();var t,r=b(e),i=r==="array"||r==="object"?e:arguments,o=this[s].slice();v(n,function(e,t){var n=i[r==="object"?e:t.idx];if(n==null)n=o[t.idx];o[t.idx]=y(n,t)});if(c){t=h(c(o));t[s]=o;return t}else return h(o)};v(n,function(s,a){if(h.fn[s])return;h.fn[s]=function(e){var t,n,r,i,o=b(e);if(s==="alpha")i=this._hsla?"hsla":"rgba";else i=l;t=this[i]();n=t[a.idx];if(o==="undefined")return n;if(o==="function"){e=e.call(this,n);o=b(e)}if(e==null&&a.empty)return this;if(o==="string"){r=Z.exec(e);if(r)e=n+parseFloat(r[2])*(r[1]==="+"?1:-1)}t[a.idx]=e;return this[i](t)}})}),(h.hook=function(e){var t=e.split(" ");v(t,function(e,o){d.cssHooks[o]={set:function(e,t){var n,r,i="";if(t!=="transparent"&&(b(t)!=="string"||(n=_(t)))){t=h(n||t);if(!m.rgba&&t._rgba[3]!==1){r=o==="backgroundColor"?e.parentNode:e;while((i===""||i==="transparent")&&r&&r.style)try{i=d.css(r,"backgroundColor");r=r.parentNode}catch(e){}t=t.blend(i&&i!=="transparent"?i:"_default")}t=t.toRgbaString()}try{e.style[o]=t}catch(e){}}};d.fx.step[o]=function(e){if(!e.colorInit){e.start=h(e.elem,o);e.end=h(e.end);e.colorInit=true}d.cssHooks[o].set(e.elem,e.start.transition(e.end,e.pos))}})})(U),d.cssHooks.borderColor={expand:function(n){var r={};v(["Top","Right","Bottom","Left"],function(e,t){r["border"+t+"Color"]=n});return r}};var g=d.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"},D="ui-effects-",t="ui-effects-style",T="ui-effects-animated",q=(te.effects={effect:{}},["add","remove","toggle"]),K={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};function G(e){return e.replace(/-([\da-z])/gi,function(e,t){return t.toUpperCase()})}function X(e){var t,n,r=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,i={};if(r&&r.length&&r[0]&&r[r[0]]){n=r.length;while(n--){t=r[n];if(typeof r[t]==="string")i[G(t)]=r[t]}}else for(t in r)if(typeof r[t]==="string")i[t]=r[t];return i}function J(e,t){var n={},r,i;for(r in t){i=t[r];if(e[r]!==i)if(!K[r])if(te.fx.step[r]||!isNaN(parseFloat(i)))n[r]=i}return n}if(te.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,t){te.fx.step[t]=function(e){if(e.end!=="none"&&!e.setAttr||e.pos===1&&!e.setAttr){d.style(e.elem,t,e.end);e.setAttr=true}}}),!te.fn.addBack)te.fn.addBack=function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))};if(te.effects.animateClass=function(i,e,t,n){var o=te.speed(e,t,n);return this.queue(function(){var n=te(this),e=n.attr("class")||"",t,r=o.children?n.find("*").addBack():n;r=r.map(function(){var e=te(this);return{el:e,start:X(this)}});t=function(){te.each(q,function(e,t){if(i[t])n[t+"Class"](i[t])})};t();r=r.map(function(){this.end=X(this.el[0]);this.diff=J(this.start,this.end);return this});n.attr("class",e);r=r.map(function(){var e=this,t=te.Deferred(),n=te.extend({},o,{queue:false,complete:function(){t.resolve(e)}});this.el.animate(this.diff,n);return t.promise()});te.when.apply(te,r.get()).done(function(){t();te.each(arguments,function(){var t=this.el;te.each(this.diff,function(e){t.css(e,"")})});o.complete.call(n[0])})})},te.fn.extend({addClass:function(i){return function(e,t,n,r){return t?te.effects.animateClass.call(this,{add:e},t,n,r):i.apply(this,arguments)}}(te.fn.addClass),removeClass:function(i){return function(e,t,n,r){return arguments.length>1?te.effects.animateClass.call(this,{remove:e},t,n,r):i.apply(this,arguments)}}(te.fn.removeClass),toggleClass:function(o){return function(e,t,n,r,i){if(typeof t==="boolean"||t===undefined)if(!n)return o.apply(this,arguments);else return te.effects.animateClass.call(this,t?{add:e}:{remove:e},n,r,i);else return te.effects.animateClass.call(this,{toggle:e},t,n,r)}}(te.fn.toggleClass),switchClass:function(e,t,n,r,i){return te.effects.animateClass.call(this,{add:t,remove:e},n,r,i)}}),te.expr&&te.expr.pseudos&&te.expr.pseudos.animated)te.expr.pseudos.animated=function(t){return function(e){return!!te(e).data(T)||t(e)}}(te.expr.pseudos.animated);if(te.uiBackCompat!==false)te.extend(te.effects,{save:function(e,t){var n=0,r=t.length;for(;n").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),t={width:n.width(),height:n.height()},i=document.activeElement;try{i.id}catch(e){i=document.body}n.wrap(e);if(n[0]===i||te.contains(n[0],i))te(i).trigger("focus");e=n.parent();if(n.css("position")==="static"){e.css({position:"relative"});n.css({position:"relative"})}else{te.extend(r,{position:n.css("position"),zIndex:n.css("z-index")});te.each(["top","left","bottom","right"],function(e,t){r[t]=n.css(t);if(isNaN(parseInt(r[t],10)))r[t]="auto"});n.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}n.css(t);return e.css(r).show()},removeWrapper:function(e){var t=document.activeElement;if(e.parent().is(".ui-effects-wrapper")){e.parent().replaceWith(e);if(e[0]===t||te.contains(e[0],t))te(t).trigger("focus")}return e}});function O(e,t,n,r){if(te.isPlainObject(e)){t=e;e=e.effect}e={effect:e};if(t==null)t={};if(typeof t==="function"){r=t;n=null;t={}}if(typeof t==="number"||te.fx.speeds[t]){r=n;n=t;t={}}if(typeof n==="function"){r=n;n=null}if(t)te.extend(e,t);n=n||t.duration;e.duration=te.fx.off?0:typeof n==="number"?n:n in te.fx.speeds?te.fx.speeds[n]:te.fx.speeds._default;e.complete=r||t.complete;return e}function E(e){if(!e||typeof e==="number"||te.fx.speeds[e])return true;if(typeof e==="string"&&!te.effects.effect[e])return true;if(typeof e==="function")return true;if(typeof e==="object"&&!e.effect)return true;return false}function Q(e,t){var n=t.outerWidth(),r=t.outerHeight(),i=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=i.exec(e)||["",0,n,r,0];return{top:parseFloat(o[1])||0,right:o[2]==="auto"?n:parseFloat(o[2]),bottom:o[3]==="auto"?r:parseFloat(o[3]),left:parseFloat(o[4])||0}}te.extend(te.effects,{version:"1.13.2",define:function(e,t,n){if(!n){n=t;t="effect"}te.effects.effect[e]=n;te.effects.effect[e].mode=t;return n},scaledDimensions:function(e,t,n){if(t===0)return{height:0,width:0,outerHeight:0,outerWidth:0};var r=n!=="horizontal"?(t||100)/100:1,i=n!=="vertical"?(t||100)/100:1;return{height:e.height()*i,width:e.width()*r,outerHeight:e.outerHeight()*i,outerWidth:e.outerWidth()*r}},clipToBox:function(e){return{width:e.clip.right-e.clip.left,height:e.clip.bottom-e.clip.top,left:e.clip.left,top:e.clip.top}},unshift:function(e,t,n){var r=e.queue();if(t>1)r.splice.apply(r,[1,0].concat(r.splice(t,n)));e.dequeue()},saveStyle:function(e){e.data(t,e[0].style.cssText)},restoreStyle:function(e){e[0].style.cssText=e.data(t)||"";e.removeData(t)},mode:function(e,t){var n=e.is(":hidden");if(t==="toggle")t=n?"show":"hide";if(n?t==="hide":t==="show")t="none";return t},getBaseline:function(e,t){var n,r;switch(e[0]){case"top":n=0;break;case"middle":n=.5;break;case"bottom":n=1;break;default:n=e[0]/t.height}switch(e[1]){case"left":r=0;break;case"center":r=.5;break;case"right":r=1;break;default:r=e[1]/t.width}return{x:r,y:n}},createPlaceholder:function(e){var t,n=e.css("position"),r=e.position();e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight());if(/^(static|relative)/.test(n)){n="absolute";t=te("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),float:e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder");e.data(D+"placeholder",t)}e.css({position:n,left:r.left,top:r.top});return t},removePlaceholder:function(e){var t=D+"placeholder",n=e.data(t);if(n){n.remove();e.removeData(t)}},cleanUp:function(e){te.effects.restoreStyle(e);te.effects.removePlaceholder(e)},setTransition:function(r,e,i,o){o=o||{};te.each(e,function(e,t){var n=r.cssUnit(t);if(n[0]>0)o[t]=n[0]*i+n[1]});return o}}),te.fn.extend({effect:function(){var i=O.apply(this,arguments),o=te.effects.effect[i.effect],s=o.mode,e=i.queue,t=e||"fx",a=i.complete,l=i.mode,c=[],n=function(e){var t=te(this),n=te.effects.mode(t,l)||s;t.data(T,true);c.push(n);if(s&&(n==="show"||n===s&&n==="hide"))t.show();if(!s||n!=="none")te.effects.saveStyle(t);if(typeof e==="function")e()};if(te.fx.off||!o)if(l)return this[l](i.duration,a);else return this.each(function(){if(a)a.call(this)});function r(e){var t=te(this);function n(){t.removeData(T);te.effects.cleanUp(t);if(i.mode==="hide")t.hide();r()}function r(){if(typeof a==="function")a.call(t[0]);if(typeof e==="function")e()}i.mode=c.shift();if(te.uiBackCompat!==false&&!s)if(t.is(":hidden")?l==="hide":l==="show"){t[l]();r()}else o.call(t[0],i,r);else if(i.mode==="none"){t[l]();r()}else o.call(t[0],i,n)}return e===false?this.each(n).each(r):this.queue(t,n).queue(t,r)},show:function(n){return function(e){if(E(e))return n.apply(this,arguments);else{var t=O.apply(this,arguments);t.mode="show";return this.effect.call(this,t)}}}(te.fn.show),hide:function(n){return function(e){if(E(e))return n.apply(this,arguments);else{var t=O.apply(this,arguments);t.mode="hide";return this.effect.call(this,t)}}}(te.fn.hide),toggle:function(n){return function(e){if(E(e)||typeof e==="boolean")return n.apply(this,arguments);else{var t=O.apply(this,arguments);t.mode="toggle";return this.effect.call(this,t)}}}(te.fn.toggle),cssUnit:function(e){var n=this.css(e),r=[];te.each(["em","px","%","pt"],function(e,t){if(n.indexOf(t)>0)r=[parseFloat(n),t]});return r},cssClip:function(e){if(e)return this.css("clip","rect("+e.top+"px "+e.right+"px "+e.bottom+"px "+e.left+"px)");return Q(this.css("clip"),this)},transfer:function(e,t){var n=te(this),r=te(e.to),i=r.css("position")==="fixed",o=te("body"),s=i?o.scrollTop():0,a=i?o.scrollLeft():0,l=r.offset(),c={top:l.top-s,left:l.left-a,height:r.innerHeight(),width:r.innerWidth()},u=n.offset(),d=te("
");d.appendTo("body").addClass(e.className).css({top:u.top-s,left:u.left-a,height:n.innerHeight(),width:n.innerWidth(),position:i?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove();if(typeof t==="function")t()})}}),te.fx.step.clip=function(e){if(!e.clipInit){e.start=te(e.elem).cssClip();if(typeof e.end==="string")e.end=Q(e.end,e.elem);e.clipInit=true}te(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})};var M={},ee=(te.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,e){M[e]=function(e){return Math.pow(e,t+2)}}),te.extend(M,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return e===0||e===1?e:-Math.pow(2,8*(e-1))*Math.sin(((e-1)*80-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){var t,n=4;while(e<((t=Math.pow(2,--n))-1)/11);return 1/Math.pow(4,3-n)-7.5625*Math.pow((t*3-2)/22-e,2)}}),te.each(M,function(e,t){te.easing["easeIn"+e]=t;te.easing["easeOut"+e]=function(e){return 1-t(1-e)};te.easing["easeInOut"+e]=function(e){return e<.5?t(e*2)/2:1-t(e*-2+2)/2}}),te.effects),ne=te.effects.define("blind","hide",function(e,t){var n={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},r=te(this),i=e.direction||"up",o=r.cssClip(),s={clip:te.extend({},o)},a=te.effects.createPlaceholder(r);s.clip[n[i][0]]=s.clip[n[i][1]];if(e.mode==="show"){r.cssClip(s.clip);if(a)a.css(te.effects.clipToBox(s));s.clip=o}if(a)a.animate(te.effects.clipToBox(s),e.duration,e.easing);r.animate(s,{queue:false,duration:e.duration,easing:e.easing,complete:t})}),re=te.effects.define("bounce",function(e,t){var n,r,i,o=te(this),s=e.mode,a=s==="hide",l=s==="show",c=e.direction||"up",u=e.distance,d=e.times||5,h=d*2+(l||a?1:0),f=e.duration/h,p=e.easing,m=c==="up"||c==="down"?"top":"left",g=c==="up"||c==="left",v=0,b=o.queue().length;te.effects.createPlaceholder(o);i=o.css(m);if(!u)u=o[m==="top"?"outerHeight":"outerWidth"]()/3;if(l){r={opacity:1};r[m]=i;o.css("opacity",0).css(m,g?-u*2:u*2).animate(r,f,p)}if(a)u=u/Math.pow(2,d-1);r={};r[m]=i;for(;v").css({position:"absolute",visibility:"visible",left:-r*p,top:-n*m}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:p,height:m,left:i+(h?s*p:0),top:o+(h?a*m:0),opacity:h?0:1}).animate({left:i+(h?0:s*p),top:o+(h?0:a*m),opacity:h?1:0},e.duration||500,e.easing,v)}}function b(){u.css({visibility:"visible"});te(g).remove();t()}}),ae=te.effects.define("fade","toggle",function(e,t){var n=e.mode==="show";te(this).css("opacity",n?0:1).animate({opacity:n?1:0},{queue:false,duration:e.duration,easing:e.easing,complete:t})}),le=te.effects.define("fold","hide",function(t,e){var n=te(this),r=t.mode,i=r==="show",o=r==="hide",s=t.size||15,a=/([0-9]+)%/.exec(s),l=!!t.horizFirst,c=l?["right","bottom"]:["bottom","right"],u=t.duration/2,d=te.effects.createPlaceholder(n),h=n.cssClip(),f={clip:te.extend({},h)},p={clip:te.extend({},h)},m=[h[c[0]],h[c[1]]],g=n.queue().length;if(a)s=parseInt(a[1],10)/100*m[o?0:1];f.clip[c[0]]=s;p.clip[c[0]]=s;p.clip[c[1]]=0;if(i){n.cssClip(p.clip);if(d)d.css(te.effects.clipToBox(p));p.clip=h}n.queue(function(e){if(d)d.animate(te.effects.clipToBox(f),u,t.easing).animate(te.effects.clipToBox(p),u,t.easing);e()}).animate(f,u,t.easing).animate(p,u,t.easing).queue(e);te.effects.unshift(n,g,4)}),ce=te.effects.define("highlight","show",function(e,t){var n=te(this),r={backgroundColor:n.css("backgroundColor")};if(e.mode==="hide")r.opacity=0;te.effects.saveStyle(n);n.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(r,{queue:false,duration:e.duration,easing:e.easing,complete:t})}),ue=te.effects.define("size",function(i,t){var e,o,n,r=te(this),s=["fontSize"],a=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],l=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=i.mode,u=c!=="effect",d=i.scale||"both",h=i.origin||["middle","center"],f=r.css("position"),p=r.position(),m=te.effects.scaledDimensions(r),g=i.from||m,v=i.to||te.effects.scaledDimensions(r,0);te.effects.createPlaceholder(r);if(c==="show"){n=g;g=v;v=n}o={from:{y:g.height/m.height,x:g.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}};if(d==="box"||d==="both"){if(o.from.y!==o.to.y){g=te.effects.setTransition(r,a,o.from.y,g);v=te.effects.setTransition(r,a,o.to.y,v)}if(o.from.x!==o.to.x){g=te.effects.setTransition(r,l,o.from.x,g);v=te.effects.setTransition(r,l,o.to.x,v)}}if(d==="content"||d==="both")if(o.from.y!==o.to.y){g=te.effects.setTransition(r,s,o.from.y,g);v=te.effects.setTransition(r,s,o.to.y,v)}if(h){e=te.effects.getBaseline(h,m);g.top=(m.outerHeight-g.outerHeight)*e.y+p.top;g.left=(m.outerWidth-g.outerWidth)*e.x+p.left;v.top=(m.outerHeight-v.outerHeight)*e.y+p.top;v.left=(m.outerWidth-v.outerWidth)*e.x+p.left}delete g.outerHeight;delete g.outerWidth;r.css(g);if(d==="content"||d==="both"){a=a.concat(["marginTop","marginBottom"]).concat(s);l=l.concat(["marginLeft","marginRight"]);r.find("*[width]").each(function(){var e=te(this),t=te.effects.scaledDimensions(e),n={height:t.height*o.from.y,width:t.width*o.from.x,outerHeight:t.outerHeight*o.from.y,outerWidth:t.outerWidth*o.from.x},r={height:t.height*o.to.y,width:t.width*o.to.x,outerHeight:t.height*o.to.y,outerWidth:t.width*o.to.x};if(o.from.y!==o.to.y){n=te.effects.setTransition(e,a,o.from.y,n);r=te.effects.setTransition(e,a,o.to.y,r)}if(o.from.x!==o.to.x){n=te.effects.setTransition(e,l,o.from.x,n);r=te.effects.setTransition(e,l,o.to.x,r)}if(u)te.effects.saveStyle(e);e.css(n);e.animate(r,i.duration,i.easing,function(){if(u)te.effects.restoreStyle(e)})})}r.animate(v,{queue:false,duration:i.duration,easing:i.easing,complete:function(){var e=r.offset();if(v.opacity===0)r.css("opacity",g.opacity);if(!u){r.css("position",f==="static"?"relative":f).offset(e);te.effects.saveStyle(r)}t()}})}),de=te.effects.define("scale",function(e,t){var n=te(this),r=e.mode,i=parseInt(e.percent,10)||(parseInt(e.percent,10)===0?0:r!=="effect"?0:100),o=te.extend(true,{from:te.effects.scaledDimensions(n),to:te.effects.scaledDimensions(n,i,e.direction||"both"),origin:e.origin||["middle","center"]},e);if(e.fade){o.from.opacity=1;o.to.opacity=0}te.effects.effect.size.call(this,o,t)}),he=te.effects.define("puff","hide",function(e,t){var n=te.extend(true,{},e,{fade:true,percent:parseInt(e.percent,10)||150});te.effects.effect.scale.call(this,n,t)}),fe=te.effects.define("pulsate","show",function(e,t){var n=te(this),r=e.mode,i=r==="show",o=r==="hide",s=i||o,a=(e.times||5)*2+(s?1:0),l=e.duration/a,c=0,u=1,d=n.queue().length;if(i||!n.is(":visible")){n.css("opacity",0).show();c=1}for(;u0&&i.is(":visible")}if(/^(input|select|textarea|button|object)$/.test(a)){o=!e.disabled;if(o){s=te(e).closest("fieldset")[0];if(s)o=!s.disabled}}else if("a"===a)o=e.href||t;else o=t;return o&&te(e).is(":visible")&&ve(te(e))},te.extend(te.expr.pseudos,{focusable:function(e){return te.ui.focusable(e,te.attr(e,"tabindex")!=null)}});var be=te.ui.focusable,ye=te.fn._form=function(){return typeof this[0].form==="string"?this.closest("form"):te(this[0].form)},_e=te.ui.formResetMixin={_formResetHandler:function(){var t=te(this);setTimeout(function(){var e=t.data("ui-form-reset-instances");te.each(e,function(){this.refresh()})})},_bindFormResetHandler:function(){this.form=this.element._form();if(!this.form.length)return;var e=this.form.data("ui-form-reset-instances")||[];if(!e.length)this.form.on("reset.ui-form-reset",this._formResetHandler);e.push(this);this.form.data("ui-form-reset-instances",e)},_unbindFormResetHandler:function(){if(!this.form.length)return;var e=this.form.data("ui-form-reset-instances");e.splice(te.inArray(this,e),1);if(e.length)this.form.data("ui-form-reset-instances",e);else this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}};if(!te.expr.pseudos)te.expr.pseudos=te.expr[":"];if(!te.uniqueSort)te.uniqueSort=te.unique;if(!te.escapeSelector){var we=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;var xe=function(e,t){if(t){if(e==="\0")return"�";return e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" "}return"\\"+e};te.escapeSelector=function(e){return(e+"").replace(we,xe)}}if(!te.fn.even||!te.fn.odd)te.fn.extend({even:function(){return this.filter(function(e){return e%2===0})},odd:function(){return this.filter(function(e){return e%2===1})}});var Ce=te.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},ke=te.fn.labels=function(){var e,t,n,r,i;if(!this.length)return this.pushStack([]);if(this[0].labels&&this[0].labels.length)return this.pushStack(this[0].labels);r=this.eq(0).parents("label");n=this.attr("id");if(n){e=this.eq(0).parents().last();i=e.add(e.length?e.siblings():this.siblings());t="label[for='"+te.escapeSelector(n)+"']";r=r.add(i.find(t).addBack(t))}return this.pushStack(r)},Se=te.fn.scrollParent=function(e){var t=this.css("position"),n=t==="absolute",r=e?/(auto|scroll|hidden)/:/(auto|scroll)/,i=this.parents().filter(function(){var e=te(this);if(n&&e.css("position")==="static")return false;return r.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return t==="fixed"||!i.length?te(this[0].ownerDocument||document):i},De=te.extend(te.expr.pseudos,{tabbable:function(e){var t=te.attr(e,"tabindex"),n=t!=null;return(!n||t>=0)&&te.ui.focusable(e,n)}}),Te=te.fn.extend({uniqueId:function(){var e=0;return function(){return this.each(function(){if(!this.id)this.id="ui-id-"+ ++e})}}(),removeUniqueId:function(){return this.each(function(){if(/^ui-id-\d+$/.test(this.id))te(this).removeAttr("id")})}}),Oe=te.widget("ui.accordion",{version:"1.13.2",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:false,event:"click",header:function(e){return e.find("> li > :first-child").add(e.find("> :not(li)").even())},heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=te();this._addClass("ui-accordion","ui-widget ui-helper-reset");this.element.attr("role","tablist");if(!e.collapsible&&(e.active===false||e.active==null))e.active=0;this._processPanels();if(e.active<0)e.active+=this.headers.length;this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:!this.active.length?te():this.active.next()}},_createIcons:function(){var e,t,n=this.options.icons;if(n){e=te("");this._addClass(e,"ui-accordion-header-icon","ui-icon "+n.header);e.prependTo(this.headers);t=this.active.children(".ui-accordion-header-icon");this._removeClass(t,n.header)._addClass(t,null,n.activeHeader)._addClass(this.headers,"ui-accordion-icons")}},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons");this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeAttr("role");this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId();this._destroyIcons();e=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId();if(this.options.heightStyle!=="content")e.css("height","")},_setOption:function(e,t){if(e==="active"){this._activate(t);return}if(e==="event"){if(this.options.event)this._off(this.headers,this.options.event);this._setupEvents(t)}this._super(e,t);if(e==="collapsible"&&!t&&this.options.active===false)this._activate(0);if(e==="icons"){this._destroyIcons();if(t)this._createIcons()}},_setOptionDisabled:function(e){this._super(e);this.element.attr("aria-disabled",e);this._toggleClass(null,"ui-state-disabled",!!e);this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!e)},_keydown:function(e){if(e.altKey||e.ctrlKey)return;var t=te.ui.keyCode,n=this.headers.length,r=this.headers.index(e.target),i=false;switch(e.keyCode){case t.RIGHT:case t.DOWN:i=this.headers[(r+1)%n];break;case t.LEFT:case t.UP:i=this.headers[(r-1+n)%n];break;case t.SPACE:case t.ENTER:this._eventHandler(e);break;case t.HOME:i=this.headers[0];break;case t.END:i=this.headers[n-1];break}if(i){te(e.target).attr("tabIndex",-1);te(i).attr("tabIndex",0);te(i).trigger("focus");e.preventDefault()}},_panelKeyDown:function(e){if(e.keyCode===te.ui.keyCode.UP&&e.ctrlKey)te(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels();if(e.active===false&&e.collapsible===true||!this.headers.length){e.active=false;this.active=te()}else if(e.active===false)this._activate(0);else if(this.active.length&&!te.contains(this.element[0],this.active[0]))if(this.headers.length===this.headers.find(".ui-state-disabled").length){e.active=false;this.active=te()}else this._activate(Math.max(0,e.active-1));else e.active=this.headers.index(this.active);this._destroyIcons();this._refresh()},_processPanels:function(){var e=this.headers,t=this.panels;if(typeof this.options.header==="function")this.headers=this.options.header(this.element);else this.headers=this.element.find(this.options.header);this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default");this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide();this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content");if(t){this._off(e.not(this.headers));this._off(t.not(this.panels))}},_refresh:function(){var n,e=this.options,t=e.heightStyle,r=this.element.parent();this.active=this._findActive(e.active);this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed");this._addClass(this.active.next(),"ui-accordion-content-active");this.active.next().show();this.headers.attr("role","tab").each(function(){var e=te(this),t=e.uniqueId().attr("id"),n=e.next(),r=n.uniqueId().attr("id");e.attr("aria-controls",r);n.attr("aria-labelledby",t)}).next().attr("role","tabpanel");this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide();if(!this.active.length)this.headers.eq(0).attr("tabIndex",0);else this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"});this._createIcons();this._setupEvents(e.event);if(t==="fill"){n=r.height();this.element.siblings(":visible").each(function(){var e=te(this),t=e.css("position");if(t==="absolute"||t==="fixed")return;n-=e.outerHeight(true)});this.headers.each(function(){n-=te(this).outerHeight(true)});this.headers.next().each(function(){te(this).height(Math.max(0,n-te(this).innerHeight()+te(this).height()))}).css("overflow","auto")}else if(t==="auto"){n=0;this.headers.next().each(function(){var e=te(this).is(":visible");if(!e)te(this).show();n=Math.max(n,te(this).css("height","").height());if(!e)te(this).hide()}).height(n)}},_activate:function(e){var t=this._findActive(e)[0];if(t===this.active[0])return;t=t||this.active[0];this._eventHandler({target:t,currentTarget:t,preventDefault:te.noop})},_findActive:function(e){return typeof e==="number"?this.headers.eq(e):te()},_setupEvents:function(e){var n={keydown:"_keydown"};if(e)te.each(e.split(" "),function(e,t){n[t]="_eventHandler"});this._off(this.headers.add(this.headers.next()));this._on(this.headers,n);this._on(this.headers.next(),{keydown:"_panelKeyDown"});this._hoverable(this.headers);this._focusable(this.headers)},_eventHandler:function(e){var t,n,r=this.options,i=this.active,o=te(e.currentTarget),s=o[0]===i[0],a=s&&r.collapsible,l=a?te():o.next(),c=i.next(),u={oldHeader:i,oldPanel:c,newHeader:a?te():o,newPanel:l};e.preventDefault();if(s&&!r.collapsible||this._trigger("beforeActivate",e,u)===false)return;r.active=a?false:this.headers.index(o);this.active=s?te():o;this._toggle(u);this._removeClass(i,"ui-accordion-header-active","ui-state-active");if(r.icons){t=i.children(".ui-accordion-header-icon");this._removeClass(t,null,r.icons.activeHeader)._addClass(t,null,r.icons.header)}if(!s){this._removeClass(o,"ui-accordion-header-collapsed")._addClass(o,"ui-accordion-header-active","ui-state-active");if(r.icons){n=o.children(".ui-accordion-header-icon");this._removeClass(n,null,r.icons.header)._addClass(n,null,r.icons.activeHeader)}this._addClass(o.next(),"ui-accordion-content-active")}},_toggle:function(e){var t=e.newPanel,n=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(true,true);this.prevShow=t;this.prevHide=n;if(this.options.animate)this._animate(t,n,e);else{n.hide();t.show();this._toggleComplete(e)}n.attr({"aria-hidden":"true"});n.prev().attr({"aria-selected":"false","aria-expanded":"false"});if(t.length&&n.length)n.prev().attr({tabIndex:-1,"aria-expanded":"false"});else if(t.length)this.headers.filter(function(){return parseInt(te(this).attr("tabIndex"),10)===0}).attr("tabIndex",-1);t.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(e,n,t){var r,i,o,s=this,a=0,l=e.css("box-sizing"),c=e.length&&(!n.length||e.index()",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element;this.mouseHandled=false;this.lastMousePosition={x:null,y:null};this.element.uniqueId().attr({role:this.options.role,tabIndex:0});this._addClass("ui-menu","ui-widget ui-widget-content");this._on({"mousedown .ui-menu-item":function(e){e.preventDefault();this._activateItem(e)},"click .ui-menu-item":function(e){var t=te(e.target);var n=te(te.ui.safeActiveElement(this.document[0]));if(!this.mouseHandled&&t.not(".ui-state-disabled").length){this.select(e);if(!e.isPropagationStopped())this.mouseHandled=true;if(t.has(".ui-menu").length)this.expand(e);else if(!this.element.is(":focus")&&n.closest(".ui-menu").length){this.element.trigger("focus",[true]);if(this.active&&this.active.parents(".ui-menu").length===1)clearTimeout(this.timer)}}},"mouseenter .ui-menu-item":"_activateItem","mousemove .ui-menu-item":"_activateItem",mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var n=this.active||this._menuItems().first();if(!t)this.focus(e,n)},blur:function(t){this._delay(function(){var e=!te.contains(this.element[0],te.ui.safeActiveElement(this.document[0]));if(e)this.collapseAll(t)})},keydown:"_keydown"});this.refresh();this._on(this.document,{click:function(e){if(this._closeOnDocumentClick(e))this.collapseAll(e,true);this.mouseHandled=false}})},_activateItem:function(e){if(this.previousFilter)return;if(e.clientX===this.lastMousePosition.x&&e.clientY===this.lastMousePosition.y)return;this.lastMousePosition={x:e.clientX,y:e.clientY};var t=te(e.target).closest(".ui-menu-item"),n=te(e.currentTarget);if(t[0]!==n[0])return;if(n.is(".ui-state-active"))return;this._removeClass(n.siblings().children(".ui-state-active"),null,"ui-state-active");this.focus(e,n)},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),t=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled "+"tabIndex").removeUniqueId().show();t.children().each(function(){var e=te(this);if(e.data("ui-menu-submenu-caret"))e.remove()})},_keydown:function(e){var t,n,r,i,o=true;switch(e.keyCode){case te.ui.keyCode.PAGE_UP:this.previousPage(e);break;case te.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case te.ui.keyCode.HOME:this._move("first","first",e);break;case te.ui.keyCode.END:this._move("last","last",e);break;case te.ui.keyCode.UP:this.previous(e);break;case te.ui.keyCode.DOWN:this.next(e);break;case te.ui.keyCode.LEFT:this.collapse(e);break;case te.ui.keyCode.RIGHT:if(this.active&&!this.active.is(".ui-state-disabled"))this.expand(e);break;case te.ui.keyCode.ENTER:case te.ui.keyCode.SPACE:this._activate(e);break;case te.ui.keyCode.ESCAPE:this.collapse(e);break;default:o=false;n=this.previousFilter||"";i=false;r=e.keyCode>=96&&e.keyCode<=105?(e.keyCode-96).toString():String.fromCharCode(e.keyCode);clearTimeout(this.filterTimer);if(r===n)i=true;else r=n+r;t=this._filterMenuItems(r);t=i&&t.index(this.active.next())!==-1?this.active.nextAll(".ui-menu-item"):t;if(!t.length){r=String.fromCharCode(e.keyCode);t=this._filterMenuItems(r)}if(t.length){this.focus(e,t);this.previousFilter=r;this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)}else delete this.previousFilter}if(o)e.preventDefault()},_activate:function(e){if(this.active&&!this.active.is(".ui-state-disabled"))if(this.active.children("[aria-haspopup='true']").length)this.expand(e);else this.select(e)},refresh:function(){var e,t,n,r,i,o=this,s=this.options.icons.submenu,a=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length);n=a.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=te(this),t=e.prev(),n=te("").data("ui-menu-submenu-caret",true);o._addClass(n,"ui-menu-icon","ui-icon "+s);t.attr("aria-haspopup","true").prepend(n);e.attr("aria-labelledby",t.attr("id"))});this._addClass(n,"ui-menu","ui-widget ui-widget-content ui-front");e=a.add(this.element);t=e.find(this.options.items);t.not(".ui-menu-item").each(function(){var e=te(this);if(o._isDivider(e))o._addClass(e,"ui-menu-divider","ui-widget-content")});r=t.not(".ui-menu-item, .ui-menu-divider");i=r.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()});this._addClass(r,"ui-menu-item")._addClass(i,"ui-menu-item-wrapper");t.filter(".ui-state-disabled").attr("aria-disabled","true");if(this.active&&!te.contains(this.element[0],this.active[0]))this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){if(e==="icons"){var n=this.element.find(".ui-menu-icon");this._removeClass(n,null,this.options.icons.submenu)._addClass(n,null,t.submenu)}this._super(e,t)},_setOptionDisabled:function(e){this._super(e);this.element.attr("aria-disabled",String(e));this._toggleClass(null,"ui-state-disabled",!!e)},focus:function(e,t){var n,r,i;this.blur(e,e&&e.type==="focus");this._scrollIntoView(t);this.active=t.first();r=this.active.children(".ui-menu-item-wrapper");this._addClass(r,null,"ui-state-active");if(this.options.role)this.element.attr("aria-activedescendant",r.attr("id"));i=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper");this._addClass(i,null,"ui-state-active");if(e&&e.type==="keydown")this._close();else this.timer=this._delay(function(){this._close()},this.delay);n=t.children(".ui-menu");if(n.length&&e&&/^mouse/.test(e.type))this._startOpening(n);this.activeMenu=t.parent();this._trigger("focus",e,{item:t})},_scrollIntoView:function(e){var t,n,r,i,o,s;if(this._hasScroll()){t=parseFloat(te.css(this.activeMenu[0],"borderTopWidth"))||0;n=parseFloat(te.css(this.activeMenu[0],"paddingTop"))||0;r=e.offset().top-this.activeMenu.offset().top-t-n;i=this.activeMenu.scrollTop();o=this.activeMenu.height();s=e.outerHeight();if(r<0)this.activeMenu.scrollTop(i+r);else if(r+s>o)this.activeMenu.scrollTop(i+r-o+s)}},blur:function(e,t){if(!t)clearTimeout(this.timer);if(!this.active)return;this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active");this._trigger("blur",e,{item:this.active});this.active=null},_startOpening:function(e){clearTimeout(this.timer);if(e.attr("aria-hidden")!=="true")return;this.timer=this._delay(function(){this._close();this._open(e)},this.delay)},_open:function(e){var t=te.extend({of:this.active},this.options.position);clearTimeout(this.timer);this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true");e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(t)},collapseAll:function(t,n){clearTimeout(this.timer);this.timer=this._delay(function(){var e=n?this.element:te(t&&t.target).closest(this.element.find(".ui-menu"));if(!e.length)e=this.element;this._close(e);this.blur(t);this._removeClass(e.find(".ui-state-active"),null,"ui-state-active");this.activeMenu=e},n?0:this.delay)},_close:function(e){if(!e)e=this.active?this.active.parent():this.element;e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!te(e.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);if(t&&t.length){this._close();this.focus(e,t)}},expand:function(e){var t=this.active&&this._menuItems(this.active.children(".ui-menu")).first();if(t&&t.length){this._open(t.parent());this._delay(function(){this.focus(e,t)})}},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_menuItems:function(e){return(e||this.element).find(this.options.items).filter(".ui-menu-item")},_move:function(e,t,n){var r;if(this.active)if(e==="first"||e==="last")r=this.active[e==="first"?"prevAll":"nextAll"](".ui-menu-item").last();else r=this.active[e+"All"](".ui-menu-item").first();if(!r||!r.length||!this.active)r=this._menuItems(this.activeMenu)[t]();this.focus(n,r)},nextPage:function(e){var t,n,r;if(!this.active){this.next(e);return}if(this.isLastItem())return;if(this._hasScroll()){n=this.active.offset().top;r=this.element.innerHeight();if(te.fn.jquery.indexOf("3.2.")===0)r+=this.element[0].offsetHeight-this.element.outerHeight();this.active.nextAll(".ui-menu-item").each(function(){t=te(this);return t.offset().top-n-r<0});this.focus(e,t)}else this.focus(e,this._menuItems(this.activeMenu)[!this.active?"first":"last"]())},previousPage:function(e){var t,n,r;if(!this.active){this.next(e);return}if(this.isFirstItem())return;if(this._hasScroll()){n=this.active.offset().top;r=this.element.innerHeight();if(te.fn.jquery.indexOf("3.2.")===0)r+=this.element[0].offsetHeight-this.element.outerHeight();this.active.prevAll(".ui-menu-item").each(function(){t=te(this);return t.offset().top-n+r>0});this.focus(e,t)}else this.focus(e,this._menuItems(this.activeMenu).first())},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,liveRegionTimer:null,_create:function(){var n,r,i,e=this.element[0].nodeName.toLowerCase(),t=e==="textarea",o=e==="input";this.isMultiLine=t||!o&&this._isContentEditable(this.element);this.valueMethod=this.element[t||o?"val":"text"];this.isNewMenu=true;this._addClass("ui-autocomplete-input");this.element.attr("autocomplete","off");this._on(this.element,{keydown:function(e){if(this.element.prop("readOnly")){n=true;i=true;r=true;return}n=false;i=false;r=false;var t=te.ui.keyCode;switch(e.keyCode){case t.PAGE_UP:n=true;this._move("previousPage",e);break;case t.PAGE_DOWN:n=true;this._move("nextPage",e);break;case t.UP:n=true;this._keyEvent("previous",e);break;case t.DOWN:n=true;this._keyEvent("next",e);break;case t.ENTER:if(this.menu.active){n=true;e.preventDefault();this.menu.select(e)}break;case t.TAB:if(this.menu.active)this.menu.select(e);break;case t.ESCAPE:if(this.menu.element.is(":visible")){if(!this.isMultiLine)this._value(this.term);this.close(e);e.preventDefault()}break;default:r=true;this._searchTimeout(e);break}},keypress:function(e){if(n){n=false;if(!this.isMultiLine||this.menu.element.is(":visible"))e.preventDefault();return}if(r)return;var t=te.ui.keyCode;switch(e.keyCode){case t.PAGE_UP:this._move("previousPage",e);break;case t.PAGE_DOWN:this._move("nextPage",e);break;case t.UP:this._keyEvent("previous",e);break;case t.DOWN:this._keyEvent("next",e);break}},input:function(e){if(i){i=false;e.preventDefault();return}this._searchTimeout(e)},focus:function(){this.selectedItem=null;this.previous=this._value()},blur:function(e){clearTimeout(this.searching);this.close(e);this._change(e)}});this._initSource();this.menu=te("