diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0b43490
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+output
+__pycache__
+*.pid
+*.pid
+*.pyc
+*~
diff --git a/README.md b/README.md
index 3a295f2..d963ea3 100644
--- a/README.md
+++ b/README.md
@@ -4,3 +4,11 @@ phschoen.de
install requirements:
pip install -r requirements.txt
+
+resize images
+
+ make img
+
+start devserver
+
+ make devserver
diff --git a/content/pages/about.md b/content/pages/about.md
new file mode 100644
index 0000000..d69c548
--- /dev/null
+++ b/content/pages/about.md
@@ -0,0 +1,46 @@
+title: About me
+date: 2013-03-25 10:20
+authors: Philipp Schönberger
+url: about.html
+save_as: about.html
+
+## Personal Links ##
+
+
+[github](https://www.github.com/phschoen)
+[linkedin](https://www.linkedin.com/in/phschoen)
+[xing](https://www.xing.com/profile/Philipp_Schoenberger5)
+[stackoverflow](https://stackoverflow.com/users/1016564)
+
+## Contact Details ##
+
+Email: mail@phschoen.de
+Address: Check the WHOIS record.
+
+## Press ##
+
+| year | article |
+|------|---------|
+| 2019 | [Loeten-bis-zum-Abheben-So-bauen-Maedchen-in-Markdorf-einen-flugfaehigen-Quadrocopter](https://www.suedkurier.de/region/bodenseekreis/markdorf/Loeten-bis-zum-Abheben-So-bauen-Maedchen-in-Markdorf-einen-flugfaehigen-Quadrocopter;art372484,10125455) |
+| 2019 | [Vier Mädchen bauen ein Fluggerät](https://www.schwaebische.de/landkreis/bodenseekreis/markdorf_artikel,-vier-m%C3%A4dchen-bauen-ein-flugger%C3%A4t-_arid,11042245.html) |
+
+
+## Interests ##
+
+photography,
+programming,
+3d printing and CAD,
+electrical engeneering,
+gardening,
+
+## CV ##
+
+| year | working title |
+|-------------------|------------------------------------------------------|
+| 01/2018 - now | embedded software architect - employee |
+| 07/2015 - 12/2017 | embedded Linux engineer - employee |
+| 03/2014 - 05/2016 | embedded Linux engineer - working student & employee |
+| 05/2013 - 09/2013 | embedded Linux engineer - employee |
+| 01/2013 - 04/2013 | embedded Linux engineer - bachelor thesis |
+| 07/2012 - 12/2012 | embedded Linux engineer - working student |
+| 09/2011 - 03/2012 | embedded Linux engineer - intern |
diff --git a/content/pages/gallery/index.md b/content/pages/gallery/index.md
new file mode 100644
index 0000000..0c6726b
--- /dev/null
+++ b/content/pages/gallery/index.md
@@ -0,0 +1,26 @@
+title: Gallery
+author: Philipp Schönberger
+url: gallery/index.html
+save_as: gallery/index.html
+template: page
+
+Here you find latest pictures i am willing to share. Enjoy the views.
+
+
+[lightgallery
+ /images/gallery/IMG_3184.jpg, Neighbour cat ;
+ /images/gallery/IMG_3364.jpg, Steinhummel an der Kornblume ;
+ /images/gallery/IMG_3386.jpg, Gartenhummel an der Kornblume ;
+ /images/gallery/IMG_3414.jpg, Gartenhummel an der Kornblume ;
+ /images/gallery/IMG_3477.jpg ;
+ /images/gallery/IMG_3483.jpg, Distel ;
+ /images/gallery/IMG_3559.jpg, Windrose in Blüte ;
+ /images/gallery/IMG_8722.jpg, Dänische Südseehaus ;
+ /images/gallery/IMG_9037.jpg, Fisherman Sailingboat ;
+ /images/gallery/IMG_9097.jpg, Sailingboat ;
+ /images/gallery/IMG_9136.jpg, Sunrise in Denmark ;
+ /images/gallery/IMG_9137.jpg, Sunrise in Denmark ;
+ /images/gallery/IMG_9393.jpg, Harbour Grömitz at night;
+lightgalleryend]
+
+this is some gallery:
diff --git a/content/pages/impressum.md b/content/pages/impressum.md
new file mode 100644
index 0000000..03f845d
--- /dev/null
+++ b/content/pages/impressum.md
@@ -0,0 +1,24 @@
+title: Impressum
+authors: Philipp Schönberger
+url: impressum.html
+save_as: impressum.html
+
+Haftungsausschluss (Disclaimer)
+Haftung für Inhalte
+
+Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen.
+
+Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.
+Haftung für Links
+
+Unser Angebot enthält Links zu externen Websites Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar.
+
+Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.
+Urheberrecht
+
+Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet.
+
+Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.
+
+Quelle: http://www.e-recht24.de
+
diff --git a/content/pages/index.md b/content/pages/index.md
new file mode 100644
index 0000000..0fe4a73
--- /dev/null
+++ b/content/pages/index.md
@@ -0,0 +1,21 @@
+title: home
+author: Philipp Schönberger
+url: index.html
+save_as: index.html
+template: page
+
+Welcome to my webpage.
+
+It contains things I work or worked on and lot of other things I had fun with.
+
+I’m Philipp Schönberger born in in Zeitz(Germany) within the 1988.
+In Constance I made my bachelor degree within ‘computer engineering‘.
+Afterwards I absolved my master degree within the ‘robotics and intelligent embedded systems‘ in Lübeck.
+Currently I am employed as software engineer/architect for a satellite aided router in Germany near the Lake Constance.
+
+Enjoy your stay.
+
+## Contact ##
+
+* Email: mail@phschoen.de
+* Address: Check the WHOIS record.
diff --git a/content/pages/projects/01_3d_printer.md b/content/pages/projects/01_3d_printer.md
new file mode 100644
index 0000000..938482c
--- /dev/null
+++ b/content/pages/projects/01_3d_printer.md
@@ -0,0 +1,11 @@
+title: Projects
+date: 2019-05-20
+author: Philipp Schönberger
+slug: 3d_printer_en
+template: page
+category: projects
+url: projects/01_3d_printer.html
+save_as: projects/01_3d_printer.html
+
+Here you can view the.. latest projects i've started.
+
diff --git a/content/pages/projects/projects.md b/content/pages/projects/projects.md
new file mode 100644
index 0000000..d9e295b
--- /dev/null
+++ b/content/pages/projects/projects.md
@@ -0,0 +1,13 @@
+title: Projects
+date: 2019-05-20
+author: Philipp Schönberger
+slug: projects
+category: projects
+url: projects/index.html
+save_as: projects/index.html
+
+Here you can view the latest projects i've started.
+
+This page contains tutorials, rough drafts I work on. The articles in here aren't necessarily finished and some of them aren't open to discussion, because they are work in progress (or chaos). Some of them might be turned into self-contained blog posts, some of them will never get out of this dungeon.
+
+
diff --git a/develop_server.sh b/develop_server.sh
new file mode 100755
index 0000000..9e92dc5
--- /dev/null
+++ b/develop_server.sh
@@ -0,0 +1,109 @@
+#!/usr/bin/env bash
+##
+# This section should match your Makefile
+##
+IS_UBUNTU_1404=$(lsb_release -r | grep 14.04 > /dev/null && echo yes || echo no)
+echo is damn old ubuntu $IS_UBUNTU_1404
+if [[ "$IS_UBUNTU_1404" == "yes" ]]
+then
+ PY=python2.7
+else
+ PY=python3
+fi
+echo $PY
+
+PELICAN=pelican
+PELICANOPTS=
+
+BASEDIR=$(pwd)
+INPUTDIR=$BASEDIR/content
+OUTPUTDIR=$BASEDIR/output
+CONFFILE=$BASEDIR/pelicanconf.py
+
+###
+# Don't change stuff below here unless you are sure
+###
+
+SRV_PID=$BASEDIR/srv.pid
+PELICAN_PID=$BASEDIR/pelican.pid
+
+function usage(){
+ echo "usage: $0 (stop) (start) (restart)"
+ echo "This starts pelican in debug and reload mode and then launches"
+ echo "A pelican.server to help site development. It doesn't read"
+ echo "your pelican options so you edit any paths in your Makefile"
+ echo "you will need to edit it as well"
+ exit 3
+}
+
+function alive() {
+ kill -0 $1 >/dev/null 2>&1
+}
+
+function shut_down(){
+ PID=$(cat $SRV_PID)
+ if [[ $? -eq 0 ]]; then
+ if alive $PID; then
+ echo "Killing pelican.server"
+ kill $PID
+ else
+ echo "Stale PID, deleting"
+ fi
+ rm $SRV_PID
+ else
+ echo "pelican.server PIDFile not found"
+ fi
+
+ PID=$(cat $PELICAN_PID)
+ if [[ $? -eq 0 ]]; then
+ if alive $PID; then
+ echo "Killing Pelican"
+ kill $PID
+ else
+ echo "Stale PID, deleting"
+ fi
+ rm $PELICAN_PID
+ else
+ echo "Pelican PIDFile not found"
+ fi
+}
+
+function start_up(){
+ echo "Starting up Pelican and pelican.server"
+ shift
+ mkdir -p $(OUTPUTDIR)
+ $PELICAN --debug --autoreload -r $INPUTDIR -o $OUTPUTDIR -s $CONFFILE $PELICANOPTS &
+ pelican_pid=$!
+ echo $pelican_pid > $PELICAN_PID
+ cd $OUTPUTDIR
+ $PY -m pelican.server &
+ srv_pid=$!
+ echo $srv_pid > $SRV_PID
+ cd $BASEDIR
+ sleep 1
+ if ! alive $pelican_pid ; then
+ echo "Pelican didn't start. Is the pelican package installed?"
+ return 1
+ elif ! alive $srv_pid ; then
+ echo "pelican.server didn't start. Is the pelican package installed?"
+ return 1
+ fi
+ echo 'Pelican and pelican.server processes now running in background.'
+}
+
+###
+# MAIN
+###
+[[ $# -ne 1 ]] && usage
+if [[ $1 == "stop" ]]; then
+ shut_down
+elif [[ $1 == "restart" ]]; then
+ shut_down
+ start_up
+elif [[ $1 == "start" ]]; then
+ if ! start_up; then
+ shut_down
+ fi
+else
+ usage
+fi
diff --git a/pelicanconf.py b/pelicanconf.py
new file mode 100644
index 0000000..eac4b16
--- /dev/null
+++ b/pelicanconf.py
@@ -0,0 +1,175 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*- #
+
+# Probably replace those with simpler methods:
+from __future__ import unicode_literals
+from operator import itemgetter, methodcaller
+
+AUTHOR = 'Philipp Schönberger'
+EMAIL = 'mail AT phschoen.de'
+SITENAME = 'https://phschoen.de'
+OUTPUT_PATH = 'output/DEV/'
+
+# Base URL this page is hosted at:
+SITENAME = 'phschoen.de'
+# SITEURL = 'http://skylx125.ndsatcom.com:8000'
+SITEURL = 'http://localhost:8000'
+
+# Timezone is GMT+1:
+TIMEZONE = 'Europe/Paris'
+# Using a simple date format:
+DEFAULT_DATE_FORMAT = ('%d %b %Y')
+DEFAULT_LANG = 'en'
+DATE_FORMATS = {
+ 'en': '%-d/%b/%Y',
+ 'de': '%-d/%-m/%Y',
+}
+LOCALE = ('usa', 'de', # On Windows
+ 'en_US', 'de_DE' # On Unix/Linux
+ )
+
+# We are using the custom minimal theme:
+THEME = 'themes/minimal'
+# THEME = 'themes/pelican-chunk'
+#THEME = 'themes/pelican-themes/bootstrap4-standard'
+
+DELETE_OUTPUT_DIRECTORY = True
+# MARKUP = ('md',)
+# # Markdown Configuration:
+# MARKDOWN = {
+# 'extension_configs': {
+# 'markdown.extensions.codehilite': {'css_class': 'highlight'},
+# 'markdown.extensions.toc' : {},
+# 'markdown.extensions.extra': {},
+# 'markdown.extensions.meta': {},
+# },
+# 'output_format': 'html5',
+# }
+# We don't use relative URLs:
+RELATIVE_URLS = False
+
+# Edit predefined pathes:
+ARCHIVES_SAVE_AS = 'pages/index.html'
+
+# Generates nice URLs for pages:
+PAGE_URL = '{slug}'
+PAGE_SAVE_AS = '{slug}/index.html'
+
+# Generate nice URLs for articles:
+ARTICLE_EXCLUDES = (('pages',))
+ARTICLE_URL = 'blog/{slug}'
+ARTICLE_SAVE_AS = 'blog/{slug}/index.html'
+
+# Generate nice URLs for tags:
+TAG_URL = 'tag/{name}/'
+TAG_SAVE_AS = 'tag/{name}/index.html'
+TAGS_SAVE_AS = 'tags/index.html'
+
+# Generate nice URLs for categories:
+CATEGORY_URL = 'category/{name}/'
+CATEGORY_SAVE_AS = 'category/{name}/index.html'
+
+# Setup the RSS/ATOM feeds:
+FEED_DOMAIN = SITEURL
+FEED_MAX_ITEMS = 10
+# We only want RSS/ATOM Feeds for all articles, exclude categories:
+FEED_RSS = 'feeds/rss.xml'
+TAG_FEED_RSS = 'feeds/{slug}.rss.xml'
+CATEGORY_FEED_RSS = None
+
+# Feed generation is usually not desired when developing
+FEED_ATOM = 'feeds/atom.xml'
+FEED_ALL_ATOM = None
+TAG_FEED_ATOM = None
+CATEGORY_FEED_ATOM = None
+TRANSLATION_FEED_ATOM = None
+
+
+# Separate page directory and articles directory:
+PAGE_PATHS = ['pages']
+ARTICLE_PATHS = ['blog']
+
+# Save index as blog/index.html instead of index.html:
+INDEX_SAVE_AS = 'blog/index.html'
+
+# Navigation menu:
+SECTIONS = [('blog', '/blog'),
+ ('Projects', '/projects'),
+ ('Gallery', '/gallery'),
+ ('about', '/about'),
+ ('Impressum', '/impressum'),
+ ]
+
+# Links to display in the footer:
+LINKS = [('bsd', 'http://www.opensource.org/licenses/BSD-3-Clause'),
+ ('xhtml', 'http://validator.w3.org/check/referer'),
+ ('css3', 'http://jigsaw.w3.org/css-validator/check/referer?profile=css'),
+ ('pelican', 'https://github.com/getpelican'),
+ ]
+
+# Set some default category:
+DEFAULT_CATEGORY = 'uncategorized'
+
+# Social widget
+# SOCIAL = (('You can add links in your config file', '#'),
+# ('Another social link', '#'),)
+
+# DEFAULT_PAGINATION = 10
+
+PLUGIN_PATHS = ['plugins', ]
+PLUGINS = ['lightgallery', 'i18n_subsites']
+# PLUGIN_PATHS = ['./pelican-plugins/', ]
+
+# PLUGINS = ['i18n_subsites', ]
+# JINJA_ENVIRONMENT = {
+# 'extensions': ['jinja2.ext.i18n'],
+# }
+
+
+GITHUB_SOURCE_PATH = "wooot"
+
+I18N_SUBSITES = {'en': {'SITENAME': 'phschoen.com',
+ },
+ 'de': {'SITENAME': 'phschoen.de',
+ },
+ }
+
+languages_lookup = {'en': 'English',
+ 'de': 'Deutsch',
+ }
+
+
+def lookup_lang_name(lang_code):
+ return languages_lookup[lang_code]
+
+
+def getGitHubPage(source_file):
+ filename = getBasename(source_file)
+ return '{0}/{1}'.format(GITHUB_SOURCE_PATH, filename)
+
+
+def getBasename(path):
+ return "name "
+
+
+def month_name(month_number):
+ return "month_name"
+
+
+def sortTupleByIndex(items, index=0, reverse=True):
+ return sorted(items, key=lambda tup: len(tup[index]), reverse=reverse)
+
+
+def sortDictByKey(items, key, reverse=True, default=None):
+ if default is None:
+ return sorted(items, key=itemgetter(key), reverse=reverse)
+ return sorted(items, key=methodcaller('get', key, default), reverse=reverse)
+
+
+JINJA_FILTERS = {'month_name': month_name,
+ 'sortTupleByIndex': sortTupleByIndex,
+ 'sortDictByKey': sortDictByKey,
+ 'basename': getBasename,
+ 'asGitHubPage': getGitHubPage,
+ 'lookup_lang_name': lookup_lang_name,
+ }
diff --git a/plugins/i18n_subsites/README.rst b/plugins/i18n_subsites/README.rst
new file mode 100644
index 0000000..340109b
--- /dev/null
+++ b/plugins/i18n_subsites/README.rst
@@ -0,0 +1,165 @@
+=======================
+ I18N Sub-sites Plugin
+=======================
+
+This plugin extends the translations functionality by creating
+internationalized sub-sites for the default site.
+
+This plugin is designed for Pelican 3.4 and later.
+
+What it does
+============
+
+1. When the content of the main site is being generated, the settings
+ are saved and the generation stops when content is ready to be
+ written. While reading source files and generating content objects,
+ the output queue is modified in certain ways:
+
+ - translations that will appear as native in a different (sub-)site
+ will be removed
+ - untranslated articles will be transformed to drafts if
+ ``I18N_UNTRANSLATED_ARTICLES`` is ``'hide'`` (default), removed if
+ ``'remove'`` or kept as they are if ``'keep'``.
+ - untranslated pages will be transformed into hidden pages if
+ ``I18N_UNTRANSLATED_PAGES`` is ``'hide'`` (default), removed if
+ ``'remove'`` or kept as they are if ``'keep'``.''
+ - additional content manipulation similar to articles and pages can
+ be specified for custom generators in the ``I18N_GENERATOR_INFO``
+ setting.
+
+2. For each language specified in the ``I18N_SUBSITES`` dictionary the
+ settings overrides are applied to the settings from the main site
+ and a new sub-site is generated in the same way as with the main
+ site until content is ready to be written.
+3. When all (sub-)sites are waiting for content writing, all removed
+ contents, translations and static files are interlinked across the
+ (sub-)sites.
+4. Finally, all the output is written.
+
+Setting it up
+=============
+
+For each extra used language code, a language-specific settings overrides
+dictionary must be given (but can be empty) in the ``I18N_SUBSITES`` dictionary
+
+.. code-block:: python
+
+ PLUGINS = ['i18n_subsites', ...]
+
+ # mapping: language_code -> settings_overrides_dict
+ I18N_SUBSITES = {
+ 'cz': {
+ 'SITENAME': 'Hezkej blog',
+ }
+ }
+
+You must also have the following in your pelican configuration
+
+.. code-block:: python
+ JINJA_ENVIRONMENT = {
+ 'extensions': ['jinja2.ext.i18n'],
+ }
+
+
+
+Default and special overrides
+-----------------------------
+The settings overrides may contain arbitrary settings, however, there
+are some that are handled in a special way:
+
+``SITEURL``
+ Any overrides to this setting should ensure that there is some level
+ of hierarchy between all (sub-)sites, because Pelican makes all URLs
+ relative to ``SITEURL`` and the plugin can only cross-link between
+ the sites using this hierarchy. For instance, with the main site
+ ``http://example.com`` a sub-site ``http://example.com/de`` will
+ work, but ``http://de.example.com`` will not. If not overridden, the
+ language code (the language identifier used in the ``lang``
+ metadata) is appended to the main ``SITEURL`` for each sub-site.
+``OUTPUT_PATH``, ``CACHE_PATH``
+ If not overridden, the language code is appended as with ``SITEURL``.
+ Separate cache paths are required as parser results depend on the locale.
+``STATIC_PATHS``, ``THEME_STATIC_PATHS``
+ If not overridden, they are set to ``[]`` and all links to static
+ files are cross-linked to the main site.
+``THEME``, ``THEME_STATIC_DIR``
+ If overridden, the logic with ``THEME_STATIC_PATHS`` does not apply.
+``DEFAULT_LANG``
+ This should not be overridden as the plugin changes it to the
+ language code of each sub-site to change what is perceived as translations.
+
+Localizing templates
+--------------------
+
+Most importantly, this plugin can use localized templates for each
+sub-site. There are two approaches to having the templates localized:
+
+- You can set a different ``THEME`` override for each language in
+ ``I18N_SUBSITES``, e.g. by making a copy of a theme ``my_theme`` to
+ ``my_theme_lang`` and then editing the templates in the new
+ localized theme. This approach means you don't have to deal with
+ gettext ``*.po`` files, but it is harder to maintain over time.
+- You use only one theme and localize the templates using the
+ `jinja2.ext.i18n Jinja2 extension
+ `_. For a kickstart
+ read this `guide <./localizing_using_jinja2.rst>`_.
+
+Additional context variables
+............................
+
+It may be convenient to add language buttons to your theme in addition
+to the translation links of articles and pages. These buttons could,
+for example, point to the ``SITEURL`` of each (sub-)site. For this
+reason the plugin adds these variables to the template context:
+
+``main_lang``
+ The language of the main site — the original ``DEFAULT_LANG``
+``main_siteurl``
+ The ``SITEURL`` of the main site — the original ``SITEURL``
+``lang_siteurls``
+ An ordered dictionary, mapping all used languages to their
+ ``SITEURL``. The ``main_lang`` is the first key with ``main_siteurl``
+ as the value. This dictionary is useful for implementing global
+ language buttons that show the language of the currently viewed
+ (sub-)site too.
+``extra_siteurls``
+ An ordered dictionary, subset of ``lang_siteurls``, the current
+ ``DEFAULT_LANG`` of the rendered (sub-)site is not included, so for
+ each (sub-)site ``set(extra_siteurls) == set(lang_siteurls) -
+ set([DEFAULT_LANG])``. This dictionary is useful for implementing
+ global language buttons that do not show the current language.
+``relpath_to_site``
+ A function that returns a relative path from the first (sub-)site to
+ the second (sub-)site where the (sub-)sites are identified by the
+ language codes given as two arguments.
+
+If you don't like the default ordering of the ordered dictionaries,
+use a Jinja2 filter to alter the ordering.
+
+All the siteurls above are always absolute even in the case of
+``RELATIVE_URLS == True`` (it would be to complicated to replicate the
+Pelican internals for local siteurls), so you may rather use something
+like ``{{ SITEURL }}/{{ relpath_to_site(DEFAULT_LANG, main_lang }}``
+to link to the main site.
+
+This short `howto <./implementing_language_buttons.rst>`_ shows two
+example implementations of language buttons.
+
+Usage notes
+===========
+- It is **mandatory** to specify ``lang`` metadata for each article
+ and page as ``DEFAULT_LANG`` is later changed for each sub-site, so
+ content without ``lang`` metadata would be rendered in every
+ (sub-)site.
+- As with the original translations functionality, ``slug`` metadata
+ is used to group translations. It is therefore often convenient to
+ compensate for this by overriding the content URL (which defaults to
+ slug) using the ``url`` and ``save_as`` metadata. You could also
+ give articles e.g. ``name`` metadata and use it in ``ARTICLE_URL =
+ '{name}.html'``.
+
+Development
+===========
+
+- A demo and a test site is in the ``gh-pages`` branch and can be seen
+ at http://smartass101.github.io/pelican-plugins/
diff --git a/plugins/i18n_subsites/__init__.py b/plugins/i18n_subsites/__init__.py
new file mode 100644
index 0000000..7dfbde0
--- /dev/null
+++ b/plugins/i18n_subsites/__init__.py
@@ -0,0 +1 @@
+from .i18n_subsites import *
diff --git a/plugins/i18n_subsites/i18n_subsites.py b/plugins/i18n_subsites/i18n_subsites.py
new file mode 100644
index 0000000..dc27799
--- /dev/null
+++ b/plugins/i18n_subsites/i18n_subsites.py
@@ -0,0 +1,462 @@
+"""i18n_subsites plugin creates i18n-ized subsites of the default site
+
+This plugin is designed for Pelican 3.4 and later
+"""
+
+
+import os
+import six
+import logging
+import posixpath
+
+from copy import copy
+from itertools import chain
+from operator import attrgetter
+try:
+ from collections.abc import OrderedDict
+except ImportError:
+ from collections import OrderedDict
+from contextlib import contextmanager
+from six.moves.urllib.parse import urlparse
+
+import gettext
+import locale
+
+from pelican import signals
+from pelican.generators import ArticlesGenerator, PagesGenerator
+from pelican.settings import configure_settings
+try:
+ from pelican.contents import Draft
+except ImportError:
+ from pelican.contents import Article as Draft
+
+
+# Global vars
+_MAIN_SETTINGS = None # settings dict of the main Pelican instance
+_MAIN_LANG = None # lang of the main Pelican instance
+_MAIN_SITEURL = None # siteurl of the main Pelican instance
+_MAIN_STATIC_FILES = None # list of Static instances the main Pelican instance
+_SUBSITE_QUEUE = {} # map: lang -> settings overrides
+_SITE_DB = OrderedDict() # OrderedDict: lang -> siteurl
+_SITES_RELPATH_DB = {} # map: (lang, base_lang) -> relpath
+# map: generator -> list of removed contents that need interlinking
+_GENERATOR_DB = {}
+_NATIVE_CONTENT_URL_DB = {} # map: source_path -> content in its native lang
+_LOGGER = logging.getLogger(__name__)
+
+
+@contextmanager
+def temporary_locale(temp_locale=None):
+ '''Enable code to run in a context with a temporary locale
+
+ Resets the locale back when exiting context.
+ Can set a temporary locale if provided
+ '''
+ orig_locale = locale.setlocale(locale.LC_ALL)
+ if temp_locale is not None:
+ locale.setlocale(locale.LC_ALL, temp_locale)
+ yield
+ locale.setlocale(locale.LC_ALL, orig_locale)
+
+
+def initialize_dbs(settings):
+ '''Initialize internal DBs using the Pelican settings dict
+
+ This clears the DBs for e.g. autoreload mode to work
+ '''
+ global _MAIN_SETTINGS, _MAIN_SITEURL, _MAIN_LANG, _SUBSITE_QUEUE
+ _MAIN_SETTINGS = settings
+ _MAIN_LANG = settings['DEFAULT_LANG']
+ _MAIN_SITEURL = settings['SITEURL']
+ _SUBSITE_QUEUE = settings.get('I18N_SUBSITES', {}).copy()
+ prepare_site_db_and_overrides()
+ # clear databases in case of autoreload mode
+ _SITES_RELPATH_DB.clear()
+ _NATIVE_CONTENT_URL_DB.clear()
+ _GENERATOR_DB.clear()
+
+
+def prepare_site_db_and_overrides():
+ '''Prepare overrides and create _SITE_DB
+
+ _SITE_DB.keys() need to be ready for filter_translations
+ '''
+ _SITE_DB.clear()
+ _SITE_DB[_MAIN_LANG] = _MAIN_SITEURL
+ # make sure it works for both root-relative and absolute
+ main_siteurl = '/' if _MAIN_SITEURL == '' else _MAIN_SITEURL
+ for lang, overrides in _SUBSITE_QUEUE.items():
+ if 'SITEURL' not in overrides:
+ overrides['SITEURL'] = posixpath.join(main_siteurl, lang)
+ _SITE_DB[lang] = overrides['SITEURL']
+ # default subsite hierarchy
+ if 'OUTPUT_PATH' not in overrides:
+ overrides['OUTPUT_PATH'] = os.path.join(
+ _MAIN_SETTINGS['OUTPUT_PATH'], lang)
+ if 'CACHE_PATH' not in overrides:
+ overrides['CACHE_PATH'] = os.path.join(
+ _MAIN_SETTINGS['CACHE_PATH'], lang)
+ if 'STATIC_PATHS' not in overrides:
+ overrides['STATIC_PATHS'] = []
+ if ('THEME' not in overrides and 'THEME_STATIC_DIR' not in overrides and
+ 'THEME_STATIC_PATHS' not in overrides):
+ relpath = relpath_to_site(lang, _MAIN_LANG)
+ overrides['THEME_STATIC_DIR'] = posixpath.join(
+ relpath, _MAIN_SETTINGS['THEME_STATIC_DIR'])
+ overrides['THEME_STATIC_PATHS'] = []
+ # to change what is perceived as translations
+ overrides['DEFAULT_LANG'] = lang
+
+
+def subscribe_filter_to_signals(settings):
+ '''Subscribe content filter to requested signals'''
+ for sig in settings.get('I18N_FILTER_SIGNALS', []):
+ sig.connect(filter_contents_translations)
+
+
+def initialize_plugin(pelican_obj):
+ '''Initialize plugin variables and Pelican settings'''
+ if _MAIN_SETTINGS is None:
+ initialize_dbs(pelican_obj.settings)
+ subscribe_filter_to_signals(pelican_obj.settings)
+
+
+def get_site_path(url):
+ '''Get the path component of an url, excludes siteurl
+
+ also normalizes '' to '/' for relpath to work,
+ otherwise it could be interpreted as a relative filesystem path
+ '''
+ path = urlparse(url).path
+ if path == '':
+ path = '/'
+ return path
+
+
+def relpath_to_site(lang, target_lang):
+ '''Get relative path from siteurl of lang to siteurl of base_lang
+
+ the output is cached in _SITES_RELPATH_DB
+ '''
+ path = _SITES_RELPATH_DB.get((lang, target_lang), None)
+ if path is None:
+ siteurl = _SITE_DB.get(lang, _MAIN_SITEURL)
+ target_siteurl = _SITE_DB.get(target_lang, _MAIN_SITEURL)
+ path = posixpath.relpath(get_site_path(target_siteurl),
+ get_site_path(siteurl))
+ _SITES_RELPATH_DB[(lang, target_lang)] = path
+ return path
+
+
+def save_generator(generator):
+ '''Save the generator for later use
+
+ initialize the removed content list
+ '''
+ _GENERATOR_DB[generator] = []
+
+
+def article2draft(article):
+ '''Transform an Article to Draft'''
+ draft = Draft(article._content, article.metadata, article.settings,
+ article.source_path, article._context)
+ draft.status = 'draft'
+ return draft
+
+
+def page2hidden_page(page):
+ '''Transform a Page to a hidden Page'''
+ page.status = 'hidden'
+ return page
+
+
+class GeneratorInspector(object):
+ '''Inspector of generator instances'''
+
+ generators_info = {
+ ArticlesGenerator: {
+ 'translations_lists': ['translations', 'drafts_translations'],
+ 'contents_lists': [('articles', 'drafts')],
+ 'hiding_func': article2draft,
+ 'policy': 'I18N_UNTRANSLATED_ARTICLES',
+ },
+ PagesGenerator: {
+ 'translations_lists': ['translations', 'hidden_translations'],
+ 'contents_lists': [('pages', 'hidden_pages')],
+ 'hiding_func': page2hidden_page,
+ 'policy': 'I18N_UNTRANSLATED_PAGES',
+ },
+ }
+
+ def __init__(self, generator):
+ '''Identify the best known class of the generator instance
+
+ The class '''
+ self.generator = generator
+ self.generators_info.update(generator.settings.get(
+ 'I18N_GENERATORS_INFO', {}))
+ for cls in generator.__class__.__mro__:
+ if cls in self.generators_info:
+ self.info = self.generators_info[cls]
+ break
+ else:
+ self.info = {}
+
+ def translations_lists(self):
+ '''Iterator over lists of content translations'''
+ return (getattr(self.generator, name) for name in
+ self.info.get('translations_lists', []))
+
+ def contents_list_pairs(self):
+ '''Iterator over pairs of normal and hidden contents'''
+ return (tuple(getattr(self.generator, name) for name in names)
+ for names in self.info.get('contents_lists', []))
+
+ def hiding_function(self):
+ '''Function for transforming content to a hidden version'''
+ hiding_func = self.info.get('hiding_func', lambda x: x)
+ return hiding_func
+
+ def untranslated_policy(self, default):
+ '''Get the policy for untranslated content'''
+ return self.generator.settings.get(self.info.get('policy', None),
+ default)
+
+ def all_contents(self):
+ '''Iterator over all contents'''
+ translations_iterator = chain(*self.translations_lists())
+ return chain(translations_iterator,
+ *(pair[i] for pair in self.contents_list_pairs()
+ for i in (0, 1)))
+
+
+def filter_contents_translations(generator):
+ '''Filter the content and translations lists of a generator
+
+ Filters out
+ 1) translations which will be generated in a different site
+ 2) content that is not in the language of the currently
+ generated site but in that of a different site, content in a
+ language which has no site is generated always. The filtering
+ method bay be modified by the respective untranslated policy
+ '''
+ inspector = GeneratorInspector(generator)
+ current_lang = generator.settings['DEFAULT_LANG']
+ langs_with_sites = _SITE_DB.keys()
+ removed_contents = _GENERATOR_DB[generator]
+
+ for translations in inspector.translations_lists():
+ for translation in translations[:]: # copy to be able to remove
+ if translation.lang in langs_with_sites:
+ translations.remove(translation)
+ removed_contents.append(translation)
+
+ hiding_func = inspector.hiding_function()
+ untrans_policy = inspector.untranslated_policy(default='hide')
+ for (contents, other_contents) in inspector.contents_list_pairs():
+ for content in other_contents: # save any hidden native content first
+ if content.lang == current_lang: # in native lang
+ # save the native URL attr formatted in the current locale
+ _NATIVE_CONTENT_URL_DB[content.source_path] = content.url
+ for content in contents[:]: # copy for removing in loop
+ if content.lang == current_lang: # in native lang
+ # save the native URL attr formatted in the current locale
+ _NATIVE_CONTENT_URL_DB[content.source_path] = content.url
+ elif content.lang in langs_with_sites and untrans_policy != 'keep':
+ contents.remove(content)
+ if untrans_policy == 'hide':
+ other_contents.append(hiding_func(content))
+ elif untrans_policy == 'remove':
+ removed_contents.append(content)
+
+
+def install_templates_translations(generator):
+ '''Install gettext translations in the jinja2.Environment
+
+ Only if the 'jinja2.ext.i18n' jinja2 extension is enabled
+ the translations for the current DEFAULT_LANG are installed.
+ '''
+ if 'JINJA_ENVIRONMENT' in generator.settings: # pelican 3.7+
+ jinja_extensions = generator.settings['JINJA_ENVIRONMENT'].get(
+ 'extensions', [])
+ else:
+ jinja_extensions = generator.settings['JINJA_EXTENSIONS']
+
+ if 'jinja2.ext.i18n' in jinja_extensions:
+ domain = generator.settings.get('I18N_GETTEXT_DOMAIN', 'messages')
+ localedir = generator.settings.get('I18N_GETTEXT_LOCALEDIR')
+ if localedir is None:
+ localedir = os.path.join(generator.theme, 'translations')
+ current_lang = generator.settings['DEFAULT_LANG']
+ if current_lang == generator.settings.get('I18N_TEMPLATES_LANG',
+ _MAIN_LANG):
+ translations = gettext.NullTranslations()
+ else:
+ langs = [current_lang]
+ try:
+ translations = gettext.translation(domain, localedir, langs)
+ except (IOError, OSError):
+ _LOGGER.error((
+ "Cannot find translations for language '{}' in '{}' with "
+ "domain '{}'. Installing NullTranslations.").format(
+ langs[0], localedir, domain))
+ translations = gettext.NullTranslations()
+ newstyle = generator.settings.get('I18N_GETTEXT_NEWSTYLE', True)
+ generator.env.install_gettext_translations(translations, newstyle)
+
+
+def add_variables_to_context(generator):
+ '''Adds useful iterable variables to template context'''
+ context = generator.context # minimize attr lookup
+ context['relpath_to_site'] = relpath_to_site
+ context['main_siteurl'] = _MAIN_SITEURL
+ context['main_lang'] = _MAIN_LANG
+ context['lang_siteurls'] = _SITE_DB
+ current_lang = generator.settings['DEFAULT_LANG']
+ extra_siteurls = _SITE_DB.copy()
+ extra_siteurls.pop(current_lang)
+ context['extra_siteurls'] = extra_siteurls
+
+
+def interlink_translations(content):
+ '''Link content to translations in their main language
+
+ so the URL (including localized month names) of the different subsites
+ will be honored
+ '''
+ lang = content.lang
+ # sort translations by lang
+ content.translations.sort(key=attrgetter('lang'))
+ for translation in content.translations:
+ relpath = relpath_to_site(lang, translation.lang)
+ url = _NATIVE_CONTENT_URL_DB[translation.source_path]
+ translation.override_url = posixpath.join(relpath, url)
+
+
+def interlink_translated_content(generator):
+ '''Make translations link to the native locations
+
+ for generators that may contain translated content
+ '''
+ inspector = GeneratorInspector(generator)
+ for content in inspector.all_contents():
+ interlink_translations(content)
+
+
+def interlink_removed_content(generator):
+ '''For all contents removed from generation queue update interlinks
+
+ link to the native location
+ '''
+ current_lang = generator.settings['DEFAULT_LANG']
+ for content in _GENERATOR_DB[generator]:
+ url = _NATIVE_CONTENT_URL_DB[content.source_path]
+ relpath = relpath_to_site(current_lang, content.lang)
+ content.override_url = posixpath.join(relpath, url)
+
+
+def interlink_static_files(generator):
+ '''Add links to static files in the main site if necessary'''
+ if generator.settings['STATIC_PATHS'] != []:
+ return # customized STATIC_PATHS
+ try: # minimize attr lookup
+ static_content = generator.context['static_content']
+ except KeyError:
+ static_content = generator.context['filenames']
+ relpath = relpath_to_site(generator.settings['DEFAULT_LANG'], _MAIN_LANG)
+ for staticfile in _MAIN_STATIC_FILES:
+ if staticfile.get_relative_source_path() not in static_content:
+ staticfile = copy(staticfile) # prevent override in main site
+ staticfile.override_url = posixpath.join(relpath, staticfile.url)
+ try:
+ generator.add_source_path(staticfile, static=True)
+ except TypeError:
+ generator.add_source_path(staticfile)
+
+
+def save_main_static_files(static_generator):
+ '''Save the static files generated for the main site'''
+ global _MAIN_STATIC_FILES
+ # test just for current lang as settings change in autoreload mode
+ if static_generator.settings['DEFAULT_LANG'] == _MAIN_LANG:
+ _MAIN_STATIC_FILES = static_generator.staticfiles
+
+
+def update_generators():
+ '''Update the context of all generators
+
+ Ads useful variables and translations into the template context
+ and interlink translations
+ '''
+ for generator in _GENERATOR_DB.keys():
+ install_templates_translations(generator)
+ add_variables_to_context(generator)
+ interlink_static_files(generator)
+ interlink_removed_content(generator)
+ interlink_translated_content(generator)
+
+
+def get_pelican_cls(settings):
+ '''Get the Pelican class requested in settings'''
+ cls = settings['PELICAN_CLASS']
+ if isinstance(cls, six.string_types):
+ module, cls_name = cls.rsplit('.', 1)
+ module = __import__(module)
+ cls = getattr(module, cls_name)
+ return cls
+
+
+def create_next_subsite(pelican_obj):
+ '''Create the next subsite using the lang-specific config
+
+ If there are no more subsites in the generation queue, update all
+ the generators (interlink translations and removed content, add
+ variables and translations to template context). Otherwise get the
+ language and overrides for next the subsite in the queue and apply
+ overrides. Then generate the subsite using a PELICAN_CLASS
+ instance and its run method. Finally, restore the previous locale.
+ '''
+ global _MAIN_SETTINGS
+ if len(_SUBSITE_QUEUE) == 0:
+ _LOGGER.debug(
+ 'i18n: Updating cross-site links and context of all generators.')
+ update_generators()
+ _MAIN_SETTINGS = None # to initialize next time
+ else:
+ with temporary_locale():
+ settings = _MAIN_SETTINGS.copy()
+ lang, overrides = _SUBSITE_QUEUE.popitem()
+ settings.update(overrides)
+ settings = configure_settings(settings) # to set LOCALE, etc.
+ cls = get_pelican_cls(settings)
+
+ new_pelican_obj = cls(settings)
+ _LOGGER.debug(("Generating i18n subsite for language '{}' "
+ "using class {}").format(lang, cls))
+ new_pelican_obj.run()
+
+
+# map: signal name -> function name
+_SIGNAL_HANDLERS_DB = {
+ 'get_generators': initialize_plugin,
+ 'article_generator_pretaxonomy': filter_contents_translations,
+ 'page_generator_finalized': filter_contents_translations,
+ 'get_writer': create_next_subsite,
+ 'static_generator_finalized': save_main_static_files,
+ 'generator_init': save_generator,
+}
+
+
+def register():
+ '''Register the plugin only if required signals are available'''
+ for sig_name in _SIGNAL_HANDLERS_DB.keys():
+ if not hasattr(signals, sig_name):
+ _LOGGER.error((
+ 'The i18n_subsites plugin requires the {} '
+ 'signal available for sure in Pelican 3.4.0 and later, '
+ 'plugin will not be used.').format(sig_name))
+ return
+
+ for sig_name, handler in _SIGNAL_HANDLERS_DB.items():
+ sig = getattr(signals, sig_name)
+ sig.connect(handler)
diff --git a/plugins/i18n_subsites/implementing_language_buttons.rst b/plugins/i18n_subsites/implementing_language_buttons.rst
new file mode 100644
index 0000000..55b7bf3
--- /dev/null
+++ b/plugins/i18n_subsites/implementing_language_buttons.rst
@@ -0,0 +1,128 @@
+-----------------------------
+Implementing language buttons
+-----------------------------
+
+Each article with translations has translations links, but that's the
+only way to switch between language subsites.
+
+For this reason it is convenient to add language buttons to the top
+menu bar to make it simple to switch between the language subsites on
+all pages.
+
+Example designs
+---------------
+
+Language buttons showing other available languages
+..................................................
+
+The ``extra_siteurls`` dictionary is a mapping of all other (not the
+``DEFAULT_LANG`` of the current (sub-)site) languages to the
+``SITEURL`` of the respective (sub-)sites
+
+.. code-block:: jinja
+
+
+
+ {% if extra_siteurls %}
+ {% for lang, url in extra_siteurls.items() %}
+ {{ lang }}
+ {% endfor %}
+
+  
+ {% endif %}
+ {% for title, link in MENUITEMS %}
+
+
+Notice the slash ``/`` after ``{{ url }}``, this makes sure it works
+with local development when ``SITEURL == ''``.
+
+Language buttons showing all available languages, current is active
+...................................................................
+
+The ``lang_subsites`` dictionary is a mapping of all languages to the
+``SITEURL`` of the respective (sub-)sites. This template sets the
+language of the current (sub-)site as active.
+
+.. code-block:: jinja
+
+
+
+ {% if lang_siteurls %}
+ {% for lang, url in lang_siteurls.items() %}
+ {{ lang }}
+ {% endfor %}
+
+  
+ {% endif %}
+ {% for title, link in MENUITEMS %}
+
+
+
+Tips and tricks
+---------------
+
+Showing more than language codes
+................................
+
+If you want the language buttons to show e.g. the names of the
+languages or flags [#flags]_, not just the language codes, you can use
+a jinja filter to translate the language codes
+
+
+.. code-block:: python
+
+ languages_lookup = {
+ 'en': 'English',
+ 'cz': 'Čeština',
+ }
+
+ def lookup_lang_name(lang_code):
+ return languages_lookup[lang_code]
+
+ JINJA_FILTERS = {
+ ...
+ 'lookup_lang_name': lookup_lang_name,
+ }
+
+And then the link content becomes
+
+.. code-block:: jinja
+
+
+ {% for lang, siteurl in lang_siteurls.items() %}
+ {{ lang | lookup_lang_name }}
+ {% endfor %}
+
+
+
+Changing the order of language buttons
+......................................
+
+Because ``lang_siteurls`` and ``extra_siteurls`` are instances of
+``OrderedDict`` with ``main_lang`` being always the first key, you can
+change the order through a jinja filter.
+
+.. code-block:: python
+
+ def my_ordered_items(ordered_dict):
+ items = list(ordered_dict.items())
+ # swap first and last using tuple unpacking
+ items[0], items[-1] = items[-1], items[0]
+ return items
+
+ JINJA_FILTERS = {
+ ...
+ 'my_ordered_items': my_ordered_items,
+ }
+
+And then the ``for`` loop line in the template becomes
+
+.. code-block:: jinja
+
+
+ {% for lang, siteurl in lang_siteurls | my_ordered_items %}
+
+
+
+.. [#flags] Although it may look nice, `w3 discourages it
+ `_.
diff --git a/plugins/i18n_subsites/localizing_using_jinja2.rst b/plugins/i18n_subsites/localizing_using_jinja2.rst
new file mode 100644
index 0000000..6ffe654
--- /dev/null
+++ b/plugins/i18n_subsites/localizing_using_jinja2.rst
@@ -0,0 +1,200 @@
+-----------------------------
+Localizing themes with Jinja2
+-----------------------------
+
+1. Localize templates
+---------------------
+
+To enable the |ext| extension in your templates, you must add it to
+``JINJA_EXTENSIONS`` in your Pelican configuration
+
+.. code-block:: python
+
+ JINJA_EXTENSIONS = ['jinja2.ext.i18n', ...]
+
+Then follow the `Jinja2 templating documentation for the I18N plugin
+`_ to make your templates
+localizable. This usually means surrounding strings with the ``{%
+trans %}`` directive or using ``gettext()`` in expressions
+
+.. code-block:: jinja
+
+ {% trans %}translatable content{% endtrans %}
+ {{ gettext('a translatable string') }}
+
+For pluralization support, etc. consult the documentation.
+
+To enable `newstyle gettext calls
+`_ the
+``I18N_GETTEXT_NEWSTYLE`` config variable must be set to ``True``
+(default).
+
+.. |ext| replace:: ``jinja2.ext.i18n``
+
+2. Specify translations location
+--------------------------------
+
+The |ext| extension uses the `Python gettext library
+`_ for translating
+strings.
+
+In your Pelican config you can give the path in which to look for
+translations in the ``I18N_GETTEXT_LOCALEDIR`` variable. If not given,
+it is assumed to be the ``translations`` subfolder in the top folder
+of the theme specified by ``THEME``.
+
+The domain of the translations (the name of each translation file is
+``domain.mo``) is controlled by the ``I18N_GETTEXT_DOMAIN`` config
+variable (defaults to ``messages``).
+
+Example
+.......
+
+With the following in your Pelican settings file
+
+.. code-block:: python
+
+ I18N_GETTEXT_LOCALEDIR = 'some/path/'
+ I18N_GETTEXT_DOMAIN = 'my_domain'
+
+the translation for language 'cz' will be expected to be in
+``some/path/cz/LC_MESSAGES/my_domain.mo``
+
+
+3. Extract translatable strings and translate them
+--------------------------------------------------
+
+There are many ways to extract translatable strings and create
+``gettext`` compatible translations. You can create the ``*.po`` and
+``*.mo`` message catalog files yourself, or you can use some helper
+tool as described in `the Python gettext library tutorial
+`_.
+
+You of course don't need to provide a translation for the language in
+which the templates are written which is assumed to be the original
+``DEFAULT_LANG``. This can be overridden in the
+``I18N_TEMPLATES_LANG`` variable.
+
+Recommended tool: babel
+.......................
+
+`Babel `_ makes it easy to extract
+translatable strings from the localized Jinja2 templates and assists
+with creating translations as documented in this `Jinja2-Babel
+tutorial
+`_
+[#flask]_ on which the following is based.
+
+1. Add babel mapping
+~~~~~~~~~~~~~~~~~~~~
+
+Let's assume that you are localizing a theme in ``themes/my_theme/``
+and that you use the default settings, i.e. the default domain
+``messages`` and will put the translations in the ``translations``
+subdirectory of the theme directory as
+``themes/my_theme/translations/``.
+
+It is up to you where to store babel mappings and translation files
+templates (``*.pot``), but a convenient place is to put them in
+``themes/my_theme/`` and work in that directory. From now on let's
+assume that it will be our current working directory (CWD).
+
+To tell babel to extract translatable strings from the templates
+create a mapping file ``babel.cfg`` with the following line
+
+.. code-block:: cfg
+
+ [jinja2: templates/**.html]
+
+
+2. Extract translatable strings from templates
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Run the following command to create a ``messages.pot`` message catalog
+template file from extracted translatable strings
+
+.. code-block:: bash
+
+ pybabel extract --mapping babel.cfg --output messages.pot ./
+
+
+3. Initialize message catalogs
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If you want to translate the template to language ``lang``, run the
+following command to create a message catalog
+``translations/lang/LC_MESSAGES/messages.po`` using the template
+``messages.pot``
+
+.. code-block:: bash
+
+ pybabel init --input-file messages.pot --output-dir translations/ --locale lang --domain messages
+
+babel expects ``lang`` to be a valid locale identifier, so if e.g. you
+are translating for language ``cz`` but the corresponding locale is
+``cs``, you have to use the locale identifier. Nevertheless, the
+gettext infrastructure should later correctly find the locale for a
+given language.
+
+4. Fill the message catalogs
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The message catalog files format is quite intuitive, it is fully
+documented in the `GNU gettext manual
+`_. Essentially,
+you fill in the ``msgstr`` strings
+
+
+.. code-block:: po
+
+ msgid "just a simple string"
+ msgstr "jenom jednoduchý řetězec"
+
+ msgid ""
+ "some multiline string"
+ "looks like this"
+ msgstr ""
+ "nějaký více řádkový řetězec"
+ "vypadá takto"
+
+You might also want to remove ``#,fuzzy`` flags once the translation
+is complete and reviewed to show that it can be compiled.
+
+5. Compile the message catalogs
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The message catalogs must be compiled into binary format using this
+command
+
+.. code-block:: bash
+
+ pybabel compile --directory translations/ --domain messages
+
+This command might complain about "fuzzy" translations, which means
+you should review the translations and once done, remove the fuzzy
+flag line.
+
+(6.) Update the catalogs when templates change
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If you add any translatable patterns into your templates, you have to
+update your message catalogs too. First you extract a new message
+catalog template as described in the 2. step. Then you run the
+following command [#pybabel_error]_
+
+.. code-block:: bash
+
+ pybabel update --input-file messages.pot --output-dir translations/ --domain messages
+
+This will merge the new patterns with the old ones. Once you review
+and fill them, you have to recompile them as described in the 5. step.
+
+.. [#flask] Although the tutorial is focused on Flask-based web
+ applications, the linked translation tutorial is not
+ Flask-specific.
+.. [#pybabel_error] If you get an error ``TypeError: must be str, not
+ bytes`` with Python 3.3, it is likely you are
+ suffering from this `bug
+ `_.
+ Until the fix is released, you can use babel with
+ Python 2.7.
diff --git a/plugins/i18n_subsites/test_data/content/images/img.png b/plugins/i18n_subsites/test_data/content/images/img.png
new file mode 100644
index 0000000..e69de29
diff --git a/plugins/i18n_subsites/test_data/content/pages/hidden-page-cz.rst b/plugins/i18n_subsites/test_data/content/pages/hidden-page-cz.rst
new file mode 100644
index 0000000..c282faa
--- /dev/null
+++ b/plugins/i18n_subsites/test_data/content/pages/hidden-page-cz.rst
@@ -0,0 +1,7 @@
+404 stránka
+===========
+:slug: 404
+:lang: cz
+:status: hidden
+
+Jednoduchá 404 stránka.
diff --git a/plugins/i18n_subsites/test_data/content/pages/hidden-page-de.rst b/plugins/i18n_subsites/test_data/content/pages/hidden-page-de.rst
new file mode 100644
index 0000000..d8410a1
--- /dev/null
+++ b/plugins/i18n_subsites/test_data/content/pages/hidden-page-de.rst
@@ -0,0 +1,7 @@
+Eine 404 Seite
+==============
+:slug: 404
+:lang: de
+:status: hidden
+
+Eine einfache 404 Seite.
diff --git a/plugins/i18n_subsites/test_data/content/pages/hidden-page-en.rst b/plugins/i18n_subsites/test_data/content/pages/hidden-page-en.rst
new file mode 100644
index 0000000..74a97d7
--- /dev/null
+++ b/plugins/i18n_subsites/test_data/content/pages/hidden-page-en.rst
@@ -0,0 +1,7 @@
+A 404 page
+==========
+:slug: 404
+:lang: en
+:status: hidden
+
+A simple 404 page.
diff --git a/plugins/i18n_subsites/test_data/content/pages/untranslated-page.rst b/plugins/i18n_subsites/test_data/content/pages/untranslated-page.rst
new file mode 100644
index 0000000..ae4c2b8
--- /dev/null
+++ b/plugins/i18n_subsites/test_data/content/pages/untranslated-page.rst
@@ -0,0 +1,5 @@
+Untranslated page
+=================
+:lang: en
+
+This page has no translation.
diff --git a/plugins/i18n_subsites/test_data/content/translated_article-cz.rst b/plugins/i18n_subsites/test_data/content/translated_article-cz.rst
new file mode 100644
index 0000000..555a69d
--- /dev/null
+++ b/plugins/i18n_subsites/test_data/content/translated_article-cz.rst
@@ -0,0 +1,8 @@
+Přeložený článek
+================
+:slug: translated-article
+:lang: cz
+:date: 2014-09-15
+
+Jednoduchý článek s překlady.
+Zde je odkaz na `nějaký obrázek <{filename}/images/img.png>`_.
diff --git a/plugins/i18n_subsites/test_data/content/translated_article-de.rst b/plugins/i18n_subsites/test_data/content/translated_article-de.rst
new file mode 100644
index 0000000..01bf565
--- /dev/null
+++ b/plugins/i18n_subsites/test_data/content/translated_article-de.rst
@@ -0,0 +1,8 @@
+Ein übersetzter Artikel
+=======================
+:slug: translated-article
+:lang: de
+:date: 2014-09-14
+
+Ein einfacher Artikel mit einer Übersetzung.
+Hier ist ein Link zur `einigem Bild <{filename}/images/img.png>`_.
diff --git a/plugins/i18n_subsites/test_data/content/translated_article-en.rst b/plugins/i18n_subsites/test_data/content/translated_article-en.rst
new file mode 100644
index 0000000..d7f5dad
--- /dev/null
+++ b/plugins/i18n_subsites/test_data/content/translated_article-en.rst
@@ -0,0 +1,8 @@
+A translated article
+====================
+:slug: translated-article
+:lang: en
+:date: 2014-09-13
+
+A simple article with a translation.
+Here is a link to `some image <{filename}/images/img.png>`_.
diff --git a/plugins/i18n_subsites/test_data/content/untranslated_article-en.rst b/plugins/i18n_subsites/test_data/content/untranslated_article-en.rst
new file mode 100644
index 0000000..867ae5d
--- /dev/null
+++ b/plugins/i18n_subsites/test_data/content/untranslated_article-en.rst
@@ -0,0 +1,9 @@
+An untranslated article
+=======================
+:date: 2014-07-14
+:lang: en
+
+An article without a translation.
+Here is a link to an `untranslated page`_
+
+.. _`untranslated page`: {filename}/pages/untranslated-page.rst
diff --git a/plugins/i18n_subsites/test_data/localized_theme/babel.cfg b/plugins/i18n_subsites/test_data/localized_theme/babel.cfg
new file mode 100644
index 0000000..4406732
--- /dev/null
+++ b/plugins/i18n_subsites/test_data/localized_theme/babel.cfg
@@ -0,0 +1,2 @@
+[jinja2: templates/**.html]
+
diff --git a/plugins/i18n_subsites/test_data/localized_theme/messages.pot b/plugins/i18n_subsites/test_data/localized_theme/messages.pot
new file mode 100644
index 0000000..578917f
--- /dev/null
+++ b/plugins/i18n_subsites/test_data/localized_theme/messages.pot
@@ -0,0 +1,23 @@
+# Translations template for PROJECT.
+# Copyright (C) 2014 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+# FIRST AUTHOR , 2014.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2014-07-13 12:25+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 1.3\n"
+
+#: templates/base.html:3
+msgid "Welcome to our"
+msgstr ""
+
diff --git a/plugins/i18n_subsites/test_data/localized_theme/static/style.css b/plugins/i18n_subsites/test_data/localized_theme/static/style.css
new file mode 100644
index 0000000..e69de29
diff --git a/plugins/i18n_subsites/test_data/localized_theme/templates/base.html b/plugins/i18n_subsites/test_data/localized_theme/templates/base.html
new file mode 100644
index 0000000..a24eb1d
--- /dev/null
+++ b/plugins/i18n_subsites/test_data/localized_theme/templates/base.html
@@ -0,0 +1,7 @@
+{% extends "!simple/base.html" %}
+
+{% block title %}{% trans %}Welcome to our{% endtrans %} {{ SITENAME }}{% endblock %}
+{% block head %}
+{{ super() }}
+
+{% endblock %}
diff --git a/plugins/i18n_subsites/test_data/localized_theme/translations/de/LC_MESSAGES/messages.mo b/plugins/i18n_subsites/test_data/localized_theme/translations/de/LC_MESSAGES/messages.mo
new file mode 100644
index 0000000..2390102
Binary files /dev/null and b/plugins/i18n_subsites/test_data/localized_theme/translations/de/LC_MESSAGES/messages.mo differ
diff --git a/plugins/i18n_subsites/test_data/localized_theme/translations/de/LC_MESSAGES/messages.po b/plugins/i18n_subsites/test_data/localized_theme/translations/de/LC_MESSAGES/messages.po
new file mode 100644
index 0000000..2eb4efb
--- /dev/null
+++ b/plugins/i18n_subsites/test_data/localized_theme/translations/de/LC_MESSAGES/messages.po
@@ -0,0 +1,23 @@
+# German translations for PROJECT.
+# Copyright (C) 2014 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+# FIRST AUTHOR , 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2014-07-13 12:25+0200\n"
+"PO-Revision-Date: 2014-07-13 12:26+0200\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: de \n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 1.3\n"
+
+#: templates/base.html:3
+msgid "Welcome to our"
+msgstr "Willkommen Sie zur unserer"
+
diff --git a/plugins/i18n_subsites/test_data/pelicanconf.py b/plugins/i18n_subsites/test_data/pelicanconf.py
new file mode 100644
index 0000000..55018f2
--- /dev/null
+++ b/plugins/i18n_subsites/test_data/pelicanconf.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*- #
+from __future__ import unicode_literals
+
+AUTHOR = 'The Tester'
+SITENAME = 'Testing site'
+SITEURL = 'http://example.com/test'
+
+# to make the test suite portable
+TIMEZONE = 'UTC'
+
+DEFAULT_LANG = 'en'
+LOCALE = 'en_US.UTF-8'
+
+# Generate only one feed
+FEED_ALL_ATOM = 'feeds_all.atom.xml'
+CATEGORY_FEED_ATOM = None
+TRANSLATION_FEED_ATOM = None
+AUTHOR_FEED_ATOM = None
+AUTHOR_FEED_RSS = None
+
+# Disable unnecessary pages
+CATEGORY_SAVE_AS = ''
+TAG_SAVE_AS = ''
+AUTHOR_SAVE_AS = ''
+ARCHIVES_SAVE_AS = ''
+AUTHORS_SAVE_AS = ''
+CATEGORIES_SAVE_AS = ''
+TAGS_SAVE_AS = ''
+
+PLUGIN_PATHS = ['../../']
+PLUGINS = ['i18n_subsites']
+
+THEME = 'localized_theme'
+JINJA_ENVIRONMENT = {'extensions': ['jinja2.ext.i18n']}
+
+from blinker import signal
+tmpsig = signal('tmpsig')
+I18N_FILTER_SIGNALS = [tmpsig]
+
+I18N_SUBSITES = {
+ 'de': {
+ 'SITENAME': 'Testseite',
+ 'AUTHOR': 'Der Tester',
+ 'LOCALE': 'de_DE.UTF-8',
+ },
+ 'cz': {
+ 'SITENAME': 'Testovací stránka',
+ 'AUTHOR': 'Test Testovič',
+ 'I18N_UNTRANSLATED_PAGES': 'remove',
+ 'I18N_UNTRANSLATED_ARTICLES': 'keep',
+ },
+ }
diff --git a/plugins/i18n_subsites/test_i18n_subsites.py b/plugins/i18n_subsites/test_i18n_subsites.py
new file mode 100644
index 0000000..c6c1d6a
--- /dev/null
+++ b/plugins/i18n_subsites/test_i18n_subsites.py
@@ -0,0 +1,139 @@
+'''Unit tests for the i18n_subsites plugin'''
+
+import os
+import locale
+import unittest
+import subprocess
+from tempfile import mkdtemp
+from shutil import rmtree
+
+from . import i18n_subsites as i18ns
+from pelican import Pelican
+from pelican.tests.support import get_settings
+from pelican.settings import read_settings
+
+
+class TestTemporaryLocale(unittest.TestCase):
+ '''Test the temporary locale context manager'''
+
+ def test_locale_restored(self):
+ '''Test that the locale is restored after exiting context'''
+ orig_locale = locale.setlocale(locale.LC_ALL)
+ with i18ns.temporary_locale():
+ locale.setlocale(locale.LC_ALL, 'C')
+ self.assertEqual(locale.setlocale(locale.LC_ALL), 'C')
+ self.assertEqual(locale.setlocale(locale.LC_ALL), orig_locale)
+
+ def test_temp_locale_set(self):
+ '''Test that the temporary locale is set'''
+ with i18ns.temporary_locale('C'):
+ self.assertEqual(locale.setlocale(locale.LC_ALL), 'C')
+
+
+class TestSettingsManipulation(unittest.TestCase):
+ '''Test operations on settings dict'''
+
+ def setUp(self):
+ '''Prepare default settings'''
+ self.settings = get_settings()
+
+ def test_get_pelican_cls_class(self):
+ '''Test that we get class given as an object'''
+ self.settings['PELICAN_CLASS'] = object
+ cls = i18ns.get_pelican_cls(self.settings)
+ self.assertIs(cls, object)
+
+ def test_get_pelican_cls_str(self):
+ '''Test that we get correct class given by string'''
+ cls = i18ns.get_pelican_cls(self.settings)
+ self.assertIs(cls, Pelican)
+
+
+class TestSitesRelpath(unittest.TestCase):
+ '''Test relative path between sites generation'''
+
+ def setUp(self):
+ '''Generate some sample siteurls'''
+ self.siteurl = 'http://example.com'
+ i18ns._SITE_DB['en'] = self.siteurl
+ i18ns._SITE_DB['de'] = self.siteurl + '/de'
+
+ def tearDown(self):
+ '''Remove sites from db'''
+ i18ns._SITE_DB.clear()
+
+ def test_get_site_path(self):
+ '''Test getting the path within a site'''
+ self.assertEqual(i18ns.get_site_path(self.siteurl), '/')
+ self.assertEqual(i18ns.get_site_path(self.siteurl + '/de'), '/de')
+
+ def test_relpath_to_site(self):
+ '''Test getting relative paths between sites'''
+ self.assertEqual(i18ns.relpath_to_site('en', 'de'), 'de')
+ self.assertEqual(i18ns.relpath_to_site('de', 'en'), '..')
+
+
+class TestRegistration(unittest.TestCase):
+ '''Test plugin registration'''
+
+ def test_return_on_missing_signal(self):
+ '''Test return on missing required signal'''
+ i18ns._SIGNAL_HANDLERS_DB['tmp_sig'] = None
+ i18ns.register()
+ self.assertNotIn(id(i18ns.save_generator),
+ i18ns.signals.generator_init.receivers)
+
+ def test_registration(self):
+ '''Test registration of all signal handlers'''
+ i18ns.register()
+ for sig_name, handler in i18ns._SIGNAL_HANDLERS_DB.items():
+ sig = getattr(i18ns.signals, sig_name)
+ self.assertIn(id(handler), sig.receivers)
+ # clean up
+ sig.disconnect(handler)
+
+
+class TestFullRun(unittest.TestCase):
+ '''Test running Pelican with the Plugin'''
+
+ def setUp(self):
+ '''Create temporary output and cache folders'''
+ self.temp_path = mkdtemp(prefix='pelicantests.')
+ self.temp_cache = mkdtemp(prefix='pelican_cache.')
+
+ def tearDown(self):
+ '''Remove output and cache folders'''
+ rmtree(self.temp_path)
+ rmtree(self.temp_cache)
+
+ def test_sites_generation(self):
+ '''Test generation of sites with the plugin
+
+ Compare with recorded output via ``git diff``.
+ To generate output for comparison run the command
+ ``pelican -o test_data/output -s test_data/pelicanconf.py \
+ test_data/content``
+ Remember to remove the output/ folder before that.
+ '''
+ base_path = os.path.dirname(os.path.abspath(__file__))
+ base_path = os.path.join(base_path, 'test_data')
+ content_path = os.path.join(base_path, 'content')
+ output_path = os.path.join(base_path, 'output')
+ settings_path = os.path.join(base_path, 'pelicanconf.py')
+ settings = read_settings(path=settings_path, override={
+ 'PATH': content_path,
+ 'OUTPUT_PATH': self.temp_path,
+ 'CACHE_PATH': self.temp_cache,
+ 'PLUGINS': [i18ns],
+ }
+ )
+ pelican = Pelican(settings)
+ pelican.run()
+
+ # compare output
+ out, err = subprocess.Popen(
+ ['git', 'diff', '--no-ext-diff', '--exit-code', '-w', output_path,
+ self.temp_path], env={'PAGER': ''},
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
+ self.assertFalse(out, 'non-empty `diff` stdout:\n{}'.format(out))
+ self.assertFalse(err, 'non-empty `diff` stderr:\n{}'.format(out))
diff --git a/plugins/lightgallery/__init__.py b/plugins/lightgallery/__init__.py
new file mode 100644
index 0000000..3ecc9e2
--- /dev/null
+++ b/plugins/lightgallery/__init__.py
@@ -0,0 +1 @@
+from .lightgallery import *
diff --git a/plugins/lightgallery/lightgallery.py b/plugins/lightgallery/lightgallery.py
new file mode 100644
index 0000000..f9cb035
--- /dev/null
+++ b/plugins/lightgallery/lightgallery.py
@@ -0,0 +1,217 @@
+import logging
+from pelican import signals
+
+from pelican.generators import ArticlesGenerator
+from pelican.generators import PagesGenerator
+from pathlib import Path
+
+logger = logging.getLogger(__name__)
+
+
+IMAGE_PATH = './content/'
+IMAGE_SIZES = [200, 375, 480, 800, 1600]
+
+
+def process_content(article):
+ """
+ Substitute the citations and add a bibliography for an article or
+ page, using the local bib file if specified or the global one otherwise.
+ """
+ content = article._content
+ logger.info("start\n\n")
+ content = "" + content
+
+ i = content.count("[lightgallery")
+ if (i <= 0):
+ pass
+
+ j = content.count("lightgalleryend]")
+ if (j != i):
+ pass
+
+ m = find_between(content, '[lightgallery', 'lightgalleryend]')
+
+ imgs = m.split(';')
+ logger.info("" + article.title + "\n")
+ imgs_text = ""
+ for i in imgs:
+ cont = i.split(',')
+ img_url = cont[0].strip()
+ if img_url == "":
+ continue
+
+ img_text = ""
+ if (len(cont) > 1):
+ img_text = "" + cont[1] + " "
+
+ logger.info("t\'" + img_url + "\'a\'" + img_text + "\'\n")
+ zoom_url = "/theme/images/zoom.png"
+
+ imgs_text += ""
+ imgs_text += create_exif_print(IMAGE_PATH + img_url)
+ imgs_text += "
"
+ imgs_text += "\"> "
+
+ imgs_text += ""
+ imgs_text += " "
+
+ imgs_text += " "
+ imgs_text += "
"
+ imgs_text += "
"
+
+ imgs_text += " "
+ imgs_text += "\n"
+
+ replace_text = " "
+ replace_text += "
"
+ replace_text += imgs_text
+ replace_text += " "
+ replace_text += "
"
+ logger.info("" + replace_text + "\n")
+ content = content.replace('[lightgallery' + m + 'lightgalleryend]', replace_text)
+ article._content = content
+ logger.info("end\n\n")
+ pass
+
+
+def replace_right(source, target, replacement, replacements=None):
+ return replacement.join(source.rsplit(target, replacements))
+
+
+def find_between(s, first, last):
+ try:
+ start = s.rindex(first) + len(first)
+ end = s.rindex(last, start)
+ return s[start:end]
+ except ValueError:
+ return ""
+
+
+def add_gallery(generators):
+ logger.info("add_gallery\n\n")
+
+ # Process the articles and pages
+ for generator in generators:
+ if isinstance(generator, ArticlesGenerator):
+ for article in (generator.articles + generator.translations + generator.drafts):
+ process_content(article)
+ elif isinstance(generator, PagesGenerator):
+ for page in generator.pages:
+ process_content(page)
+
+ pass
+
+
+def create_scaled_image(org_path, new_path, resize_width):
+ import PIL.Image
+ from resizeimage import resizeimage
+ import os
+
+ logger.info("gen " + new_path + "from " + org_path + " size " + str(resize_width) + "\n")
+
+ exists = os.path.isfile(new_path)
+ if exists:
+ logger.info("skip nothing to do\n")
+ return ""
+
+ dir_path = str(Path(new_path).parent)
+ exists = os.path.isdir(dir_path)
+ if not exists:
+ logger.info("create dir " + dir_path)
+ os.mkdir(dir_path)
+
+
+ logger.info("convert \n")
+ img = PIL.Image.open(org_path)
+ width, height = img.size
+ logger.info("" + str(width) + "\n")
+ if (width > resize_width):
+ img = resizeimage.resize_width(img, resize_width)
+ img.save(new_path, img.format)
+ img.close()
+ logger.info("done \n")
+
+
+def create_exif_print(img_path):
+ try:
+ import PIL.Image
+ import os
+ exists = os.path.isfile(img_path)
+ if not exists:
+ return ""
+
+ img = PIL.Image.open(img_path)
+ exif = img._getexif()
+ img.close()
+
+ logger.info("######### exif " + img_path + "\n")
+
+ if exif is None:
+ return ""
+
+ programm_dic = {0: "N", # "Not defined",
+ 1: "M", # "Manual",
+ 2: "N", # "Normal program",
+ 3: "A", # "Aperture priority",
+ 4: "S", # "Shutter priority",
+ 5: "C", # "Creative program",
+ 6: "A", # "Action program",
+ 7: "P", # "Portrait mode",
+ 8: "L", # "Landscape mode",
+ }
+
+ ret = ""
+ if 272 in exif:
+ ret += "" + exif[272]
+ if 42036 in exif:
+ ret += " with " + exif[42036]
+ ret += " "
+
+ if 37386 in exif:
+ ret += "at" + str(exif[37386][0] / exif[37386][1]) + "mm "
+ if 37378 in exif:
+ ret += "f" + str(exif[37378][0] / exif[37378][1]) + " "
+
+ if 34855 in exif:
+ ret += " iso" + str(exif[34855]) + " "
+ if 33434 in exif:
+ ret += " " + str(exif[33434][0])
+ if exif[33434][1] != 1:
+ ret += "/" + str(exif[33434][1])
+ ret += "sec "
+
+ if 34850 in exif:
+ ret += " " + programm_dic[exif[34850]] + " "
+
+ if 315 in exif:
+ ret += " " + exif[315]
+ if 33432 in exif:
+ ret += " (c) " + exif[33432]
+
+ return ret
+ except ValueError:
+ return ""
+
+
+def register():
+ signals.all_generators_finalized.connect(add_gallery)
diff --git a/themes/minimal/static/css/bitter.css b/themes/minimal/static/css/bitter.css
new file mode 100644
index 0000000..eaa53ac
--- /dev/null
+++ b/themes/minimal/static/css/bitter.css
@@ -0,0 +1,17 @@
+/* latin-ext */
+@font-face {
+ font-family: 'Bitter';
+ font-style: normal;
+ font-weight: 400;
+ src: local('Bitter Regular'), local('Bitter-Regular'), url("../fonts/Regular/Bitter-Regular.woff") format('woff');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Bitter';
+ font-style: normal;
+ font-weight: 400;
+ src: local('Bitter Regular'), local('Bitter-Regular'), url("../fonts/Regular/Bitter-Regular.woff") format('woff');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+
diff --git a/themes/minimal/static/css/bootstrap.min.css b/themes/minimal/static/css/bootstrap.min.css
new file mode 100644
index 0000000..92e3fe8
--- /dev/null
+++ b/themes/minimal/static/css/bootstrap.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v4.3.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--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",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{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}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",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{outline:0!important}hr{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{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}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}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}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}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]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}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;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}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-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size: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{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.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-break: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{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{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;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.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{border:1px solid #dee2e6}.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:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.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{background-color:#c8cbcf}.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{background-color:#b1dfbb}.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{background-color:#abdde5}.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{background-color:#ffe8a1}.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:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.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{background-color:#ececf6}.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{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.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:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.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;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.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}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-top:.375rem;padding-bottom:.375rem;margin-bottom:0;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]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{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{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-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%;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-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%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:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.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((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 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") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.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~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.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{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~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;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(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.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:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.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:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,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:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.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:-ms-flexbox;display:flex;-ms-flex-align:center;align-items: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{-ms-flex-align:center;align-items: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;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{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{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{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{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{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{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{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{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{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{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{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{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;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:#007bff;border-color:#007bff}.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{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{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{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{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{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{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{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{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{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;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:#dc3545;border-color:#dc3545}.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{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{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{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{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{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.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{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{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:""}.dropleft .dropdown-toggle::after{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:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;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:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-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{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-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:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-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;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;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(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.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:-ms-flexbox;display:flex;-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-append,.input-group-prepend{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:-ms-flexbox;display:flex;-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>.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-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.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;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.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{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.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,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 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(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.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,%3csvg xmlns='http://www.w3.org/2000/svg' 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(0,123,255,.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;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .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}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{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(0,123,255,.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:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.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-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{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.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{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .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{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.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:#007bff;border:0;border-radius:1rem;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{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.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:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.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{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.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{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{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-item{margin-bottom:-1px}.nav-tabs .nav-link{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:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-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:-ms-flexbox;display:flex;-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%;-ms-flex-positive:1;flex-grow:1;-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:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.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{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{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{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.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{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{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{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.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{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{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{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.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{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-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{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{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{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.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,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .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:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-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:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.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-header+.list-group .list-group-item:first-child{border-top: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-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-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>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{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{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{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:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.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:1;color:#fff;background-color:#007bff;border-color:#007bff}.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;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{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:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.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;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;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;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;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,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;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;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;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.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:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.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{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-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:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.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;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.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:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.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:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.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;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);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:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.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{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{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:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-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:-ms-flexbox;display:flex;-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:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.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)}.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",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{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto 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 .arrow{position:absolute;display:block;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) * -1)}.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) * -1);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) * -1)}.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) * -1);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;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{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;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;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-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;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{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(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-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}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.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}.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:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!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:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!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:#007bff!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:#dc3545!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;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-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:-ms-flexbox!important;display:flex!important}.d-inline-flex{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:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{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:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{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:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{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:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{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:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{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.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-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{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-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{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-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{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-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{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-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{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-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{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-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{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-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{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-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{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-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{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-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{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-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{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-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{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-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{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-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{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-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{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-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{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-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{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-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{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-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}}.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:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;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{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{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}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.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}}.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:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!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:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!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:rgba(255,255,255,.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;overflow-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;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}body{min-width:992px!important}.container{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}}
+/*# sourceMappingURL=bootstrap.min.css.map */
\ No newline at end of file
diff --git a/themes/minimal/static/css/lightgallery.css b/themes/minimal/static/css/lightgallery.css
new file mode 100644
index 0000000..ea35129
--- /dev/null
+++ b/themes/minimal/static/css/lightgallery.css
@@ -0,0 +1,978 @@
+@font-face {
+ font-family: 'lg';
+ src: url("../fonts/lg.eot?n1z373");
+ src: url("../fonts/lg.eot?#iefixn1z373") format("embedded-opentype"), url("../fonts/lg.woff?n1z373") format("woff"), url("../fonts/lg.ttf?n1z373") format("truetype"), url("../fonts/lg.svg?n1z373#lg") format("svg");
+ font-weight: normal;
+ font-style: normal;
+}
+.lg-icon {
+ font-family: 'lg';
+ speak: none;
+ font-style: normal;
+ font-weight: normal;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+ /* Better Font Rendering =========== */
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.lg-actions .lg-next, .lg-actions .lg-prev {
+ background-color: rgba(0, 0, 0, 0.45);
+ border-radius: 2px;
+ color: #999;
+ cursor: pointer;
+ display: block;
+ font-size: 22px;
+ margin-top: -10px;
+ padding: 8px 10px 9px;
+ position: absolute;
+ top: 50%;
+ z-index: 1080;
+}
+.lg-actions .lg-next.disabled, .lg-actions .lg-prev.disabled {
+ pointer-events: none;
+ opacity: 0.5;
+}
+.lg-actions .lg-next:hover, .lg-actions .lg-prev:hover {
+ color: #FFF;
+}
+.lg-actions .lg-next {
+ right: 20px;
+}
+.lg-actions .lg-next:before {
+ content: "\e095";
+}
+.lg-actions .lg-prev {
+ left: 20px;
+}
+.lg-actions .lg-prev:after {
+ content: "\e094";
+}
+
+@-webkit-keyframes lg-right-end {
+ 0% {
+ left: 0;
+ }
+ 50% {
+ left: -30px;
+ }
+ 100% {
+ left: 0;
+ }
+}
+@-moz-keyframes lg-right-end {
+ 0% {
+ left: 0;
+ }
+ 50% {
+ left: -30px;
+ }
+ 100% {
+ left: 0;
+ }
+}
+@-ms-keyframes lg-right-end {
+ 0% {
+ left: 0;
+ }
+ 50% {
+ left: -30px;
+ }
+ 100% {
+ left: 0;
+ }
+}
+@keyframes lg-right-end {
+ 0% {
+ left: 0;
+ }
+ 50% {
+ left: -30px;
+ }
+ 100% {
+ left: 0;
+ }
+}
+@-webkit-keyframes lg-left-end {
+ 0% {
+ left: 0;
+ }
+ 50% {
+ left: 30px;
+ }
+ 100% {
+ left: 0;
+ }
+}
+@-moz-keyframes lg-left-end {
+ 0% {
+ left: 0;
+ }
+ 50% {
+ left: 30px;
+ }
+ 100% {
+ left: 0;
+ }
+}
+@-ms-keyframes lg-left-end {
+ 0% {
+ left: 0;
+ }
+ 50% {
+ left: 30px;
+ }
+ 100% {
+ left: 0;
+ }
+}
+@keyframes lg-left-end {
+ 0% {
+ left: 0;
+ }
+ 50% {
+ left: 30px;
+ }
+ 100% {
+ left: 0;
+ }
+}
+.lg-outer.lg-right-end .lg-object {
+ -webkit-animation: lg-right-end 0.3s;
+ -o-animation: lg-right-end 0.3s;
+ animation: lg-right-end 0.3s;
+ position: relative;
+}
+.lg-outer.lg-left-end .lg-object {
+ -webkit-animation: lg-left-end 0.3s;
+ -o-animation: lg-left-end 0.3s;
+ animation: lg-left-end 0.3s;
+ position: relative;
+}
+
+.lg-toolbar {
+ z-index: 1082;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+ background-color: rgba(0, 0, 0, 0.45);
+}
+.lg-toolbar .lg-icon {
+ color: #999;
+ cursor: pointer;
+ float: right;
+ font-size: 24px;
+ height: 47px;
+ line-height: 27px;
+ padding: 10px 0;
+ text-align: center;
+ width: 50px;
+ text-decoration: none !important;
+ outline: medium none;
+ -webkit-transition: color 0.2s linear;
+ -o-transition: color 0.2s linear;
+ transition: color 0.2s linear;
+}
+.lg-toolbar .lg-icon:hover {
+ color: #FFF;
+}
+.lg-toolbar .lg-close:after {
+ content: "\e070";
+}
+.lg-toolbar .lg-download:after {
+ content: "\e0f2";
+}
+
+.lg-sub-html {
+ background-color: rgba(0, 0, 0, 0.45);
+ bottom: 0;
+ color: #EEE;
+ font-size: 16px;
+ left: 0;
+ padding: 10px 40px;
+ position: fixed;
+ right: 0;
+ text-align: center;
+ z-index: 1080;
+}
+.lg-sub-html h4 {
+ margin: 0;
+ font-size: 13px;
+ font-weight: bold;
+}
+.lg-sub-html p {
+ font-size: 12px;
+ margin: 5px 0 0;
+}
+
+#lg-counter {
+ color: #999;
+ display: inline-block;
+ font-size: 16px;
+ padding-left: 20px;
+ padding-top: 12px;
+ vertical-align: middle;
+}
+
+.lg-toolbar, .lg-prev, .lg-next {
+ opacity: 1;
+ -webkit-transition: -webkit-transform 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, color 0.2s linear;
+ -moz-transition: -moz-transform 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, color 0.2s linear;
+ -o-transition: -o-transform 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, color 0.2s linear;
+ transition: transform 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, color 0.2s linear;
+}
+
+.lg-hide-items .lg-prev {
+ opacity: 0;
+ -webkit-transform: translate3d(-10px, 0, 0);
+ transform: translate3d(-10px, 0, 0);
+}
+.lg-hide-items .lg-next {
+ opacity: 0;
+ -webkit-transform: translate3d(10px, 0, 0);
+ transform: translate3d(10px, 0, 0);
+}
+.lg-hide-items .lg-toolbar {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -10px, 0);
+ transform: translate3d(0, -10px, 0);
+}
+
+body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-object {
+ -webkit-transform: scale3d(0.5, 0.5, 0.5);
+ transform: scale3d(0.5, 0.5, 0.5);
+ opacity: 0;
+ -webkit-transition: -webkit-transform 250ms cubic-bezier(0, 0, 0.25, 1) 0s, opacity 250ms cubic-bezier(0, 0, 0.25, 1) !important;
+ -moz-transition: -moz-transform 250ms cubic-bezier(0, 0, 0.25, 1) 0s, opacity 250ms cubic-bezier(0, 0, 0.25, 1) !important;
+ -o-transition: -o-transform 250ms cubic-bezier(0, 0, 0.25, 1) 0s, opacity 250ms cubic-bezier(0, 0, 0.25, 1) !important;
+ transition: transform 250ms cubic-bezier(0, 0, 0.25, 1) 0s, opacity 250ms cubic-bezier(0, 0, 0.25, 1) !important;
+ -webkit-transform-origin: 50% 50%;
+ -moz-transform-origin: 50% 50%;
+ -ms-transform-origin: 50% 50%;
+ transform-origin: 50% 50%;
+}
+body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-item.lg-complete .lg-object {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ opacity: 1;
+}
+
+.lg-outer .lg-thumb-outer {
+ background-color: #0D0A0A;
+ bottom: 0;
+ position: absolute;
+ width: 100%;
+ z-index: 1080;
+ max-height: 350px;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ -webkit-transition: -webkit-transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s;
+ -moz-transition: -moz-transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s;
+ -o-transition: -o-transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s;
+ transition: transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s;
+}
+.lg-outer .lg-thumb-outer.lg-grab .lg-thumb-item {
+ cursor: -webkit-grab;
+ cursor: -moz-grab;
+ cursor: -o-grab;
+ cursor: -ms-grab;
+ cursor: grab;
+}
+.lg-outer .lg-thumb-outer.lg-grabbing .lg-thumb-item {
+ cursor: move;
+ cursor: -webkit-grabbing;
+ cursor: -moz-grabbing;
+ cursor: -o-grabbing;
+ cursor: -ms-grabbing;
+ cursor: grabbing;
+}
+.lg-outer .lg-thumb-outer.lg-dragging .lg-thumb {
+ -webkit-transition-duration: 0s !important;
+ transition-duration: 0s !important;
+}
+.lg-outer.lg-thumb-open .lg-thumb-outer {
+ -webkit-transform: translate3d(0, 0%, 0);
+ transform: translate3d(0, 0%, 0);
+}
+.lg-outer .lg-thumb {
+ padding: 10px 0;
+ height: 100%;
+ margin-bottom: -5px;
+}
+.lg-outer .lg-thumb-item {
+ border-radius: 5px;
+ cursor: pointer;
+ float: left;
+ overflow: hidden;
+ height: 100%;
+ border: 2px solid #FFF;
+ border-radius: 4px;
+ margin-bottom: 5px;
+}
+@media (min-width: 1025px) {
+ .lg-outer .lg-thumb-item {
+ -webkit-transition: border-color 0.25s ease;
+ -o-transition: border-color 0.25s ease;
+ transition: border-color 0.25s ease;
+ }
+}
+.lg-outer .lg-thumb-item.active, .lg-outer .lg-thumb-item:hover {
+ border-color: #a90707;
+}
+.lg-outer .lg-thumb-item img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+.lg-outer.lg-has-thumb .lg-item {
+ padding-bottom: 120px;
+}
+.lg-outer.lg-can-toggle .lg-item {
+ padding-bottom: 0;
+}
+.lg-outer.lg-pull-caption-up .lg-sub-html {
+ -webkit-transition: bottom 0.25s ease;
+ -o-transition: bottom 0.25s ease;
+ transition: bottom 0.25s ease;
+}
+.lg-outer.lg-pull-caption-up.lg-thumb-open .lg-sub-html {
+ bottom: 100px;
+}
+.lg-outer .lg-toggle-thumb {
+ background-color: #0D0A0A;
+ border-radius: 2px 2px 0 0;
+ color: #999;
+ cursor: pointer;
+ font-size: 24px;
+ height: 39px;
+ line-height: 27px;
+ padding: 5px 0;
+ position: absolute;
+ right: 20px;
+ text-align: center;
+ top: -39px;
+ width: 50px;
+}
+.lg-outer .lg-toggle-thumb:after {
+ content: "\e1ff";
+}
+.lg-outer .lg-toggle-thumb:hover {
+ color: #FFF;
+}
+
+.lg-outer .lg-video-cont {
+ display: inline-block;
+ vertical-align: middle;
+ max-width: 1140px;
+ max-height: 100%;
+ width: 100%;
+ padding: 0 5px;
+}
+.lg-outer .lg-video {
+ width: 100%;
+ height: 0;
+ padding-bottom: 56.25%;
+ overflow: hidden;
+ position: relative;
+}
+.lg-outer .lg-video .lg-object {
+ display: inline-block;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100% !important;
+ height: 100% !important;
+}
+.lg-outer .lg-video .lg-video-play {
+ width: 84px;
+ height: 59px;
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin-left: -42px;
+ margin-top: -30px;
+ z-index: 1080;
+ cursor: pointer;
+}
+.lg-outer .lg-has-vimeo .lg-video-play {
+ background: url("../img/vimeo-play.png") no-repeat scroll 0 0 transparent;
+}
+.lg-outer .lg-has-vimeo:hover .lg-video-play {
+ background: url("../img/vimeo-play.png") no-repeat scroll 0 -58px transparent;
+}
+.lg-outer .lg-has-html5 .lg-video-play {
+ background: transparent url("../img/video-play.png") no-repeat scroll 0 0;
+ height: 64px;
+ margin-left: -32px;
+ margin-top: -32px;
+ width: 64px;
+ opacity: 0.8;
+}
+.lg-outer .lg-has-html5:hover .lg-video-play {
+ opacity: 1;
+}
+.lg-outer .lg-has-youtube .lg-video-play {
+ background: url("../img/youtube-play.png") no-repeat scroll 0 0 transparent;
+}
+.lg-outer .lg-has-youtube:hover .lg-video-play {
+ background: url("../img/youtube-play.png") no-repeat scroll 0 -60px transparent;
+}
+.lg-outer .lg-video-object {
+ width: 100% !important;
+ height: 100% !important;
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+.lg-outer .lg-has-video .lg-video-object {
+ visibility: hidden;
+}
+.lg-outer .lg-has-video.lg-video-playing .lg-object, .lg-outer .lg-has-video.lg-video-playing .lg-video-play {
+ display: none;
+}
+.lg-outer .lg-has-video.lg-video-playing .lg-video-object {
+ visibility: visible;
+}
+
+.lg-progress-bar {
+ background-color: #333;
+ height: 5px;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+ z-index: 1083;
+ opacity: 0;
+ -webkit-transition: opacity 0.08s ease 0s;
+ -moz-transition: opacity 0.08s ease 0s;
+ -o-transition: opacity 0.08s ease 0s;
+ transition: opacity 0.08s ease 0s;
+}
+.lg-progress-bar .lg-progress {
+ background-color: #a90707;
+ height: 5px;
+ width: 0;
+}
+.lg-progress-bar.lg-start .lg-progress {
+ width: 100%;
+}
+.lg-show-autoplay .lg-progress-bar {
+ opacity: 1;
+}
+
+.lg-autoplay-button:after {
+ content: "\e01d";
+}
+.lg-show-autoplay .lg-autoplay-button:after {
+ content: "\e01a";
+}
+
+.lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-img-wrap, .lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-image {
+ -webkit-transition-duration: 0s;
+ transition-duration: 0s;
+}
+.lg-outer.lg-use-transition-for-zoom .lg-item.lg-complete.lg-zoomable .lg-img-wrap {
+ -webkit-transition: -webkit-transform 0.3s cubic-bezier(0, 0, 0.25, 1) 0s;
+ -moz-transition: -moz-transform 0.3s cubic-bezier(0, 0, 0.25, 1) 0s;
+ -o-transition: -o-transform 0.3s cubic-bezier(0, 0, 0.25, 1) 0s;
+ transition: transform 0.3s cubic-bezier(0, 0, 0.25, 1) 0s;
+}
+.lg-outer.lg-use-left-for-zoom .lg-item.lg-complete.lg-zoomable .lg-img-wrap {
+ -webkit-transition: left 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, top 0.3s cubic-bezier(0, 0, 0.25, 1) 0s;
+ -moz-transition: left 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, top 0.3s cubic-bezier(0, 0, 0.25, 1) 0s;
+ -o-transition: left 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, top 0.3s cubic-bezier(0, 0, 0.25, 1) 0s;
+ transition: left 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, top 0.3s cubic-bezier(0, 0, 0.25, 1) 0s;
+}
+.lg-outer .lg-item.lg-complete.lg-zoomable .lg-img-wrap {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ -webkit-backface-visibility: hidden;
+ -moz-backface-visibility: hidden;
+ backface-visibility: hidden;
+}
+.lg-outer .lg-item.lg-complete.lg-zoomable .lg-image {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ -webkit-transition: -webkit-transform 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.15s !important;
+ -moz-transition: -moz-transform 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.15s !important;
+ -o-transition: -o-transform 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.15s !important;
+ transition: transform 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.15s !important;
+ -webkit-transform-origin: 0 0;
+ -moz-transform-origin: 0 0;
+ -ms-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-backface-visibility: hidden;
+ -moz-backface-visibility: hidden;
+ backface-visibility: hidden;
+}
+
+#lg-zoom-in:after {
+ content: "\e311";
+}
+
+#lg-actual-size {
+ font-size: 20px;
+}
+#lg-actual-size:after {
+ content: "\e033";
+}
+
+#lg-zoom-out {
+ opacity: 0.5;
+ pointer-events: none;
+}
+#lg-zoom-out:after {
+ content: "\e312";
+}
+.lg-zoomed #lg-zoom-out {
+ opacity: 1;
+ pointer-events: auto;
+}
+
+.lg-outer .lg-pager-outer {
+ bottom: 60px;
+ left: 0;
+ position: absolute;
+ right: 0;
+ text-align: center;
+ z-index: 1080;
+ height: 10px;
+}
+.lg-outer .lg-pager-outer.lg-pager-hover .lg-pager-cont {
+ overflow: visible;
+}
+.lg-outer .lg-pager-cont {
+ cursor: pointer;
+ display: inline-block;
+ overflow: hidden;
+ position: relative;
+ vertical-align: top;
+ margin: 0 5px;
+}
+.lg-outer .lg-pager-cont:hover .lg-pager-thumb-cont {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+.lg-outer .lg-pager-cont.lg-pager-active .lg-pager {
+ box-shadow: 0 0 0 2px white inset;
+}
+.lg-outer .lg-pager-thumb-cont {
+ background-color: #fff;
+ color: #FFF;
+ bottom: 100%;
+ height: 83px;
+ left: 0;
+ margin-bottom: 20px;
+ margin-left: -60px;
+ opacity: 0;
+ padding: 5px;
+ position: absolute;
+ width: 120px;
+ border-radius: 3px;
+ -webkit-transition: opacity 0.15s ease 0s, -webkit-transform 0.15s ease 0s;
+ -moz-transition: opacity 0.15s ease 0s, -moz-transform 0.15s ease 0s;
+ -o-transition: opacity 0.15s ease 0s, -o-transform 0.15s ease 0s;
+ transition: opacity 0.15s ease 0s, transform 0.15s ease 0s;
+ -webkit-transform: translate3d(0, 5px, 0);
+ transform: translate3d(0, 5px, 0);
+}
+.lg-outer .lg-pager-thumb-cont img {
+ width: 100%;
+ height: 100%;
+}
+.lg-outer .lg-pager {
+ background-color: rgba(255, 255, 255, 0.5);
+ border-radius: 50%;
+ box-shadow: 0 0 0 8px rgba(255, 255, 255, 0.7) inset;
+ display: block;
+ height: 12px;
+ -webkit-transition: box-shadow 0.3s ease 0s;
+ -o-transition: box-shadow 0.3s ease 0s;
+ transition: box-shadow 0.3s ease 0s;
+ width: 12px;
+}
+.lg-outer .lg-pager:hover, .lg-outer .lg-pager:focus {
+ box-shadow: 0 0 0 8px white inset;
+}
+.lg-outer .lg-caret {
+ border-left: 10px solid transparent;
+ border-right: 10px solid transparent;
+ border-top: 10px dashed;
+ bottom: -10px;
+ display: inline-block;
+ height: 0;
+ left: 50%;
+ margin-left: -5px;
+ position: absolute;
+ vertical-align: middle;
+ width: 0;
+}
+
+.lg-fullscreen:after {
+ content: "\e20c";
+}
+.lg-fullscreen-on .lg-fullscreen:after {
+ content: "\e20d";
+}
+
+.lg-outer #lg-dropdown-overlay {
+ background-color: rgba(0, 0, 0, 0.25);
+ bottom: 0;
+ cursor: default;
+ left: 0;
+ position: fixed;
+ right: 0;
+ top: 0;
+ z-index: 1081;
+ opacity: 0;
+ visibility: hidden;
+ -webkit-transition: visibility 0s linear 0.18s, opacity 0.18s linear 0s;
+ -o-transition: visibility 0s linear 0.18s, opacity 0.18s linear 0s;
+ transition: visibility 0s linear 0.18s, opacity 0.18s linear 0s;
+}
+.lg-outer.lg-dropdown-active .lg-dropdown, .lg-outer.lg-dropdown-active #lg-dropdown-overlay {
+ -webkit-transition-delay: 0s;
+ transition-delay: 0s;
+ -moz-transform: translate3d(0, 0px, 0);
+ -o-transform: translate3d(0, 0px, 0);
+ -ms-transform: translate3d(0, 0px, 0);
+ -webkit-transform: translate3d(0, 0px, 0);
+ transform: translate3d(0, 0px, 0);
+ opacity: 1;
+ visibility: visible;
+}
+.lg-outer.lg-dropdown-active #lg-share {
+ color: #FFF;
+}
+.lg-outer .lg-dropdown {
+ background-color: #fff;
+ border-radius: 2px;
+ font-size: 14px;
+ list-style-type: none;
+ margin: 0;
+ padding: 10px 0;
+ position: absolute;
+ right: 0;
+ text-align: left;
+ top: 50px;
+ opacity: 0;
+ visibility: hidden;
+ -moz-transform: translate3d(0, 5px, 0);
+ -o-transform: translate3d(0, 5px, 0);
+ -ms-transform: translate3d(0, 5px, 0);
+ -webkit-transform: translate3d(0, 5px, 0);
+ transform: translate3d(0, 5px, 0);
+ -webkit-transition: -webkit-transform 0.18s linear 0s, visibility 0s linear 0.5s, opacity 0.18s linear 0s;
+ -moz-transition: -moz-transform 0.18s linear 0s, visibility 0s linear 0.5s, opacity 0.18s linear 0s;
+ -o-transition: -o-transform 0.18s linear 0s, visibility 0s linear 0.5s, opacity 0.18s linear 0s;
+ transition: transform 0.18s linear 0s, visibility 0s linear 0.5s, opacity 0.18s linear 0s;
+}
+.lg-outer .lg-dropdown:after {
+ content: "";
+ display: block;
+ height: 0;
+ width: 0;
+ position: absolute;
+ border: 8px solid transparent;
+ border-bottom-color: #FFF;
+ right: 16px;
+ top: -16px;
+}
+.lg-outer .lg-dropdown > li:last-child {
+ margin-bottom: 0px;
+}
+.lg-outer .lg-dropdown > li:hover a, .lg-outer .lg-dropdown > li:hover .lg-icon {
+ color: #333;
+}
+.lg-outer .lg-dropdown a {
+ color: #333;
+ display: block;
+ white-space: pre;
+ padding: 4px 12px;
+ font-family: "Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;
+ font-size: 12px;
+}
+.lg-outer .lg-dropdown a:hover {
+ background-color: rgba(0, 0, 0, 0.07);
+}
+.lg-outer .lg-dropdown .lg-dropdown-text {
+ display: inline-block;
+ line-height: 1;
+ margin-top: -3px;
+ vertical-align: middle;
+}
+.lg-outer .lg-dropdown .lg-icon {
+ color: #333;
+ display: inline-block;
+ float: none;
+ font-size: 20px;
+ height: auto;
+ line-height: 1;
+ margin-right: 8px;
+ padding: 0;
+ vertical-align: middle;
+ width: auto;
+}
+.lg-outer #lg-share {
+ position: relative;
+}
+.lg-outer #lg-share:after {
+ content: "\e80d";
+}
+.lg-outer #lg-share-facebook .lg-icon {
+ color: #3b5998;
+}
+.lg-outer #lg-share-facebook .lg-icon:after {
+ content: "\e901";
+}
+.lg-outer #lg-share-twitter .lg-icon {
+ color: #00aced;
+}
+.lg-outer #lg-share-twitter .lg-icon:after {
+ content: "\e904";
+}
+.lg-outer #lg-share-googleplus .lg-icon {
+ color: #dd4b39;
+}
+.lg-outer #lg-share-googleplus .lg-icon:after {
+ content: "\e902";
+}
+.lg-outer #lg-share-pinterest .lg-icon {
+ color: #cb2027;
+}
+.lg-outer #lg-share-pinterest .lg-icon:after {
+ content: "\e903";
+}
+
+.group {
+ *zoom: 1;
+}
+
+.group:before, .group:after {
+ display: table;
+ content: "";
+ line-height: 0;
+}
+
+.group:after {
+ clear: both;
+}
+
+.lg-outer {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1050;
+ opacity: 0;
+ -webkit-transition: opacity 0.15s ease 0s;
+ -o-transition: opacity 0.15s ease 0s;
+ transition: opacity 0.15s ease 0s;
+}
+.lg-outer * {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.lg-outer.lg-visible {
+ opacity: 1;
+}
+.lg-outer.lg-css3 .lg-item.lg-prev-slide, .lg-outer.lg-css3 .lg-item.lg-next-slide, .lg-outer.lg-css3 .lg-item.lg-current {
+ -webkit-transition-duration: inherit !important;
+ transition-duration: inherit !important;
+ -webkit-transition-timing-function: inherit !important;
+ transition-timing-function: inherit !important;
+}
+.lg-outer.lg-css3.lg-dragging .lg-item.lg-prev-slide, .lg-outer.lg-css3.lg-dragging .lg-item.lg-next-slide, .lg-outer.lg-css3.lg-dragging .lg-item.lg-current {
+ -webkit-transition-duration: 0s !important;
+ transition-duration: 0s !important;
+ opacity: 1;
+}
+.lg-outer.lg-grab img.lg-object {
+ cursor: -webkit-grab;
+ cursor: -moz-grab;
+ cursor: -o-grab;
+ cursor: -ms-grab;
+ cursor: grab;
+}
+.lg-outer.lg-grabbing img.lg-object {
+ cursor: move;
+ cursor: -webkit-grabbing;
+ cursor: -moz-grabbing;
+ cursor: -o-grabbing;
+ cursor: -ms-grabbing;
+ cursor: grabbing;
+}
+.lg-outer .lg {
+ height: 100%;
+ width: 100%;
+ position: relative;
+ overflow: hidden;
+ margin-left: auto;
+ margin-right: auto;
+ max-width: 100%;
+ max-height: 100%;
+}
+.lg-outer .lg-inner {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ left: 0;
+ top: 0;
+ white-space: nowrap;
+}
+.lg-outer .lg-item {
+ background: url("/theme/images/loading.gif") no-repeat scroll center center transparent;
+ display: none !important;
+}
+.lg-outer.lg-css3 .lg-prev-slide, .lg-outer.lg-css3 .lg-current, .lg-outer.lg-css3 .lg-next-slide {
+ display: inline-block !important;
+}
+.lg-outer.lg-css .lg-current {
+ display: inline-block !important;
+}
+.lg-outer .lg-item, .lg-outer .lg-img-wrap {
+ display: inline-block;
+ text-align: center;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+}
+.lg-outer .lg-item:before, .lg-outer .lg-img-wrap:before {
+ content: "";
+ display: inline-block;
+ height: 50%;
+ width: 1px;
+ margin-right: -1px;
+}
+.lg-outer .lg-img-wrap {
+ position: absolute;
+ padding: 0 5px;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+}
+.lg-outer .lg-item.lg-complete {
+ background-image: none;
+}
+.lg-outer .lg-item.lg-current {
+ z-index: 1060;
+}
+.lg-outer .lg-image {
+ display: inline-block;
+ vertical-align: middle;
+ max-width: 100%;
+ max-height: 100%;
+ width: auto !important;
+ height: auto !important;
+}
+.lg-outer.lg-show-after-load .lg-item .lg-object, .lg-outer.lg-show-after-load .lg-item .lg-video-play {
+ opacity: 0;
+ -webkit-transition: opacity 0.15s ease 0s;
+ -o-transition: opacity 0.15s ease 0s;
+ transition: opacity 0.15s ease 0s;
+}
+.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-object, .lg-outer.lg-show-after-load .lg-item.lg-complete .lg-video-play {
+ opacity: 1;
+}
+.lg-outer .lg-empty-html {
+ display: none;
+}
+.lg-outer.lg-hide-download #lg-download {
+ display: none;
+}
+
+.lg-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 1040;
+ background-color: #000;
+ opacity: 0;
+ -webkit-transition: opacity 0.15s ease 0s;
+ -o-transition: opacity 0.15s ease 0s;
+ transition: opacity 0.15s ease 0s;
+}
+.lg-backdrop.in {
+ opacity: 1;
+}
+
+.lg-css3.lg-no-trans .lg-prev-slide, .lg-css3.lg-no-trans .lg-next-slide, .lg-css3.lg-no-trans .lg-current {
+ -webkit-transition: none 0s ease 0s !important;
+ -moz-transition: none 0s ease 0s !important;
+ -o-transition: none 0s ease 0s !important;
+ transition: none 0s ease 0s !important;
+}
+.lg-css3.lg-use-css3 .lg-item {
+ -webkit-backface-visibility: hidden;
+ -moz-backface-visibility: hidden;
+ backface-visibility: hidden;
+}
+.lg-css3.lg-use-left .lg-item {
+ -webkit-backface-visibility: hidden;
+ -moz-backface-visibility: hidden;
+ backface-visibility: hidden;
+}
+.lg-css3.lg-fade .lg-item {
+ opacity: 0;
+}
+.lg-css3.lg-fade .lg-item.lg-current {
+ opacity: 1;
+}
+.lg-css3.lg-fade .lg-item.lg-prev-slide, .lg-css3.lg-fade .lg-item.lg-next-slide, .lg-css3.lg-fade .lg-item.lg-current {
+ -webkit-transition: opacity 0.1s ease 0s;
+ -moz-transition: opacity 0.1s ease 0s;
+ -o-transition: opacity 0.1s ease 0s;
+ transition: opacity 0.1s ease 0s;
+}
+.lg-css3.lg-slide.lg-use-css3 .lg-item {
+ opacity: 0;
+}
+.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+}
+.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+}
+.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+}
+.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide, .lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide, .lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current {
+ -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
+ -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
+ -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
+ transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
+}
+.lg-css3.lg-slide.lg-use-left .lg-item {
+ opacity: 0;
+ position: absolute;
+ left: 0;
+}
+.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide {
+ left: -100%;
+}
+.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide {
+ left: 100%;
+}
+.lg-css3.lg-slide.lg-use-left .lg-item.lg-current {
+ left: 0;
+ opacity: 1;
+}
+.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide, .lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide, .lg-css3.lg-slide.lg-use-left .lg-item.lg-current {
+ -webkit-transition: left 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
+ -moz-transition: left 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
+ -o-transition: left 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
+ transition: left 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
+}
diff --git a/themes/minimal/static/css/lightgallery_setup.css b/themes/minimal/static/css/lightgallery_setup.css
new file mode 100644
index 0000000..b64dcfe
--- /dev/null
+++ b/themes/minimal/static/css/lightgallery_setup.css
@@ -0,0 +1,115 @@
+
+.demo-gallery > ul {
+ margin-bottom: 0;
+}
+.demo-gallery > ul > li {
+ margin-bottom: 15px;
+}
+.demo-gallery > ul > li a {
+ border: 3px solid #FFF;
+ border-radius: 3px;
+ display: block;
+ overflow: hidden;
+ position: relative;
+ float: left;
+}
+.demo-gallery > ul > li a > img {
+ -webkit-transition: -webkit-transform 0.15s ease 0s;
+ -moz-transition: -moz-transform 0.15s ease 0s;
+ -o-transition: -o-transform 0.15s ease 0s;
+ transition: transform 0.15s ease 0s;
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ width: 100%;
+}
+.demo-gallery > ul > li a:hover > img {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
+ transform: scale3d(1.1, 1.1, 1.1);
+}
+.demo-gallery > ul > li a:hover .demo-gallery-poster > img {
+ opacity: 1;
+}
+.demo-gallery > ul > li a .demo-gallery-poster {
+ background-color: rgba(0, 0, 0, 0.1);
+ bottom: 0;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ -webkit-transition: background-color 0.15s ease 0s;
+ -o-transition: background-color 0.15s ease 0s;
+ transition: background-color 0.15s ease 0s;
+}
+.demo-gallery > ul > li a .demo-gallery-poster > img {
+ left: 50%;
+ margin-left: -10px;
+ margin-top: -10px;
+ opacity: 0;
+ position: absolute;
+ top: 50%;
+ -webkit-transition: opacity 0.3s ease 0s;
+ -o-transition: opacity 0.3s ease 0s;
+ transition: opacity 0.3s ease 0s;
+}
+.demo-gallery > ul > li a:hover .demo-gallery-poster {
+ background-color: rgba(0, 0, 0, 0.5);
+}
+.demo-gallery .justified-gallery > a > img {
+ -webkit-transition: -webkit-transform 0.15s ease 0s;
+ -moz-transition: -moz-transform 0.15s ease 0s;
+ -o-transition: -o-transform 0.15s ease 0s;
+ transition: transform 0.15s ease 0s;
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ height: 100%;
+ width: 100%;
+}
+.demo-gallery .justified-gallery > a:hover > img {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
+ transform: scale3d(1.1, 1.1, 1.1);
+}
+.demo-gallery .justified-gallery > a:hover .demo-gallery-poster > img {
+ opacity: 1;
+}
+.demo-gallery .justified-gallery > a .demo-gallery-poster {
+ background-color: rgba(0, 0, 0, 0.1);
+ bottom: 0;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ -webkit-transition: background-color 0.15s ease 0s;
+ -o-transition: background-color 0.15s ease 0s;
+ transition: background-color 0.15s ease 0s;
+}
+.demo-gallery .justified-gallery > a .demo-gallery-poster > img {
+ left: 50%;
+ margin-left: -10px;
+ margin-top: -10px;
+ opacity: 0;
+ position: absolute;
+ top: 50%;
+ -webkit-transition: opacity 0.3s ease 0s;
+ -o-transition: opacity 0.3s ease 0s;
+ transition: opacity 0.3s ease 0s;
+}
+.demo-gallery .justified-gallery > a:hover .demo-gallery-poster {
+ background-color: rgba(0, 0, 0, 0.5);
+}
+.demo-gallery .video .demo-gallery-poster img {
+ height: 48px;
+ margin-left: -24px;
+ margin-top: -24px;
+ opacity: 0.8;
+ width: 48px;
+}
+.demo-gallery.dark > ul > li a {
+ border: 3px solid #04070a;
+}
+.home .demo-gallery {
+ padding-bottom: 80px;
+}
+#aniimated-thumbnials .demo-gallery a {
+ width: 190px;
+ height: 132px;
+}
diff --git a/themes/minimal/static/css/minimal.css b/themes/minimal/static/css/minimal.css
new file mode 100644
index 0000000..3dfff9e
--- /dev/null
+++ b/themes/minimal/static/css/minimal.css
@@ -0,0 +1,686 @@
+/* minimal.css - A minimalistic style */
+
+/*
+ Reset margins. Leave everything else default.
+*/
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, font, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td {
+ border: 0;
+ font-family: inherit;
+ font-size: 100%;
+ font-style: inherit;
+ font-weight: inherit;
+ margin: 0;
+ outline: 0;
+ padding: 0;
+ vertical-align: baseline;
+}
+
+.bg-light-red {
+ background-color: rgba(255,0,0,.25);
+}
+
+.bg-light-green {
+ background-color: rgba(0,255,0,.25);
+}
+
+
+/*
+ Always display a scrollbar by defining the overflow-y,
+ since we don't want the layout to jump if a scrollbar
+ is available or not.
+*/
+html {
+ overflow-y: scroll;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+}
+
+body {
+ font: 18px Bitter, Georgia, serif;
+ font-weight: 400;
+ line-height: 24px;
+ background-color: #fff;
+ color: #333;
+}
+
+#container {
+ width: 700px;
+ margin: 0 auto;
+}
+
+#links {
+ border: 0;
+}
+
+#links a {
+ color: #a6a6a6;
+ text-decoration: none;
+}
+
+
+
+/*----------------------------*/
+/* Page Title */
+/*----------------------------*/
+
+#header {
+ margin: 0 auto;
+ text-align: center;
+}
+
+.page-title {
+ font-family: Bitter, Georgia, serif;
+}
+
+/*----------------------------*/
+/* Menu */
+/*----------------------------*/
+
+/*
+ Don't style header.
+*/
+#header h1 a,
+#header h1 a:hover,
+#header h1 a:active,
+#header h1 a:visited
+{
+ color: #333;
+ text-decoration: none;
+}
+
+#header a.navigation-link,
+#header a.navigation-link:active,
+#header a.navigation-link:visited
+{
+ color: #333;
+ text-decoration: none;
+}
+
+#header a.navigation-link:hover
+{
+ color: #002fc8;
+ text-decoration: none;
+}
+
+/*
+ If we have a large screen, we want a simple horizontal
+ navigation bar, so the items use display: inline with
+ some padding after each list element.
+
+ This is overriden in the media query below, so for small
+ screens we make a vertical navigation list out of it.
+*/
+
+.navigation {
+ margin: 0;
+ padding: 0;
+}
+
+.navigation-item {
+ display: inline-block;
+}
+
+ .blocklink {
+ display: block;
+}
+
+#links a,
+#links a:visited,
+#links a:active,
+#links a:focus {
+ color: #a6a6a6;
+ text-decoration: none;
+}
+
+#links a:hover {
+ color: #6499ba;
+}
+
+/*------------------------------------------*/
+/* Documents */
+/*------------------------------------------*/
+
+ul.document {
+ list-style-type: none;
+ list-style-image: none;
+ margin: 0 0 1em 0;
+}
+
+li.document-downloads {
+ margin: 0.5em 0 0 0;
+}
+
+/*------------------------------------------*/
+/* Markup */
+/*------------------------------------------*/
+
+b, strong {
+ font-weight: 700;
+}
+dfn, cite, em, i {
+ font-style: italic;
+}
+
+blockquote {
+ padding: 28px 0 1px 45px;
+ quotes: "\201C" "\201D" "\2018" "\2019";
+ clear: both;
+ color: #777;
+}
+
+blockquote:before {
+ content: open-quote;
+ font-size: 4em;
+ float: left;
+ margin-left: -45px;
+ font-family: "times new roman";
+ color: #faa;
+ font-weight: bold;
+}
+
+/*------------------------------------------*/
+/* Archive */
+/*------------------------------------------*/
+
+/*
+ The idea for this simple, but nice design was adapted
+ from:
+
+ * http://hackercodex.com
+*/
+dl {
+ margin-bottom: 1em;
+}
+
+dt.article-date {
+ font-weight: bold;
+ margin-top: 1em;
+}
+
+dd.article-title {
+ margin-left: 1.5em;
+}
+
+/*----------------------------*/
+/* Comments */
+/*----------------------------*/
+#comments {
+ background-color: #dee7ec;
+ padding: 1em;
+ margin-bottom: 1em;
+ clear: both;
+}
+
+.main-column {
+ clear: both;
+ overflow: hidden;
+}
+
+.content {
+ clear: both;
+ overflow: hidden;
+}
+
+div.clearer {
+ clear: both;
+ font-size: 0;
+ line-height: 0;
+ height: 0;
+ overflow: hidden;
+}
+
+em.u {
+ font-style: normal;
+ text-decoration: underline;
+}
+
+em em.u {
+ font-style: italic;
+}
+
+/*----------------------------*/
+/* Tables */
+/*----------------------------*/
+
+table {
+ border-collapse: collapse;
+ padding: 0;
+ margin: 0 0 11px 0;
+ text-align: center;
+}
+
+table th {
+ border: 1px solid #8cacbb;
+ background-color: #dee7ec;
+ vertical-align: bottom;
+ padding: 0 10px 10px 10px;
+}
+
+table td {
+ border: 1px solid #8cacbb;
+ vertical-align: top;
+ padding: 10px;
+ text-align: center;
+}
+
+/*----------------------------*/
+/* Paragraphs */
+/*----------------------------*/
+
+hr {
+ border: 0px;
+ border-top: 1px solid #8cacbb;
+ text-align: center;
+ height: 0px;
+}
+
+/*----------------------------*/
+/* Syntax Highlightning */
+/*----------------------------*/
+
+pre,
+code {
+ font-family: Consolas, "Liberation Mono", Menlo, monospace;
+}
+
+code {
+ font-size: 15px;
+}
+
+pre {
+ background: #f8f8f8;
+ border: 1px dashed #d7d7c8;
+ line-height: 20px;
+ font-size: 14px;
+ overflow: auto; /* Do not reformat code, sorry you have to scroll! */
+ padding: 5px;
+}
+
+/*----------------------------*/
+/* Images */
+/*----------------------------*/
+
+img {
+ border: 0;
+ max-width: 100%;
+}
+
+img.mediacenter {
+ display: block;
+ margin: 0 auto;
+}
+
+img.medialeft {
+ float: left;
+ margin: 0 1.5em 0 0;
+}
+
+img.mediaright {
+ float: right;
+ margin: 0 0 0 1.5em;
+}
+
+/*----------------------------*/
+/* Links */
+/*----------------------------*/
+
+article a {
+ color: #002fc8;
+ text-decoration: none;
+}
+
+article a:visited {
+ color: purple;
+ text-decoration: none;
+}
+
+article a:hover,
+article a:active {
+ color: #333;
+ text-decoration: underline;
+}
+
+/*----------------------------*/
+/* Icons */
+/*----------------------------*/
+
+.mediafile {
+ background: transparent url(../images/fileicons/file.png) 0px 1px no-repeat;
+ padding-left: 18px;
+ padding-bottom: 1px;
+}
+
+.gz {
+ background-image: url(../images/fileicons/gz.png);
+}
+
+.pdf {
+ background-image: url(../images/fileicons/pdf.png);
+}
+
+
+/*----------------------------*/
+/* Headlines */
+/*----------------------------*/
+
+h1,
+h2,
+h3,
+h4,
+h5 {
+ margin-bottom: 0.5em;
+ font-family: Bitter, Georgia, serif;
+}
+
+h1 {
+ font-size: 26px;
+ line-height: 32px;
+ margin-bottom: 24px;
+ margin-top: 28px;
+}
+
+h2 {
+ font-size: 22px;
+ line-height: 28px;
+ margin-bottom: 24px;
+ margin-top: 28px;
+}
+
+h3 {
+ font-size: 18px;
+ line-height: 24px;
+ margin-bottom: 24px;
+ margin-top: 24px;
+}
+
+h4 {
+ font-size: 16px;
+ line-height: 20px;
+ margin-bottom: 12px;
+ margin-top: 24px;
+}
+
+h5 {
+ font-size: 14px;
+ line-height: 18px;
+ margin-bottom: 12px;
+ margin-top: 24px;
+}
+
+h6 {
+ font-size: 12px;
+ line-height: 16px;
+ margin-bottom: 0;
+ margin-top: 24px;
+}
+
+/*
+ Special margins and font for title and byline.
+*/
+.title { margin-bottom: 0.25em; }
+
+.byline {
+ font-size: 15px;
+ color: #666;
+ margin-bottom: 24px;
+}
+
+/*----------------------------*/
+/* Lists */
+/*----------------------------*/
+
+ul {
+ list-style-type: square;
+ list-style-image: none;
+ margin: 0 0 1em 3.5em;
+}
+
+ol {
+ list-style-image: none;
+ margin: 0 0 1em 3.5em;
+}
+
+/*
+ No bottom gap in between and smaller left margin
+ for nested lists
+*/
+li ul,
+li ol {
+ margin: 0 0 0 1.5em;
+}
+
+ol { list-style-type: decimal; }
+ol ol { list-style-type: upper-roman; }
+ol ol ol { list-style-type: lower-alpha; }
+ol ol ol ol { list-style-type: lower-greek; }
+
+ul.posts span {
+ font-family: Monaco, "Courier New", monospace;
+}
+
+/*----------------------------*/
+/* Margins */
+/*----------------------------*/
+
+hr,
+p,
+ul,
+ol,
+dd,
+blockquote,
+address,
+pre,
+table {
+ margin-bottom: 29px;
+}
+
+/*----------------------------*/
+/* Media Queries */
+/*----------------------------*/
+@media screen and (min-width: 780px) {
+
+ #menu {
+ border-top: 1px solid #333;
+ border-bottom: 1px solid #333;
+ line-height: 54px;
+ }
+
+ article {
+ font-size: 17px;
+ line-height: 28px;
+ }
+
+ .byline {
+ font-size: 16px;
+ }
+
+ .title {
+ font-size: 34px;
+ }
+
+ .blocklink {
+ padding-left: 20px;
+ padding-right: 20px;
+ }
+
+ h1 {
+ font-size: 34px;
+ line-height: 44px;
+ margin-bottom: 28px;
+ margin-top: 28px;
+ }
+
+ h2 {
+ font-size: 28px;
+ line-height: 36px;
+ margin-bottom: 28px;
+ margin-top: 28px;
+ }
+
+ h3 {
+ font-size: 24px;
+ line-height: 30px;
+ margin-bottom: 28px;
+ margin-top: 28px;
+ }
+
+ h4 {
+ font-size: 22px;
+ line-height: 28px;
+ margin-bottom: 28px;
+ margin-top: 28px;
+ }
+
+ h5 {
+ font-size: 20px;
+ line-height: 26px;
+ margin-bottom: 14px;
+ margin-top: 28px;
+ }
+
+ h6 {
+ font-size: 18px;
+ line-height: 24px;
+ margin-bottom: 7px;
+ margin-top: 28px;
+ }
+
+
+ hr,
+ p,
+ ul,
+ ol,
+ dd,
+ blockquote,
+ address,
+ pre,
+ table {
+ margin-bottom: 28px;
+ }
+
+}
+
+/*
+ Mobile
+*/
+@media only screen and (max-width: 780px) {
+
+ /* Turn the absolute width into a percentage at this point. */
+ #container {
+ width: 95%;
+ margin: 0 auto;
+ }
+
+ #menu {
+ border-top: 1px solid #333;
+ font-size: 18px;
+ line-height: 36px;
+ }
+
+ .page-title {
+ margin-bottom: 5px;
+ margin-top: 5px;
+ }
+
+ .page-title-link {
+ display: block;
+ padding: 0;
+ top:0px;
+ left:0px;
+ width:100%;
+ height:100%;
+ }
+
+ article {
+ font-size: 18px;
+ line-height: 29px;
+ margin-bottom: 29px
+ }
+
+ /*
+ Don't show the bottom links, since the occupy too much
+ space on small devices (and may look ugly!).
+ */
+ #links {
+ display: none !important;
+ }
+
+ /*
+ Define the blocklink now, which turns the menu items
+ into a block link, which is easy to hit with a touch
+ device.
+ */
+ .blocklink {
+ display: block;
+ padding: 0;
+ top:0px;
+ left:0px;
+ width:100%;
+ height:100%;
+ }
+
+ /*
+ Display the links in the menu as block and remove
+ padding and border for it.
+ */
+ .navigation, .navigation-item {
+ display: block;
+ color: #638c9c;
+ margin: 0;
+ padding: 0;
+ border: 0;
+ }
+
+ /*
+ Center each navigation item.
+ */
+ li.navigation-item {
+ text-align: center;
+ border-bottom: 1px solid black;
+ }
+
+ /*
+ The blog archive looks crap on small devices, so let's
+ display the information centered without floating.
+ */
+ h2.article-year {
+ text-align: center;
+ }
+
+ dt.article-date {
+ text-align: center;
+ }
+
+ dd.article-title {
+ margin-left: 0;
+ text-align: center;
+ }
+}
+
+/* Do not show header/footer for print */
+@media only print {
+
+ /*
+ You don't want the comments, menu, page-title or
+ footer links when printing a page. Don't display
+ them.
+ */
+ #comments, #header, #links {
+ display: none !important;
+ }
+
+ .footer {
+ display: none !important;
+ }
+
+ #container {
+ width: 780px;
+ }
+}
diff --git a/themes/minimal/static/css/pygments.css b/themes/minimal/static/css/pygments.css
new file mode 100644
index 0000000..fb2d77e
--- /dev/null
+++ b/themes/minimal/static/css/pygments.css
@@ -0,0 +1,84 @@
+.highlight {
+ padding: 0px;
+ margin-top: 5px;
+ margin-bottom: 1em;
+}
+
+.highlight pre {
+ padding: 5px;
+ margin: 0;
+ font-size: 12px;
+ line-height: 20px;
+}
+
+/* https://github.com/PhilipTrauner/pygments-github-css/blob/master/github.css */
+
+.highlight .hll { background-color: #ffffcc }
+.highlight { background: #f8f8f8; }
+.highlight .c { color: #6a737d } /* Comment */
+.highlight .err { } /* Error */
+.highlight .k { color: #d73a49 } /* Keyword */
+.highlight .o { } /* Operator */
+.highlight .ch { color: #6a737d } /* Comment.Hashbang */
+.highlight .cm { color: #6a737d } /* Comment.Multiline */
+.highlight .cp { color: #d73a49 } /* Comment.Preproc */
+.highlight .cpf { color: #032f62 } /* Comment.PreprocFile */
+.highlight .c1 { color: #6a737d } /* Comment.Single */
+.highlight .cs { color: #6a737d } /* Comment.Special */
+.highlight .gd { color: #b31d28; background-color: #ffeef0 } /* Generic.Deleted */
+.highlight .ge { } /* Generic.Emph */
+.highlight .gr { } /* Generic.Error */
+.highlight .gh { color: #005cc5 } /* Generic.Heading */
+.highlight .gi { color: #22863a; background-color: #f0fff4 } /* Generic.Inserted */
+.highlight .go { } /* Generic.Output */
+.highlight .gp { } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #6f42c1; font-weight: bold } /* Generic.Subheading */
+.highlight .gt { color: #0044DD } /* Generic.Traceback */
+.highlight .kc { color: #005cc5 } /* Keyword.Constant */
+.highlight .kd { color: #d73a49 } /* Keyword.Declaration */
+.highlight .kn { color: #d73a49 } /* Keyword.Namespace */
+.highlight .kp { color: #d73a49 } /* Keyword.Pseudo */
+.highlight .kr { color: #d73a49 } /* Keyword.Reserved */
+.highlight .kt { color: #d73a49 } /* Keyword.Type */
+.highlight .m { color: #666666 } /* Literal.Number */
+.highlight .s { color: #032f62 } /* Literal.String */
+.highlight .na { } /* Name.Attribute */
+.highlight .nb { color: #005cc5 } /* Name.Builtin */
+.highlight .nc { color: #6f42c1 } /* Name.Class */
+.highlight .no { color: #005cc5 } /* Name.Constant */
+.highlight .nd { color: #6f42c1 } /* Name.Decorator */
+.highlight .ni { color: #005cc5 } /* Name.Entity */
+.highlight .ne { color: #005cc5 } /* Name.Exception */
+.highlight .nf { color: #6f42c1 } /* Name.Function */
+.highlight .nl { color: #005cc5 } /* Name.Label */
+.highlight .nn { color: #6f42c1 } /* Name.Namespace */
+.highlight .nt { color: #22863a } /* Name.Tag */
+.highlight .nv { color: #24292e } /* Name.Variable */
+.highlight .ow { color: #d73a49; } /* Operator.Word */
+.highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .mb { color: #005cc5 } /* Literal.Number.Bin */
+.highlight .mf { color: #005cc5 } /* Literal.Number.Float */
+.highlight .mh { color: #005cc5 } /* Literal.Number.Hex */
+.highlight .mi { color: #005cc5 } /* Literal.Number.Integer */
+.highlight .mo { color: #005cc5 } /* Literal.Number.Oct */
+.highlight .sa { color: #d73a49 } /* Literal.String.Affix */
+.highlight .sb { color: #032f62 } /* Literal.String.Backtick */
+.highlight .sc { color: #032f62 } /* Literal.String.Char */
+.highlight .dl { color: #d73a49 } /* Literal.String.Delimiter */
+.highlight .sd { color: #032f62 } /* Literal.String.Doc */
+.highlight .s2 { color: #032f62 } /* Literal.String.Double */
+.highlight .se { color: #032f62 } /* Literal.String.Escape */
+.highlight .sh { color: #032f62 } /* Literal.String.Heredoc */
+.highlight .si { color: #005cc5 } /* Literal.String.Interpol */
+.highlight .sx { color: #032f62 } /* Literal.String.Other */
+.highlight .sr { color: #032f62 } /* Literal.String.Regex */
+.highlight .s1 { color: #032f62 } /* Literal.String.Single */
+.highlight .ss { color: #005cc5 } /* Literal.String.Symbol */
+.highlight .bp { color: #005cc5 } /* Name.Builtin.Pseudo */
+.highlight .fm { color: #005cc5 } /* Name.Function.Magic */
+.highlight .vc { color: #24292e } /* Name.Variable.Class */
+.highlight .vg { color: #24292e } /* Name.Variable.Global */
+.highlight .vi { color: #24292e } /* Name.Variable.Instance */
+.highlight .vm { color: #005cc5 } /* Name.Variable.Magic */
+.highlight .il { color: #005cc5 } /* Literal.Number.Integer.Long */
\ No newline at end of file
diff --git a/themes/minimal/static/fonts/Bold/Bitter-Bold.eot b/themes/minimal/static/fonts/Bold/Bitter-Bold.eot
new file mode 100755
index 0000000..ed2452f
Binary files /dev/null and b/themes/minimal/static/fonts/Bold/Bitter-Bold.eot differ
diff --git a/themes/minimal/static/fonts/Bold/Bitter-Bold.svg b/themes/minimal/static/fonts/Bold/Bitter-Bold.svg
new file mode 100755
index 0000000..47c9c86
--- /dev/null
+++ b/themes/minimal/static/fonts/Bold/Bitter-Bold.svg
@@ -0,0 +1,710 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/themes/minimal/static/fonts/Bold/Bitter-Bold.ttf b/themes/minimal/static/fonts/Bold/Bitter-Bold.ttf
new file mode 100755
index 0000000..b7c265d
Binary files /dev/null and b/themes/minimal/static/fonts/Bold/Bitter-Bold.ttf differ
diff --git a/themes/minimal/static/fonts/Bold/Bitter-Bold.woff b/themes/minimal/static/fonts/Bold/Bitter-Bold.woff
new file mode 100755
index 0000000..a5d5dcf
Binary files /dev/null and b/themes/minimal/static/fonts/Bold/Bitter-Bold.woff differ
diff --git a/themes/minimal/static/fonts/BoldItalic/Bitter-BoldItalic.eot b/themes/minimal/static/fonts/BoldItalic/Bitter-BoldItalic.eot
new file mode 100755
index 0000000..633ef4b
Binary files /dev/null and b/themes/minimal/static/fonts/BoldItalic/Bitter-BoldItalic.eot differ
diff --git a/themes/minimal/static/fonts/BoldItalic/Bitter-BoldItalic.svg b/themes/minimal/static/fonts/BoldItalic/Bitter-BoldItalic.svg
new file mode 100755
index 0000000..e4d9e91
--- /dev/null
+++ b/themes/minimal/static/fonts/BoldItalic/Bitter-BoldItalic.svg
@@ -0,0 +1,1067 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/themes/minimal/static/fonts/BoldItalic/Bitter-BoldItalic.ttf b/themes/minimal/static/fonts/BoldItalic/Bitter-BoldItalic.ttf
new file mode 100755
index 0000000..d66e909
Binary files /dev/null and b/themes/minimal/static/fonts/BoldItalic/Bitter-BoldItalic.ttf differ
diff --git a/themes/minimal/static/fonts/BoldItalic/Bitter-BoldItalic.woff b/themes/minimal/static/fonts/BoldItalic/Bitter-BoldItalic.woff
new file mode 100755
index 0000000..518e068
Binary files /dev/null and b/themes/minimal/static/fonts/BoldItalic/Bitter-BoldItalic.woff differ
diff --git a/themes/minimal/static/fonts/Italic/Bitter-Italic.eot b/themes/minimal/static/fonts/Italic/Bitter-Italic.eot
new file mode 100755
index 0000000..bf1c294
Binary files /dev/null and b/themes/minimal/static/fonts/Italic/Bitter-Italic.eot differ
diff --git a/themes/minimal/static/fonts/Italic/Bitter-Italic.svg b/themes/minimal/static/fonts/Italic/Bitter-Italic.svg
new file mode 100755
index 0000000..f057c66
--- /dev/null
+++ b/themes/minimal/static/fonts/Italic/Bitter-Italic.svg
@@ -0,0 +1,810 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/themes/minimal/static/fonts/Italic/Bitter-Italic.ttf b/themes/minimal/static/fonts/Italic/Bitter-Italic.ttf
new file mode 100755
index 0000000..deb3e0c
Binary files /dev/null and b/themes/minimal/static/fonts/Italic/Bitter-Italic.ttf differ
diff --git a/themes/minimal/static/fonts/Italic/Bitter-Italic.woff b/themes/minimal/static/fonts/Italic/Bitter-Italic.woff
new file mode 100755
index 0000000..844d81a
Binary files /dev/null and b/themes/minimal/static/fonts/Italic/Bitter-Italic.woff differ
diff --git a/themes/minimal/static/fonts/Regular/Bitter-Regular.eot b/themes/minimal/static/fonts/Regular/Bitter-Regular.eot
new file mode 100755
index 0000000..6a9adf5
Binary files /dev/null and b/themes/minimal/static/fonts/Regular/Bitter-Regular.eot differ
diff --git a/themes/minimal/static/fonts/Regular/Bitter-Regular.svg b/themes/minimal/static/fonts/Regular/Bitter-Regular.svg
new file mode 100755
index 0000000..5c893d5
--- /dev/null
+++ b/themes/minimal/static/fonts/Regular/Bitter-Regular.svg
@@ -0,0 +1,1358 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/themes/minimal/static/fonts/Regular/Bitter-Regular.ttf b/themes/minimal/static/fonts/Regular/Bitter-Regular.ttf
new file mode 100755
index 0000000..e6d9a33
Binary files /dev/null and b/themes/minimal/static/fonts/Regular/Bitter-Regular.ttf differ
diff --git a/themes/minimal/static/fonts/Regular/Bitter-Regular.woff b/themes/minimal/static/fonts/Regular/Bitter-Regular.woff
new file mode 100755
index 0000000..99ba003
Binary files /dev/null and b/themes/minimal/static/fonts/Regular/Bitter-Regular.woff differ
diff --git a/themes/minimal/static/fonts/lg.eot b/themes/minimal/static/fonts/lg.eot
new file mode 100644
index 0000000..51264c4
Binary files /dev/null and b/themes/minimal/static/fonts/lg.eot differ
diff --git a/themes/minimal/static/fonts/lg.svg b/themes/minimal/static/fonts/lg.svg
new file mode 100644
index 0000000..22b1a1f
--- /dev/null
+++ b/themes/minimal/static/fonts/lg.svg
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/themes/minimal/static/fonts/lg.ttf b/themes/minimal/static/fonts/lg.ttf
new file mode 100644
index 0000000..8ad8199
Binary files /dev/null and b/themes/minimal/static/fonts/lg.ttf differ
diff --git a/themes/minimal/static/fonts/lg.woff b/themes/minimal/static/fonts/lg.woff
new file mode 100644
index 0000000..d98ff60
Binary files /dev/null and b/themes/minimal/static/fonts/lg.woff differ
diff --git a/themes/minimal/static/images/fileicons/file.png b/themes/minimal/static/images/fileicons/file.png
new file mode 100644
index 0000000..817014f
Binary files /dev/null and b/themes/minimal/static/images/fileicons/file.png differ
diff --git a/themes/minimal/static/images/fileicons/gz.png b/themes/minimal/static/images/fileicons/gz.png
new file mode 100644
index 0000000..2426bd1
Binary files /dev/null and b/themes/minimal/static/images/fileicons/gz.png differ
diff --git a/themes/minimal/static/images/fileicons/pdf.png b/themes/minimal/static/images/fileicons/pdf.png
new file mode 100644
index 0000000..638066d
Binary files /dev/null and b/themes/minimal/static/images/fileicons/pdf.png differ
diff --git a/themes/minimal/static/images/loading.gif b/themes/minimal/static/images/loading.gif
new file mode 100644
index 0000000..d3bbc80
Binary files /dev/null and b/themes/minimal/static/images/loading.gif differ
diff --git a/themes/minimal/static/images/ps-initial-monogram-logo-450w-343390823.jpg b/themes/minimal/static/images/ps-initial-monogram-logo-450w-343390823.jpg
new file mode 100644
index 0000000..22f92c8
Binary files /dev/null and b/themes/minimal/static/images/ps-initial-monogram-logo-450w-343390823.jpg differ
diff --git a/themes/minimal/static/images/zoom.png b/themes/minimal/static/images/zoom.png
new file mode 100644
index 0000000..e96a3d5
Binary files /dev/null and b/themes/minimal/static/images/zoom.png differ
diff --git a/themes/minimal/static/js/bitter.zip b/themes/minimal/static/js/bitter.zip
new file mode 100644
index 0000000..6338bb2
Binary files /dev/null and b/themes/minimal/static/js/bitter.zip differ
diff --git a/themes/minimal/static/js/jquery.mousewheel.min.js b/themes/minimal/static/js/jquery.mousewheel.min.js
new file mode 100644
index 0000000..df494ab
--- /dev/null
+++ b/themes/minimal/static/js/jquery.mousewheel.min.js
@@ -0,0 +1,8 @@
+/*! Copyright (c) 2013 Brandon Aaron (http://brandon.aaron.sh)
+ * Licensed under the MIT License (LICENSE.txt).
+ *
+ * Version: 3.1.12
+ *
+ * Requires: jQuery 1.2.2+
+ */
+!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a:a(jQuery)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})});
diff --git a/themes/minimal/static/js/lg-autoplay.js b/themes/minimal/static/js/lg-autoplay.js
new file mode 100644
index 0000000..c7e822c
--- /dev/null
+++ b/themes/minimal/static/js/lg-autoplay.js
@@ -0,0 +1,216 @@
+/**!
+ * lg-autoplay.js | 1.0.0 | October 5th 2016
+ * http://sachinchoolur.github.io/lg-autoplay.js
+ * Copyright (c) 2016 Sachin N;
+ * @license GPLv3
+ */(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.LgAutoplay = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o
');
+ }
+
+ // set progress
+ _this.progress();
+
+ // Start autoplay
+ if (_this.core.s.autoplay) {
+ _this.startlAuto();
+ }
+
+ // cancel interval on touchstart and dragstart
+ utils.on(_this.el, 'onDragstart.lgtm touchstart.lgtm', function () {
+ if (_this.interval) {
+ _this.cancelAuto();
+ _this.canceledOnTouch = true;
+ }
+ });
+
+ // restore autoplay if autoplay canceled from touchstart / dragstart
+ utils.on(_this.el, 'onDragend.lgtm touchend.lgtm onSlideClick.lgtm', function () {
+ if (!_this.interval && _this.canceledOnTouch) {
+ _this.startlAuto();
+ _this.canceledOnTouch = false;
+ }
+ });
+ };
+
+ Autoplay.prototype.progress = function () {
+
+ var _this = this;
+ var _progressBar;
+ var _progress;
+
+ utils.on(_this.el, 'onBeforeSlide.lgtm', function () {
+
+ // start progress bar animation
+ if (_this.core.s.progressBar && _this.fromAuto) {
+ _progressBar = _this.core.outer.querySelector('.lg-progress-bar');
+ _progress = _this.core.outer.querySelector('.lg-progress');
+ if (_this.interval) {
+ _progress.removeAttribute('style');
+ utils.removeClass(_progressBar, 'lg-start');
+ setTimeout(function () {
+ utils.setVendor(_progress, 'Transition', 'width ' + (_this.core.s.speed + _this.core.s.pause) + 'ms ease 0s');
+ utils.addClass(_progressBar, 'lg-start');
+ }, 20);
+ }
+ }
+
+ // Remove setinterval if slide is triggered manually and fourceautoplay is false
+ if (!_this.fromAuto && !_this.core.s.fourceAutoplay) {
+ _this.cancelAuto();
+ }
+
+ _this.fromAuto = false;
+ });
+ };
+
+ // Manage autoplay via play/stop buttons
+ Autoplay.prototype.controls = function () {
+ var _this = this;
+ var _html = ' ';
+
+ // Append autoplay controls
+ _this.core.outer.querySelector(this.core.s.appendAutoplayControlsTo).insertAdjacentHTML('beforeend', _html);
+
+ utils.on(_this.core.outer.querySelector('.lg-autoplay-button'), 'click.lg', function () {
+ if (utils.hasClass(_this.core.outer, 'lg-show-autoplay')) {
+ _this.cancelAuto();
+ _this.core.s.fourceAutoplay = false;
+ } else {
+ if (!_this.interval) {
+ _this.startlAuto();
+ _this.core.s.fourceAutoplay = _this.fourceAutoplayTemp;
+ }
+ }
+ });
+ };
+
+ // Autostart gallery
+ Autoplay.prototype.startlAuto = function () {
+ var _this = this;
+
+ utils.setVendor(_this.core.outer.querySelector('.lg-progress'), 'Transition', 'width ' + (_this.core.s.speed + _this.core.s.pause) + 'ms ease 0s');
+ utils.addClass(_this.core.outer, 'lg-show-autoplay');
+ utils.addClass(_this.core.outer.querySelector('.lg-progress-bar'), 'lg-start');
+
+ _this.interval = setInterval(function () {
+ if (_this.core.index + 1 < _this.core.items.length) {
+ _this.core.index++;
+ } else {
+ _this.core.index = 0;
+ }
+
+ _this.fromAuto = true;
+ _this.core.slide(_this.core.index, false, false);
+ }, _this.core.s.speed + _this.core.s.pause);
+ };
+
+ // cancel Autostart
+ Autoplay.prototype.cancelAuto = function () {
+ clearInterval(this.interval);
+ this.interval = false;
+ if (this.core.outer.querySelector('.lg-progress')) {
+ this.core.outer.querySelector('.lg-progress').removeAttribute('style');
+ }
+
+ utils.removeClass(this.core.outer, 'lg-show-autoplay');
+ utils.removeClass(this.core.outer.querySelector('.lg-progress-bar'), 'lg-start');
+ };
+
+ Autoplay.prototype.destroy = function () {
+
+ this.cancelAuto();
+ if (this.core.outer.querySelector('.lg-progress-bar')) {
+ this.core.outer.querySelector('.lg-progress-bar').parentNode.removeChild(this.core.outer.querySelector('.lg-progress-bar'));
+ }
+ };
+
+ window.lgModules.autoplay = Autoplay;
+});
+
+},{}]},{},[1])(1)
+});
\ No newline at end of file
diff --git a/themes/minimal/static/js/lg-fullscreen.js b/themes/minimal/static/js/lg-fullscreen.js
new file mode 100644
index 0000000..5efcd28
--- /dev/null
+++ b/themes/minimal/static/js/lg-fullscreen.js
@@ -0,0 +1,131 @@
+/**!
+ * lg-fullscreen.js | 1.1.0 | February 23rd 2019
+ * http://sachinchoolur.github.io/lg-fullscreen.js
+ * Copyright (c) 2016 Sachin N;
+ * @license GPLv3
+ */(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.LgFullscreen = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i -1) {
+ _this.core.slide(_idx, false, false);
+ } else if (_this.core.lGalleryOn) {
+ _this.core.destroy();
+ }
+ });
+ };
+
+ Hash.prototype.destroy = function () {
+ if (!this.core.s.hash) {
+ return;
+ }
+
+ // Reset to old hash value
+ if (this.oldHash && this.oldHash.indexOf('lg=' + this.core.s.galleryId) < 0) {
+ window.location.hash = this.oldHash;
+ } else {
+ if (history.pushState) {
+ history.pushState('', document.title, window.location.pathname + window.location.search);
+ } else {
+ window.location.hash = '';
+ }
+ }
+
+ utils.off(this.core.el, '.lghash');
+ };
+
+ window.lgModules.hash = Hash;
+});
+
+},{}]},{},[1])(1)
+});
\ No newline at end of file
diff --git a/themes/minimal/static/js/lg-pager.js b/themes/minimal/static/js/lg-pager.js
new file mode 100644
index 0000000..347ffd1
--- /dev/null
+++ b/themes/minimal/static/js/lg-pager.js
@@ -0,0 +1,120 @@
+/**!
+ * lg-pager.js | 1.0.0 | October 5th 2016
+ * http://sachinchoolur.github.io/lg-pager.js
+ * Copyright (c) 2016 Sachin N;
+ * @license GPLv3
+ */(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.LgPager = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1) {
+ this.init();
+ }
+
+ return this;
+ };
+
+ Pager.prototype.init = function () {
+ var _this = this;
+ var pagerList = '';
+ var $pagerCont;
+ var $pagerOuter;
+ var timeout;
+
+ _this.core.outer.querySelector('.lg').insertAdjacentHTML('beforeend', '');
+
+ if (_this.core.s.dynamic) {
+ for (var j = 0; j < _this.core.s.dynamicEl.length; j++) {
+ pagerList += '';
+ }
+ } else {
+ for (var i = 0; i < _this.core.items.length; i++) {
+ if (!_this.core.s.exThumbImage) {
+ pagerList += '';
+ } else {
+ pagerList += '';
+ }
+ }
+ }
+
+ $pagerOuter = _this.core.outer.querySelector('.lg-pager-outer');
+
+ $pagerOuter.innerHTML = pagerList;
+
+ $pagerCont = _this.core.outer.querySelectorAll('.lg-pager-cont');
+ for (var k = 0; k < $pagerCont.length; k++) {
+
+ /*jshint loopfunc: true */
+ (function (index) {
+ utils.on($pagerCont[index], 'click.lg touchend.lg', function () {
+ _this.core.index = index;
+ _this.core.slide(_this.core.index, false, false);
+ });
+ })(k);
+ }
+
+ utils.on($pagerOuter, 'mouseover.lg', function () {
+ clearTimeout(timeout);
+ utils.addClass($pagerOuter, 'lg-pager-hover');
+ });
+
+ utils.on($pagerOuter, 'mouseout.lg', function () {
+ timeout = setTimeout(function () {
+ utils.removeClass($pagerOuter, 'lg-pager-hover');
+ });
+ });
+
+ utils.on(_this.core.el, 'onBeforeSlide.lgtm', function (e) {
+ for (var n = 0; n < $pagerCont.length; n++) {
+ utils.removeClass($pagerCont[n], 'lg-pager-active');
+ if (e.detail.index === n) {
+ utils.addClass($pagerCont[n], 'lg-pager-active');
+ }
+ }
+ });
+ };
+
+ Pager.prototype.destroy = function () {};
+
+ window.lgModules.pager = Pager;
+});
+
+},{}]},{},[1])(1)
+});
\ No newline at end of file
diff --git a/themes/minimal/static/js/lg-share.js b/themes/minimal/static/js/lg-share.js
new file mode 100644
index 0000000..ee1ddf4
--- /dev/null
+++ b/themes/minimal/static/js/lg-share.js
@@ -0,0 +1,134 @@
+/**!
+ * lg-share.js | 1.2.2 | January 14th 2018
+ * http://sachinchoolur.github.io/lg-share.js
+ * Copyright (c) 2016 Sachin N;
+ * @license GPLv3
+ */(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.LgShare = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o';
+ shareHtml += _this.core.s.facebook ? '' + this.core.s.facebookDropdownText + ' ' : '';
+ shareHtml += _this.core.s.twitter ? ' ' : '';
+ shareHtml += _this.core.s.googlePlus ? '' + this.core.s.googlePlusDropdownText + ' ' : '';
+ shareHtml += _this.core.s.pinterest ? '' + this.core.s.pinterestDropdownText + ' ' : '';
+ shareHtml += '';
+
+ this.core.outer.querySelector('.lg-toolbar').insertAdjacentHTML('beforeend', shareHtml);
+ this.core.outer.querySelector('.lg').insertAdjacentHTML('beforeend', '
');
+ utils.on(document.getElementById('lg-share'), 'click.lg', function () {
+ if (utils.hasClass(_this.core.outer, 'lg-dropdown-active')) {
+ utils.removeClass(_this.core.outer, 'lg-dropdown-active');
+ } else {
+ utils.addClass(_this.core.outer, 'lg-dropdown-active');
+ }
+ });
+
+ utils.on(document.getElementById('lg-dropdown-overlay'), 'click.lg', function () {
+ utils.removeClass(_this.core.outer, 'lg-dropdown-active');
+ });
+
+ utils.on(_this.core.el, 'onAfterSlide.lgtm', function (event) {
+
+ setTimeout(function () {
+ if (_this.core.s.facebook) {
+ document.getElementById('lg-share-facebook').setAttribute('href', 'https://www.facebook.com/sharer/sharer.php?u=' + _this.getSharePropsUrl(event.detail.index, 'data-facebook-share-url'));
+ }
+ if (_this.core.s.twitter) {
+ document.getElementById('lg-share-twitter').setAttribute('href', 'https://twitter.com/intent/tweet?text=' + _this.getShareProps(event.detail.index, 'data-tweet-text') + '&url=' + _this.getSharePropsUrl(event.detail.index, 'data-twitter-share-url'));
+ }
+ if (_this.core.s.googlePlus) {
+ document.getElementById('lg-share-googleplus').setAttribute('href', 'https://plus.google.com/share?url=' + _this.getSharePropsUrl(event.detail.index, 'data-googleplus-share-url'));
+ }
+ if (_this.core.s.pinterest) {
+ document.getElementById('lg-share-pinterest').setAttribute('href', 'http://www.pinterest.com/pin/create/button/?url=' + _this.getSharePropsUrl(event.detail.index, 'data-pinterest-share-url') + '&media=' + encodeURIComponent(_this.getShareProps(event.detail.index, 'href') || _this.getShareProps(event.detail.index, 'data-src')) + '&description=' + _this.getShareProps(event.detail.index, 'data-pinterest-text'));
+ }
+ }, 100);
+ });
+ };
+
+ Share.prototype.getSharePropsUrl = function (index, prop) {
+ var shareProp = this.getShareProps(index, prop);
+ if (!shareProp) {
+ shareProp = window.location.href;
+ }
+ return encodeURIComponent(shareProp);
+ };
+
+ Share.prototype.getShareProps = function (index, prop) {
+ var shareProp = '';
+ if (this.core.s.dynamic) {
+ shareProp = this.core.items[index][toCamelCase(prop.replace('data-', ''))];
+ } else if (this.core.items[index].getAttribute(prop)) {
+ shareProp = this.core.items[index].getAttribute(prop);
+ }
+ return shareProp;
+ };
+
+ Share.prototype.destroy = function () {};
+
+ window.lgModules.share = Share;
+});
+
+},{}]},{},[1])(1)
+});
\ No newline at end of file
diff --git a/themes/minimal/static/js/lg-zoom.js b/themes/minimal/static/js/lg-zoom.js
new file mode 100644
index 0000000..369b044
--- /dev/null
+++ b/themes/minimal/static/js/lg-zoom.js
@@ -0,0 +1,568 @@
+/**!
+ * lg-zoom.js | 1.0.1 | December 22nd 2016
+ * http://sachinchoolur.github.io/lg-zoom.js
+ * Copyright (c) 2016 Sachin N;
+ * @license GPLv3
+ */(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.LgZoom = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o';
+ }
+
+ if (_this.core.s.useLeftForZoom) {
+ utils.addClass(_this.core.outer, 'lg-use-left-for-zoom');
+ } else {
+ utils.addClass(_this.core.outer, 'lg-use-transition-for-zoom');
+ }
+
+ this.core.outer.querySelector('.lg-toolbar').insertAdjacentHTML('beforeend', zoomIcons);
+
+ // Add zoomable class
+ utils.on(_this.core.el, 'onSlideItemLoad.lgtmzoom', function (event) {
+
+ // delay will be 0 except first time
+ var _speed = _this.core.s.enableZoomAfter + event.detail.delay;
+
+ // set _speed value 0 if gallery opened from direct url and if it is first slide
+ if (utils.hasClass(document.body, 'lg-from-hash') && event.detail.delay) {
+
+ // will execute only once
+ _speed = 0;
+ } else {
+
+ // Remove lg-from-hash to enable starting animation.
+ utils.removeClass(document.body, 'lg-from-hash');
+ }
+
+ _this.zoomabletimeout = setTimeout(function () {
+ utils.addClass(_this.core.___slide[event.detail.index], 'lg-zoomable');
+ }, _speed + 30);
+ });
+
+ var scale = 1;
+ /**
+ * @desc Image zoom
+ * Translate the wrap and scale the image to get better user experience
+ *
+ * @param {String} scaleVal - Zoom decrement/increment value
+ */
+ var zoom = function zoom(scaleVal) {
+
+ var image = _this.core.outer.querySelector('.lg-current .lg-image');
+ var _x;
+ var _y;
+
+ // Find offset manually to avoid issue after zoom
+ var offsetX = (window.innerWidth - image.clientWidth) / 2;
+ var offsetY = (window.innerHeight - image.clientHeight) / 2 + (document.documentElement.scrollTop || document.body.scrollTop);
+
+ _x = _this.pageX - offsetX;
+ _y = _this.pageY - offsetY;
+
+ var x = (scaleVal - 1) * _x;
+ var y = (scaleVal - 1) * _y;
+
+ utils.setVendor(image, 'Transform', 'scale3d(' + scaleVal + ', ' + scaleVal + ', 1)');
+ image.setAttribute('data-scale', scaleVal);
+
+ if (_this.core.s.useLeftForZoom) {
+ image.parentElement.style.left = -x + 'px';
+ image.parentElement.style.top = -y + 'px';
+ } else {
+ utils.setVendor(image.parentElement, 'Transform', 'translate3d(-' + x + 'px, -' + y + 'px, 0)');
+ }
+
+ image.parentElement.setAttribute('data-x', x);
+ image.parentElement.setAttribute('data-y', y);
+ };
+
+ var callScale = function callScale() {
+ if (scale > 1) {
+ utils.addClass(_this.core.outer, 'lg-zoomed');
+ } else {
+ _this.resetZoom();
+ }
+
+ if (scale < 1) {
+ scale = 1;
+ }
+
+ zoom(scale);
+ };
+
+ var actualSize = function actualSize(event, image, index, fromIcon) {
+ var w = image.clientWidth;
+ var nw;
+ if (_this.core.s.dynamic) {
+ nw = _this.core.s.dynamicEl[index].width || image.naturalWidth || w;
+ } else {
+ nw = _this.core.items[index].getAttribute('data-width') || image.naturalWidth || w;
+ }
+
+ var _scale;
+
+ if (utils.hasClass(_this.core.outer, 'lg-zoomed')) {
+ scale = 1;
+ } else {
+ if (nw > w) {
+ _scale = nw / w;
+ scale = _scale || 2;
+ }
+ }
+
+ if (fromIcon) {
+ _this.pageX = window.innerWidth / 2;
+ _this.pageY = window.innerHeight / 2 + (document.documentElement.scrollTop || document.body.scrollTop);
+ } else {
+ _this.pageX = event.pageX || event.targetTouches[0].pageX;
+ _this.pageY = event.pageY || event.targetTouches[0].pageY;
+ }
+
+ callScale();
+ setTimeout(function () {
+ utils.removeClass(_this.core.outer, 'lg-grabbing');
+ utils.addClass(_this.core.outer, 'lg-grab');
+ }, 10);
+ };
+
+ var tapped = false;
+
+ // event triggered after appending slide content
+ utils.on(_this.core.el, 'onAferAppendSlide.lgtmzoom', function (event) {
+
+ var index = event.detail.index;
+
+ // Get the current element
+ var image = _this.core.___slide[index].querySelector('.lg-image');
+
+ if (!_this.core.isTouch) {
+ utils.on(image, 'dblclick', function (event) {
+ actualSize(event, image, index);
+ });
+ }
+
+ if (_this.core.isTouch) {
+ utils.on(image, 'touchstart', function (event) {
+ if (!tapped) {
+ tapped = setTimeout(function () {
+ tapped = null;
+ }, 300);
+ } else {
+ clearTimeout(tapped);
+ tapped = null;
+ actualSize(event, image, index);
+ }
+
+ event.preventDefault();
+ });
+ }
+ });
+
+ // Update zoom on resize and orientationchange
+ utils.on(window, 'resize.lgzoom scroll.lgzoom orientationchange.lgzoom', function () {
+ _this.pageX = window.innerWidth / 2;
+ _this.pageY = window.innerHeight / 2 + (document.documentElement.scrollTop || document.body.scrollTop);
+ zoom(scale);
+ });
+
+ utils.on(document.getElementById('lg-zoom-out'), 'click.lg', function () {
+ if (_this.core.outer.querySelector('.lg-current .lg-image')) {
+ scale -= _this.core.s.scale;
+ callScale();
+ }
+ });
+
+ utils.on(document.getElementById('lg-zoom-in'), 'click.lg', function () {
+ if (_this.core.outer.querySelector('.lg-current .lg-image')) {
+ scale += _this.core.s.scale;
+ callScale();
+ }
+ });
+
+ utils.on(document.getElementById('lg-actual-size'), 'click.lg', function (event) {
+ actualSize(event, _this.core.___slide[_this.core.index].querySelector('.lg-image'), _this.core.index, true);
+ });
+
+ // Reset zoom on slide change
+ utils.on(_this.core.el, 'onBeforeSlide.lgtm', function () {
+ scale = 1;
+ _this.resetZoom();
+ });
+
+ // Drag option after zoom
+ if (!_this.core.isTouch) {
+ _this.zoomDrag();
+ }
+
+ if (_this.core.isTouch) {
+ _this.zoomSwipe();
+ }
+ };
+
+ // Reset zoom effect
+ Zoom.prototype.resetZoom = function () {
+ utils.removeClass(this.core.outer, 'lg-zoomed');
+ for (var i = 0; i < this.core.___slide.length; i++) {
+ if (this.core.___slide[i].querySelector('.lg-img-wrap')) {
+ this.core.___slide[i].querySelector('.lg-img-wrap').removeAttribute('style');
+ this.core.___slide[i].querySelector('.lg-img-wrap').removeAttribute('data-x');
+ this.core.___slide[i].querySelector('.lg-img-wrap').removeAttribute('data-y');
+ }
+ }
+
+ for (var j = 0; j < this.core.___slide.length; j++) {
+ if (this.core.___slide[j].querySelector('.lg-image')) {
+ this.core.___slide[j].querySelector('.lg-image').removeAttribute('style');
+ this.core.___slide[j].querySelector('.lg-image').removeAttribute('data-scale');
+ }
+ }
+
+ // Reset pagx pagy values to center
+ this.pageX = window.innerWidth / 2;
+ this.pageY = window.innerHeight / 2 + (document.documentElement.scrollTop || document.body.scrollTop);
+ };
+
+ Zoom.prototype.zoomSwipe = function () {
+ var _this = this;
+ var startCoords = {};
+ var endCoords = {};
+ var isMoved = false;
+
+ // Allow x direction drag
+ var allowX = false;
+
+ // Allow Y direction drag
+ var allowY = false;
+
+ for (var i = 0; i < _this.core.___slide.length; i++) {
+
+ /*jshint loopfunc: true */
+ utils.on(_this.core.___slide[i], 'touchstart.lg', function (e) {
+
+ if (utils.hasClass(_this.core.outer, 'lg-zoomed')) {
+ var image = _this.core.___slide[_this.core.index].querySelector('.lg-object');
+
+ allowY = image.offsetHeight * image.getAttribute('data-scale') > _this.core.outer.querySelector('.lg').clientHeight;
+ allowX = image.offsetWidth * image.getAttribute('data-scale') > _this.core.outer.querySelector('.lg').clientWidth;
+ if (allowX || allowY) {
+ e.preventDefault();
+ startCoords = {
+ x: e.targetTouches[0].pageX,
+ y: e.targetTouches[0].pageY
+ };
+ }
+ }
+ });
+ }
+
+ for (var j = 0; j < _this.core.___slide.length; j++) {
+
+ /*jshint loopfunc: true */
+ utils.on(_this.core.___slide[j], 'touchmove.lg', function (e) {
+
+ if (utils.hasClass(_this.core.outer, 'lg-zoomed')) {
+
+ var _el = _this.core.___slide[_this.core.index].querySelector('.lg-img-wrap');
+ var distanceX;
+ var distanceY;
+
+ e.preventDefault();
+ isMoved = true;
+
+ endCoords = {
+ x: e.targetTouches[0].pageX,
+ y: e.targetTouches[0].pageY
+ };
+
+ // reset opacity and transition duration
+ utils.addClass(_this.core.outer, 'lg-zoom-dragging');
+
+ if (allowY) {
+ distanceY = -Math.abs(_el.getAttribute('data-y')) + (endCoords.y - startCoords.y);
+ } else {
+ distanceY = -Math.abs(_el.getAttribute('data-y'));
+ }
+
+ if (allowX) {
+ distanceX = -Math.abs(_el.getAttribute('data-x')) + (endCoords.x - startCoords.x);
+ } else {
+ distanceX = -Math.abs(_el.getAttribute('data-x'));
+ }
+
+ if (Math.abs(endCoords.x - startCoords.x) > 15 || Math.abs(endCoords.y - startCoords.y) > 15) {
+
+ if (_this.core.s.useLeftForZoom) {
+ _el.style.left = distanceX + 'px';
+ _el.style.top = distanceY + 'px';
+ } else {
+ utils.setVendor(_el, 'Transform', 'translate3d(' + distanceX + 'px, ' + distanceY + 'px, 0)');
+ }
+ }
+ }
+ });
+ }
+
+ for (var k = 0; k < _this.core.___slide.length; k++) {
+
+ /*jshint loopfunc: true */
+ utils.on(_this.core.___slide[k], 'touchend.lg', function () {
+ if (utils.hasClass(_this.core.outer, 'lg-zoomed')) {
+ if (isMoved) {
+ isMoved = false;
+ utils.removeClass(_this.core.outer, 'lg-zoom-dragging');
+ _this.touchendZoom(startCoords, endCoords, allowX, allowY);
+ }
+ }
+ });
+ }
+ };
+
+ Zoom.prototype.zoomDrag = function () {
+
+ var _this = this;
+ var startCoords = {};
+ var endCoords = {};
+ var isDraging = false;
+ var isMoved = false;
+
+ // Allow x direction drag
+ var allowX = false;
+
+ // Allow Y direction drag
+ var allowY = false;
+
+ for (var i = 0; i < _this.core.___slide.length; i++) {
+
+ /*jshint loopfunc: true */
+ utils.on(_this.core.___slide[i], 'mousedown.lgzoom', function (e) {
+
+ // execute only on .lg-object
+ var image = _this.core.___slide[_this.core.index].querySelector('.lg-object');
+
+ allowY = image.offsetHeight * image.getAttribute('data-scale') > _this.core.outer.querySelector('.lg').clientHeight;
+ allowX = image.offsetWidth * image.getAttribute('data-scale') > _this.core.outer.querySelector('.lg').clientWidth;
+
+ if (utils.hasClass(_this.core.outer, 'lg-zoomed')) {
+ if (utils.hasClass(e.target, 'lg-object') && (allowX || allowY)) {
+ e.preventDefault();
+ startCoords = {
+ x: e.pageX,
+ y: e.pageY
+ };
+
+ isDraging = true;
+
+ // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723
+ _this.core.outer.scrollLeft += 1;
+ _this.core.outer.scrollLeft -= 1;
+
+ utils.removeClass(_this.core.outer, 'lg-grab');
+ utils.addClass(_this.core.outer, 'lg-grabbing');
+ }
+ }
+ });
+ }
+
+ utils.on(window, 'mousemove.lgzoom', function (e) {
+ if (isDraging) {
+ var _el = _this.core.___slide[_this.core.index].querySelector('.lg-img-wrap');
+ var distanceX;
+ var distanceY;
+
+ isMoved = true;
+ endCoords = {
+ x: e.pageX,
+ y: e.pageY
+ };
+
+ // reset opacity and transition duration
+ utils.addClass(_this.core.outer, 'lg-zoom-dragging');
+
+ if (allowY) {
+ distanceY = -Math.abs(_el.getAttribute('data-y')) + (endCoords.y - startCoords.y);
+ } else {
+ distanceY = -Math.abs(_el.getAttribute('data-y'));
+ }
+
+ if (allowX) {
+ distanceX = -Math.abs(_el.getAttribute('data-x')) + (endCoords.x - startCoords.x);
+ } else {
+ distanceX = -Math.abs(_el.getAttribute('data-x'));
+ }
+
+ if (_this.core.s.useLeftForZoom) {
+ _el.style.left = distanceX + 'px';
+ _el.style.top = distanceY + 'px';
+ } else {
+ utils.setVendor(_el, 'Transform', 'translate3d(' + distanceX + 'px, ' + distanceY + 'px, 0)');
+ }
+ }
+ });
+
+ utils.on(window, 'mouseup.lgzoom', function (e) {
+
+ if (isDraging) {
+ isDraging = false;
+ utils.removeClass(_this.core.outer, 'lg-zoom-dragging');
+
+ // Fix for chrome mouse move on click
+ if (isMoved && (startCoords.x !== endCoords.x || startCoords.y !== endCoords.y)) {
+ endCoords = {
+ x: e.pageX,
+ y: e.pageY
+ };
+ _this.touchendZoom(startCoords, endCoords, allowX, allowY);
+ }
+
+ isMoved = false;
+ }
+
+ utils.removeClass(_this.core.outer, 'lg-grabbing');
+ utils.addClass(_this.core.outer, 'lg-grab');
+ });
+ };
+
+ Zoom.prototype.touchendZoom = function (startCoords, endCoords, allowX, allowY) {
+
+ var _this = this;
+ var _el = _this.core.___slide[_this.core.index].querySelector('.lg-img-wrap');
+ var image = _this.core.___slide[_this.core.index].querySelector('.lg-object');
+ var distanceX = -Math.abs(_el.getAttribute('data-x')) + (endCoords.x - startCoords.x);
+ var distanceY = -Math.abs(_el.getAttribute('data-y')) + (endCoords.y - startCoords.y);
+ var minY = (_this.core.outer.querySelector('.lg').clientHeight - image.offsetHeight) / 2;
+ var maxY = Math.abs(image.offsetHeight * Math.abs(image.getAttribute('data-scale')) - _this.core.outer.querySelector('.lg').clientHeight + minY);
+ var minX = (_this.core.outer.querySelector('.lg').clientWidth - image.offsetWidth) / 2;
+ var maxX = Math.abs(image.offsetWidth * Math.abs(image.getAttribute('data-scale')) - _this.core.outer.querySelector('.lg').clientWidth + minX);
+
+ if (Math.abs(endCoords.x - startCoords.x) > 15 || Math.abs(endCoords.y - startCoords.y) > 15) {
+ if (allowY) {
+ if (distanceY <= -maxY) {
+ distanceY = -maxY;
+ } else if (distanceY >= -minY) {
+ distanceY = -minY;
+ }
+ }
+
+ if (allowX) {
+ if (distanceX <= -maxX) {
+ distanceX = -maxX;
+ } else if (distanceX >= -minX) {
+ distanceX = -minX;
+ }
+ }
+
+ if (allowY) {
+ _el.setAttribute('data-y', Math.abs(distanceY));
+ } else {
+ distanceY = -Math.abs(_el.getAttribute('data-y'));
+ }
+
+ if (allowX) {
+ _el.setAttribute('data-x', Math.abs(distanceX));
+ } else {
+ distanceX = -Math.abs(_el.getAttribute('data-x'));
+ }
+
+ if (_this.core.s.useLeftForZoom) {
+ _el.style.left = distanceX + 'px';
+ _el.style.top = distanceY + 'px';
+ } else {
+ utils.setVendor(_el, 'Transform', 'translate3d(' + distanceX + 'px, ' + distanceY + 'px, 0)');
+ }
+ }
+ };
+
+ Zoom.prototype.destroy = function () {
+
+ var _this = this;
+
+ // Unbind all events added by lightGallery zoom plugin
+ utils.off(_this.core.el, '.lgzoom');
+ utils.off(window, '.lgzoom');
+ for (var i = 0; i < _this.core.___slide.length; i++) {
+ utils.off(_this.core.___slide[i], '.lgzoom');
+ }
+
+ utils.off(_this.core.el, '.lgtmzoom');
+ _this.resetZoom();
+ clearTimeout(_this.zoomabletimeout);
+ _this.zoomabletimeout = false;
+ };
+
+ window.lgModules.zoom = Zoom;
+});
+
+},{}]},{},[1])(1)
+});
\ No newline at end of file
diff --git a/themes/minimal/static/js/lightgallery.js b/themes/minimal/static/js/lightgallery.js
new file mode 100644
index 0000000..6b853ea
--- /dev/null
+++ b/themes/minimal/static/js/lightgallery.js
@@ -0,0 +1,1588 @@
+/**!
+ * lightgallery.js | 1.1.3 | February 11th 2019
+ * http://sachinchoolur.github.io/lightgallery.js/
+ * Copyright (c) 2016 Sachin N;
+ * @license GPLv3
+ */(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Lightgallery = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 2 && arguments[2] !== undefined ? arguments[2] : null;
+
+ if (!el) {
+ return;
+ }
+
+ var customEvent = new CustomEvent(event, {
+ detail: detail
+ });
+ el.dispatchEvent(customEvent);
+ },
+
+ Listener: {
+ uid: 0
+ },
+ on: function on(el, events, fn) {
+ var _this = this;
+
+ if (!el) {
+ return;
+ }
+
+ events.split(' ').forEach(function (event) {
+ var _id = _this.getAttribute(el, 'lg-event-uid') || '';
+ utils.Listener.uid++;
+ _id += '&' + utils.Listener.uid;
+ _this.setAttribute(el, 'lg-event-uid', _id);
+ utils.Listener[event + utils.Listener.uid] = fn;
+ el.addEventListener(event.split('.')[0], fn, false);
+ });
+ },
+
+ off: function off(el, event) {
+ if (!el) {
+ return;
+ }
+
+ var _id = this.getAttribute(el, 'lg-event-uid');
+ if (_id) {
+ _id = _id.split('&');
+ for (var i = 0; i < _id.length; i++) {
+ if (_id[i]) {
+ var _event = event + _id[i];
+ if (_event.substring(0, 1) === '.') {
+ for (var key in utils.Listener) {
+ if (utils.Listener.hasOwnProperty(key)) {
+ if (key.split('.').indexOf(_event.split('.')[1]) > -1) {
+ el.removeEventListener(key.split('.')[0], utils.Listener[key]);
+ this.setAttribute(el, 'lg-event-uid', this.getAttribute(el, 'lg-event-uid').replace('&' + _id[i], ''));
+ delete utils.Listener[key];
+ }
+ }
+ }
+ } else {
+ el.removeEventListener(_event.split('.')[0], utils.Listener[_event]);
+ this.setAttribute(el, 'lg-event-uid', this.getAttribute(el, 'lg-event-uid').replace('&' + _id[i], ''));
+ delete utils.Listener[_event];
+ }
+ }
+ }
+ }
+ },
+
+ param: function param(obj) {
+ return Object.keys(obj).map(function (k) {
+ return encodeURIComponent(k) + '=' + encodeURIComponent(obj[k]);
+ }).join('&');
+ }
+ };
+
+ exports.default = utils;
+});
+
+},{}],2:[function(require,module,exports){
+(function (global, factory) {
+ if (typeof define === "function" && define.amd) {
+ define(['./lg-utils'], factory);
+ } else if (typeof exports !== "undefined") {
+ factory(require('./lg-utils'));
+ } else {
+ var mod = {
+ exports: {}
+ };
+ factory(global.lgUtils);
+ global.lightgallery = mod.exports;
+ }
+})(this, function (_lgUtils) {
+ 'use strict';
+
+ var _lgUtils2 = _interopRequireDefault(_lgUtils);
+
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+
+ var _extends = Object.assign || function (target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+
+ for (var key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+
+ return target;
+ };
+
+ /** Polyfill the CustomEvent() constructor functionality in Internet Explorer 9 and higher */
+ (function () {
+
+ if (typeof window.CustomEvent === 'function') {
+ return false;
+ }
+
+ function CustomEvent(event, params) {
+ params = params || {
+ bubbles: false,
+ cancelable: false,
+ detail: undefined
+ };
+ var evt = document.createEvent('CustomEvent');
+ evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
+ return evt;
+ }
+
+ CustomEvent.prototype = window.Event.prototype;
+
+ window.CustomEvent = CustomEvent;
+ })();
+
+ window.utils = _lgUtils2.default;
+ window.lgData = {
+ uid: 0
+ };
+
+ window.lgModules = {};
+ var defaults = {
+
+ mode: 'lg-slide',
+
+ // Ex : 'ease'
+ cssEasing: 'ease',
+
+ //'for jquery animation'
+ easing: 'linear',
+ speed: 600,
+ height: '100%',
+ width: '100%',
+ addClass: '',
+ startClass: 'lg-start-zoom',
+ backdropDuration: 150,
+ hideBarsDelay: 6000,
+
+ useLeft: false,
+
+ closable: true,
+ loop: true,
+ escKey: true,
+ keyPress: true,
+ controls: true,
+ slideEndAnimatoin: true,
+ hideControlOnEnd: false,
+ mousewheel: false,
+
+ getCaptionFromTitleOrAlt: true,
+
+ // .lg-item || '.lg-sub-html'
+ appendSubHtmlTo: '.lg-sub-html',
+
+ subHtmlSelectorRelative: false,
+
+ /**
+ * @desc number of preload slides
+ * will exicute only after the current slide is fully loaded.
+ *
+ * @ex you clicked on 4th image and if preload = 1 then 3rd slide and 5th
+ * slide will be loaded in the background after the 4th slide is fully loaded..
+ * if preload is 2 then 2nd 3rd 5th 6th slides will be preloaded.. ... ...
+ *
+ */
+ preload: 1,
+ showAfterLoad: true,
+ selector: '',
+ selectWithin: '',
+ nextHtml: '',
+ prevHtml: '',
+
+ // 0, 1
+ index: false,
+
+ iframeMaxWidth: '100%',
+
+ download: true,
+ counter: true,
+ appendCounterTo: '.lg-toolbar',
+
+ swipeThreshold: 50,
+ enableSwipe: true,
+ enableDrag: true,
+
+ dynamic: false,
+ dynamicEl: [],
+ galleryId: 1
+ };
+
+ function Plugin(element, options) {
+
+ // Current lightGallery element
+ this.el = element;
+
+ // lightGallery settings
+ this.s = _extends({}, defaults, options);
+
+ // When using dynamic mode, ensure dynamicEl is an array
+ if (this.s.dynamic && this.s.dynamicEl !== 'undefined' && this.s.dynamicEl.constructor === Array && !this.s.dynamicEl.length) {
+ throw 'When using dynamic mode, you must also define dynamicEl as an Array.';
+ }
+
+ // lightGallery modules
+ this.modules = {};
+
+ // false when lightgallery complete first slide;
+ this.lGalleryOn = false;
+
+ this.lgBusy = false;
+
+ // Timeout function for hiding controls;
+ this.hideBartimeout = false;
+
+ // To determine browser supports for touch events;
+ this.isTouch = 'ontouchstart' in document.documentElement;
+
+ // Disable hideControlOnEnd if sildeEndAnimation is true
+ if (this.s.slideEndAnimatoin) {
+ this.s.hideControlOnEnd = false;
+ }
+
+ this.items = [];
+
+ // Gallery items
+ if (this.s.dynamic) {
+ this.items = this.s.dynamicEl;
+ } else {
+ if (this.s.selector === 'this') {
+ this.items.push(this.el);
+ } else if (this.s.selector !== '') {
+ if (this.s.selectWithin) {
+ this.items = document.querySelector(this.s.selectWithin).querySelectorAll(this.s.selector);
+ } else {
+ this.items = this.el.querySelectorAll(this.s.selector);
+ }
+ } else {
+ this.items = this.el.children;
+ }
+ }
+
+ // .lg-item
+
+ this.___slide = '';
+
+ // .lg-outer
+ this.outer = '';
+
+ this.init();
+
+ return this;
+ }
+
+ Plugin.prototype.init = function () {
+
+ var _this = this;
+
+ // s.preload should not be more than $item.length
+ if (_this.s.preload > _this.items.length) {
+ _this.s.preload = _this.items.length;
+ }
+
+ // if dynamic option is enabled execute immediately
+ var _hash = window.location.hash;
+ if (_hash.indexOf('lg=' + this.s.galleryId) > 0) {
+
+ _this.index = parseInt(_hash.split('&slide=')[1], 10);
+
+ _lgUtils2.default.addClass(document.body, 'lg-from-hash');
+ if (!_lgUtils2.default.hasClass(document.body, 'lg-on')) {
+ _lgUtils2.default.addClass(document.body, 'lg-on');
+ setTimeout(function () {
+ _this.build(_this.index);
+ });
+ }
+ }
+
+ if (_this.s.dynamic) {
+
+ _lgUtils2.default.trigger(this.el, 'onBeforeOpen');
+
+ _this.index = _this.s.index || 0;
+
+ // prevent accidental double execution
+ if (!_lgUtils2.default.hasClass(document.body, 'lg-on')) {
+ _lgUtils2.default.addClass(document.body, 'lg-on');
+ setTimeout(function () {
+ _this.build(_this.index);
+ });
+ }
+ } else {
+
+ for (var i = 0; i < _this.items.length; i++) {
+
+ /*jshint loopfunc: true */
+ (function (index) {
+
+ // Using different namespace for click because click event should not unbind if selector is same object('this')
+ _lgUtils2.default.on(_this.items[index], 'click.lgcustom', function (e) {
+
+ e.preventDefault();
+
+ _lgUtils2.default.trigger(_this.el, 'onBeforeOpen');
+
+ _this.index = _this.s.index || index;
+
+ if (!_lgUtils2.default.hasClass(document.body, 'lg-on')) {
+ _this.build(_this.index);
+ _lgUtils2.default.addClass(document.body, 'lg-on');
+ }
+ });
+ })(i);
+ }
+ }
+ };
+
+ Plugin.prototype.build = function (index) {
+
+ var _this = this;
+
+ _this.structure();
+
+ for (var key in window.lgModules) {
+ _this.modules[key] = new window.lgModules[key](_this.el);
+ }
+
+ // initiate slide function
+ _this.slide(index, false, false);
+
+ if (_this.s.keyPress) {
+ _this.keyPress();
+ }
+
+ if (_this.items.length > 1) {
+
+ _this.arrow();
+
+ setTimeout(function () {
+ _this.enableDrag();
+ _this.enableSwipe();
+ }, 50);
+
+ if (_this.s.mousewheel) {
+ _this.mousewheel();
+ }
+ }
+
+ _this.counter();
+
+ _this.closeGallery();
+
+ _lgUtils2.default.trigger(_this.el, 'onAfterOpen');
+
+ // Hide controllers if mouse doesn't move for some period
+ _lgUtils2.default.on(_this.outer, 'mousemove.lg click.lg touchstart.lg', function () {
+
+ _lgUtils2.default.removeClass(_this.outer, 'lg-hide-items');
+
+ clearTimeout(_this.hideBartimeout);
+
+ // Timeout will be cleared on each slide movement also
+ _this.hideBartimeout = setTimeout(function () {
+ _lgUtils2.default.addClass(_this.outer, 'lg-hide-items');
+ }, _this.s.hideBarsDelay);
+ });
+ };
+
+ Plugin.prototype.structure = function () {
+ var list = '';
+ var controls = '';
+ var i = 0;
+ var subHtmlCont = '';
+ var template;
+ var _this = this;
+
+ document.body.insertAdjacentHTML('beforeend', '
');
+ _lgUtils2.default.setVendor(document.querySelector('.lg-backdrop'), 'TransitionDuration', this.s.backdropDuration + 'ms');
+
+ // Create gallery items
+ for (i = 0; i < this.items.length; i++) {
+ list += '
';
+ }
+
+ // Create controlls
+ if (this.s.controls && this.items.length > 1) {
+ controls = '' + '
' + this.s.prevHtml + '
' + '
' + this.s.nextHtml + '
' + '
';
+ }
+
+ if (this.s.appendSubHtmlTo === '.lg-sub-html') {
+ subHtmlCont = '
';
+ }
+
+ template = '' + '
' + '
' + list + '
' + '
' + ' ' + '
' + controls + subHtmlCont + '
' + '
';
+
+ document.body.insertAdjacentHTML('beforeend', template);
+ this.outer = document.querySelector('.lg-outer');
+ this.___slide = this.outer.querySelectorAll('.lg-item');
+
+ if (this.s.useLeft) {
+ _lgUtils2.default.addClass(this.outer, 'lg-use-left');
+
+ // Set mode lg-slide if use left is true;
+ this.s.mode = 'lg-slide';
+ } else {
+ _lgUtils2.default.addClass(this.outer, 'lg-use-css3');
+ }
+
+ // For fixed height gallery
+ _this.setTop();
+ _lgUtils2.default.on(window, 'resize.lg orientationchange.lg', function () {
+ setTimeout(function () {
+ _this.setTop();
+ }, 100);
+ });
+
+ // add class lg-current to remove initial transition
+ _lgUtils2.default.addClass(this.___slide[this.index], 'lg-current');
+
+ // add Class for css support and transition mode
+ if (this.doCss()) {
+ _lgUtils2.default.addClass(this.outer, 'lg-css3');
+ } else {
+ _lgUtils2.default.addClass(this.outer, 'lg-css');
+
+ // Set speed 0 because no animation will happen if browser doesn't support css3
+ this.s.speed = 0;
+ }
+
+ _lgUtils2.default.addClass(this.outer, this.s.mode);
+
+ if (this.s.enableDrag && this.items.length > 1) {
+ _lgUtils2.default.addClass(this.outer, 'lg-grab');
+ }
+
+ if (this.s.showAfterLoad) {
+ _lgUtils2.default.addClass(this.outer, 'lg-show-after-load');
+ }
+
+ if (this.doCss()) {
+ var inner = this.outer.querySelector('.lg-inner');
+ _lgUtils2.default.setVendor(inner, 'TransitionTimingFunction', this.s.cssEasing);
+ _lgUtils2.default.setVendor(inner, 'TransitionDuration', this.s.speed + 'ms');
+ }
+
+ setTimeout(function () {
+ _lgUtils2.default.addClass(document.querySelector('.lg-backdrop'), 'in');
+ });
+
+ setTimeout(function () {
+ _lgUtils2.default.addClass(_this.outer, 'lg-visible');
+ }, this.s.backdropDuration);
+
+ if (this.s.download) {
+ this.outer.querySelector('.lg-toolbar').insertAdjacentHTML('beforeend', ' ');
+ }
+
+ // Store the current scroll top value to scroll back after closing the gallery..
+ this.prevScrollTop = document.documentElement.scrollTop || document.body.scrollTop;
+ };
+
+ // For fixed height gallery
+ Plugin.prototype.setTop = function () {
+ if (this.s.height !== '100%') {
+ var wH = window.innerHeight;
+ var top = (wH - parseInt(this.s.height, 10)) / 2;
+ var lGallery = this.outer.querySelector('.lg');
+ if (wH >= parseInt(this.s.height, 10)) {
+ lGallery.style.top = top + 'px';
+ } else {
+ lGallery.style.top = '0px';
+ }
+ }
+ };
+
+ // Find css3 support
+ Plugin.prototype.doCss = function () {
+ // check for css animation support
+ var support = function support() {
+ var transition = ['transition', 'MozTransition', 'WebkitTransition', 'OTransition', 'msTransition', 'KhtmlTransition'];
+ var root = document.documentElement;
+ var i = 0;
+ for (i = 0; i < transition.length; i++) {
+ if (transition[i] in root.style) {
+ return true;
+ }
+ }
+ };
+
+ if (support()) {
+ return true;
+ }
+
+ return false;
+ };
+
+ /**
+ * @desc Check the given src is video
+ * @param {String} src
+ * @return {Object} video type
+ * Ex:{ youtube : ["//www.youtube.com/watch?v=c0asJgSyxcY", "c0asJgSyxcY"] }
+ */
+ Plugin.prototype.isVideo = function (src, index) {
+
+ var html;
+ if (this.s.dynamic) {
+ html = this.s.dynamicEl[index].html;
+ } else {
+ html = this.items[index].getAttribute('data-html');
+ }
+
+ if (!src && html) {
+ return {
+ html5: true
+ };
+ }
+
+ var youtube = src.match(/\/\/(?:www\.)?youtu(?:\.be|be\.com|be-nocookie\.com)\/(?:watch\?v=|embed\/)?([a-z0-9\-\_\%]+)/i);
+ var vimeo = src.match(/\/\/(?:www\.)?vimeo.com\/([0-9a-z\-_]+)/i);
+ var dailymotion = src.match(/\/\/(?:www\.)?dai.ly\/([0-9a-z\-_]+)/i);
+ var vk = src.match(/\/\/(?:www\.)?(?:vk\.com|vkontakte\.ru)\/(?:video_ext\.php\?)(.*)/i);
+
+ if (youtube) {
+ return {
+ youtube: youtube
+ };
+ } else if (vimeo) {
+ return {
+ vimeo: vimeo
+ };
+ } else if (dailymotion) {
+ return {
+ dailymotion: dailymotion
+ };
+ } else if (vk) {
+ return {
+ vk: vk
+ };
+ }
+ };
+
+ /**
+ * @desc Create image counter
+ * Ex: 1/10
+ */
+ Plugin.prototype.counter = function () {
+ if (this.s.counter) {
+ this.outer.querySelector(this.s.appendCounterTo).insertAdjacentHTML('beforeend', '' + (parseInt(this.index, 10) + 1) + ' / ' + this.items.length + '
');
+ }
+ };
+
+ /**
+ * @desc add sub-html into the slide
+ * @param {Number} index - index of the slide
+ */
+ Plugin.prototype.addHtml = function (index) {
+ var subHtml = null;
+ var currentEle;
+ if (this.s.dynamic) {
+ subHtml = this.s.dynamicEl[index].subHtml;
+ } else {
+ currentEle = this.items[index];
+ subHtml = currentEle.getAttribute('data-sub-html');
+ if (this.s.getCaptionFromTitleOrAlt && !subHtml) {
+ subHtml = currentEle.getAttribute('title');
+ if (subHtml && currentEle.querySelector('img')) {
+ subHtml = currentEle.querySelector('img').getAttribute('alt');
+ }
+ }
+ }
+
+ if (typeof subHtml !== 'undefined' && subHtml !== null) {
+
+ // get first letter of subhtml
+ // if first letter starts with . or # get the html form the jQuery object
+ var fL = subHtml.substring(0, 1);
+ if (fL === '.' || fL === '#') {
+ if (this.s.subHtmlSelectorRelative && !this.s.dynamic) {
+ subHtml = currentEle.querySelector(subHtml).innerHTML;
+ } else {
+ subHtml = document.querySelector(subHtml).innerHTML;
+ }
+ }
+ } else {
+ subHtml = '';
+ }
+
+ if (this.s.appendSubHtmlTo === '.lg-sub-html') {
+ this.outer.querySelector(this.s.appendSubHtmlTo).innerHTML = subHtml;
+ } else {
+ this.___slide[index].insertAdjacentHTML('beforeend', subHtml);
+ }
+
+ // Add lg-empty-html class if title doesn't exist
+ if (typeof subHtml !== 'undefined' && subHtml !== null) {
+ if (subHtml === '') {
+ _lgUtils2.default.addClass(this.outer.querySelector(this.s.appendSubHtmlTo), 'lg-empty-html');
+ } else {
+ _lgUtils2.default.removeClass(this.outer.querySelector(this.s.appendSubHtmlTo), 'lg-empty-html');
+ }
+ }
+
+ _lgUtils2.default.trigger(this.el, 'onAfterAppendSubHtml', {
+ index: index
+ });
+ };
+
+ /**
+ * @desc Preload slides
+ * @param {Number} index - index of the slide
+ */
+ Plugin.prototype.preload = function (index) {
+ var i = 1;
+ var j = 1;
+ for (i = 1; i <= this.s.preload; i++) {
+ if (i >= this.items.length - index) {
+ break;
+ }
+
+ this.loadContent(index + i, false, 0);
+ }
+
+ for (j = 1; j <= this.s.preload; j++) {
+ if (index - j < 0) {
+ break;
+ }
+
+ this.loadContent(index - j, false, 0);
+ }
+ };
+
+ /**
+ * @desc Load slide content into slide.
+ * @param {Number} index - index of the slide.
+ * @param {Boolean} rec - if true call loadcontent() function again.
+ * @param {Boolean} delay - delay for adding complete class. it is 0 except first time.
+ */
+ Plugin.prototype.loadContent = function (index, rec, delay) {
+
+ var _this = this;
+ var _hasPoster = false;
+ var _img;
+ var _src;
+ var _poster;
+ var _srcset;
+ var _sizes;
+ var _html;
+ var getResponsiveSrc = function getResponsiveSrc(srcItms) {
+ var rsWidth = [];
+ var rsSrc = [];
+ for (var i = 0; i < srcItms.length; i++) {
+ var __src = srcItms[i].split(' ');
+
+ // Manage empty space
+ if (__src[0] === '') {
+ __src.splice(0, 1);
+ }
+
+ rsSrc.push(__src[0]);
+ rsWidth.push(__src[1]);
+ }
+
+ var wWidth = window.innerWidth;
+ for (var j = 0; j < rsWidth.length; j++) {
+ if (parseInt(rsWidth[j], 10) > wWidth) {
+ _src = rsSrc[j];
+ break;
+ }
+ }
+ };
+
+ if (_this.s.dynamic) {
+
+ if (_this.s.dynamicEl[index].poster) {
+ _hasPoster = true;
+ _poster = _this.s.dynamicEl[index].poster;
+ }
+
+ _html = _this.s.dynamicEl[index].html;
+ _src = _this.s.dynamicEl[index].src;
+
+ if (_this.s.dynamicEl[index].responsive) {
+ var srcDyItms = _this.s.dynamicEl[index].responsive.split(',');
+ getResponsiveSrc(srcDyItms);
+ }
+
+ _srcset = _this.s.dynamicEl[index].srcset;
+ _sizes = _this.s.dynamicEl[index].sizes;
+ } else {
+
+ if (_this.items[index].getAttribute('data-poster')) {
+ _hasPoster = true;
+ _poster = _this.items[index].getAttribute('data-poster');
+ }
+
+ _html = _this.items[index].getAttribute('data-html');
+ _src = _this.items[index].getAttribute('href') || _this.items[index].getAttribute('data-src');
+
+ if (_this.items[index].getAttribute('data-responsive')) {
+ var srcItms = _this.items[index].getAttribute('data-responsive').split(',');
+ getResponsiveSrc(srcItms);
+ }
+
+ _srcset = _this.items[index].getAttribute('data-srcset');
+ _sizes = _this.items[index].getAttribute('data-sizes');
+ }
+
+ //if (_src || _srcset || _sizes || _poster) {
+
+ var iframe = false;
+ if (_this.s.dynamic) {
+ if (_this.s.dynamicEl[index].iframe) {
+ iframe = true;
+ }
+ } else {
+ if (_this.items[index].getAttribute('data-iframe') === 'true') {
+ iframe = true;
+ }
+ }
+
+ var _isVideo = _this.isVideo(_src, index);
+ if (!_lgUtils2.default.hasClass(_this.___slide[index], 'lg-loaded')) {
+ if (iframe) {
+ _this.___slide[index].insertAdjacentHTML('afterbegin', '');
+ } else if (_hasPoster) {
+ var videoClass = '';
+ if (_isVideo && _isVideo.youtube) {
+ videoClass = 'lg-has-youtube';
+ } else if (_isVideo && _isVideo.vimeo) {
+ videoClass = 'lg-has-vimeo';
+ } else {
+ videoClass = 'lg-has-html5';
+ }
+
+ _this.___slide[index].insertAdjacentHTML('beforeend', '');
+ } else if (_isVideo) {
+ _this.___slide[index].insertAdjacentHTML('beforeend', '');
+ _lgUtils2.default.trigger(_this.el, 'hasVideo', {
+ index: index,
+ src: _src,
+ html: _html
+ });
+ } else {
+ _this.___slide[index].insertAdjacentHTML('beforeend', '');
+ }
+
+ _lgUtils2.default.trigger(_this.el, 'onAferAppendSlide', {
+ index: index
+ });
+
+ _img = _this.___slide[index].querySelector('.lg-object');
+ if (_sizes) {
+ _img.setAttribute('sizes', _sizes);
+ }
+
+ if (_srcset) {
+ _img.setAttribute('srcset', _srcset);
+ try {
+ picturefill({
+ elements: [_img[0]]
+ });
+ } catch (e) {
+ console.error('Make sure you have included Picturefill version 2');
+ }
+ }
+
+ if (this.s.appendSubHtmlTo !== '.lg-sub-html') {
+ _this.addHtml(index);
+ }
+
+ _lgUtils2.default.addClass(_this.___slide[index], 'lg-loaded');
+ }
+
+ _lgUtils2.default.on(_this.___slide[index].querySelector('.lg-object'), 'load.lg error.lg', function () {
+
+ // For first time add some delay for displaying the start animation.
+ var _speed = 0;
+
+ // Do not change the delay value because it is required for zoom plugin.
+ // If gallery opened from direct url (hash) speed value should be 0
+ if (delay && !_lgUtils2.default.hasClass(document.body, 'lg-from-hash')) {
+ _speed = delay;
+ }
+
+ setTimeout(function () {
+ _lgUtils2.default.addClass(_this.___slide[index], 'lg-complete');
+
+ _lgUtils2.default.trigger(_this.el, 'onSlideItemLoad', {
+ index: index,
+ delay: delay || 0
+ });
+ }, _speed);
+ });
+
+ // @todo check load state for html5 videos
+ if (_isVideo && _isVideo.html5 && !_hasPoster) {
+ _lgUtils2.default.addClass(_this.___slide[index], 'lg-complete');
+ }
+
+ if (rec === true) {
+ if (!_lgUtils2.default.hasClass(_this.___slide[index], 'lg-complete')) {
+ _lgUtils2.default.on(_this.___slide[index].querySelector('.lg-object'), 'load.lg error.lg', function () {
+ _this.preload(index);
+ });
+ } else {
+ _this.preload(index);
+ }
+ }
+
+ //}
+ };
+
+ /**
+ * @desc slide function for lightgallery
+ ** Slide() gets call on start
+ ** ** Set lg.on true once slide() function gets called.
+ ** Call loadContent() on slide() function inside setTimeout
+ ** ** On first slide we do not want any animation like slide of fade
+ ** ** So on first slide( if lg.on if false that is first slide) loadContent() should start loading immediately
+ ** ** Else loadContent() should wait for the transition to complete.
+ ** ** So set timeout s.speed + 50
+ <=> ** loadContent() will load slide content in to the particular slide
+ ** ** It has recursion (rec) parameter. if rec === true loadContent() will call preload() function.
+ ** ** preload will execute only when the previous slide is fully loaded (images iframe)
+ ** ** avoid simultaneous image load
+ <=> ** Preload() will check for s.preload value and call loadContent() again accoring to preload value
+ ** loadContent() <====> Preload();
+
+ * @param {Number} index - index of the slide
+ * @param {Boolean} fromTouch - true if slide function called via touch event or mouse drag
+ * @param {Boolean} fromThumb - true if slide function called via thumbnail click
+ */
+ Plugin.prototype.slide = function (index, fromTouch, fromThumb) {
+
+ var _prevIndex = 0;
+ for (var i = 0; i < this.___slide.length; i++) {
+ if (_lgUtils2.default.hasClass(this.___slide[i], 'lg-current')) {
+ _prevIndex = i;
+ break;
+ }
+ }
+
+ var _this = this;
+
+ // Prevent if multiple call
+ // Required for hsh plugin
+ if (_this.lGalleryOn && _prevIndex === index) {
+ return;
+ }
+
+ var _length = this.___slide.length;
+ var _time = _this.lGalleryOn ? this.s.speed : 0;
+ var _next = false;
+ var _prev = false;
+
+ if (!_this.lgBusy) {
+
+ if (this.s.download) {
+ var _src;
+ if (_this.s.dynamic) {
+ _src = _this.s.dynamicEl[index].downloadUrl !== false && (_this.s.dynamicEl[index].downloadUrl || _this.s.dynamicEl[index].src);
+ } else {
+ _src = _this.items[index].getAttribute('data-download-url') !== 'false' && (_this.items[index].getAttribute('data-download-url') || _this.items[index].getAttribute('href') || _this.items[index].getAttribute('data-src'));
+ }
+
+ if (_src) {
+ document.getElementById('lg-download').setAttribute('href', _src);
+ _lgUtils2.default.removeClass(_this.outer, 'lg-hide-download');
+ } else {
+ _lgUtils2.default.addClass(_this.outer, 'lg-hide-download');
+ }
+ }
+
+ _lgUtils2.default.trigger(_this.el, 'onBeforeSlide', {
+ prevIndex: _prevIndex,
+ index: index,
+ fromTouch: fromTouch,
+ fromThumb: fromThumb
+ });
+
+ _this.lgBusy = true;
+
+ clearTimeout(_this.hideBartimeout);
+
+ // Add title if this.s.appendSubHtmlTo === lg-sub-html
+ if (this.s.appendSubHtmlTo === '.lg-sub-html') {
+
+ // wait for slide animation to complete
+ setTimeout(function () {
+ _this.addHtml(index);
+ }, _time);
+ }
+
+ this.arrowDisable(index);
+
+ if (!fromTouch) {
+
+ // remove all transitions
+ _lgUtils2.default.addClass(_this.outer, 'lg-no-trans');
+
+ for (var j = 0; j < this.___slide.length; j++) {
+ _lgUtils2.default.removeClass(this.___slide[j], 'lg-prev-slide');
+ _lgUtils2.default.removeClass(this.___slide[j], 'lg-next-slide');
+ }
+
+ if (index < _prevIndex) {
+ _prev = true;
+ if (index === 0 && _prevIndex === _length - 1 && !fromThumb) {
+ _prev = false;
+ _next = true;
+ }
+ } else if (index > _prevIndex) {
+ _next = true;
+ if (index === _length - 1 && _prevIndex === 0 && !fromThumb) {
+ _prev = true;
+ _next = false;
+ }
+ }
+
+ if (_prev) {
+
+ //prevslide
+ _lgUtils2.default.addClass(this.___slide[index], 'lg-prev-slide');
+ _lgUtils2.default.addClass(this.___slide[_prevIndex], 'lg-next-slide');
+ } else if (_next) {
+
+ // next slide
+ _lgUtils2.default.addClass(this.___slide[index], 'lg-next-slide');
+ _lgUtils2.default.addClass(this.___slide[_prevIndex], 'lg-prev-slide');
+ }
+
+ // give 50 ms for browser to add/remove class
+ setTimeout(function () {
+ _lgUtils2.default.removeClass(_this.outer.querySelector('.lg-current'), 'lg-current');
+
+ //_this.$slide.eq(_prevIndex).removeClass('lg-current');
+ _lgUtils2.default.addClass(_this.___slide[index], 'lg-current');
+
+ // reset all transitions
+ _lgUtils2.default.removeClass(_this.outer, 'lg-no-trans');
+ }, 50);
+ } else {
+
+ var touchPrev = index - 1;
+ var touchNext = index + 1;
+
+ if (index === 0 && _prevIndex === _length - 1) {
+
+ // next slide
+ touchNext = 0;
+ touchPrev = _length - 1;
+ } else if (index === _length - 1 && _prevIndex === 0) {
+
+ // prev slide
+ touchNext = 0;
+ touchPrev = _length - 1;
+ }
+
+ _lgUtils2.default.removeClass(_this.outer.querySelector('.lg-prev-slide'), 'lg-prev-slide');
+ _lgUtils2.default.removeClass(_this.outer.querySelector('.lg-current'), 'lg-current');
+ _lgUtils2.default.removeClass(_this.outer.querySelector('.lg-next-slide'), 'lg-next-slide');
+ _lgUtils2.default.addClass(_this.___slide[touchPrev], 'lg-prev-slide');
+ _lgUtils2.default.addClass(_this.___slide[touchNext], 'lg-next-slide');
+ _lgUtils2.default.addClass(_this.___slide[index], 'lg-current');
+ }
+
+ if (_this.lGalleryOn) {
+ setTimeout(function () {
+ _this.loadContent(index, true, 0);
+ }, this.s.speed + 50);
+
+ setTimeout(function () {
+ _this.lgBusy = false;
+ _lgUtils2.default.trigger(_this.el, 'onAfterSlide', {
+ prevIndex: _prevIndex,
+ index: index,
+ fromTouch: fromTouch,
+ fromThumb: fromThumb
+ });
+ }, this.s.speed);
+ } else {
+ _this.loadContent(index, true, _this.s.backdropDuration);
+
+ _this.lgBusy = false;
+ _lgUtils2.default.trigger(_this.el, 'onAfterSlide', {
+ prevIndex: _prevIndex,
+ index: index,
+ fromTouch: fromTouch,
+ fromThumb: fromThumb
+ });
+ }
+
+ _this.lGalleryOn = true;
+
+ if (this.s.counter) {
+ if (document.getElementById('lg-counter-current')) {
+ document.getElementById('lg-counter-current').innerHTML = index + 1;
+ }
+ }
+ }
+ };
+
+ /**
+ * @desc Go to next slide
+ * @param {Boolean} fromTouch - true if slide function called via touch event
+ */
+ Plugin.prototype.goToNextSlide = function (fromTouch) {
+ var _this = this;
+ if (!_this.lgBusy) {
+ if (_this.index + 1 < _this.___slide.length) {
+ _this.index++;
+ _lgUtils2.default.trigger(_this.el, 'onBeforeNextSlide', {
+ index: _this.index
+ });
+ _this.slide(_this.index, fromTouch, false);
+ } else {
+ if (_this.s.loop) {
+ _this.index = 0;
+ _lgUtils2.default.trigger(_this.el, 'onBeforeNextSlide', {
+ index: _this.index
+ });
+ _this.slide(_this.index, fromTouch, false);
+ } else if (_this.s.slideEndAnimatoin) {
+ _lgUtils2.default.addClass(_this.outer, 'lg-right-end');
+ setTimeout(function () {
+ _lgUtils2.default.removeClass(_this.outer, 'lg-right-end');
+ }, 400);
+ }
+ }
+ }
+ };
+
+ /**
+ * @desc Go to previous slide
+ * @param {Boolean} fromTouch - true if slide function called via touch event
+ */
+ Plugin.prototype.goToPrevSlide = function (fromTouch) {
+ var _this = this;
+ if (!_this.lgBusy) {
+ if (_this.index > 0) {
+ _this.index--;
+ _lgUtils2.default.trigger(_this.el, 'onBeforePrevSlide', {
+ index: _this.index,
+ fromTouch: fromTouch
+ });
+ _this.slide(_this.index, fromTouch, false);
+ } else {
+ if (_this.s.loop) {
+ _this.index = _this.items.length - 1;
+ _lgUtils2.default.trigger(_this.el, 'onBeforePrevSlide', {
+ index: _this.index,
+ fromTouch: fromTouch
+ });
+ _this.slide(_this.index, fromTouch, false);
+ } else if (_this.s.slideEndAnimatoin) {
+ _lgUtils2.default.addClass(_this.outer, 'lg-left-end');
+ setTimeout(function () {
+ _lgUtils2.default.removeClass(_this.outer, 'lg-left-end');
+ }, 400);
+ }
+ }
+ }
+ };
+
+ Plugin.prototype.keyPress = function () {
+ var _this = this;
+ if (this.items.length > 1) {
+ _lgUtils2.default.on(window, 'keyup.lg', function (e) {
+ if (_this.items.length > 1) {
+ if (e.keyCode === 37) {
+ e.preventDefault();
+ _this.goToPrevSlide();
+ }
+
+ if (e.keyCode === 39) {
+ e.preventDefault();
+ _this.goToNextSlide();
+ }
+ }
+ });
+ }
+
+ _lgUtils2.default.on(window, 'keydown.lg', function (e) {
+ if (_this.s.escKey === true && e.keyCode === 27) {
+ e.preventDefault();
+ if (!_lgUtils2.default.hasClass(_this.outer, 'lg-thumb-open')) {
+ _this.destroy();
+ } else {
+ _lgUtils2.default.removeClass(_this.outer, 'lg-thumb-open');
+ }
+ }
+ });
+ };
+
+ Plugin.prototype.arrow = function () {
+ var _this = this;
+ _lgUtils2.default.on(this.outer.querySelector('.lg-prev'), 'click.lg', function () {
+ _this.goToPrevSlide();
+ });
+
+ _lgUtils2.default.on(this.outer.querySelector('.lg-next'), 'click.lg', function () {
+ _this.goToNextSlide();
+ });
+ };
+
+ Plugin.prototype.arrowDisable = function (index) {
+
+ // Disable arrows if s.hideControlOnEnd is true
+ if (!this.s.loop && this.s.hideControlOnEnd) {
+ var next = this.outer.querySelector('.lg-next');
+ var prev = this.outer.querySelector('.lg-prev');
+ if (index + 1 < this.___slide.length) {
+ next.removeAttribute('disabled');
+ _lgUtils2.default.removeClass(next, 'disabled');
+ } else {
+ next.setAttribute('disabled', 'disabled');
+ _lgUtils2.default.addClass(next, 'disabled');
+ }
+
+ if (index > 0) {
+ prev.removeAttribute('disabled');
+ _lgUtils2.default.removeClass(prev, 'disabled');
+ } else {
+ prev.setAttribute('disabled', 'disabled');
+ _lgUtils2.default.addClass(prev, 'disabled');
+ }
+ }
+ };
+
+ Plugin.prototype.setTranslate = function (el, xValue, yValue) {
+ // jQuery supports Automatic CSS prefixing since jQuery 1.8.0
+ if (this.s.useLeft) {
+ el.style.left = xValue;
+ } else {
+ _lgUtils2.default.setVendor(el, 'Transform', 'translate3d(' + xValue + 'px, ' + yValue + 'px, 0px)');
+ }
+ };
+
+ Plugin.prototype.touchMove = function (startCoords, endCoords) {
+
+ var distance = endCoords - startCoords;
+
+ if (Math.abs(distance) > 15) {
+ // reset opacity and transition duration
+ _lgUtils2.default.addClass(this.outer, 'lg-dragging');
+
+ // move current slide
+ this.setTranslate(this.___slide[this.index], distance, 0);
+
+ // move next and prev slide with current slide
+ this.setTranslate(document.querySelector('.lg-prev-slide'), -this.___slide[this.index].clientWidth + distance, 0);
+ this.setTranslate(document.querySelector('.lg-next-slide'), this.___slide[this.index].clientWidth + distance, 0);
+ }
+ };
+
+ Plugin.prototype.touchEnd = function (distance) {
+ var _this = this;
+
+ // keep slide animation for any mode while dragg/swipe
+ if (_this.s.mode !== 'lg-slide') {
+ _lgUtils2.default.addClass(_this.outer, 'lg-slide');
+ }
+
+ for (var i = 0; i < this.___slide.length; i++) {
+ if (!_lgUtils2.default.hasClass(this.___slide[i], 'lg-current') && !_lgUtils2.default.hasClass(this.___slide[i], 'lg-prev-slide') && !_lgUtils2.default.hasClass(this.___slide[i], 'lg-next-slide')) {
+ this.___slide[i].style.opacity = '0';
+ }
+ }
+
+ // set transition duration
+ setTimeout(function () {
+ _lgUtils2.default.removeClass(_this.outer, 'lg-dragging');
+ if (distance < 0 && Math.abs(distance) > _this.s.swipeThreshold) {
+ _this.goToNextSlide(true);
+ } else if (distance > 0 && Math.abs(distance) > _this.s.swipeThreshold) {
+ _this.goToPrevSlide(true);
+ } else if (Math.abs(distance) < 5) {
+
+ // Trigger click if distance is less than 5 pix
+ _lgUtils2.default.trigger(_this.el, 'onSlideClick');
+ }
+
+ for (var i = 0; i < _this.___slide.length; i++) {
+ _this.___slide[i].removeAttribute('style');
+ }
+ });
+
+ // remove slide class once drag/swipe is completed if mode is not slide
+ setTimeout(function () {
+ if (!_lgUtils2.default.hasClass(_this.outer, 'lg-dragging') && _this.s.mode !== 'lg-slide') {
+ _lgUtils2.default.removeClass(_this.outer, 'lg-slide');
+ }
+ }, _this.s.speed + 100);
+ };
+
+ Plugin.prototype.enableSwipe = function () {
+ var _this = this;
+ var startCoords = 0;
+ var endCoords = 0;
+ var isMoved = false;
+
+ if (_this.s.enableSwipe && _this.isTouch && _this.doCss()) {
+
+ for (var i = 0; i < _this.___slide.length; i++) {
+ /*jshint loopfunc: true */
+ _lgUtils2.default.on(_this.___slide[i], 'touchstart.lg', function (e) {
+ if (!_lgUtils2.default.hasClass(_this.outer, 'lg-zoomed') && !_this.lgBusy) {
+ e.preventDefault();
+ _this.manageSwipeClass();
+ startCoords = e.targetTouches[0].pageX;
+ }
+ });
+ }
+
+ for (var j = 0; j < _this.___slide.length; j++) {
+ /*jshint loopfunc: true */
+ _lgUtils2.default.on(_this.___slide[j], 'touchmove.lg', function (e) {
+ if (!_lgUtils2.default.hasClass(_this.outer, 'lg-zoomed')) {
+ e.preventDefault();
+ endCoords = e.targetTouches[0].pageX;
+ _this.touchMove(startCoords, endCoords);
+ isMoved = true;
+ }
+ });
+ }
+
+ for (var k = 0; k < _this.___slide.length; k++) {
+ /*jshint loopfunc: true */
+ _lgUtils2.default.on(_this.___slide[k], 'touchend.lg', function () {
+ if (!_lgUtils2.default.hasClass(_this.outer, 'lg-zoomed')) {
+ if (isMoved) {
+ isMoved = false;
+ _this.touchEnd(endCoords - startCoords);
+ } else {
+ _lgUtils2.default.trigger(_this.el, 'onSlideClick');
+ }
+ }
+ });
+ }
+ }
+ };
+
+ Plugin.prototype.enableDrag = function () {
+ var _this = this;
+ var startCoords = 0;
+ var endCoords = 0;
+ var isDraging = false;
+ var isMoved = false;
+ if (_this.s.enableDrag && !_this.isTouch && _this.doCss()) {
+ for (var i = 0; i < _this.___slide.length; i++) {
+ /*jshint loopfunc: true */
+ _lgUtils2.default.on(_this.___slide[i], 'mousedown.lg', function (e) {
+ // execute only on .lg-object
+ if (!_lgUtils2.default.hasClass(_this.outer, 'lg-zoomed')) {
+ if (_lgUtils2.default.hasClass(e.target, 'lg-object') || _lgUtils2.default.hasClass(e.target, 'lg-video-play')) {
+ e.preventDefault();
+
+ if (!_this.lgBusy) {
+ _this.manageSwipeClass();
+ startCoords = e.pageX;
+ isDraging = true;
+
+ // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723
+ _this.outer.scrollLeft += 1;
+ _this.outer.scrollLeft -= 1;
+
+ // *
+
+ _lgUtils2.default.removeClass(_this.outer, 'lg-grab');
+ _lgUtils2.default.addClass(_this.outer, 'lg-grabbing');
+
+ _lgUtils2.default.trigger(_this.el, 'onDragstart');
+ }
+ }
+ }
+ });
+ }
+
+ _lgUtils2.default.on(window, 'mousemove.lg', function (e) {
+ if (isDraging) {
+ isMoved = true;
+ endCoords = e.pageX;
+ _this.touchMove(startCoords, endCoords);
+ _lgUtils2.default.trigger(_this.el, 'onDragmove');
+ }
+ });
+
+ _lgUtils2.default.on(window, 'mouseup.lg', function (e) {
+ if (isMoved) {
+ isMoved = false;
+ _this.touchEnd(endCoords - startCoords);
+ _lgUtils2.default.trigger(_this.el, 'onDragend');
+ } else if (_lgUtils2.default.hasClass(e.target, 'lg-object') || _lgUtils2.default.hasClass(e.target, 'lg-video-play')) {
+ _lgUtils2.default.trigger(_this.el, 'onSlideClick');
+ }
+
+ // Prevent execution on click
+ if (isDraging) {
+ isDraging = false;
+ _lgUtils2.default.removeClass(_this.outer, 'lg-grabbing');
+ _lgUtils2.default.addClass(_this.outer, 'lg-grab');
+ }
+ });
+ }
+ };
+
+ Plugin.prototype.manageSwipeClass = function () {
+ var touchNext = this.index + 1;
+ var touchPrev = this.index - 1;
+ var length = this.___slide.length;
+ if (this.s.loop) {
+ if (this.index === 0) {
+ touchPrev = length - 1;
+ } else if (this.index === length - 1) {
+ touchNext = 0;
+ }
+ }
+
+ for (var i = 0; i < this.___slide.length; i++) {
+ _lgUtils2.default.removeClass(this.___slide[i], 'lg-next-slide');
+ _lgUtils2.default.removeClass(this.___slide[i], 'lg-prev-slide');
+ }
+
+ if (touchPrev > -1) {
+ _lgUtils2.default.addClass(this.___slide[touchPrev], 'lg-prev-slide');
+ }
+
+ _lgUtils2.default.addClass(this.___slide[touchNext], 'lg-next-slide');
+ };
+
+ Plugin.prototype.mousewheel = function () {
+ var _this = this;
+ _lgUtils2.default.on(_this.outer, 'mousewheel.lg', function (e) {
+
+ if (!e.deltaY) {
+ return;
+ }
+
+ if (e.deltaY > 0) {
+ _this.goToPrevSlide();
+ } else {
+ _this.goToNextSlide();
+ }
+
+ e.preventDefault();
+ });
+ };
+
+ Plugin.prototype.closeGallery = function () {
+
+ var _this = this;
+ var mousedown = false;
+ _lgUtils2.default.on(this.outer.querySelector('.lg-close'), 'click.lg', function () {
+ _this.destroy();
+ });
+
+ if (_this.s.closable) {
+
+ // If you drag the slide and release outside gallery gets close on chrome
+ // for preventing this check mousedown and mouseup happened on .lg-item or lg-outer
+ _lgUtils2.default.on(_this.outer, 'mousedown.lg', function (e) {
+
+ if (_lgUtils2.default.hasClass(e.target, 'lg-outer') || _lgUtils2.default.hasClass(e.target, 'lg-item') || _lgUtils2.default.hasClass(e.target, 'lg-img-wrap')) {
+ mousedown = true;
+ } else {
+ mousedown = false;
+ }
+ });
+
+ _lgUtils2.default.on(_this.outer, 'mouseup.lg', function (e) {
+
+ if (_lgUtils2.default.hasClass(e.target, 'lg-outer') || _lgUtils2.default.hasClass(e.target, 'lg-item') || _lgUtils2.default.hasClass(e.target, 'lg-img-wrap') && mousedown) {
+ if (!_lgUtils2.default.hasClass(_this.outer, 'lg-dragging')) {
+ _this.destroy();
+ }
+ }
+ });
+ }
+ };
+
+ Plugin.prototype.destroy = function (d) {
+
+ var _this = this;
+
+ if (!d) {
+ _lgUtils2.default.trigger(_this.el, 'onBeforeClose');
+ }
+
+ document.body.scrollTop = _this.prevScrollTop;
+ document.documentElement.scrollTop = _this.prevScrollTop;
+
+ /**
+ * if d is false or undefined destroy will only close the gallery
+ * plugins instance remains with the element
+ *
+ * if d is true destroy will completely remove the plugin
+ */
+
+ if (d) {
+ if (!_this.s.dynamic) {
+ // only when not using dynamic mode is $items a jquery collection
+
+ for (var i = 0; i < this.items.length; i++) {
+ _lgUtils2.default.off(this.items[i], '.lg');
+ _lgUtils2.default.off(this.items[i], '.lgcustom');
+ }
+ }
+
+ var lguid = _this.el.getAttribute('lg-uid');
+ delete window.lgData[lguid];
+ _this.el.removeAttribute('lg-uid');
+ }
+
+ // Unbind all events added by lightGallery
+ _lgUtils2.default.off(this.el, '.lgtm');
+
+ // Distroy all lightGallery modules
+ for (var key in window.lgModules) {
+ if (_this.modules[key]) {
+ _this.modules[key].destroy(d);
+ }
+ }
+
+ this.lGalleryOn = false;
+
+ clearTimeout(_this.hideBartimeout);
+ this.hideBartimeout = false;
+ _lgUtils2.default.off(window, '.lg');
+ _lgUtils2.default.removeClass(document.body, 'lg-on');
+ _lgUtils2.default.removeClass(document.body, 'lg-from-hash');
+
+ if (_this.outer) {
+ _lgUtils2.default.removeClass(_this.outer, 'lg-visible');
+ }
+
+ _lgUtils2.default.removeClass(document.querySelector('.lg-backdrop'), 'in');
+ setTimeout(function () {
+ try {
+ if (_this.outer) {
+ _this.outer.parentNode.removeChild(_this.outer);
+ }
+
+ if (document.querySelector('.lg-backdrop')) {
+ document.querySelector('.lg-backdrop').parentNode.removeChild(document.querySelector('.lg-backdrop'));
+ }
+
+ if (!d) {
+ _lgUtils2.default.trigger(_this.el, 'onCloseAfter');
+ }
+ } catch (err) {}
+ }, _this.s.backdropDuration + 50);
+ };
+
+ window.lightGallery = function (el, options) {
+ if (!el) {
+ return;
+ }
+
+ try {
+ if (!el.getAttribute('lg-uid')) {
+ var uid = 'lg' + window.lgData.uid++;
+ window.lgData[uid] = new Plugin(el, options);
+ el.setAttribute('lg-uid', uid);
+ } else {
+ try {
+ window.lgData[el.getAttribute('lg-uid')].init();
+ } catch (err) {
+ console.error('lightGallery has not initiated properly');
+ }
+ }
+ } catch (err) {
+ console.error('lightGallery has not initiated properly');
+ }
+ };
+});
+
+},{"./lg-utils":1}]},{},[2])(2)
+});
diff --git a/themes/minimal/templates/alternate_index.html b/themes/minimal/templates/alternate_index.html
new file mode 100644
index 0000000..7eecb65
--- /dev/null
+++ b/themes/minimal/templates/alternate_index.html
@@ -0,0 +1,20 @@
+{% extends "base.html" %}
+
+{% block title %}{{ SITEURL }}/blog{% endblock %}
+{% block content_title %}blog {%endblock%}
+
+{% block content %}
+ {% for year, date_year in dates | groupby('date.year') | sort(reverse=True) %}
+ {{ date_year[0].date.strftime('%Y') }}
+
+ {% for month, date_month in date_year | groupby( 'date.month' ) | sort(reverse=True) %}
+ {{ month | month_name }}
+
+ {% for article in date_month %}
+ {{ article.date.strftime('%d') }} » {{ article.title }}
+ {% endfor %}
+
+ {% endfor %}
+
+ {% endfor %}
+{% endblock %}
diff --git a/themes/minimal/templates/archives.html b/themes/minimal/templates/archives.html
new file mode 100644
index 0000000..7a99bbf
--- /dev/null
+++ b/themes/minimal/templates/archives.html
@@ -0,0 +1,14 @@
+{% extends "base.html" %}
+
+{% block title %}{{ SITEURL }}/pages{% endblock %}
+{% block content_title %}pages{%endblock%}
+
+{% block content %}
+Pages, Drafts, Tutorials, ...
+This page contains tutorials, rough drafts I work on. The articles in here aren't necessarily finished and some of them aren't open to discussion, because they are work in progress (or chaos). Some of them might be turned into self-contained blog posts, some of them will never get out of this dungeon.
+
+{% for page in pages | sort(attribute='title') %}
+ {{ page.title }}
+{% endfor %}
+
+{% endblock %}
diff --git a/themes/minimal/templates/article.html b/themes/minimal/templates/article.html
new file mode 100644
index 0000000..79bf65c
--- /dev/null
+++ b/themes/minimal/templates/article.html
@@ -0,0 +1,23 @@
+{% extends "base.html" %}
+
+{% block title %}{{ article.title }}{% endblock %}
+
+{% block content_title %}{{ article.url }}{% endblock %}
+
+{% block content %}
+
+ {% if article.toc %}
+ Table of Contents
+
+ {{ article.toc }}
+
+ {% endif %}
+
+ {{ article.content }}
+
+
+{% endblock %}
diff --git a/themes/minimal/templates/author.html b/themes/minimal/templates/author.html
new file mode 100644
index 0000000..6173ee8
--- /dev/null
+++ b/themes/minimal/templates/author.html
@@ -0,0 +1,17 @@
+{% extends "base.html" %}
+
+{% block content_title %}{{page_name}}{%endblock%}
+
+{% block content %}
+ Posts by {{ author }}:
+ {% if articles %}
+
+ {% for year, date_year in dates | groupby('date.year') | sort(reverse=True) %}
+ {% for article in date_year | sort(attribute='date', reverse=True) %}
+ {{ article.date.strftime('%B %d, %Y') }}
+ {{ article.title }}
+ {% endfor %}
+ {% endfor %}
+
+ {% endif %}
+{% endblock %}
diff --git a/themes/minimal/templates/authors.html b/themes/minimal/templates/authors.html
new file mode 100644
index 0000000..e69de29
diff --git a/themes/minimal/templates/base.html b/themes/minimal/templates/base.html
new file mode 100644
index 0000000..609cf58
--- /dev/null
+++ b/themes/minimal/templates/base.html
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% if FEED_RSS %}
+
+{% endif %}
+
+ asdf {% block title %}{{ SITENAME }}{% endblock title %}
+
+
+
+
+
+
+
+ {% block content %}{% endblock %}
+
+
+
+
+
+
+
diff --git a/themes/minimal/templates/galery.html b/themes/minimal/templates/galery.html
new file mode 100644
index 0000000..11b25df
--- /dev/null
+++ b/themes/minimal/templates/galery.html
@@ -0,0 +1,11 @@
+{% extends "base.html" %}
+
+{% block title %}{{ page.title }}{% endblock %}
+
+{% block content_title %}{{ page.url }}{%endblock%}
+
+{% block content %}
+ {{ page.title }}
+ {{ page.content }}
+{% endblock %}
+
diff --git a/themes/minimal/templates/index.html b/themes/minimal/templates/index.html
new file mode 100644
index 0000000..fa0d2e6
--- /dev/null
+++ b/themes/minimal/templates/index.html
@@ -0,0 +1,17 @@
+{% extends "base.html" %}
+
+{% block title %}{{ SITEURL }}/blog{% endblock %}
+{% block content_title %}blog{%endblock%}
+
+{% block content %}
+ blog
+ {% for year, date_year in dates | groupby('date.year') | sort(reverse=True) %}
+ {{ date_year[0].date.strftime('%Y') }}
+
+ {% for article in date_year | sort(attribute='date', reverse=True) %}
+ {{ article.date.strftime('%B %d, %Y') }}
+ {{ article.title }}
+ {% endfor %}
+
+ {% endfor %}
+{% endblock %}
diff --git a/themes/minimal/templates/page.html b/themes/minimal/templates/page.html
new file mode 100644
index 0000000..232f618
--- /dev/null
+++ b/themes/minimal/templates/page.html
@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+
+{% block title %}{{ page.title }}{% endblock %}
+
+{% block content_title %}{{ page.url }}{%endblock%}
+
+{% block content %}
+ {{ page.title }}
+ {{ page.content }}
+{% endblock %}
+
+
diff --git a/themes/minimal/templates/page_discussion.html b/themes/minimal/templates/page_discussion.html
new file mode 100644
index 0000000..56dd70e
--- /dev/null
+++ b/themes/minimal/templates/page_discussion.html
@@ -0,0 +1,9 @@
+{% extends "base.html" %}
+
+{% block title %}{{ SITEURL }}/{{ page.url }}{% endblock %}
+
+{% block content_title %}{{ page.url }}{%endblock%}
+
+{% block content %}
+ {{ page.content }}
+{% endblock %}
diff --git a/themes/minimal/templates/page_notitle.html b/themes/minimal/templates/page_notitle.html
new file mode 100644
index 0000000..56dd70e
--- /dev/null
+++ b/themes/minimal/templates/page_notitle.html
@@ -0,0 +1,9 @@
+{% extends "base.html" %}
+
+{% block title %}{{ SITEURL }}/{{ page.url }}{% endblock %}
+
+{% block content_title %}{{ page.url }}{%endblock%}
+
+{% block content %}
+ {{ page.content }}
+{% endblock %}
diff --git a/themes/minimal/templates/projects.html b/themes/minimal/templates/projects.html
new file mode 100644
index 0000000..bd00842
--- /dev/null
+++ b/themes/minimal/templates/projects.html
@@ -0,0 +1,15 @@
+{% extends "base.html" %}
+
+{% block title %}{{ SITEURL }}/pages{% endblock %}
+{% block content_title %}pages{%endblock%}
+
+{% block content %}
+Pages, Drafts, Tutorials, ...
+This page contains tutorials, rough drafts I work on. The articles in here aren't necessarily finished and some of them aren't open to discussion, because they are work in progress (or chaos). Some of them might be turned into self-contained blog posts, some of them will never get out of this dungeon.
+{% endblock %}
+dfsafsdf
+
+{% for page in pages | sort(attribute='title') %}
+ {{ page.title }}
+{% endfor %}
+
diff --git a/themes/minimal/templates/tag.html b/themes/minimal/templates/tag.html
new file mode 100644
index 0000000..3938f16
--- /dev/null
+++ b/themes/minimal/templates/tag.html
@@ -0,0 +1,18 @@
+{% extends "base.html" %}
+
+{% block title %}Articles for Tag "{{ tag }}"{% endblock %}
+{% block content_title %}tag/{{ tag }}{%endblock%}
+
+{% block content %}
+ {% if articles %}
+ Articles for Tag "{{ tag }}"
+
+ {% for year, date_year in dates | groupby('date.year') | sort(reverse=True) %}
+ {% for article in date_year | sort(attribute='date', reverse=True) %}
+ {{ article.date.strftime('%B %d, %Y') }}
+ {{ article.title }}
+ {% endfor %}
+ {% endfor %}
+
+ {% endif %}
+{% endblock %}
diff --git a/themes/minimal/templates/tags.html b/themes/minimal/templates/tags.html
new file mode 100644
index 0000000..75eec1a
--- /dev/null
+++ b/themes/minimal/templates/tags.html
@@ -0,0 +1,14 @@
+{% extends "base.html" %}
+
+{% block title %}Tags{%endblock%}
+{% block content_title %}tags{%endblock%}
+
+{% block content %}
+ {% if tags %}
+ Available Tags and Articles
+