diff --git a/.gitignore b/.gitignore index 1ab72424..1ae86973 100644 --- a/.gitignore +++ b/.gitignore @@ -7,10 +7,21 @@ cpp/*.test *.pyc *.vglog +build/ + client/mosquitto_pub client/mosquitto_sub + +dist/ + examples/mysql_log/mosquitto_mysql_log examples/temperature_conversion/mqtt_temperature_conversion + +lib/cpp/libmosquittopp.so* +lib/cpp/libmosquittopp.a +lib/libmosquitto.so* +lib/libmosquitto.a + man/mosquitto.8 man/mosquitto-tls.7 man/mosquitto.conf.5 @@ -19,9 +30,11 @@ man/mosquitto_passwd.1 man/mosquitto_pub.1 man/mosquitto_sub.1 man/mqtt.7 + src/db_dump/mosquitto_db_dump src/mosquitto src/mosquitto_passwd + test/broker/broker.pid test/test_client test/fake_user @@ -32,15 +45,10 @@ test/msgsps_sub.dat test/broker/c/auth_plugin.so test/broker/c/*.test -lib/cpp/libmosquittopp.so* -lib/cpp/libmosquittopp.a -lib/libmosquitto.so* -lib/libmosquitto.a - test/ssl/*.csr test/lib/c/*.test test/lib/cpp/*.test -build/ -dist/ +www/cache/ +__pycache__ diff --git a/man/html.xsl b/man/html.xsl index 6ffa0bca..44f00187 100644 --- a/man/html.xsl +++ b/man/html.xsl @@ -5,7 +5,6 @@ man.css ansi - ansi diff --git a/man/libmosquitto.3.meta b/man/libmosquitto.3.meta new file mode 100644 index 00000000..205f3bfa --- /dev/null +++ b/man/libmosquitto.3.meta @@ -0,0 +1,5 @@ +.. title: libmosquitto man page +.. slug: libmosquitto-3 +.. category: man +.. type: man +.. pretty_url: False diff --git a/man/mosquitto-tls.7.meta b/man/mosquitto-tls.7.meta new file mode 100644 index 00000000..fed34c4d --- /dev/null +++ b/man/mosquitto-tls.7.meta @@ -0,0 +1,5 @@ +.. title: mosquitto-tls man page +.. slug: mosquitto-tls-7 +.. category: man +.. type: man +.. pretty_url: False diff --git a/man/mosquitto.8.meta b/man/mosquitto.8.meta new file mode 100644 index 00000000..45a19728 --- /dev/null +++ b/man/mosquitto.8.meta @@ -0,0 +1,5 @@ +.. title: Mosquitto man page +.. slug: mosquitto-8 +.. category: man +.. type: man +.. pretty_url: False diff --git a/man/mosquitto.conf.5.meta b/man/mosquitto.conf.5.meta new file mode 100644 index 00000000..5356affd --- /dev/null +++ b/man/mosquitto.conf.5.meta @@ -0,0 +1,5 @@ +.. title: mosquitto.conf man page +.. slug: mosquitto-conf-5 +.. category: man +.. type: man +.. pretty_url: False diff --git a/man/mosquitto_passwd.1.meta b/man/mosquitto_passwd.1.meta new file mode 100644 index 00000000..6d7c65b3 --- /dev/null +++ b/man/mosquitto_passwd.1.meta @@ -0,0 +1,5 @@ +.. title: mosquitto_passwd man page +.. slug: mosquitto_passwd-1 +.. category: man +.. type: man +.. pretty_url: False diff --git a/man/mosquitto_pub.1.meta b/man/mosquitto_pub.1.meta new file mode 100644 index 00000000..ef9b0359 --- /dev/null +++ b/man/mosquitto_pub.1.meta @@ -0,0 +1,5 @@ +.. title: mosquitto_pub man page +.. slug: mosquitto_pub-1 +.. category: man +.. type: man +.. pretty_url: False diff --git a/man/mosquitto_sub.1.meta b/man/mosquitto_sub.1.meta new file mode 100644 index 00000000..9eedadd5 --- /dev/null +++ b/man/mosquitto_sub.1.meta @@ -0,0 +1,5 @@ +.. title: mosquitto_sub man page +.. slug: mosquitto_sub-1 +.. category: man +.. type: man +.. pretty_url: False diff --git a/man/mqtt.7.meta b/man/mqtt.7.meta new file mode 100644 index 00000000..83727446 --- /dev/null +++ b/man/mqtt.7.meta @@ -0,0 +1,6 @@ +.. title: MQTT man page +.. slug: mqtt-7 +.. category: man +.. type: man +.. pretty_url: False +.. hide_title: True diff --git a/www/conf.py b/www/conf.py new file mode 100644 index 00000000..7e012f5a --- /dev/null +++ b/www/conf.py @@ -0,0 +1,1421 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals +import time + +# !! This is the configuration of Nikola. !! # +# !! You should edit it to your liking. !! # + + +# ! Some settings can be different in different languages. +# ! A comment stating (translatable) is used to denote those. +# ! There are two ways to specify a translatable setting: +# ! (a) BLOG_TITLE = "My Blog" +# ! (b) BLOG_TITLE = {"en": "My Blog", "es": "Mi Blog"} +# ! Option (a) is used when you don't want that setting translated. +# ! Option (b) is used for settings that are different in different languages. + + +# Data about this site +BLOG_AUTHOR = "Mosquitto Project" # (translatable) +BLOG_TITLE = "Eclipse Mosquitto" # (translatable) +# This is the main URL for your site. It will be used +# in a prominent link. Don't forget the protocol (http/https)! +SITE_URL = "https://mosquitto.org/" +# This is the URL where Nikola's output will be deployed. +# If not set, defaults to SITE_URL +# BASE_URL = "https://example.com/" +BLOG_EMAIL = "roger@atchoo.org" +BLOG_DESCRIPTION = "An open source MQTT server" # (translatable) + + +# What is the default language? +DEFAULT_LANG = "en" + +# What other languages do you have? +# The format is {"translationcode" : "path/to/translation" } +# the path will be used as a prefix for the generated pages location +TRANSLATIONS = { + DEFAULT_LANG: "", + # Example for another language: + # "es": "./es", +} + +# What will translated input files be named like? + +# If you have a page something.rst, then something.pl.rst will be considered +# its Polish translation. +# (in the above example: path == "something", ext == "rst", lang == "pl") +# this pattern is also used for metadata: +# something.meta -> something.pl.meta + +TRANSLATIONS_PATTERN = "{path}.{lang}.{ext}" + +# Links for the sidebar / navigation bar. (translatable) +# This is a dict. The keys are languages, and values are tuples. +# +# For regular links: +# ('https://getnikola.com/', 'Nikola Homepage') +# +# For submenus: +# ( +# ( +# ('https://apple.com/', 'Apple'), +# ('https://orange.com/', 'Orange'), +# ), +# 'Fruits' +# ) +# +# WARNING: Support for submenus is theme-dependent. +# Only one level of submenus is supported. +# WARNING: Some themes, including the default Bootstrap 3 theme, +# may present issues if the menu is too large. +# (in bootstrap3, the navbar can grow too large and cover contents.) +# WARNING: If you link to directories, make sure to follow +# ``STRIP_INDEXES``. If it’s set to ``True``, end your links +# with a ``/``, otherwise end them with ``/index.html`` — or +# else they won’t be highlighted when active. + +NAVIGATION_LINKS = { + DEFAULT_LANG: ( + ("/", "Home"), + #("/about/", "About"), + ("/blog/", "Blog"), + ("/download/", "Download"), + #("/development/", "Development"), + #("/community/", "Community"), + #("/sponsoring/", "Sponsoring"), + ( + ( + ("/api/", "API"), + ("/man/libmosquitto-3.html", "libmosquitto"), + ("/man/mosquitto-8.html", "mosquitto"), + ("/man/mosquitto-conf-5.html", "mosquitto.conf"), + ("/man/mosquitto_passwd-1.html", "mosquitto_passwd"), + ("/man/mosquitto_pub-1.html", "mosquitto_pub"), + ("/man/mosquitto_sub-1.html", "mosquitto_sub"), + ("/man/mosquitto-tls-7.html", "mosquitto-tls"), + ("/man/mqtt-7.html", "mqtt"), + ), "Documentation", + ) + ), +} + +# Name of the theme to use. +THEME = "mosquitto" +#THEME = "bootstrap3" + +# Primary color of your theme. This will be used to customize your theme and +# auto-generate related colors in POSTS_SECTION_COLORS. Must be a HEX value. +THEME_COLOR = '#3c5280' + +# POSTS and PAGES contains (wildcard, destination, template) tuples. +# (translatable) +# +# The wildcard is used to generate a list of source files +# (whatever/thing.rst, for example). +# +# That fragment could have an associated metadata file (whatever/thing.meta), +# and optionally translated files (example for Spanish, with code "es"): +# whatever/thing.es.rst and whatever/thing.es.meta +# +# This assumes you use the default TRANSLATIONS_PATTERN. +# +# From those files, a set of HTML fragment files will be generated: +# cache/whatever/thing.html (and maybe cache/whatever/thing.html.es) +# +# These files are combined with the template to produce rendered +# pages, which will be placed at +# output/TRANSLATIONS[lang]/destination/pagename.html +# +# where "pagename" is the "slug" specified in the metadata file. +# The page might also be placed in /destination/pagename/index.html +# if PRETTY_URLS are enabled. +# +# The difference between POSTS and PAGES is that POSTS are added +# to feeds, indexes, tag lists and archives and are considered part +# of a blog, while PAGES are just independent HTML pages. +# +# Finally, note that destination can be translated, i.e. you can +# specify a different translation folder per language. Example: +# PAGES = ( +# ("pages/*.rst", {"en": "pages", "de": "seiten"}, "story.tmpl"), +# ("pages/*.md", {"en": "pages", "de": "seiten"}, "story.tmpl"), +# ) + +POSTS = ( + ("posts/*.rst", "blog", "post.tmpl"), + ("posts/*.txt", "blog", "post.tmpl"), + ("posts/*.html", "blog", "post.tmpl"), + ("posts/*.md", "blog", "post.tmpl"), +) +PAGES = ( + ("pages/*.rst", "", "story.tmpl"), + ("pages/*.txt", "", "story.tmpl"), + ("pages/*.html", "", "story.tmpl"), + ("pages/*.md", "", "story.tmpl"), + ("../man/*.xml", "man", "story.tmpl"), +) + + +# Below this point, everything is optional + +# Post's dates are considered in UTC by default, if you want to use +# another time zone, please set TIMEZONE to match. Check the available +# list from Wikipedia: +# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones +# (e.g. 'Europe/Zurich') +# Also, if you want to use a different time zone in some of your posts, +# you can use the ISO 8601/RFC 3339 format (ex. 2012-03-30T23:00:00+02:00) +TIMEZONE = "Europe/London" + +# If you want to use ISO 8601 (also valid RFC 3339) throughout Nikola +# (especially in new_post), set this to True. +# Note that this does not affect DATE_FORMAT. +# FORCE_ISO8601 = False + +# Date format used to display post dates. (translatable) +# (str used by datetime.datetime.strftime) +# DATE_FORMAT = '%Y-%m-%d %H:%M' + +# Date format used to display post dates, if local dates are used. (translatable) +# (str used by moment.js) +# JS_DATE_FORMAT = 'YYYY-MM-DD HH:mm' + +# Date fanciness. +# +# 0 = using DATE_FORMAT and TIMEZONE +# 1 = using JS_DATE_FORMAT and local user time (via moment.js) +# 2 = using a string like “2 days ago” +# +# Your theme must support it, bootstrap and bootstrap3 already do. +# DATE_FANCINESS = 0 + +# While Nikola can select a sensible locale for each language, +# sometimes explicit control can come handy. +# In this file we express locales in the string form that +# python's locales will accept in your OS, by example +# "en_US.utf8" in Unix-like OS, "English_United States" in Windows. +# LOCALES = dict mapping language --> explicit locale for the languages +# in TRANSLATIONS. You can omit one or more keys. +# LOCALE_FALLBACK = locale to use when an explicit locale is unavailable +# LOCALE_DEFAULT = locale to use for languages not mentioned in LOCALES; if +# not set the default Nikola mapping is used. + +# LOCALES = {} +# LOCALE_FALLBACK = None +# LOCALE_DEFAULT = None + +# One or more folders containing files to be copied as-is into the output. +# The format is a dictionary of {source: relative destination}. +# Default is: +# FILES_FOLDERS = {'files': ''} +# Which means copy 'files' into 'output' + +# One or more folders containing code listings to be processed and published on +# the site. The format is a dictionary of {source: relative destination}. +# Default is: +# LISTINGS_FOLDERS = {'listings': 'listings'} +# Which means process listings from 'listings' into 'output/listings' + +# A mapping of languages to file-extensions that represent that language. +# Feel free to add or delete extensions to any list, but don't add any new +# compilers unless you write the interface for it yourself. +# +# 'rest' is reStructuredText +# 'markdown' is MarkDown +# 'html' assumes the file is HTML and just copies it +COMPILERS = { + "rest": ('.rst', '.txt'), + "markdown": ('.md', '.mdown', '.markdown'), + "textile": ('.textile',), + "txt2tags": ('.t2t',), + "bbcode": ('.bb',), + "wiki": ('.wiki',), + "ipynb": ('.ipynb',), + "html": ('.html', '.htm'), + # PHP files are rendered the usual way (i.e. with the full templates). + # The resulting files have .php extensions, making it possible to run + # them without reconfiguring your server to recognize them. + "php": ('.php',), + # Pandoc detects the input from the source filename + # but is disabled by default as it would conflict + # with many of the others. + "docbookmanpage": ('.xml',), +} + +# Create by default posts in one file format? +# Set to False for two-file posts, with separate metadata. +# ONE_FILE_POSTS = True + +# Use date-based path when creating posts? +# Can be enabled on a per-post basis with `nikola new_post -d`. +# The setting is ignored when creating pages (`-d` still works). +# NEW_POST_DATE_PATH = False + +# What format to use when creating posts with date paths? +# Default is '%Y/%m/%d', other possibilities include '%Y' or '%Y/%m'. +# NEW_POST_DATE_PATH_FORMAT = '%Y/%m/%d' + +# If this is set to True, the DEFAULT_LANG version will be displayed for +# untranslated posts. +# If this is set to False, then posts that are not translated to a language +# LANG will not be visible at all in the pages in that language. +# Formerly known as HIDE_UNTRANSLATED_POSTS (inverse) +# SHOW_UNTRANSLATED_POSTS = True + +# Nikola supports logo display. If you have one, you can put the URL here. +# Final output is . +# The URL may be relative to the site root. +# LOGO_URL = '' + +# If you want to hide the title of your website (for example, if your logo +# already contains the text), set this to False. +SHOW_BLOG_TITLE = False + +# Writes tag cloud data in form of tag_cloud_data.json. +# Warning: this option will change its default value to False in v8! +WRITE_TAG_CLOUD = True + +# Generate pages for each section. The site must have at least two sections +# for this option to take effect. It wouldn't build for just one section. +POSTS_SECTIONS = True + +# Setting this to False generates a list page instead of an index. Indexes +# are the default and will apply GENERATE_ATOM if set. +# POSTS_SECTIONS_ARE_INDEXES = True + +# Final locations are: +# output / TRANSLATION[lang] / SECTION_PATH / SECTION_NAME / index.html (list of posts for a section) +# output / TRANSLATION[lang] / SECTION_PATH / SECTION_NAME / rss.xml (RSS feed for a section) +# (translatable) +# SECTION_PATH = "" + +# Each post and section page will have an associated color that can be used +# to style them with a recognizable color detail across your site. A color +# is assigned to each section based on shifting the hue of your THEME_COLOR +# at least 7.5 % while leaving the lightness and saturation untouched in the +# HUSL colorspace. You can overwrite colors by assigning them colors in HEX. +# POSTS_SECTION_COLORS = { +# DEFAULT_LANG: { +# 'posts': '#49b11bf', +# 'reviews': '#ffe200', +# }, +# } + +# Associate a description with a section. For use in meta description on +# section index pages or elsewhere in themes. +# POSTS_SECTION_DESCRIPTIONS = { +# DEFAULT_LANG: { +# 'how-to': 'Learn how-to things properly with these amazing tutorials.', +# }, +# } + +# Sections are determined by their output directory as set in POSTS by default, +# but can alternatively be determined from file metadata instead. +# POSTS_SECTION_FROM_META = False + +# Names are determined from the output directory name automatically or the +# metadata label. Unless overwritten below, names will use title cased and +# hyphens replaced by spaces. +# POSTS_SECTION_NAME = { +# DEFAULT_LANG: { +# 'posts': 'Blog Posts', +# 'uncategorized': 'Odds and Ends', +# }, +# } + +# Titles for per-section index pages. Can be either one string where "{name}" +# is substituted or the POSTS_SECTION_NAME, or a dict of sections. Note +# that the INDEX_PAGES option is also applied to section page titles. +# POSTS_SECTION_TITLE = { +# DEFAULT_LANG: { +# 'how-to': 'How-to and Tutorials', +# }, +# } + +# Paths for different autogenerated bits. These are combined with the +# translation paths. + +# Final locations are: +# output / TRANSLATION[lang] / TAG_PATH / index.html (list of tags) +# output / TRANSLATION[lang] / TAG_PATH / tag.html (list of posts for a tag) +# output / TRANSLATION[lang] / TAG_PATH / tag.xml (RSS feed for a tag) +# (translatable) +TAG_PATH = "blog/categories" + +# By default, the list of tags is stored in +# output / TRANSLATION[lang] / TAG_PATH / index.html +# (see explanation for TAG_PATH). This location can be changed to +# output / TRANSLATION[lang] / TAGS_INDEX_PATH +# with an arbitrary relative path TAGS_INDEX_PATH. +# (translatable) +# TAGS_INDEX_PATH = "tags.html" + +# If TAG_PAGES_ARE_INDEXES is set to True, each tag's page will contain +# the posts themselves. If set to False, it will be just a list of links. +# TAG_PAGES_ARE_INDEXES = False + +# Set descriptions for tag pages to make them more interesting. The +# default is no description. The value is used in the meta description +# and displayed underneath the tag list or index page’s title. +# TAG_PAGES_DESCRIPTIONS = { +# DEFAULT_LANG: { +# "blogging": "Meta-blog posts about blogging about blogging.", +# "open source": "My contributions to my many, varied, ever-changing, and eternal libre software projects." +# }, +# } + +# Set special titles for tag pages. The default is "Posts about TAG". +# TAG_PAGES_TITLES = { +# DEFAULT_LANG: { +# "blogging": "Meta-posts about blogging", +# "open source": "Posts about open source software" +# }, +# } + +# If you do not want to display a tag publicly, you can mark it as hidden. +# The tag will not be displayed on the tag list page, the tag cloud and posts. +# Tag pages will still be generated. +HIDDEN_TAGS = ['mathjax'] + +# Only include tags on the tag list/overview page if there are at least +# TAGLIST_MINIMUM_POSTS number of posts or more with every tag. Every tag +# page is still generated, linked from posts, and included in the sitemap. +# However, more obscure tags can be hidden from the tag index page. +# TAGLIST_MINIMUM_POSTS = 1 + +# Final locations are: +# output / TRANSLATION[lang] / CATEGORY_PATH / index.html (list of categories) +# output / TRANSLATION[lang] / CATEGORY_PATH / CATEGORY_PREFIX category.html (list of posts for a category) +# output / TRANSLATION[lang] / CATEGORY_PATH / CATEGORY_PREFIX category.xml (RSS feed for a category) +# (translatable) +# CATEGORY_PATH = "categories" +# CATEGORY_PREFIX = "cat_" + +# By default, the list of categories is stored in +# output / TRANSLATION[lang] / CATEGORY_PATH / index.html +# (see explanation for CATEGORY_PATH). This location can be changed to +# output / TRANSLATION[lang] / CATEGORIES_INDEX_PATH +# with an arbitrary relative path CATEGORIES_INDEX_PATH. +# (translatable) +# CATEGORIES_INDEX_PATH = "categories.html" + +# If CATEGORY_ALLOW_HIERARCHIES is set to True, categories can be organized in +# hierarchies. For a post, the whole path in the hierarchy must be specified, +# using a forward slash ('/') to separate paths. Use a backslash ('\') to escape +# a forward slash or a backslash (i.e. '\//\\' is a path specifying the +# subcategory called '\' of the top-level category called '/'). +CATEGORY_ALLOW_HIERARCHIES = False +# If CATEGORY_OUTPUT_FLAT_HIERARCHY is set to True, the output written to output +# contains only the name of the leaf category and not the whole path. +CATEGORY_OUTPUT_FLAT_HIERARCHY = False + +# If CATEGORY_PAGES_ARE_INDEXES is set to True, each category's page will contain +# the posts themselves. If set to False, it will be just a list of links. +# CATEGORY_PAGES_ARE_INDEXES = False + +# Set descriptions for category pages to make them more interesting. The +# default is no description. The value is used in the meta description +# and displayed underneath the category list or index page’s title. +# CATEGORY_PAGES_DESCRIPTIONS = { +# DEFAULT_LANG: { +# "blogging": "Meta-blog posts about blogging about blogging.", +# "open source": "My contributions to my many, varied, ever-changing, and eternal libre software projects." +# }, +# } + +# Set special titles for category pages. The default is "Posts about CATEGORY". +# CATEGORY_PAGES_TITLES = { +# DEFAULT_LANG: { +# "blogging": "Meta-posts about blogging", +# "open source": "Posts about open source software" +# }, +# } + +# If you do not want to display a category publicly, you can mark it as hidden. +# The category will not be displayed on the category list page. +# Category pages will still be generated. +HIDDEN_CATEGORIES = [] + +# If ENABLE_AUTHOR_PAGES is set to True and there is more than one +# author, author pages are generated. +# ENABLE_AUTHOR_PAGES = True + +# Path to author pages. Final locations are: +# output / TRANSLATION[lang] / AUTHOR_PATH / index.html (list of authors) +# output / TRANSLATION[lang] / AUTHOR_PATH / author.html (list of posts by an author) +# output / TRANSLATION[lang] / AUTHOR_PATH / author.xml (RSS feed for an author) +# (translatable) +AUTHOR_PATH = "blog/authors" + +# If AUTHOR_PAGES_ARE_INDEXES is set to True, each author's page will contain +# the posts themselves. If set to False, it will be just a list of links. +# AUTHOR_PAGES_ARE_INDEXES = False + +# Set descriptions for author pages to make them more interesting. The +# default is no description. The value is used in the meta description +# and displayed underneath the author list or index page’s title. +# AUTHOR_PAGES_DESCRIPTIONS = { +# DEFAULT_LANG: { +# "Juanjo Conti": "Python coder and writer.", +# "Roberto Alsina": "Nikola father." +# }, +# } + + +# If you do not want to display an author publicly, you can mark it as hidden. +# The author will not be displayed on the author list page and posts. +# Tag pages will still be generated. +HIDDEN_AUTHORS = ['Guest'] + +# Final location for the main blog page and sibling paginated pages is +# output / TRANSLATION[lang] / INDEX_PATH / index-*.html +# (translatable) +INDEX_PATH = "blog" + +# Optional HTML that displayed on “main” blog index.html files. +# May be used for a greeting. (translatable) +FRONT_INDEX_HEADER = { + DEFAULT_LANG: '' +} + +# Create per-month archives instead of per-year +# CREATE_MONTHLY_ARCHIVE = False +# Create one large archive instead of per-year +# CREATE_SINGLE_ARCHIVE = False +# Create year, month, and day archives each with a (long) list of posts +# (overrides both CREATE_MONTHLY_ARCHIVE and CREATE_SINGLE_ARCHIVE) +# CREATE_FULL_ARCHIVES = False +# If monthly archives or full archives are created, adds also one archive per day +# CREATE_DAILY_ARCHIVE = False +# Create previous, up, next navigation links for archives +# CREATE_ARCHIVE_NAVIGATION = False +# Final locations for the archives are: +# output / TRANSLATION[lang] / ARCHIVE_PATH / ARCHIVE_FILENAME +# output / TRANSLATION[lang] / ARCHIVE_PATH / YEAR / index.html +# output / TRANSLATION[lang] / ARCHIVE_PATH / YEAR / MONTH / index.html +# output / TRANSLATION[lang] / ARCHIVE_PATH / YEAR / MONTH / DAY / index.html +# ARCHIVE_PATH = "" +# ARCHIVE_FILENAME = "archive.html" + +# If ARCHIVES_ARE_INDEXES is set to True, each archive page which contains a list +# of posts will contain the posts themselves. If set to False, it will be just a +# list of links. +# ARCHIVES_ARE_INDEXES = False + +# URLs to other posts/pages can take 3 forms: +# rel_path: a relative URL to the current page/post (default) +# full_path: a URL with the full path from the root +# absolute: a complete URL (that includes the SITE_URL) +# URL_TYPE = 'rel_path' + +# If USE_BASE_TAG is True, then all HTML files will include +# something like to help +# the browser resolve relative links. +# Most people don’t need this tag; major websites don’t use it. Use +# only if you know what you’re doing. If this is True, your website +# will not be fully usable by manually opening .html files in your web +# browser (`nikola serve` or `nikola auto` is mandatory). Also, if you +# have mirrors of your site, they will point to SITE_URL everywhere. +USE_BASE_TAG = False + +# Final location for the blog main RSS feed is: +# output / TRANSLATION[lang] / RSS_PATH / rss.xml +# (translatable) +# RSS_PATH = "" + +# Slug the Tag URL. Easier for users to type, special characters are +# often removed or replaced as well. +# SLUG_TAG_PATH = True + +# Slug the Author URL. Easier for users to type, special characters are +# often removed or replaced as well. +# SLUG_AUTHOR_PATH = True + +# A list of redirection tuples, [("foo/from.html", "/bar/to.html")]. +# +# A HTML file will be created in output/foo/from.html that redirects +# to the "/bar/to.html" URL. notice that the "from" side MUST be a +# relative URL. +# +# If you don't need any of these, just set to [] +REDIRECTIONS = [ \ + ["2009/12/version-0-2-released/index.html", "/blog/2009/12/version-0-2-released"], \ + ["2009/12/version-0-3-released/index.html", "/blog/2009/12/version-0-3-released"], \ + ["2010/01/mailing-list-irc/index.html", "/blog/2010/01/mailing-list-irc"], \ + ["2010/01/version-0-4-1-released/index.html", "/blog/2010/01/version-0-4-1-released"], \ + ["2010/01/version-0-4-released/index.html", "/blog/2010/01/version-0-4-released"], \ + ["2010/02/version-0-4-2-released/index.html", "/blog/2010/02/version-0-4-2-released"], \ + ["2010/03/google-powermeter/index.html", "/blog/2010/03/google-powermeter"], \ + ["2010/03/upgrading-to-0-5-1/index.html", "/blog/2010/03/upgrading-to-0-5-1"], \ + ["2010/03/version-0-5-1-released/index.html", "/blog/2010/03/version-0-5-1-released"], \ + ["2010/03/version-0-5-2-released/index.html", "/blog/2010/03/version-0-5-2-released"], \ + ["2010/03/version-0-5-3-released/index.html", "/blog/2010/03/version-0-5-3-released"], \ + ["2010/03/version-0-5-4-released/index.html", "/blog/2010/03/version-0-5-4-released"], \ + ["2010/04/help-wanted-rpm-packaging/index.html", "/blog/2010/04/help-wanted-rpm-packaging"], \ + ["2010/04/mind-control-mqtt/index.html", "/blog/2010/04/mind-control-mqtt"], \ + ["2010/04/oggcamp/index.html", "/blog/2010/04/oggcamp"], \ + ["2010/05/fedora-packages-available/index.html", "/blog/2010/05/fedora-packages-available"], \ + ["2010/05/gentoo-ebuilds-available/index.html", "/blog/2010/05/gentoo-ebuilds-available"], \ + ["2010/05/mosquitto-org/index.html", "/blog/2010/05/mosquitto-org"], \ + ["2010/05/mqtt-push-on-android/index.html", "/blog/2010/05/mqtt-push-on-android"], \ + ["2010/05/mqtt-wiki/index.html", "/blog/2010/05/mqtt-wiki"], \ + ["2010/05/version-0-6-1-released/index.html", "/blog/2010/05/version-0-6-1-released"], \ + ["2010/05/version-0-6-released/index.html", "/blog/2010/05/version-0-6-released"], \ + ["2010/06/automation-has-the-oven-warmed-up-yet/index.html", "/blog/2010/06/automation-has-the-oven-warmed-up-yet"], \ + ["2010/06/google-powermeter-step-by-step/index.html", "/blog/2010/06/google-powermeter-step-by-step"], \ + ["2010/06/mosquitto-0-7rc1/index.html", "/blog/2010/06/mosquitto-0-7rc1"], \ + ["2010/06/version-0-7-released/index.html", "/blog/2010/06/version-0-7-released"], \ + ["2010/07/mosquitto-on-opensuse-11-3/index.html", "/blog/2010/07/mosquitto-on-opensuse-11-3"], \ + ["2010/07/mqtt-client-library/index.html", "/blog/2010/07/mqtt-client-library"], \ + ["2010/08/compiling-mosquitto-on-mac-os-x/index.html", "/blog/2010/08/compiling-mosquitto-on-mac-os-x"], \ + ["2010/08/mosquitto-running-on-mac-os-x/index.html", "/blog/2010/08/mosquitto-running-on-mac-os-x"], \ + ["2010/08/mqtt-v3-1/index.html", "/blog/2010/08/mqtt-v3-1"], \ + ["2010/08/version-0-8-1-released/index.html", "/blog/2010/08/version-0-8-1-released"], \ + ["2010/08/version-0-8-2/index.html", "/blog/2010/08/version-0-8-2"], \ + ["2010/08/version-0-8-released/index.html", "/blog/2010/08/version-0-8-released"], \ + ["2010/09/debian-packages/index.html", "/blog/2010/09/debian-packages"], \ + ["2010/09/mqtt-with-php/index.html", "/blog/2010/09/mqtt-with-php"], \ + ["2010/10/man-page-translations/index.html", "/blog/2010/10/man-page-translations"], \ + ["2010/10/one-year-old/index.html", "/blog/2010/10/one-year-old"], \ + ["2010/10/version-0-8-3-released/index.html", "/blog/2010/10/version-0-8-3-released"], \ + ["2010/11/distro-packaging/index.html", "/blog/2010/11/distro-packaging"], \ + ["2010/11/mosquitto-0-9test2/index.html", "/blog/2010/11/mosquitto-0-9test2"], \ + ["2010/11/version-0-9-released/index.html", "/blog/2010/11/version-0-9-released"], \ + ["2010/12/version-0-9-1-released/index.html", "/blog/2010/12/version-0-9-1-released"], \ + ["2011/01/mosquitto-for-slackware/index.html", "/blog/2011/01/mosquitto-for-slackware"], \ + ["2011/01/mqtt-news/index.html", "/blog/2011/01/mqtt-news"], \ + ["2011/02/lightweight-messaging-and-linux/index.html", "/blog/2011/02/lightweight-messaging-and-linux"], \ + ["2011/02/mosquitto-on-maemo/index.html", "/blog/2011/02/mosquitto-on-maemo"], \ + ["2011/02/mqtt-on-android/index.html", "/blog/2011/02/mqtt-on-android"], \ + ["2011/02/version-0-9-2-released/index.html", "/blog/2011/02/version-0-9-2-released"], \ + ["2011/03/api-documentation/index.html", "/blog/2011/03/api-documentation"], \ + ["2011/03/mosquitto-in-mac-homebrew/index.html", "/blog/2011/03/mosquitto-in-mac-homebrew"], \ + ["2011/03/version-0-9-3-released/index.html", "/blog/2011/03/version-0-9-3-released"], \ + ["2011/04/version-0-10-released/index.html", "/blog/2011/04/version-0-10-released"], \ + ["2011/05/mqtt-ontology/index.html", "/blog/2011/05/mqtt-ontology"], \ + ["2011/05/version-0-10-1-released/index.html", "/blog/2011/05/version-0-10-1-released"], \ + ["2011/06/nanode-a-cheap-networked-arduino-clone/index.html", "/blog/2011/06/nanode-a-cheap-networked-arduino-clone"], \ + ["2011/06/version-0-10-2-released/index.html", "/blog/2011/06/version-0-10-2-released"], \ + ["2011/06/version-0-11-1-released/index.html", "/blog/2011/06/version-0-11-1-released"], \ + ["2011/06/version-0-11-2-released/index.html", "/blog/2011/06/version-0-11-2-released"], \ + ["2011/06/version-0-11-released/index.html", "/blog/2011/06/version-0-11-released"], \ + ["2011/07/debian-and-ubuntu-packaging/index.html", "/blog/2011/07/debian-and-ubuntu-packaging"], \ + ["2011/07/lua-mqtt-client/index.html", "/blog/2011/07/lua-mqtt-client"], \ + ["2011/07/mosquitto-on-qnx/index.html", "/blog/2011/07/mosquitto-on-qnx"], \ + ["2011/07/version-0-11-3-released/index.html", "/blog/2011/07/version-0-11-3-released"], \ + ["2011/07/version-0-12-released/index.html", "/blog/2011/07/version-0-12-released"], \ + ["2011/07/wireshark-mqtt-decoder/index.html", "/blog/2011/07/wireshark-mqtt-decoder"], \ + ["2011/08/arch-linux-package/index.html", "/blog/2011/08/arch-linux-package"], \ + ["2011/08/facebook-using-mqtt/index.html", "/blog/2011/08/facebook-using-mqtt"], \ + ["2011/08/mosquitto-on-openwrt/index.html", "/blog/2011/08/mosquitto-on-openwrt"], \ + ["2011/08/mqtt-standardisation/index.html", "/blog/2011/08/mqtt-standardisation"], \ + ["2011/09/version-0-13-released/index.html", "/blog/2011/09/version-0-13-released"], \ + ["2011/10/mqtt-power-usage-on-android/index.html", "/blog/2011/10/mqtt-power-usage-on-android"], \ + ["2011/10/two/index.html", "/blog/2011/10/two"], \ + ["2011/11/android-mqtt-example-project/index.html", "/blog/2011/11/android-mqtt-example-project"], \ + ["2011/11/ibm-java-and-c-clients-to-be-open-source/index.html", "/blog/2011/11/ibm-java-and-c-clients-to-be-open-source"], \ + ["2011/11/new-linux-repositories/index.html", "/blog/2011/11/new-linux-repositories"], \ + ["2011/11/version-0-14-1-released/index.html", "/blog/2011/11/version-0-14-1-released"], \ + ["2011/11/version-0-14-2-released/index.html", "/blog/2011/11/version-0-14-2-released"], \ + ["2011/11/version-0-14-released/index.html", "/blog/2011/11/version-0-14-released"], \ + ["2011/12/mqtt-on-nanode/index.html", "/blog/2011/12/mqtt-on-nanode"], \ + ["2011/12/version-0-14-3-released/index.html", "/blog/2011/12/version-0-14-3-released"], \ + ["2012/01/challenge-web-based-mqtt-graphing/index.html", "/blog/2012/01/challenge-web-based-mqtt-graphing"], \ + ["2012/01/do-you-use-mqtt/index.html", "/blog/2012/01/do-you-use-mqtt"], \ + ["2012/01/mosquitto-test-server/index.html", "/blog/2012/01/mosquitto-test-server"], \ + ["2012/01/version-0-14-4-released/index.html", "/blog/2012/01/version-0-14-4-released"], \ + ["2012/02/mqtt2pachube/index.html", "/blog/2012/02/mqtt2pachube"], \ + ["2012/02/version-0-15-released/index.html", "/blog/2012/02/version-0-15-released"], \ + ["2012/03/quick-start-guide-for-mqtt-with-pachube/index.html", "/blog/2012/03/quick-start-guide-for-mqtt-with-pachube"], \ + ["2012/03/upcoming-incompatible-library-changes/index.html", "/blog/2012/03/upcoming-incompatible-library-changes"], \ + ["2012/05/python-client-module-available-for-testing/index.html", "/blog/2012/05/python-client-module-available-for-testing"], \ + ["2012/06/ipv6-on-test-server/index.html", "/blog/2012/06/ipv6-on-test-server"], \ + ["2012/06/ssl-support-on-test-server/index.html", "/blog/2012/06/ssl-support-on-test-server"], \ + ["2012/07/upcoming-release/index.html", "/blog/2012/07/upcoming-release"], \ + ["2012/08/baby/index.html", "/blog/2012/08/baby"], \ + ["2012/08/bugfix-coming-soon/index.html", "/blog/2012/08/bugfix-coming-soon"], \ + ["2012/08/version-1-0-1-released/index.html", "/blog/2012/08/version-1-0-1-released"], \ + ["2012/08/version-1-0-2-released/index.html", "/blog/2012/08/version-1-0-2-released"], \ + ["2012/08/version-1-0-released/index.html", "/blog/2012/08/version-1-0-released"], \ + ["2012/09/updating-password-files/index.html", "/blog/2012/09/updating-password-files"], \ + ["2012/09/version-1-0-3-released/index.html", "/blog/2012/09/version-1-0-3-released"], \ + ["2012/10/version-1-0-4-released/index.html", "/blog/2012/10/version-1-0-4-released"], \ + ["2012/11/making-mosquitto-packages-for-debian-yourself/index.html", "/blog/2012/11/making-mosquitto-packages-for-debian-yourself"], \ + ["2012/11/version-1-0-5-released/index.html", "/blog/2012/11/version-1-0-5-released"], \ + ["2012/12/libmosquitto-go-bindings/index.html", "/blog/2012/12/libmosquitto-go-bindings"], \ + ["2012/12/version-1-1-released/index.html", "/blog/2012/12/version-1-1-released"], \ + ["2013/01/mosquitto-debian-repository/index.html", "/blog/2013/01/mosquitto-debian-repository"], \ + ["2013/01/version-1-1-1-released/index.html", "/blog/2013/01/version-1-1-1-released"], \ + ["2013/01/version-1-1-2-released/index.html", "/blog/2013/01/version-1-1-2-released"], \ + ["2013/02/mqtt-standardisation-oasis-call-for-participation/index.html", "/blog/2013/02/mqtt-standardisation-oasis-call-for-participation"], \ + ["2013/02/version-1-1-3-released/index.html", "/blog/2013/02/version-1-1-3-released"], \ + ["2013/04/some-interesting-mqtt-things/index.html", "/blog/2013/04/some-interesting-mqtt-things"], \ + ["2013/05/mosquitto-javascript-client-deprecated/index.html", "/blog/2013/05/mosquitto-javascript-client-deprecated"], \ + ["2013/07/authentication-plugins/index.html", "/blog/2013/07/authentication-plugins"], \ + ["2013/07/version-1-2-near-complete/index.html", "/blog/2013/07/version-1-2-near-complete"], \ + ["2013/08/mosquitto-on-fedora/index.html", "/blog/2013/08/mosquitto-on-fedora"], \ + ["2013/08/mqtt-watchdir/index.html", "/blog/2013/08/mqtt-watchdir"], \ + ["2013/08/version-1-2-released/index.html", "/blog/2013/08/version-1-2-released"], \ + ["2013/09/version-1-2-1-released/index.html", "/blog/2013/09/version-1-2-1-released"], \ + ["2013/10/version-1-2-2-released/index.html", "/blog/2013/10/version-1-2-2-released"], \ + ["2013/12/paho-mqtt-python-client/index.html", "/blog/2013/12/paho-mqtt-python-client"], \ + ["2013/12/version-1-2-3-released/index.html", "/blog/2013/12/version-1-2-3-released"], \ + ["2014/03/version-1-3-1-released/index.html", "/blog/2014/03/version-1-3-1-released"], \ + ["2014/03/version-1-3-released/index.html", "/blog/2014/03/version-1-3-released"], \ + ["2014/05/new-arrival/index.html", "/blog/2014/05/new-arrival"], \ + ["2014/07/version-1-3-2-released/index.html", "/blog/2014/07/version-1-3-2-released"], \ + ["2014/08/version-1-3-3-released/index.html", "/blog/2014/08/version-1-3-3-released"], \ + ["2014/08/version-1-3-4-released/index.html", "/blog/2014/08/version-1-3-4-released"], \ + ["2014/10/mosquitto-and-poodle/index.html", "/blog/2014/10/mosquitto-and-poodle"], \ + ["2014/10/unintended-change-of-behaviour-in-1-3-4/index.html", "/blog/2014/10/unintended-change-of-behaviour-in-1-3-4"], \ + ["2014/10/version-1-3-5-released/index.html", "/blog/2014/10/version-1-3-5-released"], \ + ["2015/01/seeking-sponsorship/index.html", "/blog/2015/01/seeking-sponsorship"], \ + ["2015/02/version-1-4-released/index.html", "/blog/2015/02/version-1-4-released"], \ + ["2015/04/version-1-4-1-released/index.html", "/blog/2015/04/version-1-4-1-released"], \ + ["2015/05/mosquitto-and-current-unreleased-libwebsockets-branch/index.html", "/blog/2015/05/mosquitto-and-current-unreleased-libwebsockets-branch"], \ + ["2015/05/version-1-4-2-released/index.html", "/blog/2015/05/version-1-4-2-released"], \ + ["2015/08/version-1-4-3-released/index.html", "/blog/2015/08/version-1-4-3-released"], \ + ["2015/09/version-1-4-4-released/index.html", "/blog/2015/09/version-1-4-4-released"], \ + ["2015/11/version-1-4-5-released/index.html", "/blog/2015/11/version-1-4-5-released"], \ + ["2015/12/using-lets-encrypt-certificates-with-mosquitto/index.html", "/blog/2015/12/using-lets-encrypt-certificates-with-mosquitto"], \ + ["2015/12/version-1-4-7-released/index.html", "/blog/2015/12/version-1-4-7-released"], \ + ["2016/01/test6-mosquitto-org/index.html", "/blog/2016/01/test6-mosquitto-org"], \ + ["2016/02/version-1-4-8-released/index.html", "/blog/2016/02/version-1-4-8-released"], \ + ["2016/03/logo-contest-results-for-shortlisting/index.html", "/blog/2016/03/logo-contest-results-for-shortlisting"], \ + ["2016/03/logo-contest/index.html", "/blog/2016/03/logo-contest"], \ + ["2016/03/repository-moved-to-github/index.html", "/blog/2016/03/repository-moved-to-github"], \ + ["2016/05/stickers/index.html", "/blog/2016/05/stickers"], \ + ["2016/06/version-1-4-9-released/index.html", "/blog/2016/06/version-1-4-9-released"], \ + ["2016/08/mqtt-v5-draft-features/index.html", "/blog/2016/08/mqtt-v5-draft-features"], \ + ["2016/08/version-1-4-10-released/index.html", "/blog/2016/08/version-1-4-10-released"], \ + ["2016/12/pre-christmas-update/index.html", "/blog/2016/12/pre-christmas-update"], \ + ["2017/02/version-1-4-11-released/index.html", "/blog/2017/02/version-1-4-11-released"], \ + ["2017/03/for-the-final-time/index.html", "/blog/2017/03/for-the-final-time"], \ + ["2017/05/security-advisory-cve-2017-7650/index.html", "/blog/2017/05/security-advisory-cve-2017-7650"], \ + ["2017/06/citing-eclipse-mosquitto/index.html", "/blog/2017/06/citing-eclipse-mosquitto"], \ + ["2017/06/security-advisory-cve-2017-9868/index.html", "/blog/2017/06/security-advisory-cve-2017-9868"], \ + ["2017/07/version-1-4-13-released/index.html", "/blog/2017/07/version-1-4-13-released"], \ + ["2017/07/version-1-4-14-released/index.html", "/blog/2017/07/version-1-4-14-released"], \ + ["2018/01/mosquitto-debian-repo-key-updated/index.html", "/blog/2018/01/mosquitto-debian-repo-key-updated"] \ + ] + + +## Presets of commands to execute to deploy. Can be anything, for +# example, you may use rsync: +# "rsync -rav --delete output/ joe@my.site:/srv/www/site" +# And then do a backup, or run `nikola ping` from the `ping` +# plugin (`nikola plugin -i ping`). Or run `nikola check -l`. +# You may also want to use github_deploy (see below). +# You can define multiple presets and specify them as arguments +# to `nikola deploy`. If no arguments are specified, a preset +# named `default` will be executed. You can use as many presets +# in a `nikola deploy` command as you like. +# DEPLOY_COMMANDS = { +# 'default': [ +# "rsync -rav --delete output/ joe@my.site:/srv/www/site", +# ] +# } + +# github_deploy configuration +# For more details, read the manual: +# https://getnikola.com/handbook.html#deploying-to-github +# You will need to configure the deployment branch on GitHub. +GITHUB_SOURCE_BRANCH = 'src' +GITHUB_DEPLOY_BRANCH = 'master' + +# The name of the remote where you wish to push to, using github_deploy. +GITHUB_REMOTE_NAME = 'origin' + +# Whether or not github_deploy should commit to the source branch automatically +# before deploying. +GITHUB_COMMIT_SOURCE = True + +# Where the output site should be located +# If you don't use an absolute path, it will be considered as relative +# to the location of conf.py +OUTPUT_FOLDER = '/home/mosqorg/site/mosquitto.org' + +# where the "cache" of partial generated content should be located +# default: 'cache' +# CACHE_FOLDER = 'cache' + +# Filters to apply to the output. +# A directory where the keys are either: a file extensions, or +# a tuple of file extensions. +# +# And the value is a list of commands to be applied in order. +# +# Each command must be either: +# +# A string containing a '%s' which will +# be replaced with a filename. The command *must* produce output +# in place. +# +# Or: +# +# A python callable, which will be called with the filename as +# argument. +# +# By default, only .php files uses filters to inject PHP into +# Nikola’s templates. All other filters must be enabled through FILTERS. +# +# Many filters are shipped with Nikola. A list is available in the manual: +# +# +# from nikola import filters +# FILTERS = { +# ".html": [filters.typogrify], +# ".js": [filters.closure_compiler], +# ".jpg": ["jpegoptim --strip-all -m75 -v %s"], +# } + +# Executable for the "yui_compressor" filter (defaults to 'yui-compressor'). +# YUI_COMPRESSOR_EXECUTABLE = 'yui-compressor' + +# Executable for the "closure_compiler" filter (defaults to 'closure-compiler'). +# CLOSURE_COMPILER_EXECUTABLE = 'closure-compiler' + +# Executable for the "optipng" filter (defaults to 'optipng'). +# OPTIPNG_EXECUTABLE = 'optipng' + +# Executable for the "jpegoptim" filter (defaults to 'jpegoptim'). +# JPEGOPTIM_EXECUTABLE = 'jpegoptim' + +# Executable for the "html_tidy_withconfig", "html_tidy_nowrap", +# "html_tidy_wrap", "html_tidy_wrap_attr" and "html_tidy_mini" filters +# (defaults to 'tidy5'). +# HTML_TIDY_EXECUTABLE = 'tidy5' + + + +# Expert setting! Create a gzipped copy of each generated file. Cheap server- +# side optimization for very high traffic sites or low memory servers. +# GZIP_FILES = False +# File extensions that will be compressed +# GZIP_EXTENSIONS = ('.txt', '.htm', '.html', '.css', '.js', '.json', '.atom', '.xml') +# Use an external gzip command? None means no. +# Example: GZIP_COMMAND = "pigz -k {filename}" +# GZIP_COMMAND = None +# Make sure the server does not return a "Accept-Ranges: bytes" header for +# files compressed by this option! OR make sure that a ranged request does not +# return partial content of another representation for these resources. Do not +# use this feature if you do not understand what this means. + +# Compiler to process LESS files. +# LESS_COMPILER = 'lessc' + +# A list of options to pass to the LESS compiler. +# Final command is: LESS_COMPILER LESS_OPTIONS file.less +# LESS_OPTIONS = [] + +# Compiler to process Sass files. +# SASS_COMPILER = 'sass' + +# A list of options to pass to the Sass compiler. +# Final command is: SASS_COMPILER SASS_OPTIONS file.s(a|c)ss +# SASS_OPTIONS = [] + +# ############################################################################# +# Image Gallery Options +# ############################################################################# + +# One or more folders containing galleries. The format is a dictionary of +# {"source": "relative_destination"}, where galleries are looked for in +# "source/" and the results will be located in +# "OUTPUT_PATH/relative_destination/gallery_name" +# Default is: +# GALLERY_FOLDERS = {"galleries": "galleries"} +# More gallery options: +# THUMBNAIL_SIZE = 180 +# MAX_IMAGE_SIZE = 1280 +# USE_FILENAME_AS_TITLE = True +# EXTRA_IMAGE_EXTENSIONS = [] +# +# If set to False, it will sort by filename instead. Defaults to True +# GALLERY_SORT_BY_DATE = True + +# If set to True, EXIF data will be copied when an image is thumbnailed or +# resized. (See also EXIF_WHITELIST) +# PRESERVE_EXIF_DATA = False + +# If you have enabled PRESERVE_EXIF_DATA, this option lets you choose EXIF +# fields you want to keep in images. (See also PRESERVE_EXIF_DATA) +# +# For a full list of field names, please see here: +# http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf +# +# This is a dictionary of lists. Each key in the dictionary is the +# name of a IDF, and each list item is a field you want to preserve. +# If you have a IDF with only a '*' item, *EVERY* item in it will be +# preserved. If you don't want to preserve anything in a IDF, remove it +# from the setting. By default, no EXIF information is kept. +# Setting the whitelist to anything other than {} implies +# PRESERVE_EXIF_DATA is set to True +# To preserve ALL EXIF data, set EXIF_WHITELIST to {"*": "*"} + +# EXIF_WHITELIST = {} + +# Some examples of EXIF_WHITELIST settings: + +# Basic image information: +# EXIF_WHITELIST['0th'] = [ +# "Orientation", +# "XResolution", +# "YResolution", +# ] + +# If you want to keep GPS data in the images: +# EXIF_WHITELIST['GPS'] = ["*"] + +# Embedded thumbnail information: +# EXIF_WHITELIST['1st'] = ["*"] + +# Folders containing images to be used in normal posts or pages. +# IMAGE_FOLDERS is a dictionary of the form {"source": "destination"}, +# where "source" is the folder containing the images to be published, and +# "destination" is the folder under OUTPUT_PATH containing the images copied +# to the site. Thumbnail images will be created there as well. + +# To reference the images in your posts, include a leading slash in the path. +# For example, if IMAGE_FOLDERS = {'images': 'images'}, write +# +# .. image:: /images/tesla.jpg +# +# See the Nikola Handbook for details (in the “Embedding Images” and +# “Thumbnails” sections) + +# Images will be scaled down according to IMAGE_THUMBNAIL_SIZE and MAX_IMAGE_SIZE +# options, but will have to be referenced manually to be visible on the site +# (the thumbnail has ``.thumbnail`` added before the file extension by default, +# but a different naming template can be configured with IMAGE_THUMBNAIL_FORMAT). + +IMAGE_FOLDERS = {'images': 'images'} +# IMAGE_THUMBNAIL_SIZE = 400 +# IMAGE_THUMBNAIL_FORMAT = '{name}.thumbnail{ext}' + +# ############################################################################# +# HTML fragments and diverse things that are used by the templates +# ############################################################################# + +# Data about post-per-page indexes. +# INDEXES_PAGES defaults to ' old posts, page %d' or ' page %d' (translated), +# depending on the value of INDEXES_PAGES_MAIN. +# +# (translatable) If the following is empty, defaults to BLOG_TITLE: +# INDEXES_TITLE = "" +# +# (translatable) If the following is empty, defaults to ' [old posts,] page %d' (see above): +# INDEXES_PAGES = "" +# +# If the following is True, INDEXES_PAGES is also displayed on the main (the +# newest) index page (index.html): +# INDEXES_PAGES_MAIN = False +# +# If the following is True, index-1.html has the oldest posts, index-2.html the +# second-oldest posts, etc., and index.html has the newest posts. This ensures +# that all posts on index-x.html will forever stay on that page, now matter how +# many new posts are added. +# If False, index-1.html has the second-newest posts, index-2.html the third-newest, +# and index-n.html the oldest posts. When this is active, old posts can be moved +# to other index pages when new posts are added. +# INDEXES_STATIC = True +# +# (translatable) If PRETTY_URLS is set to True, this setting will be used to create +# prettier URLs for index pages, such as page/2/index.html instead of index-2.html. +# Valid values for this settings are: +# * False, +# * a list or tuple, specifying the path to be generated, +# * a dictionary mapping languages to lists or tuples. +# Every list or tuple must consist of strings which are used to combine the path; +# for example: +# ['page', '{number}', '{index_file}'] +# The replacements +# {number} --> (logical) page number; +# {old_number} --> the page number inserted into index-n.html before (zero for +# the main page); +# {index_file} --> value of option INDEX_FILE +# are made. +# Note that in case INDEXES_PAGES_MAIN is set to True, a redirection will be created +# for the full URL with the page number of the main page to the normal (shorter) main +# page URL. +# INDEXES_PRETTY_PAGE_URL = False +# +# If the following is true, a page range navigation will be inserted to indices. +# Please note that this will undo the effect of INDEXES_STATIC, as all index pages +# must be recreated whenever the number of pages changes. +# SHOW_INDEX_PAGE_NAVIGATION = False + +# If the following is True, a meta name="generator" tag is added to pages. The +# generator tag is used to specify the software used to generate the page +# (it promotes Nikola). +# META_GENERATOR_TAG = True + +# Color scheme to be used for code blocks. If your theme provides +# "assets/css/code.css" this is ignored. Leave empty to disable. +# Can be any of: +# algol, algol_nu, autumn, borland, bw, colorful, default, emacs, friendly, +# fruity, igor, lovelace, manni, monokai, murphy, native, paraiso-dark, +# paraiso-light, pastie, perldoc, rrt, tango, trac, vim, vs, xcode +# This list MAY be incomplete since pygments adds styles every now and then. +# Check with list(pygments.styles.get_all_styles()) in an interpreter. +# CODE_COLOR_SCHEME = 'default' + +# FAVICONS contains (name, file, size) tuples. +# Used to create favicon link like this: +# +FAVICONS = ( + ("icon", "/favicon-16x16.png", "16x16"), + ("icon", "/favicon-32x32.png", "32x32"), + ) + +# Show teasers (instead of full posts) in indexes? Defaults to False. +# INDEX_TEASERS = False + +# HTML fragments with the Read more... links. +# The following tags exist and are replaced for you: +# {link} A link to the full post page. +# {read_more} The string “Read more” in the current language. +# {reading_time} An estimate of how long it will take to read the post. +# {remaining_reading_time} An estimate of how long it will take to read the post, sans the teaser. +# {min_remaining_read} The string “{remaining_reading_time} min remaining to read” in the current language. +# {paragraph_count} The amount of paragraphs in the post. +# {remaining_paragraph_count} The amount of paragraphs in the post, sans the teaser. +# {post_title} The title of the post. +# {{ A literal { (U+007B LEFT CURLY BRACKET) +# }} A literal } (U+007D RIGHT CURLY BRACKET) + +# 'Read more...' for the index page, if INDEX_TEASERS is True (translatable) +INDEX_READ_MORE_LINK = '

{read_more}…

' +# 'Read more...' for the feeds, if FEED_TEASERS is True (translatable) +FEED_READ_MORE_LINK = '

{read_more}… ({min_remaining_read})

' + +# Append a URL query to the FEED_READ_MORE_LINK in Atom and RSS feeds. Advanced +# option used for traffic source tracking. +# Minimum example for use with Piwik: "pk_campaign=feed" +# The following tags exist and are replaced for you: +# {feedRelUri} A relative link to the feed. +# {feedFormat} The name of the syndication format. +# Example using replacement for use with Google Analytics: +# "utm_source={feedRelUri}&utm_medium=nikola_feed&utm_campaign={feedFormat}_feed" +FEED_LINKS_APPEND_QUERY = False + +# A HTML fragment describing the license, for the sidebar. +# (translatable) +LICENSE = "" +# I recommend using the Creative Commons' wizard: +# https://creativecommons.org/choose/ +# LICENSE = """ +# +# Creative Commons License BY-NC-SA""" + +# A small copyright notice for the page footer (in HTML). +# (translatable) +CONTENT_FOOTER = 'Contents © {date} {author} - Powered by Nikola {license}' + +# Things that will be passed to CONTENT_FOOTER.format(). This is done +# for translatability, as dicts are not formattable. Nikola will +# intelligently format the setting properly. +# The setting takes a dict. The keys are languages. The values are +# tuples of tuples of positional arguments and dicts of keyword arguments +# to format(). For example, {'en': (('Hello'), {'target': 'World'})} +# results in CONTENT_FOOTER['en'].format('Hello', target='World'). +# WARNING: If you do not use multiple languages with CONTENT_FOOTER, this +# still needs to be a dict of this format. (it can be empty if you +# do not need formatting) +# (translatable) +CONTENT_FOOTER_FORMATS = { + DEFAULT_LANG: ( + (), + { + "email": BLOG_EMAIL, + "author": BLOG_AUTHOR, + "date": time.gmtime().tm_year, + "license": LICENSE + } + ) +} + +# A simple copyright tag for inclusion in RSS feeds that works just +# like CONTENT_FOOTER and CONTENT_FOOTER_FORMATS +RSS_COPYRIGHT = 'Contents © {date} {author} {license}' +RSS_COPYRIGHT_PLAIN = 'Contents © {date} {author} {license}' +RSS_COPYRIGHT_FORMATS = CONTENT_FOOTER_FORMATS + +# To use comments, you can choose between different third party comment +# systems. The following comment systems are supported by Nikola: +# disqus, facebook, googleplus, intensedebate, isso, livefyre, muut +# You can leave this option blank to disable comments. +COMMENT_SYSTEM = "disqus" +# And you also need to add your COMMENT_SYSTEM_ID which +# depends on what comment system you use. The default is +# "nikolademo" which is a test account for Disqus. More information +# is in the manual. +COMMENT_SYSTEM_ID = "mosquitto" + +# Enable annotations using annotateit.org? +# If set to False, you can still enable them for individual posts and pages +# setting the "annotations" metadata. +# If set to True, you can disable them for individual posts and pages using +# the "noannotations" metadata. +# ANNOTATIONS = False + +# Create index.html for page folders? +# WARNING: if a page would conflict with the index file (usually +# caused by setting slug to `index`), the PAGE_INDEX +# will not be generated for that directory. +# PAGE_INDEX = False +# Enable comments on pages (i.e. not posts)? +# COMMENTS_IN_PAGES = False +# Enable comments on picture gallery pages? +# COMMENTS_IN_GALLERIES = False + +# What file should be used for directory indexes? +# Defaults to index.html +# Common other alternatives: default.html for IIS, index.php +# INDEX_FILE = "index.html" + +# If a link ends in /index.html, drop the index.html part. +# http://mysite/foo/bar/index.html => http://mysite/foo/bar/ +# (Uses the INDEX_FILE setting, so if that is, say, default.html, +# it will instead /foo/default.html => /foo) +# (Note: This was briefly STRIP_INDEX_HTML in v 5.4.3 and 5.4.4) +STRIP_INDEXES = True + +# Should the sitemap list directories which only include other directories +# and no files. +# Default to True +# If this is False +# e.g. /2012 includes only /01, /02, /03, /04, ...: don't add it to the sitemap +# if /2012 includes any files (including index.html)... add it to the sitemap +# SITEMAP_INCLUDE_FILELESS_DIRS = True + +# List of files relative to the server root (!) that will be asked to be excluded +# from indexing and other robotic spidering. * is supported. Will only be effective +# if SITE_URL points to server root. The list is used to exclude resources from +# /robots.txt and /sitemap.xml, and to inform search engines about /sitemapindex.xml. +# ROBOTS_EXCLUSIONS = ["/archive.html", "/category/*.html"] + +# Instead of putting files in .html, put them in /index.html. +# No web server configuration is required. Also enables STRIP_INDEXES. +# This can be disabled on a per-page/post basis by adding +# .. pretty_url: False +# to the metadata. +PRETTY_URLS = True + +# If True, publish future dated posts right away instead of scheduling them. +# Defaults to False. +# FUTURE_IS_NOW = False + +# If True, future dated posts are allowed in deployed output +# Only the individual posts are published/deployed; not in indexes/sitemap +# Generally, you want FUTURE_IS_NOW and DEPLOY_FUTURE to be the same value. +# DEPLOY_FUTURE = False +# If False, draft posts will not be deployed +# DEPLOY_DRAFTS = True + +# Allows scheduling of posts using the rule specified here (new_post -s) +# Specify an iCal Recurrence Rule: http://www.kanzaki.com/docs/ical/rrule.html +# SCHEDULE_RULE = '' +# If True, use the scheduling rule to all posts by default +# SCHEDULE_ALL = False + +# Do you want a add a Mathjax config file? +# MATHJAX_CONFIG = "" + +# If you want support for the $.$ syntax (which may conflict with running +# text!), just use this config: +# MATHJAX_CONFIG = """ +# +# """ + +# Want to use KaTeX instead of MathJax? While KaTeX may not support every +# feature yet, it's faster and the output looks better. +# USE_KATEX = False + +# KaTeX auto-render settings. If you want support for the $.$ syntax (wihch may +# conflict with running text!), just use this config: +# KATEX_AUTO_RENDER = """ +# delimiters: [ +# {left: "$$", right: "$$", display: true}, +# {left: "\\\[", right: "\\\]", display: true}, +# {left: "$", right: "$", display: false}, +# {left: "\\\(", right: "\\\)", display: false} +# ] +# """ + +# Do you want to customize the nbconversion of your IPython notebook? +# IPYNB_CONFIG = {} +# With the following example configuration you can use a custom jinja template +# called `toggle.tpl` which has to be located in your site/blog main folder: +# IPYNB_CONFIG = {'Exporter':{'template_file': 'toggle'}} + +# What Markdown extensions to enable? +# You will also get gist, nikola and podcast because those are +# done in the code, hope you don't mind ;-) +# Note: most Nikola-specific extensions are done via the Nikola plugin system, +# with the MarkdownExtension class and should not be added here. +# The default is ['fenced_code', 'codehilite'] +MARKDOWN_EXTENSIONS = ['fenced_code', 'codehilite', 'extra'] + +# Extra options to pass to the pandoc command. +# by default, it's empty, is a list of strings, for example +# ['-F', 'pandoc-citeproc', '--bibliography=/Users/foo/references.bib'] +# Pandoc does not demote headers by default. To enable this, you can use, for example +# ['--base-header-level=2'] +# PANDOC_OPTIONS = [] + +# Social buttons. This is sample code for AddThis (which was the default for a +# long time). Insert anything you want here, or even make it empty (which is +# the default right now) +# (translatable) +# SOCIAL_BUTTONS_CODE = """ +# +#
+# Share +#
  • +#
  • +#
  • +#
  • +#
+#
+# +# +# """ + +# Show link to source for the posts? +# Formerly known as HIDE_SOURCELINK (inverse) +SHOW_SOURCELINK = False +# Copy the source files for your pages? +# Setting it to False implies SHOW_SOURCELINK = False +COPY_SOURCES = False + +# Modify the number of Post per Index Page +# Defaults to 10 +# INDEX_DISPLAY_POST_COUNT = 10 + +# By default, Nikola generates RSS files for the website and for tags, and +# links to it. Set this to False to disable everything RSS-related. +# GENERATE_RSS = True + +# By default, Nikola does not generates Atom files for indexes and links to +# them. Generate Atom for tags by setting TAG_PAGES_ARE_INDEXES to True. +# Atom feeds are built based on INDEX_DISPLAY_POST_COUNT and not FEED_LENGTH +# Switch between plain-text summaries and full HTML content using the +# FEED_TEASER option. FEED_LINKS_APPEND_QUERY is also respected. Atom feeds +# are generated even for old indexes and have pagination link relations +# between each other. Old Atom feeds with no changes are marked as archived. +# GENERATE_ATOM = False + +# Only include teasers in Atom and RSS feeds. Disabling include the full +# content. Defaults to True. +# FEED_TEASERS = True + +# Strip HTML from Atom and RSS feed summaries and content. Defaults to False. +# FEED_PLAIN = False + +# Number of posts in Atom and RSS feeds. +# FEED_LENGTH = 10 + +# Include preview image as a
at the top of the entry. +# Requires FEED_PLAIN = False. If the preview image is found in the content, +# it will not be included again. Image will be included as-is, aim to optmize +# the image source for Feedly, Apple News, Flipboard, and other popular clients. +# FEED_PREVIEWIMAGE = True + +# RSS_LINK is a HTML fragment to link the RSS or Atom feeds. If set to None, +# the base.tmpl will use the feed Nikola generates. However, you may want to +# change it for a FeedBurner feed or something else. +# RSS_LINK = None + +# A search form to search this site, for the sidebar. You can use a Google +# custom search (https://www.google.com/cse/) +# Or a DuckDuckGo search: https://duckduckgo.com/search_box.html +# Default is no search form. +# (translatable) +# SEARCH_FORM = "" +# +# This search form works for any site and looks good in the "site" theme where +# it appears on the navigation bar: +# +# SEARCH_FORM = """ +# +# +# +# """ % SITE_URL +# +# If you prefer a Google search form, here's an example that should just work: +# SEARCH_FORM = """ +# +# +# +# """ % SITE_URL + +# Use content distribution networks for jQuery, twitter-bootstrap css and js, +# and html5shiv (for older versions of Internet Explorer) +# If this is True, jQuery and html5shiv are served from the Google CDN and +# Bootstrap is served from BootstrapCDN (provided by MaxCDN) +# Set this to False if you want to host your site without requiring access to +# external resources. +# USE_CDN = False + +# Check for USE_CDN compatibility. +# If you are using custom themes, have configured the CSS properly and are +# receiving warnings about incompatibility but believe they are incorrect, you +# can set this to False. +# USE_CDN_WARNING = True + +# Extra things you want in the pages HEAD tag. This will be added right +# before +# (translatable) +# EXTRA_HEAD_DATA = "" +# Google Analytics or whatever else you use. Added to the bottom of +# in the default template (base.tmpl). +# (translatable) +# BODY_END = "" + +# The possibility to extract metadata from the filename by using a +# regular expression. +# To make it work you need to name parts of your regular expression. +# The following names will be used to extract metadata: +# - title +# - slug +# - date +# - tags +# - link +# - description +# +# An example re is the following: +# '.*\/(?P\d{4}-\d{2}-\d{2})-(?P.*)-(?P.*)\.rst' +# (Note the '.*\/' in the beginning -- matches source paths relative to conf.py) +# FILE_METADATA_REGEXP = None + +# If you hate "Filenames with Capital Letters and Spaces.md", you should +# set this to true. +UNSLUGIFY_TITLES = True + +# Additional metadata that is added to a post when creating a new_post +# ADDITIONAL_METADATA = {} + +# Nikola supports Open Graph Protocol data for enhancing link sharing and +# discoverability of your site on Facebook, Google+, and other services. +# Open Graph is enabled by default. +# USE_OPEN_GRAPH = True + +# Nikola supports Twitter Card summaries, but they are disabled by default. +# They make it possible for you to attach media to Tweets that link +# to your content. +# +# IMPORTANT: +# Please note, that you need to opt-in for using Twitter Cards! +# To do this please visit https://cards-dev.twitter.com/validator +# +# Uncomment and modify to following lines to match your accounts. +# Images displayed come from the `previewimage` meta tag. +# You can specify the card type by using the `card` parameter in TWITTER_CARD. +# TWITTER_CARD = { +# # 'use_twitter_cards': True, # enable Twitter Cards +# # 'card': 'summary', # Card type, you can also use 'summary_large_image', +# # see https://dev.twitter.com/cards/types +# # 'site': '@website', # twitter nick for the website +# # 'creator': '@username', # Username for the content creator / author. +# } + +# If webassets is installed, bundle JS and CSS into single files to make +# site loading faster in a HTTP/1.1 environment but is not recommended for +# HTTP/2.0 when caching is used. Defaults to True. +USE_BUNDLES = False + +# Plugins you don't want to use. Be careful :-) +# DISABLED_PLUGINS = ["render_galleries"] + +# Special settings to disable only parts of the indexes plugin (to allow RSS +# but no blog indexes, or to allow blog indexes and Atom but no site-wide RSS). +# Use with care. +# DISABLE_INDEXES_PLUGIN_INDEX_AND_ATOM_FEED = False +# DISABLE_INDEXES_PLUGIN_RSS_FEED = False + +# Add the absolute paths to directories containing plugins to use them. +# For example, the `plugins` directory of your clone of the Nikola plugins +# repository. +# EXTRA_PLUGINS_DIRS = [] + +# Add the absolute paths to directories containing themes to use them. +# For example, the `v7` directory of your clone of the Nikola themes +# repository. +# EXTRA_THEMES_DIRS = [] + +# List of regular expressions, links matching them will always be considered +# valid by "nikola check -l" +# LINK_CHECK_WHITELIST = [] + +# If set to True, enable optional hyphenation in your posts (requires pyphen) +# Enabling hyphenation has been shown to break math support in some cases, +# use with caution. +# HYPHENATE = False + +# The <hN> tags in HTML generated by certain compilers (reST/Markdown) +# will be demoted by that much (1 → h1 will become h2 and so on) +# This was a hidden feature of the Markdown and reST compilers in the +# past. Useful especially if your post titles are in <h1> tags too, for +# example. +# (defaults to 1.) +# DEMOTE_HEADERS = 1 + +# Docutils, by default, will perform a transform in your documents +# extracting unique titles at the top of your document and turning +# them into metadata. This surprises a lot of people, and setting +# this option to True will prevent it. +# NO_DOCUTILS_TITLE_TRANSFORM = False + +# If you don’t like slugified file names ([a-z0-9] and a literal dash), +# and would prefer to use all the characters your file system allows. +# USE WITH CARE! This is also not guaranteed to be perfect, and may +# sometimes crash Nikola, your web server, or eat your cat. +# USE_SLUGIFY = True + +# Templates will use those filters, along with the defaults. +# Consult your engine's documentation on filters if you need help defining +# those. +# TEMPLATE_FILTERS = {} + +# Put in global_context things you want available on all your templates. +# It can be anything, data, functions, modules, etc. +GLOBAL_CONTEXT = {} + +# Add functions here and they will be called with template +# GLOBAL_CONTEXT as parameter when the template is about to be +# rendered +GLOBAL_CONTEXT_FILLER = [] diff --git a/www/files/android-chrome-192x192.png b/www/files/android-chrome-192x192.png new file mode 100644 index 00000000..46f0d461 Binary files /dev/null and b/www/files/android-chrome-192x192.png differ diff --git a/www/files/android-chrome-512x512.png b/www/files/android-chrome-512x512.png new file mode 100644 index 00000000..79d4f9ce Binary files /dev/null and b/www/files/android-chrome-512x512.png differ diff --git a/www/files/apple-touch-icon.png b/www/files/apple-touch-icon.png new file mode 100644 index 00000000..54c7ae4a Binary files /dev/null and b/www/files/apple-touch-icon.png differ diff --git a/www/files/blog/uploads/2010/06/powermeter-example-150x150.png b/www/files/blog/uploads/2010/06/powermeter-example-150x150.png new file mode 100644 index 00000000..083f0e70 Binary files /dev/null and b/www/files/blog/uploads/2010/06/powermeter-example-150x150.png differ diff --git a/www/files/blog/uploads/2010/06/powermeter-example-300x138.png b/www/files/blog/uploads/2010/06/powermeter-example-300x138.png new file mode 100644 index 00000000..15af78d3 Binary files /dev/null and b/www/files/blog/uploads/2010/06/powermeter-example-300x138.png differ diff --git a/www/files/blog/uploads/2010/06/powermeter-example.png b/www/files/blog/uploads/2010/06/powermeter-example.png new file mode 100644 index 00000000..5d6ce1a0 Binary files /dev/null and b/www/files/blog/uploads/2010/06/powermeter-example.png differ diff --git a/www/files/blog/uploads/2011/08/image-150x150.png b/www/files/blog/uploads/2011/08/image-150x150.png new file mode 100644 index 00000000..3e356d3b Binary files /dev/null and b/www/files/blog/uploads/2011/08/image-150x150.png differ diff --git a/www/files/blog/uploads/2011/08/image-300x225.png b/www/files/blog/uploads/2011/08/image-300x225.png new file mode 100644 index 00000000..35fd36e5 Binary files /dev/null and b/www/files/blog/uploads/2011/08/image-300x225.png differ diff --git a/www/files/blog/uploads/2011/08/image.png b/www/files/blog/uploads/2011/08/image.png new file mode 100644 index 00000000..22f81403 Binary files /dev/null and b/www/files/blog/uploads/2011/08/image.png differ diff --git a/www/files/blog/uploads/2012/08/IMAG0006-150x150.jpg b/www/files/blog/uploads/2012/08/IMAG0006-150x150.jpg new file mode 100644 index 00000000..78d4042c Binary files /dev/null and b/www/files/blog/uploads/2012/08/IMAG0006-150x150.jpg differ diff --git a/www/files/blog/uploads/2012/08/IMAG0006-300x199.jpg b/www/files/blog/uploads/2012/08/IMAG0006-300x199.jpg new file mode 100644 index 00000000..01b26eab Binary files /dev/null and b/www/files/blog/uploads/2012/08/IMAG0006-300x199.jpg differ diff --git a/www/files/blog/uploads/2012/08/IMAG0006.jpg b/www/files/blog/uploads/2012/08/IMAG0006.jpg new file mode 100644 index 00000000..ab1e816d Binary files /dev/null and b/www/files/blog/uploads/2012/08/IMAG0006.jpg differ diff --git a/www/files/blog/uploads/2014/05/14098345978_c15d12f19a_z-150x150.jpg b/www/files/blog/uploads/2014/05/14098345978_c15d12f19a_z-150x150.jpg new file mode 100644 index 00000000..b7ee1217 Binary files /dev/null and b/www/files/blog/uploads/2014/05/14098345978_c15d12f19a_z-150x150.jpg differ diff --git a/www/files/blog/uploads/2014/05/14098345978_c15d12f19a_z-300x200.jpg b/www/files/blog/uploads/2014/05/14098345978_c15d12f19a_z-300x200.jpg new file mode 100644 index 00000000..a3380f45 Binary files /dev/null and b/www/files/blog/uploads/2014/05/14098345978_c15d12f19a_z-300x200.jpg differ diff --git a/www/files/blog/uploads/2014/05/14098345978_c15d12f19a_z.jpg b/www/files/blog/uploads/2014/05/14098345978_c15d12f19a_z.jpg new file mode 100644 index 00000000..f92f293b Binary files /dev/null and b/www/files/blog/uploads/2014/05/14098345978_c15d12f19a_z.jpg differ diff --git a/www/files/blog/uploads/2016/05/stickers-150x150.jpg b/www/files/blog/uploads/2016/05/stickers-150x150.jpg new file mode 100644 index 00000000..d08e6481 Binary files /dev/null and b/www/files/blog/uploads/2016/05/stickers-150x150.jpg differ diff --git a/www/files/blog/uploads/2016/05/stickers-300x225.jpg b/www/files/blog/uploads/2016/05/stickers-300x225.jpg new file mode 100644 index 00000000..55416f39 Binary files /dev/null and b/www/files/blog/uploads/2016/05/stickers-300x225.jpg differ diff --git a/www/files/blog/uploads/2016/05/stickers.jpg b/www/files/blog/uploads/2016/05/stickers.jpg new file mode 100644 index 00000000..111f4f4b Binary files /dev/null and b/www/files/blog/uploads/2016/05/stickers.jpg differ diff --git a/www/files/blog/uploads/2017/03/img_20170308_155049248_33196894011_o-1024x576.jpg b/www/files/blog/uploads/2017/03/img_20170308_155049248_33196894011_o-1024x576.jpg new file mode 100644 index 00000000..3308d2b3 Binary files /dev/null and b/www/files/blog/uploads/2017/03/img_20170308_155049248_33196894011_o-1024x576.jpg differ diff --git a/www/files/blog/uploads/2017/03/img_20170308_155049248_33196894011_o-150x150.jpg b/www/files/blog/uploads/2017/03/img_20170308_155049248_33196894011_o-150x150.jpg new file mode 100644 index 00000000..365f8d5b Binary files /dev/null and b/www/files/blog/uploads/2017/03/img_20170308_155049248_33196894011_o-150x150.jpg differ diff --git a/www/files/blog/uploads/2017/03/img_20170308_155049248_33196894011_o-300x169.jpg b/www/files/blog/uploads/2017/03/img_20170308_155049248_33196894011_o-300x169.jpg new file mode 100644 index 00000000..82c4fce2 Binary files /dev/null and b/www/files/blog/uploads/2017/03/img_20170308_155049248_33196894011_o-300x169.jpg differ diff --git a/www/files/blog/uploads/2017/03/img_20170308_155049248_33196894011_o-768x432.jpg b/www/files/blog/uploads/2017/03/img_20170308_155049248_33196894011_o-768x432.jpg new file mode 100644 index 00000000..2e9a2d57 Binary files /dev/null and b/www/files/blog/uploads/2017/03/img_20170308_155049248_33196894011_o-768x432.jpg differ diff --git a/www/files/blog/uploads/2017/03/img_20170308_155049248_33196894011_o.jpg b/www/files/blog/uploads/2017/03/img_20170308_155049248_33196894011_o.jpg new file mode 100644 index 00000000..4518f9f7 Binary files /dev/null and b/www/files/blog/uploads/2017/03/img_20170308_155049248_33196894011_o.jpg differ diff --git a/www/files/favicon-16x16.png b/www/files/favicon-16x16.png new file mode 100644 index 00000000..5f5f4fe8 Binary files /dev/null and b/www/files/favicon-16x16.png differ diff --git a/www/files/favicon-32x32.png b/www/files/favicon-32x32.png new file mode 100644 index 00000000..4bfe09f0 Binary files /dev/null and b/www/files/favicon-32x32.png differ diff --git a/www/files/favicon.ico b/www/files/favicon.ico new file mode 100644 index 00000000..c4efbcc0 Binary files /dev/null and b/www/files/favicon.ico differ diff --git a/www/files/images/eclipse_logo_colour.png b/www/files/images/eclipse_logo_colour.png new file mode 100644 index 00000000..f6f6b903 Binary files /dev/null and b/www/files/images/eclipse_logo_colour.png differ diff --git a/www/files/images/github-icon.jpg b/www/files/images/github-icon.jpg new file mode 100644 index 00000000..d5f44885 Binary files /dev/null and b/www/files/images/github-icon.jpg differ diff --git a/www/files/images/iot-logo.png b/www/files/images/iot-logo.png new file mode 100644 index 00000000..653a6f80 Binary files /dev/null and b/www/files/images/iot-logo.png differ diff --git a/www/files/images/mosquitto-logo-47.png b/www/files/images/mosquitto-logo-47.png new file mode 100644 index 00000000..6588c625 Binary files /dev/null and b/www/files/images/mosquitto-logo-47.png differ diff --git a/www/files/images/mosquitto-logo.png b/www/files/images/mosquitto-logo.png new file mode 100644 index 00000000..ea181ea4 Binary files /dev/null and b/www/files/images/mosquitto-logo.png differ diff --git a/www/files/images/mosquitto-text-side-28.png b/www/files/images/mosquitto-text-side-28.png new file mode 100644 index 00000000..095736b4 Binary files /dev/null and b/www/files/images/mosquitto-text-side-28.png differ diff --git a/www/files/images/mosquitto-text-side.png b/www/files/images/mosquitto-text-side.png new file mode 100644 index 00000000..5f30815f Binary files /dev/null and b/www/files/images/mosquitto-text-side.png differ diff --git a/www/files/manifest.json b/www/files/manifest.json new file mode 100644 index 00000000..828d6c99 --- /dev/null +++ b/www/files/manifest.json @@ -0,0 +1,18 @@ +{ + "name": "Mosquitto", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file diff --git a/www/files/mstile-144x144.png b/www/files/mstile-144x144.png new file mode 100644 index 00000000..6ddfcab5 Binary files /dev/null and b/www/files/mstile-144x144.png differ diff --git a/www/files/mstile-150x150.png b/www/files/mstile-150x150.png new file mode 100644 index 00000000..87283854 Binary files /dev/null and b/www/files/mstile-150x150.png differ diff --git a/www/files/mstile-310x150.png b/www/files/mstile-310x150.png new file mode 100644 index 00000000..a33f4398 Binary files /dev/null and b/www/files/mstile-310x150.png differ diff --git a/www/files/mstile-310x310.png b/www/files/mstile-310x310.png new file mode 100644 index 00000000..4c7a439c Binary files /dev/null and b/www/files/mstile-310x310.png differ diff --git a/www/files/mstile-70x70.png b/www/files/mstile-70x70.png new file mode 100644 index 00000000..8d679337 Binary files /dev/null and b/www/files/mstile-70x70.png differ diff --git a/www/files/safari-pinned-tab.svg b/www/files/safari-pinned-tab.svg new file mode 100644 index 00000000..f1928960 --- /dev/null +++ b/www/files/safari-pinned-tab.svg @@ -0,0 +1 @@ +<svg version="1" xmlns="http://www.w3.org/2000/svg" width="933.333" height="933.333" viewBox="0 0 700.000000 700.000000"><path d="M103.8 83.9c-.2.5-3.9 4.7-8.3 9.3-8.9 9.5-11.2 12.1-17 19.3-2.2 2.7-4.2 5.2-4.5 5.5-.3.3-3.5 4.5-7.1 9.5-22.3 30.9-38.7 63.5-50.3 99.4-4.1 12.7-9.8 35.6-11.1 44.6-.4 2.2-.8 4.7-1.1 5.6-.2.9-.7 3.8-.9 6.5-.3 2.7-.7 6.5-1 8.4-1.4 9.9-2 21.6-2 41 0 21.4.9 36.9 2.9 49 2 12.5 2.9 17.2 4.2 23.4.9 3.9 1.8 8.2 2 9.6 1.8 9.1 9.6 33.3 15.5 48.3 3.9 9.8 16.3 35.4 21.6 44.7 8.6 15.1 27.4 41.5 36.4 51.3l4.4 4.8 4-3.8c2.2-2.1 8.3-7.6 13.5-12.3 5.2-4.7 9.8-8.9 10.2-9.5.8-1.1.9-.9-8.6-12.8-55.9-70-78.6-163.1-61.5-251.2 9.1-46.5 28.9-90.7 57.7-128.8l7.4-9.9 3.2 2.9c1.7 1.6 7.6 6.9 13.1 11.9 12.9 11.5 12.5 11.1 12.5 12 0 .4-1.5 2.5-3.3 4.8-8.6 10.6-19.8 28.3-27.9 44.1-12.3 23.9-23.1 58.3-26.3 83.5-2.1 17.2-2.7 46.8-1.2 64.5.8 9.7 1 11 3.2 22.5.8 4.1 1.7 8.9 2 10.6.9 5.6 7.6 27.6 11 36.5 8 20.9 18.2 40.3 30.3 57.9 5.4 7.8 18.3 24 19.1 24 .3 0 2.4-1.7 4.6-3.8 2.2-2.1 8.3-7.5 13.5-12.2 5.2-4.6 9.7-8.6 10-8.9.3-.3 4.3-4 9-8.1s9.2-8.1 10.1-9c.8-.8 4.7-4.3 8.5-7.6 3.8-3.4 8.1-7.3 9.5-8.5 12.2-11.2 19.3-17.5 20.5-18.2 2.2-1.3 1.7-3.2-2.4-8.4-6.9-8.6-14.8-22.1-18.9-31.8-3.3-8-8.3-22.5-7.7-22.5.3 0 0-.8-.5-1.8s-1.2-3.8-1.6-6.2c-.4-2.5-.8-4.7-1-5-.7-1.1-1.8-14.5-1.9-23.6-.5-23.1 4.8-47.3 14.8-67.9 5-10.3 14.3-25.5 15.6-25.5.5 0 3 2.2 14.6 12.6 3.9 3.5 8.2 7.2 9.5 8.2l2.3 2-2.6 3.9c-9.5 14.3-16.5 34.1-18.4 51.8-.6 5.3-.5 20.8.1 26 4.6 39 29.5 74.3 64.5 91.4 10.8 5.3 14 6.4 22.8 8.5l6.3 1.4-.5-3.6c-.5-3.3-1-9.8-2.2-27.7-.1-2.8-.3-5.3-.3-5.6-.1-.4-2.5-1.7-5.3-2.9-24.9-10.5-44.3-34.2-48.4-59-.3-1.4-.7-3.2-1-4-1.1-3-.4-21.8 1-28.5 4-18.9 17.5-39.8 31.8-49.3 2.1-1.3 3.8-2.8 3.8-3.2 0-.4-6-6.1-13.2-12.6-7.3-6.5-15.1-13.5-17.3-15.5-2.2-2-11.2-10-20-17.9-8.8-7.8-16.7-15-17.5-15.9-.9-.9-4.6-4.3-8.3-7.5l-6.8-5.9-9.8 10.1c-28.2 29-44.5 61-52.6 103.1-2 10.5-2.8 41-1.3 53.6 2.3 20.5 9.3 43.6 19.2 64.1l3.3 6.7-3.6 3.1c-2 1.7-4.1 3.5-4.7 4.1-20.9 19.1-21.1 19.2-22.4 17.9-3.3-3.7-15.8-30.8-20.6-44.8-3-8.7-7.9-29.1-8.9-36.6-.4-3-.9-6.4-1.2-7.5-.7-3.4-1.7-20.5-1.7-29 0-61.3 24.5-120.7 67.6-163.8 3.7-3.7 6.8-7.1 6.7-7.5 0-.4-2.6-2.9-5.7-5.6-4.6-4-17.5-15.5-22.6-20.1-.6-.6-5.6-5-11.1-9.9s-10.7-9.6-11.6-10.5c-.9-.9-3.1-2.9-5-4.6-3-2.5-16-14.2-25.6-22.9-4.7-4.2-7.1-5.7-7.5-4.7zM586.7 90.4c-3.7 3.4-11.3 10.4-17 15.3-5.6 5-11.1 9.9-12.2 11-4.5 4.1-20.2 18.1-23.9 21.4-2.2 1.8-6.4 5.7-9.5 8.5-3.1 2.8-7.9 7.1-10.8 9.5-2.8 2.4-5.4 5-5.7 5.7-.3.7 2.6 4.4 6.7 8.5 7.3 7.4 9 9.3 16.3 18.2 14.8 18.1 29.5 44.5 37.4 66.9 3.5 10.1 8.5 28.8 9.5 35.6.4 2.5.9 5.4 1.2 6.5 1.3 6.3 2.6 24.2 2.7 35.5 0 9.4-1.1 28.7-1.7 29.8-.3.4-.8 3.1-1.1 6.1-2.5 21.1-13 52.2-24.8 74.1-5.6 10.2-5.6 10.2-7.7 8.2-1.9-1.9-6.1-5.6-19.2-17.5l-8.7-7.7 3.4-6.6c9.5-18.6 15.8-39.4 18.9-62.4 1.5-10.6 1.6-37 .3-45.8-.4-3.1-1.1-7.2-1.3-9-2.3-15.2-8.4-35-15.6-50.2-9.8-20.7-20.8-36.4-36.8-53l-9.8-10.2-3.4 2.9c-1.9 1.5-4.8 4.1-6.5 5.8-1.8 1.6-4.5 4.1-6 5.4-2.7 2.2-20.2 17.9-21.4 19.1-.3.3-4.5 4.1-9.4 8.5-5 4.4-9.7 8.7-10.6 9.5-.9.8-3.4 3.1-5.6 5-16.2 14.5-20.4 18.4-20.4 19 0 .4 1.7 1.9 3.8 3.2 14.3 9.6 29.4 32.9 31.6 48.9.3 2.2.8 4.4 1.1 4.9.8 1.2.7 19.6 0 24.5-4.1 26.9-23.7 51.7-49.2 62.5-2.9 1.2-5.3 2.5-5.4 2.9 0 .3-.2 3.3-.4 6.6-.5 8.9-1.6 22.5-2.1 26.8-.4 3.4-.2 3.8 1.5 3.2 1.1-.3 3-.8 4.2-1 10.1-2 28.9-10.7 39.2-18.3 25.2-18.5 43.3-47.5 47.2-76 .3-2 .8-4.7 1.1-6 .5-2.7.6-22.9 0-25.7-.5-2.7-1.7-11.9-1.6-12.5 0-.3-1.5-5-3.3-10.5-3.8-11.2-6.7-17.4-12.1-26.4-3.7-6.1-3.8-6.2-1.9-7.9 1.1-.9 5.3-4.6 9.2-8.2 13.5-12.1 14.6-13 15.2-13 1.2 0 10.2 14.8 14.9 24.5 6.8 14.1 10.8 25.8 12.6 37 .3 2.2.8 4.3 1 4.7.8 1.3 1.8 15.8 1.8 25.3-.1 34.6-11 66.2-32.1 93.5l-4.3 5.5 2.4 2c3.2 2.8 16.9 15.1 23 20.6 2.8 2.5 12.3 11.1 21.1 18.9 22.6 20.2 31.1 27.9 36.4 32.7 2.5 2.4 4.9 4.3 5.3 4.3.8 0 12.9-15.3 19-24 25.5-36.7 42.7-83.9 46.6-128 .9-11 .8-46.8-.2-54.5-.4-3.3-1-7.7-1.2-9.7-1.3-12.6-9.7-45.5-14.4-56.3-.5-1.1-2.5-6-4.5-10.8-7.2-17.8-19.8-39.9-31.9-56-3.6-4.8-6.6-8.9-6.6-9.2 0-.5 3.6-4.1 9.2-9 1.8-1.7 7-6.3 11.5-10.3l8.2-7.3 7.3 9.8c6.5 8.6 10.4 14.4 19.3 28.3 3.9 6 12.1 22 17 33 4.2 9.4 13.2 33.1 14 37 .2.8 1.5 5.8 2.9 11 2.7 10.1 6.2 27.4 7.2 35.5.3 2.8.7 6.3.9 8 2.4 17.8 2.4 51.2 0 69.5-1.5 12.2-2.2 16.6-3.5 23.5-.6 2.7-1.2 6.1-1.5 7.4-1.2 6.5-6 23.4-9.6 34.3-12.1 35.9-32.5 71.9-57.5 101.2-1.3 1.5-2.4 3.1-2.3 3.5 0 .3 2.6 2.8 5.7 5.5 6.3 5.4 13.7 12.1 19.4 17.4l3.7 3.5 2-2.4c1-1.3 2.9-3.5 4.1-4.9 8.4-9.4 24.8-33 34.2-49 18.8-32.2 35.4-77.3 41.2-112.5 1.5-8.9 2.6-16.6 3.1-21.5.4-3 .8-6.9 1.1-8.5.9-5.5 1.2-48.8.4-58.5-1.8-21.6-4.4-37.7-9.1-56.7-14.6-59.9-45-115.3-86.8-158.6-4.1-4.2-7.9-7.7-8.5-7.7-.6 0-4.1 2.9-7.9 6.4z"/><path d="M339.5 289.2c-9 2.7-19 8.6-22.8 13.5-1 1.3-2.4 2.9-3 3.6-4.3 4.5-8.7 17.2-8.9 25.8-.5 16.2 8.3 32.2 21.8 40 3 1.7 5.4 3.4 5.5 3.7 0 .4.2 1.4.4 2.2.1.8.5 6 .9 11.5.3 5.5.8 12.2 1.1 15 .2 2.7.7 9.3 1.1 14.5.3 5.2.8 11.5.9 14 .2 2.5.6 8.3.9 13 .3 4.7.8 11.4 1.1 15 1.2 13.1 1.4 16.7 2 26.5.4 5.5.8 11.6 1 13.5.2 1.9.7 8.2 1.1 14 .3 5.8.8 11.8.9 13.5.1 1.6.5 7.3.9 12.5s.9 11.7 1.1 14.5c.2 2.7.7 8.8 1 13.5 1 13.5 1.3 17.9 2.1 28 .4 5.2.8 10.3.8 11.2 0 1 .4 1.8.8 1.8s.9-2.6.9-5.8c.1-3.1.3-7.1.4-8.7.2-1.7.6-7.3.9-12.5.4-5.2.9-11.5 1.1-14 .5-6 1.5-19.8 2-28.5.3-3.8.7-9.9 1-13.5.3-3.6.7-9.2 1-12.5.2-3.3.7-9.4 1-13.5.6-7.4.8-11.2 2-28 .3-4.7.8-10.9 1-13.8.3-2.8.7-8.9 1-13.5.3-4.5.8-10.5 1-13.2.2-2.8.7-9.1 1-14 .4-5 .8-11 1-13.5.4-4.3 1.6-21.9 1.9-27 .2-1.8 1.5-3.2 5.1-5.3 21-12.2 28.7-38.7 17.7-60.3-5.1-10-17.5-19.9-28.4-22.8-6-1.5-17.7-1.7-22.3-.4z"/></svg> \ No newline at end of file diff --git a/www/files/stickers/index.html b/www/files/stickers/index.html new file mode 100644 index 00000000..3b2f7d34 --- /dev/null +++ b/www/files/stickers/index.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html> +<head> + <title>Eclipse Mosquitto™ Sticker Generator + + + + + + +
+

Eclipse Mosquitto™ Sticker Generator

+ +

This page allows you to create a book of square stickers to buy from Moo.

+

Click the logos to choose which to include, then click submit to be + taken to the Moo site with a stickerbook ready in your basket. If you + choose both logos you will get 45 of each, otherwise you will get 90 of the + one you choose.

+ + + +
+
+
+ + + +
+
+ + + + diff --git a/www/files/stickers/mosquitto-colour-deselected.png b/www/files/stickers/mosquitto-colour-deselected.png new file mode 100644 index 00000000..9aba3778 Binary files /dev/null and b/www/files/stickers/mosquitto-colour-deselected.png differ diff --git a/www/files/stickers/mosquitto-colour.png b/www/files/stickers/mosquitto-colour.png new file mode 100644 index 00000000..0ff69b5e Binary files /dev/null and b/www/files/stickers/mosquitto-colour.png differ diff --git a/www/files/stickers/mosquitto-mono-deselected.png b/www/files/stickers/mosquitto-mono-deselected.png new file mode 100644 index 00000000..758c9d67 Binary files /dev/null and b/www/files/stickers/mosquitto-mono-deselected.png differ diff --git a/www/files/stickers/mosquitto-mono.png b/www/files/stickers/mosquitto-mono.png new file mode 100644 index 00000000..aa096f64 Binary files /dev/null and b/www/files/stickers/mosquitto-mono.png differ diff --git a/www/pages/documentation.md b/www/pages/documentation.md new file mode 100644 index 00000000..24064224 --- /dev/null +++ b/www/pages/documentation.md @@ -0,0 +1,12 @@ + + +Write your page here. diff --git a/www/pages/download.md b/www/pages/download.md new file mode 100644 index 00000000..1771ccde --- /dev/null +++ b/www/pages/download.md @@ -0,0 +1,110 @@ + + +# Source + +* [mosquitto-1.5.tar.gz](http://mosquitto.org/files/source/mosquitto-1.5.tar.gz) (319kB) ([GPG signature](http://mosquitto.org/files/source/mosquitto-1.5.tar.gz.asc)) +* [mosquitto-1.4.15.tar.gz](http://www.eclipse.org/downloads/download.php?file=/mosquitto/source/mosquitto-1.4.15.tar.gz) (via Eclipse) +* [Git source code repository](https://github.com/eclipse/mosquitto) (github.com) + +Older downloads are available at [http://mosquitto.org/files/](../files/) + +# Binary Installation + +## Windows + +* [mosquitto-1.4.15a-install-win32.exe](http://www.eclipse.org/downloads/download.php?file=/mosquitto/binary/win32/mosquitto-1.4.15a-install-win32.exe) (~200 kB) (Native build, Windows Vista and up, built with Visual Studio Community 2015) +* [mosquitto-1.4.15-install-cygwin.exe](http://www.eclipse.org/downloads/download.php?file=/mosquitto/binary/cygwin/mosquitto-1.4.15-install-cygwin.exe) (~200 kB) (Cygwin build, Windows XP and up) + +See the readme-windows.txt after installing for Windows specific details and dependencies. + +## Mac +Mosquitto can be installed from the homebrew project. See [brew.sh](http://brew.sh/) and then use `brew install mosquitto` + +## Arch Linux +* Mosquitto can be found in the community repository. + +## CentOS +Download the repository config file for your CentOS version from below and copy it to /etc/yum.repos.d/ You'll now be able to install and keep mosquitto up to date using the normal package management tools. + +The available packages are: mosquitto, mosquitto-clients, libmosquitto1, libmosquitto-devel, libmosquittopp1, libmosquittopp-devel, python-mosquitto. +* [CentOS 7](http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo) +* [CentOS 6](http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-6/home:oojah:mqtt.repo) + +## Debian +* Mosquitto is now in Debian proper. There will be a short delay between a new release and it appearing in Debian as part of the normal Debian procedures. +* There are also Debian repositories provided by the mosquitto project, as described at http://mosquitto.org/2013/01/mosquitto-debian-repository> + +## Fedora +Mosquitto is now available from Fedora directly. Use `yum install mosquitto`, or search for "mosquitto" to find the related packages. + +## FreeBSD +Mosquitto is available for FreeBSD: http://www.freshports.org/net/mosquitto/ + +## Gentoo +Use `emerge mosquitto` + +## openSUSE +Download the repository config file for your openSUSE version from below and copy it to /etc/zypp/repos.d/ You'll now be able to install and keep mosquitto up to date using the normal package management tools. + +The available packages are: mosquitto, mosquitto-clients, libmosquitto1, libmosquitto-devel, libmosquittopp1, libmosquittopp-devel, python-mosquitto. + +* [openSUSE 13.2]http://download.opensuse.org/repositories/home:/oojah:/mqtt/openSUSE_13.2/home:oojah:mqtt.repo) +* [openSUSE 13.1]http://download.opensuse.org/repositories/home:/oojah:/mqtt/openSUSE_13.1/home:oojah:mqtt.repo) + +## OpenWrt +If you're using a trunk snapshot use `opkg update; opkg install mosquitto` + +Karl Palsson maintains a set of feeds that may be more up to date than the current OpenWrt version: + +* https://github.com/remakeelectric/owrt_pub_feeds + +## Raspberry Pi +Mosquitto is available through the main repository. + +There are also Debian repositories provided by the mosquitto project, as described at http://mosquitto.org/2013/01/mosquitto-debian-repository/ + +## Redhat Enterprise Linux +Download the repository config file for your RHEL version from below and copy it to /etc/yum.repos.d/ You'll now be able to install and keep mosquitto up to date using the normal package management tools. + +The available packages are: mosquitto, mosquitto-clients, libmosquitto1, libmosquitto-devel, libmosquittopp1, libmosquittopp-devel, python-mosquitto. +* [RHEL 7](http://download.opensuse.org/repositories/home:/oojah:/mqtt/RedHat_RHEL-7/home:oojah:mqtt.repo) +* [RHEL 6](http://download.opensuse.org/repositories/home:/oojah:/mqtt/RedHat_RHEL-6/home:oojah:mqtt.repo) + +## SUSE Linux Enterprise Server +Add the appropriate repository to your package config from the list below, then install mosquitto from your normal package management tools. + +* [SLE 15](http://download.opensuse.org/repositories/home:/oojah:/mqtt/SLE_15/) +* [SLE 12 SP3](http://download.opensuse.org/repositories/home:/oojah:/mqtt/SLE_12_SP3/) +* [SLE 12 SP2](http://download.opensuse.org/repositories/home:/oojah:/mqtt/SLE_12_SP2/) +* [SLE 12 SP1](http://download.opensuse.org/repositories/home:/oojah:/mqtt/SLE_12_SP1/) +* [SLE 12](http://download.opensuse.org/repositories/home:/oojah:/mqtt/SLE_123/) + +## Ubuntu +Mosquitto is available in the Ubuntu repositories so you can install as with +any other package. If you are on an earlier version of Ubuntu or want a more +recent version of mosquitto, add the [mosquitto-dev +PPA](http://launchpad.net/%7Emosquitto-dev/+archive/mosquitto-ppa/) to your +repositories list - see the link for details. mosquitto can then be installed +from your package manager. + +* `sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa` +* `sudo apt-get update` + +If the command `apt-add-repository` is not recognised, it can be installed with: + +* `sudo apt-get install python-software-properties` + +## iPhone +You can use libmosquitto (included in the source download) on the iPhone to +build MQTT apps. It compiles as objective-c, or you can use the +[marquette](https://github.com/njh/marquette/) project which is an objective-c +wrapper and example app. diff --git a/www/pages/index.html b/www/pages/index.html new file mode 100644 index 00000000..d31fb9a2 --- /dev/null +++ b/www/pages/index.html @@ -0,0 +1,82 @@ + + +
+
+

Eclipse Mosquitto is an open source (EPL/EDL licensed) message broker that + implements the MQTT protocol versions 3.1 and 3.1.1. Mosquitto + is lightweight and is suitable for use on all devices from low + power single board computers to full servers.

+ +

The MQTT protocol provides a lightweight method of carrying + out messaging using a publish/subscribe model. This makes it + suitable for Internet of Things messaging such as with low + power sensors or mobile devices such as phones, embedded + computers or microcontrollers.

+ +

The Mosquitto project also provides a C library for + implementing MQTT clients, and the very popular mosquitto_pub + and mosquitto_sub command line MQTT clients.

+ +

Mosquitto is part of the Eclipse + Foundation and is an iot.eclipse.org project.

+ + +
+
+
+ +
+
+
+
+

Download

+

Mosquitto is highly portable and available for a wide range of + platforms. Go to the dedicated download + page to find the source or binaries for your platform.

+

Read the Change Log to find out + about recent releases.

+
+ +
+

Test

+

You can have your own instance of Mosquitto running in + minutes, but to make testing even easier, the Mosquitto Project + runs a test server at test.mosquitto.org where + you can test your clients in a variety of ways: plain MQTT, + MQTT over TLS, MQTT over TLS (with client certificate, + MQTT over WebSockets and MQTT over WebSockets with TLS.

+ platforms.

+
+ +
+

Community

+ + +
+ +
+

Security

+

Use the security page to find out + how to report vulnerabilities or responses to past security + issues.

+
+
+
+
diff --git a/www/pages/security.md b/www/pages/security.md new file mode 100644 index 00000000..e25f3686 --- /dev/null +++ b/www/pages/security.md @@ -0,0 +1,44 @@ + + +# Reporting security vulnerabilities + +If you think you have found a security vulnerability in Mosquitto, please +follow the steps on [Eclipse Security] page to report it. + +# Past vulnerabilities + +Listed with most recent first. Further information on security related issues +can be found in the [security category]. + +* February 2018: [CVE-2017-7651] affecting versions **0.15** to **1.4.14** + inclusive, fixed in **1.4.15**. More details at + [security-advisory-cve-2017-7651-cve-2017-7652]. +* February 2018: [CVE-2017-7652] affecting versions **1.0** to **1.4.14** + inclusive, fixed in **1.4.15**. More details at + [security-advisory-cve-2017-7651-cve-2017-7652]. +* June 2017: [CVE-2017-9868] affecting versions **0.15** to **1.4.12** + inclusive, fixed in **1.4.13**. More details at + [security-advisory-cve-2017-9868]. +* May 2017: [CVE-2017-7650] affecting versions **0.15** to **1.4.11** + inclusive, fixed in **1.4.12**. More details at + [security-advisory-cve-2017-7650]. + + +[security-advisory-cve-2017-7651-cve-2017-7652]: /2018/02/security-advisory-cve-2017-7651-cve-2017-7652/ +[CVE-2017-7651]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-7651 +[CVE-2017-7652]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-7652 +[Eclipse Security]: https://www.eclipse.org/security/ +[CVE-2017-7650]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-7650 +[security-advisory-cve-2017-7650]: /2017/05/security-advisory-cve-2017-7650/ +[CVE-2017-9868]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-9868 +[security-advisory-cve-2017-9868]: /2017/06/security-advisory-cve-2017-9868/ +[security category]: /blog/categories/security/ diff --git a/www/plugins/__init__.py b/www/plugins/__init__.py new file mode 100644 index 00000000..fd7e25d7 --- /dev/null +++ b/www/plugins/__init__.py @@ -0,0 +1 @@ +# Plugin modules go here. \ No newline at end of file diff --git a/www/plugins/docbookmanpage/docbookmanpage.plugin b/www/plugins/docbookmanpage/docbookmanpage.plugin new file mode 100644 index 00000000..2522a537 --- /dev/null +++ b/www/plugins/docbookmanpage/docbookmanpage.plugin @@ -0,0 +1,12 @@ +[Core] +Name = docbookmanpage +Module = docbookmanpage + +[Nikola] +PluginCategory = PageCompiler + +[Documentation] +Author = Roger Light (asciidoc code by Roberto Alsina) +Version = 0.4 +Website = https://github.com/ralight/nikola-docbook-manpage +Description = Compile Docbook manpages into html, based on asciidoc plugin. diff --git a/www/plugins/docbookmanpage/docbookmanpage.py b/www/plugins/docbookmanpage/docbookmanpage.py new file mode 100644 index 00000000..2d55a263 --- /dev/null +++ b/www/plugins/docbookmanpage/docbookmanpage.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- + +# Copyright © 2012-2014 Roberto Alsina and others. + +# Permission is hereby granted, free of charge, to any +# person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the +# Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice +# shall be included in all copies or substantial portions of +# the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +# OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +"""Implementation of compile_html based on asciidoc. + +You will need, of course, to install asciidoc + +""" + +import codecs +import os +import subprocess + +from nikola.plugin_categories import PageCompiler +from nikola.utils import makedirs, req_missing, write_metadata + +try: + from collections import OrderedDict +except ImportError: + OrderedDict = dict # NOQA + + +class CompileDocbookManpage(PageCompiler): + """Compile docbookmanpage into HTML.""" + + name = "docbookmanpage" + demote_headers = True + + def compile(self, source, dest, is_two_file=True, post=None, lang=None): + """Compile the source file into HTML and save as dest.""" + makedirs(os.path.dirname(dest)) + binary = self.site.config.get('XSLTPROC_BINARY', 'xsltproc') + xslpath = os.path.join(os.path.split(__file__)[0], 'html.xsl') + try: + subprocess.check_call((binary, '-o', dest, xslpath, source)) + if post is None: + if shortcode_deps: + self.logger.error( + "Cannot save dependencies for post {0} (post unknown)", + source) + except OSError as e: + print(e) + req_missing(['xsltproc'], 'build this site (compile with xsltproc)', python=False) + + def create_post(self, path, content=None, onefile=False, is_page=False, **kw): + """Create post file with optional metadata.""" + metadata = OrderedDict() + metadata.update(self.default_metadata) + metadata.update(kw) + makedirs(os.path.dirname(path)) + if not content.endswith('\n'): + content += '\n' + with codecs.open(path, "wb+", "utf8") as fd: + if onefile: + fd.write("////\n") + fd.write(write_metadata(metadata)) + fd.write("////\n") + fd.write(content) diff --git a/www/plugins/docbookmanpage/html.xsl b/www/plugins/docbookmanpage/html.xsl new file mode 100644 index 00000000..a630677b --- /dev/null +++ b/www/plugins/docbookmanpage/html.xsl @@ -0,0 +1,18 @@ + + + + + man.css + + ansi + ansi + ansi + + + + + + + 1 + + diff --git a/www/posts/2009/12/version-0-2-released.md b/www/posts/2009/12/version-0-2-released.md new file mode 100644 index 00000000..a9fc9b00 --- /dev/null +++ b/www/posts/2009/12/version-0-2-released.md @@ -0,0 +1,12 @@ + + +Version 0.2 released - please see the [change log](/ChangeLog.txt). diff --git a/www/posts/2009/12/version-0-3-released.md b/www/posts/2009/12/version-0-3-released.md new file mode 100644 index 00000000..9239f4d7 --- /dev/null +++ b/www/posts/2009/12/version-0-3-released.md @@ -0,0 +1,20 @@ + + + * Added logging support. + * Now restarts much more quickly even when the network socket was in use. + * Can now be configured to run on multiple network ports and restricted to + specific network addresses. + * Added host access control in the form of tcp-wrappers support. + +See the [change log](/ChangeLog.txt) for full details. + +Wild card support in topics is coming in the next version. diff --git a/www/posts/2010/01/mailing-list-irc.md b/www/posts/2010/01/mailing-list-irc.md new file mode 100644 index 00000000..fb9a7656 --- /dev/null +++ b/www/posts/2010/01/mailing-list-irc.md @@ -0,0 +1,22 @@ + + +We've created some new support channels for mosquitto - a mailing list and an +irc channel. Although they are both intended for providing support for +mosquitto itself, general discussion of anything to do with mqtt is strongly +encouraged. We want to reduce the barrier to getting started and provide a +place where people can share their experiences. + +The mailing list is at + +The irc channel is #mqtt on the [freenode network] + +[freenode network]: http://freenode.net/ diff --git a/www/posts/2010/01/version-0-4-1-released.md b/www/posts/2010/01/version-0-4-1-released.md new file mode 100644 index 00000000..ba66cf19 --- /dev/null +++ b/www/posts/2010/01/version-0-4-1-released.md @@ -0,0 +1,14 @@ + + +This is a bugfix release: + + * Fix regex used for finding retained messages to send on new subscription. diff --git a/www/posts/2010/01/version-0-4-released.md b/www/posts/2010/01/version-0-4-released.md new file mode 100644 index 00000000..e6da992a --- /dev/null +++ b/www/posts/2010/01/version-0-4-released.md @@ -0,0 +1,22 @@ + + + * Added support for wildcard subscriptions using + and #. + * All network operations are now non-blocking and can cope with partial packets, meaning that networking should be a lot more reliable. + * Total messsages/bytes sent/received are now available in $SYS. + * Improved logging information - use client ip address and id instead of socket number. + * Keepalive==0 is now correctly treated as "never disconnect". + * Default logging destination no longer includes "topics" to prevent possible error logging to the db before it is initialised. + * Periodic $SYS messages can now be disabled. + +See the [changelog] for full details. + +[changelog]: /ChangeLog.txt diff --git a/www/posts/2010/02/version-0-4-2-released.md b/www/posts/2010/02/version-0-4-2-released.md new file mode 100644 index 00000000..3d5aff2d --- /dev/null +++ b/www/posts/2010/02/version-0-4-2-released.md @@ -0,0 +1,18 @@ + + +This is a bugfix release. + + * Fix segfault on client connect with invalid protocol name/version. + +Get it at the [download page]. + +[download page]: /download diff --git a/www/posts/2010/03/google-powermeter.md b/www/posts/2010/03/google-powermeter.md new file mode 100644 index 00000000..95bc2b07 --- /dev/null +++ b/www/posts/2010/03/google-powermeter.md @@ -0,0 +1,64 @@ + + +A popular use for mqtt brokers seems to be coupling them with a [CurrentCost] +(or similar) energy monitor to then log energy data and produce pretty (and +useful!) graphs. + +Google recently opened up their PowerMeter API which looks to provide very nice +graphing of energy data. They are working with utility companies directly with +in home monitors, but it's also possible to use it as an individual. + +Toby Evans got to the bottom of registering a device (see his [explanatory blog +post]) which just leaves getting data to Google. + +If you're already logging energy data to an MQTT broker, it's as simple as +adding another subscriber to send the data to Google. You could use the +mosquitto_sub client and a script I wrote for posting to google, +[google_powermeter_update_mqtt.pl] like so: + +``` +mosquitto_sub -t sensors/cc128/ch1 | google_powermeter_update_mqtt.pl +``` + +This assumes that the data appearing on the sensors/cc128/ch1 topic is in the +format `<unix timestamp> <power reading in Watts>`. + +If you're not logging your energy data to a broker, you should probably +consider doing so :) There is another script [google_powermeter_update.pl] +which may be more suitable and can be used as: + +``` +google_powermeter_update.pl <unix timestamp> <power in Watts> +``` + +Both of the scripts need your user details adding and should be easy to modify +to match your own particular need. They also assume you're using a single +cumulative variable with your device and will need modifying if you're using +more than one variable or aren't using cumulative variables. + +For reference, I use the script [cc128.pl] to read data from my CurrentCost +CC128 (Envi). + +# Update: + +Google has a limit of 6 API requests per hour, so the above description will +only work for a short while (the 6 request limit doesn't appear to be a hard +limit when you first exceed it, but becomes increasingly stricter). I'm now +logging my CC128 data to a mysql database and sending batch updates every 15 +minutes with [google_powermeter_update_mysql.pl]. + +[CurrentCost]: http://currentcost.com/ +[explanatory blog post]: http://2cheap2meter.blogspot.com/2010/03/setting-up-google-powermeter.html +[google_powermeter_update_mqtt.pl]: /files/perl/google_powermeter_update_mqtt.pl +[google_powermeter_update.pl]: /files/perl/google_powermeter_update.pl +[cc128.pl]: /files/perl/cc128.pl">cc128.pl +[google_powermeter_update_mysql.pl]: /files/perl/google_powermeter_update_mysql.pl diff --git a/www/posts/2010/03/upgrading-to-0-5-1.md b/www/posts/2010/03/upgrading-to-0-5-1.md new file mode 100644 index 00000000..57d0e2a2 --- /dev/null +++ b/www/posts/2010/03/upgrading-to-0-5-1.md @@ -0,0 +1,31 @@ + + +When upgrading to 0.5.1 from 0.4 or higher, there is an important change in the +location of the sqlite3-pcre library used. On Linux, the expected location of +this library has changed from /usr/lib/sqlite3-pcre.so to +/usr/lib/sqlite3/pcre.so. This is because the library is an extension +specifically for sqlite3, not a general use shared library. + +If you installed sqlite3-pcre manually, or are not using Ubuntu, you should +either modify the `ext_sqlite3_regex` option in /etc/mosquitto.conf to point to +your library path, or move the library to the new location. + +If you are using Ubuntu and have installed mosquitto from the launchpad ppa, +this will largely be taken care of. However, due to a mistake in the packaging +of sqlite3-pcre, you must first remove sqlite3-pcre with your package manager +and then reinstall it before updating mosquitto. You will only ever need to do +this once. + +Sorry for the inconvenience caused by this change. If you have any problem or +questions, feel free to get in touch on the [mqtt users mailing list]. + +[mqtt users mailing list]: https://launchpad.net/~mqtt-users diff --git a/www/posts/2010/03/version-0-5-1-released.md b/www/posts/2010/03/version-0-5-1-released.md new file mode 100644 index 00000000..223801b9 --- /dev/null +++ b/www/posts/2010/03/version-0-5-1-released.md @@ -0,0 +1,42 @@ + + +This announcement summarises the changes in both 0.5 and 0.5.1. + +The interesting changes: + + * Add mosquitto_sub and mosquitto_pub, simple clients for subscribe/publish. + * Change persistence behaviour. The database is now stored in memory even if + persistence is enabled. It is written to disk when mosquitto exits and also + at periodic intervals as defined by the new `autosave_interval` option. This + makes persistence more suitable when being used on devices with a limited + number of writes, such as flash. + * Default sqlite3-pcre path on Linux is now /usr/lib/sqlite3/pcre.so to match + new sqlite3-pcre packages. + +The less interesting/bug fixes: + + * No longer store QoS=0 messages for disconnected clients that do not have + clean start set. + * Rename `msg_timeout` option to `retry_interval` for better rsmb + compatibility. + * The writing of the persistence database may be forced by sending mosquitto + the SIGUSR1 signal. + * Clients that do not send CONNECT as their first command are now + disconnected. + * Boolean configuration values may now be specified with true/false as well as + 1/0. + * Log message on CONNECT with invalid protocol or protocol version. + * Add man pages for clients. + * Add general man page on mqtt. + * Root privileges are now dropped only after attempting to write a pid file + (if configured). This means that the pid file can be written to /var/run/ + directly and should fix bug #523183. diff --git a/www/posts/2010/03/version-0-5-2-released.md b/www/posts/2010/03/version-0-5-2-released.md new file mode 100644 index 00000000..ee43466a --- /dev/null +++ b/www/posts/2010/03/version-0-5-2-released.md @@ -0,0 +1,30 @@ + + +This is a bugfix release; it is recommended that you upgrade to this version: + + * Always update last backup time, so that the backup doesn't run every time + through the main loop once `autosave_interval` has been reached. + * Report $SYS/broker/uptime in the same format as rsmb. + * Make mandatory options obvious in usage output and man page of + mosquitto_pub. Fixes bug [#529990]. + * Treat subscriptions with a trailing slash correctly. This should fix bugs + [#530099] and [#530369]. + +Mosquitto is now also available for Linux x86 statically compiled against +sqlite3, which makes it usable on older distributions such as Ubuntu Hardy that +are still supported but do not have a sufficiently new version of sqlite3. To +download this package, go to the [download page]. + +[#529990]: https://bugs.launchpad.net/mosquitto/+bug/529990 +[#530099]: https://bugs.launchpad.net/mosquitto/+bug/530099 +[#530369]: https://bugs.launchpad.net/mosquitto/+bug/530369 +[download page]: /download diff --git a/www/posts/2010/03/version-0-5-3-released.md b/www/posts/2010/03/version-0-5-3-released.md new file mode 100644 index 00000000..ff60bd57 --- /dev/null +++ b/www/posts/2010/03/version-0-5-3-released.md @@ -0,0 +1,21 @@ + + +This is a bugfix release. + + * Will messages are now only sent when a client disconnects unexpectedly. + * Fix all incoming topics/subscriptions that start with a / or contain + multiple / in a row (//). This should finally fix bug [#530099]. + * Do actually disconnect client when it sends an empty subscription/topic + string. + * Add missing $SYS/broker/clients/total to man page. + +[#530099]: https://bugs.launchpad.net/mosquitto/+bug/530099 diff --git a/www/posts/2010/03/version-0-5-4-released.md b/www/posts/2010/03/version-0-5-4-released.md new file mode 100644 index 00000000..f9cc22e4 --- /dev/null +++ b/www/posts/2010/03/version-0-5-4-released.md @@ -0,0 +1,19 @@ + + +This is a bugfix release. + + * Fix memory allocation in `mqtt3_fix_sub_topic()` ([bug #531861]). + * Remove accidental limit of 100 client connections. + * Fix mosquitto_pub handling of messages with QoS>0 ([bug #537061]). + +[bug #531861]: https://bugs.launchpad.net/mosquitto/+bug/531861 +[bug #537061]: https://bugs.launchpad.net/mosquitto/+bug/537061 diff --git a/www/posts/2010/04/help-wanted-rpm-packaging.md b/www/posts/2010/04/help-wanted-rpm-packaging.md new file mode 100644 index 00000000..ec6c5173 --- /dev/null +++ b/www/posts/2010/04/help-wanted-rpm-packaging.md @@ -0,0 +1,31 @@ + + +I'm currently working on the finishing touches of mosquitto 0.6 and will +hopefully be releasing it some time this week in time for oggcamp. Mosquitto is +pretty usable now so I'm keen on making it as easy as possible for people to +get and use. The ultimate goal is of course to get it into the major Linux +distros so it appears in the normal package repositories. Until then, other +solutions are possible. I can provide Windows executables and have a PPA to +support Ubuntu Linux users, but don't have anything for rpm based distros. + +Can you help? I'm quite happy using the opensuse build service to build and +host the final packages, but the creation of the rpm build script isn't +something I know how to do at the moment. Given the amount of time I've spent +on the Debian style packaging, I thought I'd ask for help with rpms! :) + +If you've got familiarity with rpm and would like to help, please [get in +touch]. If you aren't familiar with creating rpms but want a reason to learn, +that would suit me fine as well. + +Thanks in advance! + +[get in touch]: /support diff --git a/www/posts/2010/04/mind-control-mqtt.md b/www/posts/2010/04/mind-control-mqtt.md new file mode 100644 index 00000000..ed36052c --- /dev/null +++ b/www/posts/2010/04/mind-control-mqtt.md @@ -0,0 +1,21 @@ + + +If you're in the UK, you may be interested in watching the Wednesday 21st April +episode of "Bang Goes the Theory". IBM employees [Nicholas O'Leary] and [Kevin +Brown] will be in one of the segments, on controlling remote control cars with +their minds - all with MQTT under the covers! + + * [BBC programme link] + +[Nicholas O'Leary]: http://twitter.com/knolleary +[Kevin Brown]: http://twitter.com/kevinxbrown +[BBC programme link]: https://www.bbc.co.uk/programmes/b00s5fvq diff --git a/www/posts/2010/04/oggcamp.md b/www/posts/2010/04/oggcamp.md new file mode 100644 index 00000000..63b5a80a --- /dev/null +++ b/www/posts/2010/04/oggcamp.md @@ -0,0 +1,16 @@ + + +I'm going to be at [oggcamp] this coming weekend. If you're there, try and find +me and say hello! I'm planning a talk on mosquitto/mqtt with Andy +Stanford-Clark, so should be relatively easy to find. + +[oggcamp]: http://oggcamp.org/ diff --git a/www/posts/2010/05/fedora-packages-available.md b/www/posts/2010/05/fedora-packages-available.md new file mode 100644 index 00000000..fe9cd87f --- /dev/null +++ b/www/posts/2010/05/fedora-packages-available.md @@ -0,0 +1,24 @@ + + +Thanks to help from Chris Procter, there are now rpm packages available for +Fedora Linux. As these are the first rpm packages, there may be problems so +please report back if you find any. + +There are details on where to get the packages on the [download page]. + +Users of other rpm based distributions are currently out of luck - the versions +of sqlite that they provide are typically either too old or else don't have +support for some required features compiled in. + +Thanks to everybody else who got in touch about rpms as well! + +[download page]: /download diff --git a/www/posts/2010/05/gentoo-ebuilds-available.md b/www/posts/2010/05/gentoo-ebuilds-available.md new file mode 100644 index 00000000..62c6672d --- /dev/null +++ b/www/posts/2010/05/gentoo-ebuilds-available.md @@ -0,0 +1,17 @@ + + +Thanks to Neil Bothwick, there are now some Gentoo ebuilds available for +mosquitto and sqlite3-pcre. You can grab them from the links below - hopefully +they'll be integrated in the near future. + + * + * diff --git a/www/posts/2010/05/mosquitto-org.md b/www/posts/2010/05/mosquitto-org.md new file mode 100644 index 00000000..255044ba --- /dev/null +++ b/www/posts/2010/05/mosquitto-org.md @@ -0,0 +1,14 @@ + + +I'm pleased to annouce that the mosquitto website is now available at + so please update your bookmarks! I'll be updating the +links here in a few days when the change has propagated. diff --git a/www/posts/2010/05/mqtt-push-on-android.md b/www/posts/2010/05/mqtt-push-on-android.md new file mode 100644 index 00000000..7498f02d --- /dev/null +++ b/www/posts/2010/05/mqtt-push-on-android.md @@ -0,0 +1,18 @@ + + +If you want to use MQTT for push in Android apps, you'll probably want to head +over to Anton L's blog post [How to Implement Push Notifications for Android]. +He has a sample Android app that uses the IBM Java library to implement push +notifications using MQTT, as well as a web page solution to demo pushing +notifications to your phone. + +[How to Implement Push Notifications for Android]: http://tokudu.com/2010/how-to-implement-push-notifications-for-android/ diff --git a/www/posts/2010/05/mqtt-wiki.md b/www/posts/2010/05/mqtt-wiki.md new file mode 100644 index 00000000..8c89b266 --- /dev/null +++ b/www/posts/2010/05/mqtt-wiki.md @@ -0,0 +1,14 @@ + + +A new wiki has been created, devoted to MQTT. If you want to share what you're +doing with MQTT and how to do it, or want to find any of that out, head over to +. diff --git a/www/posts/2010/05/version-0-6-1-released.md b/www/posts/2010/05/version-0-6-1-released.md new file mode 100644 index 00000000..c4a51a33 --- /dev/null +++ b/www/posts/2010/05/version-0-6-1-released.md @@ -0,0 +1,16 @@ + + +This fixes an important bug that didn't get caught for 0.6 that can prevent old +database versions being upgraded. + +From 0.7 onwards, mosquitto will be using release candidates to ensure this +kind of problem doesn't occur in the future. diff --git a/www/posts/2010/05/version-0-6-released.md b/www/posts/2010/05/version-0-6-released.md new file mode 100644 index 00000000..0c1f83de --- /dev/null +++ b/www/posts/2010/05/version-0-6-released.md @@ -0,0 +1,53 @@ + + +This is a new features release. It offers quite a bit of change over the +previous version. More details of the new features can be found in the +[man pages]. + +The substantial changes are: + + * Basic support for connecting multiple MQTT brokers together (bridging). + * mosquitto_sub can now subscribe to multiple topics (limited to a global + QoS). + * mosquitto_pub can now send a file as a message. + * mosquitto_pub can now read all of stdin and send it as a message. + * mosquitto_pub can now read stdin and send each line as a message. + * Implement a more efficient database design, so that only one copy of each + message is held in the database, rather than one per subscribed client. + * Add support for automatic upgrading of the mosquitto DB from v1 to v2. + * If a retained message is received with a zero length payload, the retained + message for that topic is deleted. + * Implement the `max_inflight_messages` and `max_queued_messages` features in + the broker. + +The less visible features and bug fixes are as follows: + + * Add support for disabling `clean session` for the sub client. + * mosquitto will now correctly run VACUUM on the persistent database on exit. + * Add the `store_cleanup_interval` config option for dealing with the internal + message store. + * Add `persistence_file` config option to allow changing the filename of the + persistence database. This allows multiple mosquitto DBs to be stored in the + same location whilst keeping `persistence_location` compatible with rsmb. + * Don't store QoS=0 messages for disconnected clients. Fixes bug #572608. This + wasn't correctly fixed in version 0.5. + * Don't disconnect clients if they send a PUBLISH with zero length payload + (bug #573610). + * Send through zero length messages. + * Produce a warning on unsupported rsmb options instead of quitting. + * Describe clean session flag in the mqtt man page. + +Get it from the [download page]. Windows and Ubuntu binaries will follow along +shortly. + +[man pages]: /documentation +[download page]: /download diff --git a/www/posts/2010/06/automation-has-the-oven-warmed-up-yet.md b/www/posts/2010/06/automation-has-the-oven-warmed-up-yet.md new file mode 100644 index 00000000..e5560414 --- /dev/null +++ b/www/posts/2010/06/automation-has-the-oven-warmed-up-yet.md @@ -0,0 +1,86 @@ + + +In the Bang Goes the Theory episode [The Human Power Station] a family of four +people had their electricity supplied by a large group of cyclists on cycles +hooked up to generators, the point being to highlight the amount of energy that +is used and wasted on a daily basis. There's a video on [youtube]. + +One example that seemed to waste a lot of energy was cooking roast dinner. The +oven was turned on to preheat (this is often the first instruction in a +recipe), but it wasn't actually used until a significant time later, wasting a +lot of energy. An example which may be more common is turning the oven on to +preheat before cooking frozen food (which requires no preparation), then +forgetting to check to see if it has preheated. + +This used to happen to me, but I've solved the problem by using my electricity +monitor (I have an electric oven), mqtt and asterisk. + +First off, we need to monitor electricity usage. I do this with a [CurrentCost] +CC128 (note that EON customers in the UK can apply to get one of these for free +in an [Energy Fit] pack) hooked up to a low power computer that is running +mosquitto. If you're running Linux, you can use [cc128_read.py] or +[cc128_read.pl] to read the data coming from the monitor and publish it to an +mqtt broker. A second client, [cc128_parse.pl], takes the data from the monitor +and republishes it to the broker in a friendlier format - the Unix timestamp of +the reading and the power usage, separated by a single space. + +To figure out when the oven has warmed up, I look at the electricity usage with +the oven heater on - approximately 2.4kW. If the energy usage drops below this +value, I know that the oven heater has turned off and so the oven has warmed +up. This is of course slightly simplistic - I'm not actually measuring the +oven, just the electricity usage so if I turned on the kettle at the same time +it could cause my guess to be incorrect. When CurrentCost produce their +individual appliance monitors, I'll be able to be certain of how much +electricity just the oven is using. + +This uncertainty means that I only want to turn the oven monitor on when I've +actually turned the oven on. Looking for an easy way to start the monitor, I +spotted my house phone - a Siemens C460IP - which is a "normal" land line phone +and an IP phone all in one. I've got Asterisk running on the same server as +mosquitto, so it's an ideal solution for controlling things. Configuring +Asterisk is way beyond the scope of this text, so I'm only going to talk about +the bits I changed. I added a new extension number 100 which, when called, +starts the oven monitor: + +``` +exten => 100,1,Answer() +exten => 100,n,System(echo "/usr/local/bin/oven_pub.pl" | at now) +exten => 100,n,Playback(oven-trigger) +exten => 100,n,Hangup +``` + +This answers the call, starts the monitor, plays a sound clip so the person +calling knows what has happened and then hangs up. I'm using the "at" command +here as a simple way of putting the job into the background, thanks to [Ed] for +the suggestion. The script [oven_monitor.pl] looks for the electricity usage to +drop beneath 2kW, then runs `oven_warmed_up.sh` and exits. + +The final step is to do something in [oven_warmed_up.sh] to give feedback. I +make use of asterisk once again and initiate a call to the phone - so when the +oven has warmed up I get a phone call with a message that tells me so. The +outgoing call is initiated by moving [oven.call] to +/var/spool/asterisk/outgoing/, as shown in the script. + +Do you have any suggestions on how to improve this? Or other ways of using +asterisk or mqtt like this? Let me know in the comments! + +[The Human Power Station]: http://www.bbc.co.uk/programmes/b00p8469 +[youtube]: http://www.youtube.com/watch?v=C93cL_zDVIM +[CurrentCost]: http://www.currentcost.com/ +[Energy Fit]: http://www.eon-uk.com/media/energyfit.aspx +[cc128_read.py]: http://bitbucket.org/oojah/mosquitto/src/tip/misc/currentcost/cc128_read.py +[cc128_read.pl]: http://bitbucket.org/oojah/mosquitto/src/tip/misc/currentcost/cc128_read.pl +[parse.pl]: http://bitbucket.org/oojah/mosquitto/src/tip/misc/currentcost/cc128_parse.pl +[Ed]: http://twitter.com/ribzlike +[oven_monitor.pl]: /files/examples/oven-asterisk/oven_monitor.pl +[oven_warmed_up.sh]: /files/examples/oven-asterisk/oven_warmed_up.sh +[oven.call]: /files/examples/oven-asterisk/oven.call diff --git a/www/posts/2010/06/google-powermeter-step-by-step.attachments.json b/www/posts/2010/06/google-powermeter-step-by-step.attachments.json new file mode 100644 index 00000000..47fe3d81 --- /dev/null +++ b/www/posts/2010/06/google-powermeter-step-by-step.attachments.json @@ -0,0 +1 @@ +{"54": {"wordpress_user_name": "roger", "title": "powermeter-example", "date_utc": "2010-06-15 13:52:24", "files_meta": [{"height": 292, "width": 632}, {"height": 138, "size": "medium", "width": 300}, {"height": 150, "size": "thumbnail", "width": 150}], "files": ["/wp-content/uploads/2010/06/powermeter-example.png", "/wp-content/uploads/2010/06/powermeter-example-300x138.png", "/wp-content/uploads/2010/06/powermeter-example-150x150.png"]}} \ No newline at end of file diff --git a/www/posts/2010/06/google-powermeter-step-by-step.md b/www/posts/2010/06/google-powermeter-step-by-step.md new file mode 100644 index 00000000..0c78ca9c --- /dev/null +++ b/www/posts/2010/06/google-powermeter-step-by-step.md @@ -0,0 +1,177 @@ + + +# Note: Google Powermeter is now defunct but this post will remain here for those interested. + +This is a follow up to my previous [post on using Google Powermeter], +but this time I'm going to give a step by step guide to getting your data +uploaded. The only assumptions are that you have a CurrentCost monitor (note +that CurrentCost monitors are often rebadged by electricity suppliers such as +EON in the UK so check yours) and have already connected it to your computer, +want to use MQTT and that you're using Linux, or another Unix operating system. + +# Retrieving the data + +The first step is to get the data from the CurrentCost into the MQTT broker. +This is straightforward - simply read data from the serial port and send it all +to the broker. I have scripts to do this with mosquitto in both [perl] and +[python]. + +The data coming from the CurrentCost is in XML format and as well as providing +the real time power reading every 6 seconds, will also send historical data +periodically. I'm only going to deal with the real time readings here. The next +step is to reprocess the incoming data into something more manageable, then +republish it. An example of doing that is the script [cc128_parse.pl], which +assumes you're only using the main channel from the CurrentCost. If you have +multiple monitoring channels, you'll need to modify it to suit. + +# Logging the data + +Google limits the number of times we can send data to 6 per hour, so we have to +log the data and then send amalgamated updates. I use mysql for this - I'm +going to assume that you've got it installed and running. Log into the mysql +console using "mysql -u root",  "mysql -u root -p" if you know the password, or +possibly "sudo mysql". We're now going to create a database and table to hold +the powermeter data, then add a user to access and update the data. + +To create the database and table enter the following: + +``` +CREATE DATABASE powermeter; +USE 'powermeter'; +CREATE TABLE powermeter ( + `id` INT NOT NULL auto_increment, + `timestamp` INT NOT NULL, + `temperature` FLOAT NOT NULL DEFAULT 0.0, + `ch1` INT NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE KEY `timestamp` (`timestamp`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +``` + +Note that there's a column there for the temperature as well. + +To add the user and grant access to the database: + +``` +CREATE USER 'powermeter'@'localhost' IDENTIFIED BY '<your password>'; +GRANT ALL ON powermeter.* to 'powermeter'@'localhost'; +``` + +Finally, you'll need to get data into this database. My script +[cc128_log_mysql.pl] subscribes to the data from cc128_parse.pl and logs it +into the database. You'll need to edit it to have the correct database +details. + +If you already have your power data published to an MQTT topic, it's quite +likely that you won't have it in the same format that I use above. If this is +the case, you will need to modify cc128_log_mysql.pl. Assuming your data coming +in over MQTT is just the power reading, then you can replace this: + +``` +@vals = split(/,/, $line); +$timestamp = @vals[0]; +$temperature = @vals[1]; +$ch1 = @vals[2]; +``` + +with this: + +``` +$timestamp = time(); +$temperature = 0; +$ch1 = $line; +``` + +You can of course leave the temperature column out completely if you prefer. + +# Registering with Google Powermeter + +Before you can send any data to Google, you need to register your device with +them. This would normally be done automatically by your device, but because +we're doing things ourselves we need to do it manually. See [2cheap2meter] and +the links it provides for more details. + +We first need to decide on a few parameters for our device: + + * Manufacturer (e.g. CurrentCost) + * Device model (e.g. CC128 or Envi) + * Device id (e.g. Serial number or your own made up string, 1234) + * Number of channels to log (e.g. 1) + +We can then construct an address which you will paste into your web browser: + +``` +https://www.google.com/powermeter/device/activate?mfg=CurrentCost&model=CC128&did=1234&dvars=1 +``` + +`dvars` here is the number of channels (or monitors) that we wish to register. +If you have more than one channel logging, change the number accordingly - bear +in mind that you'll have to modify just about everything else in this post to +match. You will need to remember the values you put here for later. + +Visiting that link will take you to the activation page, which you should +complete. After you have done this, you will be presented with authorisation +information for your new device. The piece of information we need is the 32 +character string contained between "token=" and "&path" (the authorisation +token) as well as the 20 digit number after "&path=/user/" (your google +powermeter id). + +# Sending the data + +I have a script [google_powermeter_update.pl] that will query the database for +readings from the past 15 minutes and then send them. You'll need to edit the +script to put the correct database details, power meter id, authorisation token +and device details. To set it to run every fifteen minutes, I use cron. Either +add an entry to your own crontab by running "crontab -e" then entering the +following line: + +``` +*/15 * * * * /path/to/google_powermeter_update.pl > /dev/null +``` + +Or by creating a file containing the line below and copying it to +/etc/cron.d/powermeter_update.cron. + +``` +*/15 * * * * nobody /path/to/google_powermeter_update.pl > /dev/null +``` + +In both cases, you can change the output redirection from "/dev/null" to e.g. +"/tmp/powermeter" to allow you to check any error codes in case of a problem. + +Now go to to check your data! Here's +an example of mine: + +[![powermeter example](/blog/uploads/2010/06/powermeter-example-300x138.png)](/blog/uploads/2010/06/powermeter-example.png) + +# Possible changes +The above description and scripts aren't ideal - if you lose your internet +connection then data will still be recorded but won't be sent to google. One +possible change would be to add a column to the database to list whether that +particular piece of data had been sent or not, which would allow all data to +eventually be sent and deleted afterwards if desired. + +A second way around this would be to make use of the historical data that the +CurrentCost monitors use. This could also be a way of reducing the need to log +things ourselves. + +# Conclusion +I hope this is of use to you - please let me know if you have any problems with +any of the above steps. + +[post on using Google Powermeter]: /blog/2010/03/google-powermeter/ +[perl]: http://bitbucket.org/oojah/mosquitto/src/tip/misc/currentcost/cc128_read.pl +[python]: http://bitbucket.org/oojah/mosquitto/src/tip/misc/currentcost/cc128_read.py +[cc128_parse.pl]: http://bitbucket.org/oojah/mosquitto/src/tip/misc/currentcost/cc128_parse.pl +[cc128_log_mysql.pl]: http://bitbucket.org/oojah/mosquitto/src/tip/misc/currentcost/cc128_log_mysql.pl +[2cheap2meter]: http://2cheap2meter.blogspot.com/2010/03/setting-up-google-powermeter.html +[google_powermeter_update.pl]: http://bitbucket.org/oojah/mosquitto/src/tip/misc/currentcost/google_powermeter_update.pl diff --git a/www/posts/2010/06/mosquitto-0-7rc1.md b/www/posts/2010/06/mosquitto-0-7rc1.md new file mode 100644 index 00000000..5127c826 --- /dev/null +++ b/www/posts/2010/06/mosquitto-0-7rc1.md @@ -0,0 +1,15 @@ + + +Mosquitto 0.7 release candidate 1 is available for testing. Please give it a +try and report back any problems you find. The source code is available at  + and I'll hopefully have various +binaries available soon. diff --git a/www/posts/2010/06/version-0-7-released.md b/www/posts/2010/06/version-0-7-released.md new file mode 100644 index 00000000..5674cc44 --- /dev/null +++ b/www/posts/2010/06/version-0-7-released.md @@ -0,0 +1,40 @@ + + +This is a new features release. Note that although the number of changes is +relatively small, there is a fairly major change in the network socket handling +(to allow >1024 clients) , which is one reason this has been treated as a +separate release. + +Changes: + + * Use poll() instead of select() to allow >1024 clients. + * Implement `max_connections`. + * Run VACUUM on in-memory database on receiving SIGUSR2. + * mosquitto_pub can now send null (zero length) messages. + * Add option to print debug messages in pub and sub clients. + * hg revision is now exported via $SYS/broker/changeset + * Add compile time option to disable heap memory tracking. + +Bug fixes: + + * Don't store QoS=0 messages for disconnected clients with subscriptions of QoS>0. + * accept() all available sockets when new clients are connecting, rather than just one (performance advantage) + * Send Will when client exceeds keepalive timer and is disconnected. + * Check to see if a client has a will before sending it. + * Correctly deal with clients connecting with the same id multiple times. + * Fix bridge keepalive timeouts and reconnects. + * Don't attempt to drop root privileges when running on Windows as this isn't well supported (bug #586231). + +Source downloads are available at the [download page] Links for binary packages +on Ubuntu and Fedora can be found on the same page. + +[download page]: /download diff --git a/www/posts/2010/07/mosquitto-on-opensuse-11-3.md b/www/posts/2010/07/mosquitto-on-opensuse-11-3.md new file mode 100644 index 00000000..fda39827 --- /dev/null +++ b/www/posts/2010/07/mosquitto-on-opensuse-11-3.md @@ -0,0 +1,20 @@ + + +The upcoming release of [openSUSE], version 11.3, includes extension support +for sqlite3 which means it now has everything required for mosquitto. + +I've created packages for this new version of openSUSE and details can be found +on the [download page]. You just need to wait three days until the release of +11.3! + +[openSUSE]: http://www.opensuse.org/ +[download page]: /download diff --git a/www/posts/2010/07/mqtt-client-library.md b/www/posts/2010/07/mqtt-client-library.md new file mode 100644 index 00000000..70bf50a6 --- /dev/null +++ b/www/posts/2010/07/mqtt-client-library.md @@ -0,0 +1,30 @@ + + +I have been working on a client library for MQTT for the next release of +Mosquitto. It is now at a stage where it is usable and ready for wider testing. +There isn't any documentation yet (!) so it's only available in the source +repository at . Use the "get source" link +in the top right corner of the page to download a snapshot. If you're +interested in developing your own open source MQTT clients, it'd be great if +you could take a look to make sure the interface is sane before I make a +release! + +The library itself is written in C, with bindings for C++ and Python. + +I plan to package it up in a more easy to access form in the not too distant +future, hopefully with some documentation as well. + +# Update +I've put the start of a man page online, which shows an example of using +libmosquitto to subscribe to a topic and print the results: [libmosquitto.3]. + +[libmosquitto.3]: http://mosquitto.org/man/libmosquitto-3.html diff --git a/www/posts/2010/08/compiling-mosquitto-on-mac-os-x.md b/www/posts/2010/08/compiling-mosquitto-on-mac-os-x.md new file mode 100644 index 00000000..dd92102e --- /dev/null +++ b/www/posts/2010/08/compiling-mosquitto-on-mac-os-x.md @@ -0,0 +1,19 @@ + + +In a follow up to his screencast [demoing mosquitto on Mac OS X], Andy Piper +has written a blog post detailing how he got compiled mosquitto and, more +importantly, the dependencies, on the Mac. + +Take a look over at [OS X mosquitto "bites"...] + +[demoing mosquitto on Mac OS X]: /blog/2010/08/mosquitto-running-on-mac-os-x/ +[OS X mosquitto "bites"...]: http://andypiper.co.uk/2010/08/08/os-x-mosquitto-bites/ diff --git a/www/posts/2010/08/mosquitto-running-on-mac-os-x.md b/www/posts/2010/08/mosquitto-running-on-mac-os-x.md new file mode 100644 index 00000000..bf61f23f --- /dev/null +++ b/www/posts/2010/08/mosquitto-running-on-mac-os-x.md @@ -0,0 +1,18 @@ + + +Andy Piper has put together a 2 minute screencast demoing mosquitto running on +Mac OS X and showing publishing and subscribing using the mosquitto command +line clients and the IBM java gui client. + +View the screen cast here: . + +Thanks Andy! diff --git a/www/posts/2010/08/mqtt-v3-1.md b/www/posts/2010/08/mqtt-v3-1.md new file mode 100644 index 00000000..512bc46a --- /dev/null +++ b/www/posts/2010/08/mqtt-v3-1.md @@ -0,0 +1,25 @@ + + +The MQTT v3 spec has been updated to v3.1. The significant change is the +inclusion of the option to send a username and password as part of the connect +command. The new spec is available at + +and is a lot more readable and clear than the original. + +Mosquitto will support the v3.1 spec in a future release, along with the +ability to control both broker and topic access by username. In the meantime, +if you need this functionality, the IBM proprietary [RSMB] broker may be +suitable for testing purposes. The RSMB package now also includes an MQTT +client library, a simple publish client and a simple subscribe client, just +like mosquitto. Be sure to check the license terms before using it! + +[RSMB]: http://www.alphaworks.ibm.com/tech/rsmb diff --git a/www/posts/2010/08/version-0-8-1-released.md b/www/posts/2010/08/version-0-8-1-released.md new file mode 100644 index 00000000..4881131d --- /dev/null +++ b/www/posts/2010/08/version-0-8-1-released.md @@ -0,0 +1,40 @@ + + +This is a minor release. The primary reason for it is the amount of interest in +the Python interface to libmosquitto. This release tidies up the Python +interface considerably (it is now more "Pythonic" and easier to use), and +significantly, brings the promised packages. + +This release also provides a few fixes, including to the packaging and +installation scripts. Unfortunately, it does also include a known bug that was +fixed prior to release, but accidentally left unmerged. This affects +mosquitto_pub client when using the -l option (publish line by line input from +stdin), causing it to exhibit high cpu load. I'll make a new bug fix release in +a few days with this and any other fixes that come up. + +This release also provides improved packaging options. All of the available +options are now packaged for Ubuntu, including the libmosquitto0-python +package. Because there are now multiple packages, it is possible to provide +some mosquitto functionality on distributions where the version of sqlite3 is +too old. The packages available on these systems are listed as "clients only": + + * Fedora 12, 13 (full support) + * openSUSE 11.3 (full support) + * openSUSE 11.1, 11.2 (clients only) + * Redhat Enterprise Linux 5 (clients only) + * CentOS 5 (clients only) + +Details are available on the [download page]. Please note that some +distributions have different naming schemes, so the Python module can be called +both python-mosquitto and libmosquitto0-mosquitto for example. + +[download page]: /download diff --git a/www/posts/2010/08/version-0-8-2.md b/www/posts/2010/08/version-0-8-2.md new file mode 100644 index 00000000..8be441a5 --- /dev/null +++ b/www/posts/2010/08/version-0-8-2.md @@ -0,0 +1,26 @@ + + +This is a bugfix release. + + * Fix default loop() timeout value in mosquitto.py. Previous value was 0, + causing high cpu load. + * Fix message handling problem in client library when more than one message + was in the client queue. + * Fix the logic used to determine whether a QoS>0 message needs to be + retried. + * Fix the Python sub.py example so that it quits on error. + +See the [download page]. Includes Windows 32-bit binaries for the broker +compiled with Cygwin, and the client library and clients compiled natively with +Visual Studio to allow developing native Windows MQTT clients. + +[download page]: /download diff --git a/www/posts/2010/08/version-0-8-released.md b/www/posts/2010/08/version-0-8-released.md new file mode 100644 index 00000000..e360d2bf --- /dev/null +++ b/www/posts/2010/08/version-0-8-released.md @@ -0,0 +1,74 @@ + + +This is the library release. There are a few bug fixes and changes of behaviour +for the mosquitto and the clients, but the significant part of this release is +the new mosquitto MQTT client library. The library comes in three flavours: the +C library, which is the main library, and C++ and Python bindings. If you're +interested in helping add bindings for your favourite language, please get in +touch. + +The library interface (API) is to be considered experimental, although I +believe the C and C++ APIs to be complete and sane. The Python bindings are a +naïve attempt by a C programmer and will definitely be changing in the future +to something more pythonic. I'd be extremely grateful for help from experienced +python programmers to this end. + +The documentation of the library is currently ongoing... There is an overview +of most of the function calls and an example in the [libmosquitto.3] man page, +but complete coverage can be found in the mosquitto.h man page. This, combined +with the class details in mosquittopp.h can be used to help use the C++ +library. The python module isn't documented due to it's extremely changeable +state, but there is an example in the python directory. + +Other changes: + + * Topics starting with a / are treated as distinct to those not starting with + a /. For example, /topic/path is different to topic/path. This matches the + behaviour of rsmb. + * Correctly calculate the will QoS on a new client connection (bug #597451). + * Add "addresses" configuration file variable as an alias of "address", for + better rsmb compatibility. + * Bridge `clean_session` setting is now false, to give more sensible behaviour + and be more compatible with rsmb. + * Add `cleansession` variable for configuring bridges. + * Add `keepalive_interval` variable for bridges. + * Remove default topic subscription for mosquitto_sub because the old + behaviour was too confusing. + * Added a C client library, which the pub and sub clients now use. + * Added a C++ client library (bound to the C library). + * Added a Python client library (bound to the C library). + * Added CMake build scripts to allow the library and clients (not the broker) + to be compiled natively on Windows. + +Get it from the [download page]. + +The change to using a library means that packaging mosquitto for distros is a +lot more complex. This is stretching my packaging experience, so please bear +with me on that front! Mosquitto will now likely consist of a number of +different packages on Ubuntu at least: + + * mosquitto (the broker) + * mosquitto-clients (mosquitto_sub, mosquitto_pub) + * libmosquitto0 (C library) + * libmosquitto0-dev (C library development files) + * libmosquittopp0 (C++ library) + * libmosquittopp0-dev (C++ library development files) + * libmosquitto-python (Python binding) + +# Update +I've been getting a few questions about the python interface. This isn't +currently packaged for Ubuntu, but hopefully will be soon. There are basic +python examples in the downloads at lib/python/sub.py and +misc/currentcost/gnome-panel/CurrentCostMQTT.py + +[libmosquitto.3]: /man/libmosquitto-3.html +[download page]: /download diff --git a/www/posts/2010/09/debian-packages.md b/www/posts/2010/09/debian-packages.md new file mode 100644 index 00000000..8738e555 --- /dev/null +++ b/www/posts/2010/09/debian-packages.md @@ -0,0 +1,18 @@ + + +I've created some packages for Debian on i386 and amd64. They can be found at +. They are almost identical to the +Ubuntu packages (Debian doesn't use upstart, so there is a different init +script), but compiled against Debian testing (Squeeze) instead. This is because +Debian 5 (Lenny) doesn't include a recent enough version of sqlite3. + +Please let me know if you have any problems with the packages. diff --git a/www/posts/2010/09/mqtt-with-php.md b/www/posts/2010/09/mqtt-with-php.md new file mode 100644 index 00000000..97f11983 --- /dev/null +++ b/www/posts/2010/09/mqtt-with-php.md @@ -0,0 +1,23 @@ + + +Using MQTT in PHP has been possible for a long time using the [Simple +Asynchronous Messaging] MQTT class. Unfortunately this is an imperfect solution +due to unclear licensing, some slightly dubious design decisions and bugs. + +Thankfully, [Andrew Milstead] has started creating an alternative +implementation. It is MIT licensed and available on [github]. It's very new, so +if you have problems check back to see if there have been updates and then let +Andrew know. + +[Simple Asynchronous Messaging]: http://project-sam.awardspace.com/ +[Andrew Milstead]: http://twitter.com/bluerhinos +[github]: http://github.com/bluerhinos/phpMQTT diff --git a/www/posts/2010/10/man-page-translations.md b/www/posts/2010/10/man-page-translations.md new file mode 100644 index 00000000..b42f3117 --- /dev/null +++ b/www/posts/2010/10/man-page-translations.md @@ -0,0 +1,27 @@ + + +Something that is very much in the back of my mind whilst developing mosquitto +is that it should have support for language translations. I've been reluctant +to start this effort until development was a little bit more settled, to avoid +wasting translators time. I think it's now time to start the ball rolling. + +I'm going to approach this in two stages - the man pages and the programs. Man +pages are first. I've imported the translation templates to launchpad, so if +your native tongue is anything other than English and you'd like to translate +them - please go ahead. I'll be putting any translated man pages (with credits +:) into the upcoming 0.9 release. I think I've finished making changes but if I +haven't, the one most likely to change is for mosquitto.conf + +The translation page can be found at + +Thanks in advance, and please get in touch if you find any strings that don't +make sense. diff --git a/www/posts/2010/10/one-year-old.md b/www/posts/2010/10/one-year-old.md new file mode 100644 index 00000000..3938f330 --- /dev/null +++ b/www/posts/2010/10/one-year-old.md @@ -0,0 +1,28 @@ + + +On the 25th October 2009, at 21:40:51 (just five hours and forty minutes after +the first [oggcamp] ended :), I made the first commit to what would become the +mosquitto source code repository. Although there was no code committed until +the next day, and the first release wasn't until almost six weeks later, I +consider this to be when mosquitto was born. It's been a good year. Thanks to +everybody who has helped out and been in touch! + +I had hoped to release version 0.9 today, but it isn't to be. Nevertheless, I +hope you'll join me in hoping for an even more successful year ahead. I'm +aiming for a 1.0 release before this time next year with full MQTT 3.1 support, +full rsmb feature set (except where inappropriate), IPv6 support, SSL support, +language translation for the programs and man pages, full API documentation and +examples, and whatever I think of in the meantime. + +Have a feature you're particularly interested in? Leave a comment! :) + +[oggcamp]: http://oggcamp.org/ diff --git a/www/posts/2010/10/version-0-8-3-released.md b/www/posts/2010/10/version-0-8-3-released.md new file mode 100644 index 00000000..202bfd5f --- /dev/null +++ b/www/posts/2010/10/version-0-8-3-released.md @@ -0,0 +1,20 @@ + + +This is a bugfix release. + + * Fix compliance with the MQTT protocol for messages published at QoS 2. This + means that messages that time out are dealt with correctly and duplicate + messages are also dealt with correctly. + +See the [download page] for the update. + +[download page]: /download diff --git a/www/posts/2010/11/distro-packaging.md b/www/posts/2010/11/distro-packaging.md new file mode 100644 index 00000000..a139da2f --- /dev/null +++ b/www/posts/2010/11/distro-packaging.md @@ -0,0 +1,37 @@ + + +Starting with version 0.9, I plan on getting mosquitto packaged in the major +Linux distributions. By this I mean Debian, Fedora, openSUSE and Ubuntu.  This +is my understanding of the current state of play of those distributions. Feel +free to correct me! + + * Debian is currently in freeze for the Squeeze release. Mosquitto will have + to go into Squeeze+1, although it can still be uploaded to Unstable. + * Fedora 14 has just been released, Fedora 15 will have feature freeze on the + 8th of February. + * openSUSE 11.4 will have feature freeze at the start of December. + * Ubuntu 11.04 has its Debian import freeze on the 30th of December and + feature freeze on 24th of February. + +The plan is therefore to release 0.9 around the 14th of November and aim to be +packaged for Debian unstable before 30th of December and openSUSE before the +start of December, with packaging for Fedora 15 coming at some point later. If +packaging for Debian unstable isn't possible before the Ubuntu import freeze, +then package for Ubuntu separately. + +If you can help out with the packaging process for any of the above, I'd love +to hear from you. If your distribution isn't included and you'd like it to be, +get in touch as well and we'll see what's possible. + +Finally, this won't stop me producing Ubuntu PPA or openSUSE build service +packaged binaries for those that prefer to stay at the cutting +edge. diff --git a/www/posts/2010/11/mosquitto-0-9test2.md b/www/posts/2010/11/mosquitto-0-9test2.md new file mode 100644 index 00000000..6be6932c --- /dev/null +++ b/www/posts/2010/11/mosquitto-0-9test2.md @@ -0,0 +1,43 @@ + + +Mosquitto 0.9, which I hope to release mid November, represents the most +significant change to mosquitto to date - the removal of sqlite as an absolute +dependency. In addition, this removes the dependency on the sqlite3-pcre +extension and on pcre. This gives a definite performance improvement, reduces +the amount of object code that needs loading by around 95%, reduces memory +usage and also makes it lots easier to compile on more unusual systems. + +It's quite a substantial change though, so I've made a test release to +hopefully get some external testing. If you could give it a try and report back +that'd be great. The source is at . +(use the highest numbered version available). There are also Ubuntu packages +available at the [mosquitto-expt ppa] and binaries for Fedora, Mandriva,  SLES +and openSUSE at the [openSUSE build service]. If you'd like binaries for other +systems, please get in touch. + +Note that this is a test release, not a release candidate - there are +definitely things that still need changing. The following list shows the points +I'm currently aware of: + + * Old style sqlite will be imported when the option is compiled in (enabled by + default). This import currently only imports retained messages and durable + subscriptions, but not queued messages. + * ~~The `max_inflight_messages` and `max_queued_messages` config options are + ignored and no maximum is applied.~~ + * ~~The CMake compilation scripts aren't updated.~~ + +# Update +I've uploaded test3 with a python fix, updated CMake scripts and fixed +`max_inflight_messages` and `max_queued_mesages`. + +[mosquitto-expt ppa]: https://launchpad.net/~mosquitto-dev/+archive/mosquitto-expt +[openSUSE build service]: https://build.opensuse.org/project/show?project=home%3Aoojah%3Amqtt_expt diff --git a/www/posts/2010/11/version-0-9-released.md b/www/posts/2010/11/version-0-9-released.md new file mode 100644 index 00000000..2361001a --- /dev/null +++ b/www/posts/2010/11/version-0-9-released.md @@ -0,0 +1,82 @@ + + +This is a features release. It is probably the most significant change for +mosquitto so far. + +The important change is the removal of the sqlite dependency, along with the +associated pcre and sqlite3-pcre dependencies. This results in better +performance both in terms of messages handled per second and memory usage. +Optional support for importing existing persistent databases in sqlite3 format +is provided, with the option compiled in by default. This will be set to not be +compiled by default in 0.10 and then removed in 0.11. + +This release also provides support for the recently updated MQTT v3.1 spec - +most notably offering username/password authentication support. The client +library and clients have full v3.1 support. The broker is fully compatible with +v3.1, but doesn't provide any mechanism for controlling username/password +control. This will come in 0.10. + +One goal of mosquitto is to be a drop in replacement for the IBM rsmb broker. +Another goal is to do more than rsmb :) I'm still working on the first goal, +but this release helps with the second as mosquitto now has IPv6 support, which +isn't supported in rsmb. + +A detailed list of changes is given below: + + * Client and message data is now stored in memory with custom routines rather + than a sqlite database. This removes the dependencies on sqlite, pcre and + sqlite3-pcre. It also means that the persistent database format has had to + be reimplemented in a custom format. Optional support for importing old + sqlite databases is provided. + * Added IPv6 support for mosquitto and the clients. + * Provide username and password support for the clients and client libraries. + This is part of the new MQTT v3.1 spec. + * The broker supports the username and password connection flags, but will not + do anything with the username and password. + * Python callback functions now optionally take an extra argument which will + return the user object passed to the `Mosquitto()` constructor, or the calling + python object itself if nothing was given to `Mosquitto()`. + * Remove the mosquitto command line option `-i interface`. + * Remove the mosquitto.conf "interface" variable. + * Add support for the listener config variable (replaces the interface + variable) + * Add support for the `bind_address` config variable. + * Change the port config variable behaviour to match that of rsmb (applies to + the default listener only, can be given just once). + * Fix QoS 2 protocol compliance - stop sending duplicate messages and handle + timeouts correctly. Fixes bug #598290. + * Set retain flag correctly for outgoing messages. It should only be set for + messages sent in response to a subscribe command (ie. stale data). + * Fix bug in returning correct CONNACK result to `on_connect` client callback. + * Don't send client will if it is disconnected for exceeding its keepalive + timer. + * Fix client library unsubscribe function incorrectly sending a SUBSCRIBE + command when it should be UNSUBSCRIBE. + * Fix `max_inflight_messages` and `max_queued_messages` operation. These + parameters now apply only to QoS 1 and 2 messages and are used regardless of + the client connection state. + * mosquitto.conf now installed to /etc/mosquitto/mosquitto.conf instead of + /etc/mosquitto.conf. The /etc/mosquitto/ directory will be used for password + and access control files in the future. + * Give the compile time option of using 32-bit integers for the database IDs + instead of 64-bit integers. This is useful where htobe64()/be64toh() are not + available or for embedded systems for example. + * The DUP bit is now set correctly when resending PUBREL messages. + * A port to Windows native has been partially completed. This currently drops + a number of features, including the ability to change configuration + parameters and persistent storage. + +See the [download page] for the update. Debian and Ubuntu users should note +that the package libmosquitto0-python has been renamed python-mosquitto to +comply with Debian naming policies. The Debian packages aren't yet ready. + +[download page]: /download diff --git a/www/posts/2010/12/version-0-9-1-released.md b/www/posts/2010/12/version-0-9-1-released.md new file mode 100644 index 00000000..175771b2 --- /dev/null +++ b/www/posts/2010/12/version-0-9-1-released.md @@ -0,0 +1,20 @@ + + +This is a bugfix release. + + * Add missing code for parsing the `bind_address` configuration option. + * Fix missing include when compiling with tcp-wrappers support. + * Add linker version script for C library to control exported functions. + +Source code is on the [download page], binary packages will follow on later. + +[download page]: /download diff --git a/www/posts/2011/01/mosquitto-for-slackware.md b/www/posts/2011/01/mosquitto-for-slackware.md new file mode 100644 index 00000000..7da7f8a6 --- /dev/null +++ b/www/posts/2011/01/mosquitto-for-slackware.md @@ -0,0 +1,20 @@ + + +Chris Willing of the University of Queensland has very kindly put together some +mosquitto packages for Slackware 13.0 and 13.1 as well as instruction on how to +build your own packages. + +The packages and instructions are here: + I've also put the link on +the downloads page. + +Thanks Chris! diff --git a/www/posts/2011/01/mqtt-news.md b/www/posts/2011/01/mqtt-news.md new file mode 100644 index 00000000..22aea908 --- /dev/null +++ b/www/posts/2011/01/mqtt-news.md @@ -0,0 +1,26 @@ + + +Here are some MQTT updates from out there on the internet: + +A new perl client implementation by Mark Hindess + + * + +A [homebrew] recipe for installing mosquitto on Mac by Adam Rudd + + * + +MQTT implemented for the mbed processor by Yiluin Fan + + * + +[homebrew]: http://brew.sh/ diff --git a/www/posts/2011/02/lightweight-messaging-and-linux.md b/www/posts/2011/02/lightweight-messaging-and-linux.md new file mode 100644 index 00000000..b04e3077 --- /dev/null +++ b/www/posts/2011/02/lightweight-messaging-and-linux.md @@ -0,0 +1,19 @@ + + +Andy Piper was at [Linux Conf Australia] this year and gave a talk on MQTT. + +His blog post Lightweight Messaging and Linux] gives a few details and has a +link to the slides. The video can be seen at + + +[Linux Conf Australia]: http://linux.conf.au/ +[Lightweight Messaging and Linux]: http://andypiper.co.uk/2011/01/28/lightweight-messaging-and-linux/ diff --git a/www/posts/2011/02/mosquitto-on-maemo.md b/www/posts/2011/02/mosquitto-on-maemo.md new file mode 100644 index 00000000..c5714539 --- /dev/null +++ b/www/posts/2011/02/mosquitto-on-maemo.md @@ -0,0 +1,16 @@ + + +Yuvraaj Kelkar got in touch to say he's packaged up mosquitto and the client +libraries for Maemo. If you want to use MQTT on your Maemo device then take a +look at the details on + +Thanks Yuvraaj! diff --git a/www/posts/2011/02/mqtt-on-android.md b/www/posts/2011/02/mqtt-on-android.md new file mode 100644 index 00000000..ec423dfa --- /dev/null +++ b/www/posts/2011/02/mqtt-on-android.md @@ -0,0 +1,18 @@ + + +Dale Lane has written an enormous blog post [Using MQTT in Android Mobile +Applications in which he talks about a lot of the points you are likely to want +to consider if you're writing MQTT applications for Android. There's lots of +useful information and he even includes a complete source code +implementation. + +[Using MQTT in Android Mobile Applications]: http://dalelane.co.uk/blog/?p=1599 diff --git a/www/posts/2011/02/version-0-9-2-released.md b/www/posts/2011/02/version-0-9-2-released.md new file mode 100644 index 00000000..b70ff455 --- /dev/null +++ b/www/posts/2011/02/version-0-9-2-released.md @@ -0,0 +1,31 @@ + + +This is a bugfix release: + + * Only send a single DISCONNECT command when using -l in the pub client. + * Set QoS=1 on PUBREL commands to meet protocol spec. + * Don't leak sockets on connection failure in the library. + * Install man pages when building under cmake. + * Fix crash bug on malformed CONNECT message. + * Clients are now rejected if their socket peer name cannot be obtained on + connection. + * Fix a number of potential problems caused when a client with a duplicate id + connects. + * Install mosquitto.conf under cmake. + +Thanks to Mark Hindess, Joshua Lock, Adam Rudd and Ben Davenport for their +help. + +The source code is available as always on the [download page]. Binaries will +appear shortly. + +[download page]: /download diff --git a/www/posts/2011/03/api-documentation.md b/www/posts/2011/03/api-documentation.md new file mode 100644 index 00000000..55cc3234 --- /dev/null +++ b/www/posts/2011/03/api-documentation.md @@ -0,0 +1,19 @@ + + +I've rewritten the API documentation for the C library using the [NaturalDocs] +format. This covers the whole C library and so should give enough information +for anybody using the C++ or Python wrappers as well. + +The documentation generated from mosquitto.h is available at + + +[NaturalDocs]: http://www.naturaldocs.org/ diff --git a/www/posts/2011/03/mosquitto-in-mac-homebrew.md b/www/posts/2011/03/mosquitto-in-mac-homebrew.md new file mode 100644 index 00000000..70af6998 --- /dev/null +++ b/www/posts/2011/03/mosquitto-in-mac-homebrew.md @@ -0,0 +1,18 @@ + + +Thanks to work done by Adam Rudd, mosquitto is now available in the Mac +[homebrew](https://brew.sh) package manager. Once you've installed homebrew +(see the link), you can install mosquitto with: + +``` +brew install mosquitto +``` diff --git a/www/posts/2011/03/version-0-9-3-released.md b/www/posts/2011/03/version-0-9-3-released.md new file mode 100644 index 00000000..33cc3e38 --- /dev/null +++ b/www/posts/2011/03/version-0-9-3-released.md @@ -0,0 +1,24 @@ + + +This is a bugfix release: + + * Set retained message status for QoS 2 messages (bug #726535). + * Only abort with an error when opening listening sockets if no address family is available, rather than aborting when any address family is not available. + * Don't clean queued messages when a non clean session client reconnects. + * Make mosquitto.py compatible with Python <2.6. + * Fix mosquitto.h header includes for Windows. + +Please see the [download page]. + +Thanks to Joe B, David Monro,  Yuvraaj Kelkar and Colin Jones. + +[download page]: /download diff --git a/www/posts/2011/04/version-0-10-released.md b/www/posts/2011/04/version-0-10-released.md new file mode 100644 index 00000000..e8cfde03 --- /dev/null +++ b/www/posts/2011/04/version-0-10-released.md @@ -0,0 +1,36 @@ + + +This release brings the new MQTT v3.1 features to the broker - client +authentication and topic access control. See [mosquitto.conf(5)] or the +included example password and ACL files. + + * Implement support for the `password_file` option and accompanying + authentication requirements in the broker. + * Implement topic Access Control Lists. + * `mosquitto_will_set()` and `mosquitto_publish()` now return + `MOSQ_ERR_PAYLOAD_SIZE` if the payload is too large (>268,435,455 bytes). + * Bridge support can now be disabled at compile time. + * Group together network writes for outgoing packets - don't send single byte + writes! + * Add support for `clientid_prefixes` variable. + * Add support for the `clientid` config variable for controlling bridge client + ids. + * Remove 32-bit database ID support because htobe64() no longer used. + * Multiple client subscriptions to the same topic result in only a single + subscription. Bug #744077. + +Please see the [download page]. + +Thanks to Adam Rudd, Joshua Lock,  Sang Kyeong Nam and Yuvraaj Kelkar. + +[mosquitto.conf(5)]: /man/mosquitto-conf-5.html +[download page]: /download diff --git a/www/posts/2011/05/mqtt-ontology.md b/www/posts/2011/05/mqtt-ontology.md new file mode 100644 index 00000000..2225cbd7 --- /dev/null +++ b/www/posts/2011/05/mqtt-ontology.md @@ -0,0 +1,19 @@ + + +Mark Hindess has written a blog post titled [Home Automation Protocols: MQTT], +where he asks for suggestions on how to go forward making "a specification for +topic usage and semantics". I think this kind of work is really valuable to +make it easy to have different MQTT systems that can interoperate. If you've +got any suggestions you can make, please go and leave a comment +there. + +[Home Automation Protocols: MQTT]: http://www.temporalanomaly.com/blog/2011/05/02/home-automation-protocols:-mqtt diff --git a/www/posts/2011/05/version-0-10-1-released.md b/www/posts/2011/05/version-0-10-1-released.md new file mode 100644 index 00000000..b71723ce --- /dev/null +++ b/www/posts/2011/05/version-0-10-1-released.md @@ -0,0 +1,23 @@ + + +This is a bugfix release primarily for Windows users. + + * Fix Windows compilation. + * Fix mosquitto.py on Windows - call lib init/cleanup. + * Don't abort when connecting if given an unknown address type (assuming + an IPv4 or IPv6 address is given). + +Please see the [download page]. + +Thanks to Karl Palsson. + +[download page]: /download diff --git a/www/posts/2011/06/nanode-a-cheap-networked-arduino-clone.md b/www/posts/2011/06/nanode-a-cheap-networked-arduino-clone.md new file mode 100644 index 00000000..40ba1047 --- /dev/null +++ b/www/posts/2011/06/nanode-a-cheap-networked-arduino-clone.md @@ -0,0 +1,23 @@ + + +The arduino, the open source microcontroller board, has had MQTT support for a +long time in the form of [Nick O'Leary's arduino client]. It does however +require networking support which has traditionally provided by an add on +shield, which increases the cost of the system. + +The [Nanode] is an arduino compatible board which includes network support and +can be built for approximately the same cost as a normal arduino board. It's +still a work in progress, but is definitely worth a look if you want to use low +power MQTT capable sensors/controllers. + +[Nick O'Leary's arduino client]: http://knolleary.net/arduino-client-for-mqtt/ +[Nanode]: http://nanode.eu/ diff --git a/www/posts/2011/06/version-0-10-2-released.md b/www/posts/2011/06/version-0-10-2-released.md new file mode 100644 index 00000000..2c9ff14b --- /dev/null +++ b/www/posts/2011/06/version-0-10-2-released.md @@ -0,0 +1,26 @@ + + +This is a bugfix release. + + * Don't abort when connecting if the first connection fails. This is important + on e.g. Windows 7, where IPV6 is offered as the first choice but may not be + available. + * Deal with long logging messages properly (bug #785882). + * Fix library compilation on Symbian - no pselect() available. + * Don't stop processing subscriptions on received messages after a + subscription with # matches. (bug #791206). + +Please see the [download page]. + +Thanks again to Karl Palsson and Yuvraaj Kelkar. + +[download page]: /download diff --git a/www/posts/2011/06/version-0-11-1-released.md b/www/posts/2011/06/version-0-11-1-released.md new file mode 100644 index 00000000..068a8ee0 --- /dev/null +++ b/www/posts/2011/06/version-0-11-1-released.md @@ -0,0 +1,18 @@ + + +This is an important bugfix release. It fixes a buffer overrun that affects +0.11 only. Users of 0.11 should upgrade immediately. + + * Fix buffer overrun when checking for + and # in topics (bug #799688). + * Pub client now quits if publish fails. + +Thanks to Karl Palsson. diff --git a/www/posts/2011/06/version-0-11-2-released.md b/www/posts/2011/06/version-0-11-2-released.md new file mode 100644 index 00000000..45361b21 --- /dev/null +++ b/www/posts/2011/06/version-0-11-2-released.md @@ -0,0 +1,15 @@ + + +This is a bugfix release. + + * Don't free contexts in mqtt3_context_disconnect() (bug #799688 / #801678). + * Only free will if present when freeing a client context. diff --git a/www/posts/2011/06/version-0-11-released.md b/www/posts/2011/06/version-0-11-released.md new file mode 100644 index 00000000..75de4a38 --- /dev/null +++ b/www/posts/2011/06/version-0-11-released.md @@ -0,0 +1,43 @@ + + +This is an update with some fairly minor changes and some bug fixes. I had +planned on more exciting features but my time has been occupied getting ready +for the 25th, when I'm getting married. Those changes will just have to wait +until 0.12! + + * Removed all old sqlite code. + * Remove client id limit in clients. + * Implemented $SYS/broker/heap/maximum size + * Implemented $SYS/broker/clients/inactive to show the number of disconnected + non-clean session clients. + * $SYS/broker/heap/current size and maximum size messages now include "bytes" + to match rsmb message format. + * Implemented the `retained_persistence` config file option - a synonym of the + `persistence` option. + * Added security_external.c to broker source to make it easier for third + parties to add support for their existing username/password and ACL database + for security checks. See external_security_checks.txt. + * $SYS messages are now only republished when their value changes. + * Windows native broker now responds to command line arguments. + * Simplify client disconnecting so wills gets sent in all cases (bug #792468). + * Clients now have a `--quiet` option. + * The on_disconnect() callback will always be called now, even if the client + has disconnected unexpectedly. + * Always close persistent DB file after restoring. + * Return error code when exiting the clients. + * mosquitto_publish() now returns `MOSQ_ERR_INVAL` if the topic contains + or + # + * mosquitto now silently rejects published messages with + or # in the topic. + * `max_connections` is now a per-listener setting instead of global. + * Connection count is now reduced when clients disconnect (bug #797983). + +Thanks to Sebastian Kroll and Karl Palsson. diff --git a/www/posts/2011/07/debian-and-ubuntu-packaging.md b/www/posts/2011/07/debian-and-ubuntu-packaging.md new file mode 100644 index 00000000..be8de70e --- /dev/null +++ b/www/posts/2011/07/debian-and-ubuntu-packaging.md @@ -0,0 +1,24 @@ + + +I'm very pleased to say that Mosquitto is very nearly packaged in Debian and +Ubuntu. In truth, 0.10 is packaged and uploaded for both Debian testing +(Wheezy) and Ubuntu Oneiric Ocelot, but there is a problem with the config that +means it won't restart properly. That is fixed with the 0.11.3 upload which is +now in unstable. That means after 10 days and it will be in Debian testing for +all to use. I've also submitted a sync request with Ubuntu ([bug #808530]) +to ensure it makes it across. I'll still be maintaining the +Launchpad PPA for older versions of Ubuntu. + +Thanks to the Debian developer Michael Tautschnig for reviewing my package and +doing the upload. + +[bug #808530]: https://bugs.launchpad.net/ubuntu/+source/mosquitto/+bug/808530 diff --git a/www/posts/2011/07/lua-mqtt-client.md b/www/posts/2011/07/lua-mqtt-client.md new file mode 100644 index 00000000..99349076 --- /dev/null +++ b/www/posts/2011/07/lua-mqtt-client.md @@ -0,0 +1,21 @@ + + +Andy Gelme [reports] that his Lua MQTT client is ready for use. The downloads, +installation and usage instructions, example code and api information are all +available at . I particularly like the +image of it running on a PSP. + +Well done Andy! + +I wonder what the next language to get MQTT support will be? + +[reports]: https://twitter.com/#%21/geekscape/status/96710950979256323 diff --git a/www/posts/2011/07/mosquitto-on-qnx.md b/www/posts/2011/07/mosquitto-on-qnx.md new file mode 100644 index 00000000..488cdc5a --- /dev/null +++ b/www/posts/2011/07/mosquitto-on-qnx.md @@ -0,0 +1,24 @@ + + +Andrea asked a [question on launchpad] about problems compiling Mosquitto on +QNX. I've now managed to get an evaluation version of QNX and fix the +compilation problems. These fixes will be in 0.12, but you can get them in the +current snapshot if it's urgent. I've also put compiled binaries in the +[downloads directory] but they are completely untested, so use at your own +risk. + +Although I've provided these binaries I don't intend to keep doing so for each +version of Mosquitto. I will endeavour to fix any other problems that arise in +the future though. + +[question on launchpad]: https://answers.launchpad.net/mosquitto/+question/164154 +[downloads directory]: http://mosquitto.org/files/binary/qnx/ diff --git a/www/posts/2011/07/version-0-11-3-released.md b/www/posts/2011/07/version-0-11-3-released.md new file mode 100644 index 00000000..a55c0ad9 --- /dev/null +++ b/www/posts/2011/07/version-0-11-3-released.md @@ -0,0 +1,24 @@ + + +This is a bugfix release. + + * Don't complain and quit if `persistence_file` option is given (bug #802423). + * Initialise listeners correctly when clients with duplicate client ids + connect. Bug #801678. + * Memory tracking is now disabled for Symbian builds due to lack of malloc.h. + * Fix memory tracking compilation for kFreeBSD. + * Python callbacks can now be used with class member functions. + * Fix persistent database writing of client message chunks which caused errors + when restoring (bug #798164) + +Thanks to Neil Bothwick, Yuvraaj Kelkar, Craig Hollabaugh, Karl Palsson and +Andy Piper. diff --git a/www/posts/2011/07/version-0-12-released.md b/www/posts/2011/07/version-0-12-released.md new file mode 100644 index 00000000..343d9c78 --- /dev/null +++ b/www/posts/2011/07/version-0-12-released.md @@ -0,0 +1,39 @@ + + +This is an update with some features and and bug fixes. The most significant +change is configuration reloading support. This will be improved to include +bridge reloading in the future. + + * Reload (most) configuration on SIGHUP. + * Memory tracking is no longer compiled in the client library. + * Add `--help` option to mosquitto to display usage. + * Add `--id-prefix` option to clients to allow easier use with brokers that + are using the `clientid_prefix` option. + * Fix compilation on QNX. + * Add `-P` as a synonym argument for `--pw` in the clients. + * Fix python MosquittoMessage payload parameter. This is now returned as a + pointer to an array of c_uint8 values so binary data is handled correctly. + If a string is needed, use msg.payload_str + * Fix memory leaks on client authentication. + * If `password_file` is not defined then clients can now connect even if they  + use a username/password. + * Add mosquitto_reconnect() to the client library. + * Add option for compiling with liberal protocol compliance support (enabled + by default). + * Fix problems with clients reconnecting and old messages remaining in the + message store. + * Display both ip and client id in the log message when a client connects. + * Change the socket connection message to make it more obvious that it is just + a socket connection being made (bug #801135). + * Fix retained message delivery where a subscription contains a +. + * Be more lenient when reloading persistent database to reduce errors with + empty retained messages. diff --git a/www/posts/2011/07/wireshark-mqtt-decoder.md b/www/posts/2011/07/wireshark-mqtt-decoder.md new file mode 100644 index 00000000..7dacf830 --- /dev/null +++ b/www/posts/2011/07/wireshark-mqtt-decoder.md @@ -0,0 +1,16 @@ + + +If you're trying to debug your MQTT connection, you may be interested in +something Karl P has written - an MQTT decoder/dissector for Wireshark. It +doesn't have complete protocol support yet, but is a good start. + + * diff --git a/www/posts/2011/08/arch-linux-package.md b/www/posts/2011/08/arch-linux-package.md new file mode 100644 index 00000000..570885ba --- /dev/null +++ b/www/posts/2011/08/arch-linux-package.md @@ -0,0 +1,16 @@ + + +Gordon Pearce has packaged Mosquitto on Arch Linux through an Arch User +Repository. The package details are at + + +Thanks Gordon! diff --git a/www/posts/2011/08/facebook-using-mqtt.attachments.json b/www/posts/2011/08/facebook-using-mqtt.attachments.json new file mode 100644 index 00000000..bede6acd --- /dev/null +++ b/www/posts/2011/08/facebook-using-mqtt.attachments.json @@ -0,0 +1 @@ +{"165": {"wordpress_user_name": "roger", "title": "iphone-app", "date_utc": "2011-08-17 15:40:22", "files_meta": [{"height": 768, "width": 1024}, {"height": 225, "size": "medium", "width": 300}, {"height": 150, "size": "thumbnail", "width": 150}], "files": ["/wp-content/uploads/2011/08/image.png", "/wp-content/uploads/2011/08/image-300x225.png", "/wp-content/uploads/2011/08/image-150x150.png"]}} \ No newline at end of file diff --git a/www/posts/2011/08/facebook-using-mqtt.md b/www/posts/2011/08/facebook-using-mqtt.md new file mode 100644 index 00000000..e3004f4c --- /dev/null +++ b/www/posts/2011/08/facebook-using-mqtt.md @@ -0,0 +1,31 @@ + + +Something else that has happened recently is the announcement by Facebook that +they're using MQTT in their new [Facebook Messenger app] They've posted some +details in a [facebook-engineering blogpost] and cite the low bandwidth and +battery usage as important considerations. + +This is very exciting as an application that is potentially huge and very user +oriented (rather than "internet of things" oriented), but the really exciting +bit is if you use an iPhone under Settings and Licenses (apparently it's quite +hard to find): + + + +Thanks to Michael Rowe for getting me the screenshot and Andy Piper for +pestering Michael on my behalf. + +You should note that if you're in the UK, the Facebook Messenger app isn't +currently available. + +[Facebook Messenger app]: https://www.facebook.com/mobile/messenger +[facebook-engineering blogpost]: http://www.facebook.com/notes/facebook-engineering/building-facebook-messenger/10150259350998920 diff --git a/www/posts/2011/08/mosquitto-on-openwrt.md b/www/posts/2011/08/mosquitto-on-openwrt.md new file mode 100644 index 00000000..b3198f6f --- /dev/null +++ b/www/posts/2011/08/mosquitto-on-openwrt.md @@ -0,0 +1,31 @@ + + +Thanks to work done by Karl Palsson, Mosquitto is now available on [OpenWrt], +the embedded Linux distribution frequently used on wireless routers. This is +exciting if you want a really low power way of running an MQTT broker. It also +includes the mosquitto clients and development libraries. + +It's only in the source tree at the moment, so if you want to install it I +believe you'll have to download everything and compile it yourself. + +Update: + +Karl tells me that if you're running a binary snapshot from trunk then you can do: + +``` +opkg update +opkg install mosquitto mosquitto-client libmosquitto +``` + +You only need to build it yourself if you're running a stable binary. + +[OpenWrt]: https://openwrt.org/ diff --git a/www/posts/2011/08/mqtt-standardisation.md b/www/posts/2011/08/mqtt-standardisation.md new file mode 100644 index 00000000..772a965d --- /dev/null +++ b/www/posts/2011/08/mqtt-standardisation.md @@ -0,0 +1,14 @@ + + +IBM have announced that MQTT is to be formally standardised. If you're +interested in taking part in the process, there are full details at + diff --git a/www/posts/2011/09/version-0-13-released.md b/www/posts/2011/09/version-0-13-released.md new file mode 100644 index 00000000..0e23eddf --- /dev/null +++ b/www/posts/2011/09/version-0-13-released.md @@ -0,0 +1,40 @@ + + +This release brings some new features and fixes. Although there are no real +"killer features", this release does include some fairly significant updates. +Of particular note are the fixes to subscription wildcard matching, which now +meets the spec in all cases, the Python payload parameter being a Python string +which should make life lots easier for Python developers, the non clean-session +client fixes and related persistent database fixes. + + * Implement bridge state notification messages. + * Save client last used mid in persistent database (DB version number bumped). + * Expose message id in Python MosquittoMessage. + * It is now possible to set the topic QoS level for bridges. + * Python MosquittoMessage payload parameter is now a Python string, not a + ctypes object which makes it much easier to use. + * Fix queueing of messages for disconnected clients. The `max_queued_messages` + option is now obeyed. + * C++ library is now in its own namespace, mosquittopp. + * Add support for adding log message timestamps in the broker. + * Fix missing mosquitto_username_pw_set() python binding. + * Fix keepalive timeout for reconnecting non clean-session clients. Prevents + immediate disconnection on reconnection. + * Fix subscription wildcard matching - a subscription of +/+ will now match + against /foo + * Fix subscription wildcard matching - a subscription of foo/# will now match + * against foo + * When restoring persistent database, clients should be set to non + clean-session or their subscriptions will be immediately removed. + * Fix SUBACK payload for multiple topic subscriptions. + * Don't send retained messages when a client subscribes to a topic it is + already subscribed to. diff --git a/www/posts/2011/10/mqtt-power-usage-on-android.md b/www/posts/2011/10/mqtt-power-usage-on-android.md new file mode 100644 index 00000000..2fba6976 --- /dev/null +++ b/www/posts/2011/10/mqtt-power-usage-on-android.md @@ -0,0 +1,14 @@ + + +Stephen Nicholas has carried out some power usage analysis of MQTT on Android. +Details are at and the conclusion is +that it doesn't use much power. diff --git a/www/posts/2011/10/two.md b/www/posts/2011/10/two.md new file mode 100644 index 00000000..9f017a62 --- /dev/null +++ b/www/posts/2011/10/two.md @@ -0,0 +1,40 @@ + + +Today (just) marks the 2nd birthday of the mosquitto project. In the past year +mosquitto has undergone pretty substantial changes and improvements. Some +highlights from the year: + + * Move away from using sqlite to store data in memory and on disk, resulting + in a much more compact, better performing and *more elegant* broker + * Windows native port + * MQTT 3.1 support + * Greatly improved Python module + * Getting really close to being feature complete with respect to RSMB + * Being packaged in Debian... + * ... and Ubuntu + * The mosquitto client code being used by Facebook in their iphone app + * The numerous bugs reported, bugfixes, suggestions and general interest + displayed by people. Thanks everyone! + +Mosquitto has gone from version 0.8.3 to 0.13 - so what about next year? This +will be the year when 1.0 is released. The bar I'm setting is complete RSMB +features, with the exception of some of the more esoteric ones. At the moment +this means there are still some of the bridge features to implement and +complete configuration reloading. I'm also going to have a much improved +Windows port so there will be no need for a separate Cygwin version. At the +same time I'm making a Windows installer and allowing mosquitto to be installed +as a proper Windows service. This work should all be in 0.14. Another point for +improvement is the Python module - it could be more Pythonic than it is now. My +current plan is to have it throw exceptions rather than return integer error +values but I could do with the help of a Python expert really. + +All in all I think it should be a good year. diff --git a/www/posts/2011/11/android-mqtt-example-project.md b/www/posts/2011/11/android-mqtt-example-project.md new file mode 100644 index 00000000..45bbce78 --- /dev/null +++ b/www/posts/2011/11/android-mqtt-example-project.md @@ -0,0 +1,45 @@ + + +To celebrate the news that the IBM Java MQTT client implementation will be +released as open source, I've put together a simple Android example based on +the [MQTT service code written by Dale Lane]. I'm a beginner at both Java and +Android, so expect it to be a bit rough. + +The example displays incoming payload text on a text label. It's a complete +project that you can build and install on your phone with only a few small +changes - search for "CHANGE ME" in +src/org/mosquitto/android/mqtt/MQTTDemo.java. + +To get the project working, assuming you've already installed the android sdk, +first get the IBM Java library (see ) and put it in +<project dir>/lib then do the following: + +``` +android update project -p <path to project> +# If the update complains about build.xml - delete it and run again +cd <path to project> +ant debug +sudo adb start-server +ant installd +``` + +I'll not be at all surprised if there are problems in the project due to +different sdk or tool versions. Please comment if you find a problem. + +The project is available from +. Until the IBM +Java implementation is open source please be aware of the licence attached to +it. + +Thanks to Dale for the core Android MQTT service implementation. + +[MQTT service code written by Dale Lane]: http://dalelane.co.uk/blog/?p=1599 diff --git a/www/posts/2011/11/ibm-java-and-c-clients-to-be-open-source.md b/www/posts/2011/11/ibm-java-and-c-clients-to-be-open-source.md new file mode 100644 index 00000000..3a8fcbe2 --- /dev/null +++ b/www/posts/2011/11/ibm-java-and-c-clients-to-be-open-source.md @@ -0,0 +1,40 @@ + + +The web is currently buzzing with the announcement yesterday that IBM and +Eurotech are donating MQTT to the Eclipse Foundation. One part of this is the +new [Machine to Machine Working Group], again part of Eclipse. Another much more significant part +has been released as part of a new Eclipse open source project [Paho], which is +in the proposal stage. + +The exciting part is the "Initial contributions" section which states "The +initial code contribution to Paho will include  Java and C client-side +implementations the MQTT protocol, contributed by IBM. " + +It looks like the code will be licensed under the EPL (Eclipse Public License). +This is particularly exciting because there is currently no solid freely +available and usable implementation of MQTT in Java. + +Well done everyone at IBM for making this happen. Roll on the end of November! + +Update: + +This post on mqtt.org explains what the various announcements mean more +clearly: + +Update 2: + +Andy Piper's blog post covers things even better, along with clearing up some +of the confusions from the news releases: + + +[Machine to Machine Working Group]: http://wiki.eclipse.org/M2MIWG_charter_draft +[Paho]: http://www.eclipse.org/proposals/technology.paho/ diff --git a/www/posts/2011/11/new-linux-repositories.md b/www/posts/2011/11/new-linux-repositories.md new file mode 100644 index 00000000..26fe54cf --- /dev/null +++ b/www/posts/2011/11/new-linux-repositories.md @@ -0,0 +1,17 @@ + + +I've just added some more Linux repositories to the download page for Fedora 16 +and SLE 10, 11 and 11 SP1. + +Note that mosquitto-python isn't available on SLE 10. + +See the [download page](/download). diff --git a/www/posts/2011/11/version-0-14-1-released.md b/www/posts/2011/11/version-0-14-1-released.md new file mode 100644 index 00000000..044e2b45 --- /dev/null +++ b/www/posts/2011/11/version-0-14-1-released.md @@ -0,0 +1,14 @@ + + +This is a bugfix release. + + * Fix Python syntax errors (bug #891673). diff --git a/www/posts/2011/11/version-0-14-2-released.md b/www/posts/2011/11/version-0-14-2-released.md new file mode 100644 index 00000000..dc17bafc --- /dev/null +++ b/www/posts/2011/11/version-0-14-2-released.md @@ -0,0 +1,15 @@ + + +This is a bugfix release: + + * Add uninstall target for libs. + * Don't try to write packet whilst in a callback. diff --git a/www/posts/2011/11/version-0-14-released.md b/www/posts/2011/11/version-0-14-released.md new file mode 100644 index 00000000..84beea2a --- /dev/null +++ b/www/posts/2011/11/version-0-14-released.md @@ -0,0 +1,36 @@ + + +This is a fairly minor feature release. The major changes are the pattern +matching ACL support, the support for running directly as a Windows service and +the change to the network code to attempt to send packets immediately. The +Windows binary is now supplied as an installer rather than a zip file. + + * Add support for matching ACLs based on client id and username. + * Add a Windows installer file (NSIS based). + * Add native support for running the broker as a Windows service. This is the + default when installed using the new installer. + * Fix client count for listeners. When clients disconnect, decrement the + count. Allow `max_connections` to work again. + * Attempt to send all packets immediately upon being queued. This will result + in more immediate network communication in many cases. + * Log IP address when reporting CONNACK packets if the client id isn't yet + known. + * Fix payload length calculation in python `will_set` function. + * Fix Python publish and `will_set` functions for payload=None. + * Fix keepalive value being lost when reconnecting a client (bug #880863). + * Persistence file writing now uses portable file functions, so the Cygwin + broker build should no longer be necessary. + * Duplicate code between the client and broker side has been reduced. + * Queued messages for clients reconnecting with `clean_session=false` set were + not being sent until the next message for that client was received. This has + been fixed (bug #890724). + * Fix subscriptions to # incorrectly matching against topics beginning with / diff --git a/www/posts/2011/12/mqtt-on-nanode.md b/www/posts/2011/12/mqtt-on-nanode.md new file mode 100644 index 00000000..14559041 --- /dev/null +++ b/www/posts/2011/12/mqtt-on-nanode.md @@ -0,0 +1,27 @@ + + +[Nanode], the popular arduino-with-ethernet board started early in 2011 is +ideal for small MQTT based projects but has so far lacked an implementation of +MQTT. + +Nick O'Leary, the author of the original Arduino MQTT client, [has created a +Nanode implementation], but it [isn't quite ready for the public]. + +Nicholas Humfrey has made public some code at + that he says [still needs some work] but +supports publishing QoS 0 messages of up to 127 bytes long and subscribing to +topics with QoS 0. + +[Nanode]: http://nanode.eu/ +[has created a Nanode implementation]: https://twitter.com/#!/knolleary/status/151057575775965184 +[isn't quite ready for the public]: https://twitter.com/#!/knolleary/status/151059089881960448 +[still needs some work]: https://twitter.com/#!/njh/status/152913104446038018 diff --git a/www/posts/2011/12/version-0-14-3-released.md b/www/posts/2011/12/version-0-14-3-released.md new file mode 100644 index 00000000..d344b14f --- /dev/null +++ b/www/posts/2011/12/version-0-14-3-released.md @@ -0,0 +1,20 @@ + + +This is a bugfix release. + + * Fix potential crash when client connects with an invalid CONNECT packet. + * Fix incorrect invalid socket comparison on Windows. + * Server shouldn't crash when a message is published to foo/ when a + subscription to foo/# exists (bug #901697). + * SO_REUSEADDR doesn't work the same on Windows, so don't use it. + * Cygwin builds now support Windows service features. + * Fix $SYS/broker/bytes/sent reporting. diff --git a/www/posts/2012/01/challenge-web-based-mqtt-graphing.md b/www/posts/2012/01/challenge-web-based-mqtt-graphing.md new file mode 100644 index 00000000..649b297a --- /dev/null +++ b/www/posts/2012/01/challenge-web-based-mqtt-graphing.md @@ -0,0 +1,42 @@ + + +Thanks to a data feed courtesy of an IBM broker, [test.mosquitto.org] now +publishes information on energy generation and demand in the UK (in the energy/ +topic tree). I think this could be used as a great demonstration for coupling +MQTT and the web. + +# The challenge +Create a web based report that takes energy data from the broker over MQTT and +displays it in interesting and useful ways. Alternatively, an Android/iPhone +app would be ok, but web based is the preferred option. + +# The rules +There are no rules really. Having said that, I'd be most pleased if the end +result was something that other people could learn from. There are bonus points +for solutions that work where a web proxy is the only internet access. If you +want to use new or unusual technologies that's fine. + +# The prize +I'm afraid there is no tangible prize - I hope you'll be content with your work +being shown here and the respect of your peers. + +# Some suggestions +Google charts is definitely worth looking at for generating the actual graphs. +Some examples of what you might show are: + + * Pie chart of generation source + * Gauge of current mains frequency + * Historical graph of electricity export amount + +I look forward to any and all responses! + +[test.mosquitto.org]: http://test.mosquitto.org/ diff --git a/www/posts/2012/01/do-you-use-mqtt.md b/www/posts/2012/01/do-you-use-mqtt.md new file mode 100644 index 00000000..fbf9f1db --- /dev/null +++ b/www/posts/2012/01/do-you-use-mqtt.md @@ -0,0 +1,24 @@ + + +I saw this in the nanode irc channel: + +> I've never seen any real world projects with MQTT... it looks good though. + +So I'm looking for real world projects that use MQTT. If you've got a project +it'd be great if you could mention it in the comments. A short sentence on what +it does and how many clients you run on it - really anything you can say. If +it's a secret please still comment if you can, just be very very vague. If +you've got a blog post describing it, link that instead. I'm interested in +everything from a single temperature sensor reporting to a computer up to +millions of mobile users. + +Thanks! diff --git a/www/posts/2012/01/mosquitto-test-server.md b/www/posts/2012/01/mosquitto-test-server.md new file mode 100644 index 00000000..72889bf6 --- /dev/null +++ b/www/posts/2012/01/mosquitto-test-server.md @@ -0,0 +1,15 @@ + + +A publicly accessible Mosquitto server is now available to use. Details are at +[test.mosquitto.org] + +[test.mosquitto.org]: http:/test.mosquitto.org/ diff --git a/www/posts/2012/01/version-0-14-4-released.md b/www/posts/2012/01/version-0-14-4-released.md new file mode 100644 index 00000000..0ccd57e7 --- /dev/null +++ b/www/posts/2012/01/version-0-14-4-released.md @@ -0,0 +1,17 @@ + + +This is a bugfix release: + + * Fix local bridge notification messages. + * Fix return values for more internal library calls. + * Fix incorrect out of memory checks in library and broker. + * Never time out local bridge connections. diff --git a/www/posts/2012/02/mqtt2pachube.md b/www/posts/2012/02/mqtt2pachube.md new file mode 100644 index 00000000..5cc5bfeb --- /dev/null +++ b/www/posts/2012/02/mqtt2pachube.md @@ -0,0 +1,37 @@ + + +I've written a tool to help get data from mqtt to [pachube]. Existing pachube +libraries offer good support for updating feeds that have a single datastream +or updating all feeds in a datastream, but seem to offer limited support for +updating an arbitrary datastream on its own. This can make life difficult when +your data is coming in from sensors as individual messages. + +[mqtt2pachube] allows you to choose what mqtt subscriptions to make and then +match incoming messages by their topics to a pachube feed and datastream id. + +At the moment it is still experimental, but seems to work. It has highlighted a +shortcoming in the mosquitto client library, so requires version 0.15.90 (ie. +the in-progress work for the next release). There is no Windows support for the +moment and no binary packages either. If you are interested in giving it a try, +you will have to compile it yourself. If you need help, please get in touch. + +There are two examples of feeds created through mqtt2pachube using data from +[test.mosquitto.org] + + * [test.mosquitto.org details] + * [UK energy data - generation source percentage] + +[pachube]: http://pachube.com/ +[mqtt2pachube]: http://bitbucket.org/oojah/mqtt2pachube +[test.mosquitto.org details]: https://pachube.com/feeds/43810 +[UK energy data - generation source percentage]: https://pachube.com/feeds/47080 +[test.mosquitto.org]: http://test.mosquitto.org/ diff --git a/www/posts/2012/02/version-0-15-released.md b/www/posts/2012/02/version-0-15-released.md new file mode 100644 index 00000000..bb431d60 --- /dev/null +++ b/www/posts/2012/02/version-0-15-released.md @@ -0,0 +1,33 @@ + + +This is a feature and bugfix release. + + * Implement "once" and "lazy" bridge start types. + * Add support for $SYS/broker/clients/maximum and $SYS/broker/clients/active + topics. + * Add support for $SYS messages/byte per second received/sent topics. + * Updated mosquitto man page - $SYS hierarchy and signal support were out of + date. + * Auto generated pub/sub client ids now include the hostname. + * Tool for dumping persistent DB contents is available in src/db_dump. It + isn't installed by default. + * Enforce topic length checks in client library. + * Add new return type `MOSQ_ERR_ERRNO` to indicate that the errno variable + should be checked for the real error code. + * Add support for `connection_messages` config option. + * mosquitto_sub will now refuse to run if the -c option (disable clean + session) is given and no client id is provided. + * mosquitto_pub now gives more useful error messages on invalid input or other + error conditions. + * Fix Python `will_set()` true/True typo. + * Fix messages to topic `a/b` incorrectly matching on a subscription `a` if + another subscription `a/#` exists. diff --git a/www/posts/2012/03/quick-start-guide-for-mqtt-with-pachube.md b/www/posts/2012/03/quick-start-guide-for-mqtt-with-pachube.md new file mode 100644 index 00000000..a45a94a4 --- /dev/null +++ b/www/posts/2012/03/quick-start-guide-for-mqtt-with-pachube.md @@ -0,0 +1,132 @@ + + +Pachube (now Cosm) has recently announced beta support for publishing and +receiving data to their service using MQTT. This is great news and something I +know that a lot of people have been hoping for. Well done Pachube! + +Their documentation is at + and provides enough +information to get going if you're already familiar with MQTT. + +If you aren't familiar with MQTT, here's a few examples of how you can use the +new service. + +First off, I'm going to use the command line MQTT clients I've created to +publish and receive data. You can get these clients as part of the [mosquitto +download]. + +  +# Command Line Examples + +## Publishing Data + +``` +mosquitto_pub -h api.xively.com + -u <your xively api-key> + -t /v2/feeds/504.csv + -m "0,29" +``` + +In this example we're connecting to host api.xively.com, using our xively +api-key as the username, publishing to feed /v2/feeds/504 using the csv format +and are updating datastream 0 with the value 29. Another way to achieve the +same thing would be to do: + +``` +mosquitto_pub -h api.xively.com + -u <your xively api-key> + -t /v2/feeds/504/datastreams/0.csv + -m 29 +``` + +mosquitto_pub can read data from stdin and publish it, so on Unix type systems the following arrangement is possible: + +``` +sensor_read | mosquitto_pub -h api.xively.com + -u <api-key> + -t /v2/feeds/504/datastreams/0.csv + -l +``` + +The `-l` option reads messages from stdin, sending a separate message for each +line. This means that our imaginary executable sensor_read that is reading data +from a sensor must be printing each reading as a text line. + +## Retrieving Data + +In the MQTT world, retrieving data is done through subscriptions: + +``` +mosquitto_sub -h api.xively.com + -u <api-key> + -t /v2/feeds/504/datastreams/0.csv +``` + +In this example, mosquitto_sub will print a text line containing the csv data +for datastream 0 of feed 504 every time it is updated. + +## Last Will and Testament + +The last will and testament or just "will" is a very nice feature of MQTT. When +your client connects to the MQTT broker/server, it can give the broker this +will, which consists of a topic and a message. If the client is disconnected +from the broker unexpectedly, that is to say without sending a disconnect +message, then the broker publishes the will message on the will topic. + +This provides a very simple mechanism for client connection monitoring. When +your client connects it could publish a message "1" to a topic. If it also set +a will to send a message "0" to the same topic on unexpected disconnect, then +it would be possible to determine whether that client was connected by +monitoring the topic. + +In the context of Xively, the same approach is possible, but using a trigger to +indicate that the client had disconnected. + +The mosquitto_sub client provides support for wills as shown in the example +below: + +``` +mosquitto_sub -h api.xively.com + -u <api-key> + -t /v2/feeds/504/datastreams/0.csv + --will-topic /v2/feeds/12345/datastreams/0.csv + --will-payload "0" +``` + +In this example, the Xively broker would publish the value "0" to datastream 0 +of feed 12345  if mosquitto_sub disconnects unexpectedly. This isn't the most +useful example because of the limitations of what mosquitto_sub provides. + +# Writing Your Own Clients +In practice, to get the full benefit of the advantages that MQTT provides you +will probably want to write your own MQTT client to connect to Xively for your +specific application. The page lists client +implementations for lots of different programming languages including the +mosquitto client libraries in C/C++, libraries in Java, Python and also device +specific implementations for Arduino and other low power devices. + +# MQTT Beyond Xively +The Xively offering is a slightly restricted MQTT offering. "Full" MQTT offers +a bit more scope for doing fun things using topic wildcards for example, +something that wouldn't really make sense for Xively. + +There is an overview of MQTT at [mqtt man page] and examples of some +applications at . + +If you'd like to play on an MQTT broker, try looking at [test.mosquitto.org]. + +If you want some help there are mailing lists and irc channels listed on +. + +[mosquitto download]: /download +[mqtt man page]: /man/mqtt-7.html +[test.mosquitto.org]: http://test.mosquitto.org/ diff --git a/www/posts/2012/03/upcoming-incompatible-library-changes.md b/www/posts/2012/03/upcoming-incompatible-library-changes.md new file mode 100644 index 00000000..2d099e17 --- /dev/null +++ b/www/posts/2012/03/upcoming-incompatible-library-changes.md @@ -0,0 +1,16 @@ + + +Version 0.16 of the mosquitto client libraries will have some binary +incompatible changes to their APIs. This means that it is a good time to make +other changes that are incompatible. If you think any part of the interface +(see ) is crazy or could be improved in any way, +please get in touch or add a comment below. diff --git a/www/posts/2012/05/python-client-module-available-for-testing.md b/www/posts/2012/05/python-client-module-available-for-testing.md new file mode 100644 index 00000000..8b13177e --- /dev/null +++ b/www/posts/2012/05/python-client-module-available-for-testing.md @@ -0,0 +1,36 @@ + + +As part of the ongoing work on mosquitto 0.16, the libmosquitto C client +library has been ported to Python. It provides complete MQTTv3.1 support and +will eventually remove the need for the current Python wrapper around the C +library and will allow it to be used more easily and in more situations. + +The interface is largely the same as the existing Python wrapper. The +differences are that it uses the current development interface which differs +slightly from that in 0.15 (see the [Python documentation]), not all of the new +interface is implemented - there is no threading support and finally some +datatypes may be more Python like (e.g. lists in `on_subscribe()` callback +rather than an integer). + +The conversion from ~4000 lines C to ~1000 lines Python took just two evenings +and is now ready for testing. It is available in the 0.16 branch in the +[bitbucket repository], or as a single file at + + +Please give it a try and report any bugs you find using any of the methods on +the [Support page]. + +Please note that the new Python module does not currently support Python 3. + +[Python documentation]: /documentation/python +[bitbucket repository]: https://bitbucket.org/oojah/mosquitto/src/b9e04ef2a762/lib/python/mosquitto.py +[Support page]: /support diff --git a/www/posts/2012/06/ipv6-on-test-server.md b/www/posts/2012/06/ipv6-on-test-server.md new file mode 100644 index 00000000..f218c851 --- /dev/null +++ b/www/posts/2012/06/ipv6-on-test-server.md @@ -0,0 +1,17 @@ + + +The public Mosquitto test server, [test.mosquitto.org] has supported IPv6 since +it was originally put online but the required DNS record was missing. This has +now been fixed so once the record has propagated across the internet you should +be able to test your IPv6 clients. + +[test.mosquitto.org]: http://test.msoquitto.org/ diff --git a/www/posts/2012/06/ssl-support-on-test-server.md b/www/posts/2012/06/ssl-support-on-test-server.md new file mode 100644 index 00000000..8d251730 --- /dev/null +++ b/www/posts/2012/06/ssl-support-on-test-server.md @@ -0,0 +1,40 @@ + + +The next version of Mosquitto will provide SSL support for network encryption +and authentication. This work is still in development, but is sufficiently +advanced to make available for testing on [test.mosquitto.org]. In addition to +the existing unencrypted access via port 1883, connections are now possible on +ports 8883 and 8884. + +Port 8883 provides simple encrypted access. Your client should verify the +server certificate using the CA certificate available at + + +Port 8884 uses the same server certificate, but requires that your client +provide a valid certificate signed by the mosquitto.org CA key. If you wish to +obtain a client certificate for testing purposes, please get in touch. + +The development Python module provides client SSL support. The latest version +is available at [mosquitto.py] with a simple example at [ssub.py]. You will +need to place the mosquitto.org CA certificate linked above in the same +directory. All versions of Python from 2.7 upwards (including Python 3) are +supported. + +Please get in touch if you have any problems. + +Update: + +All clients in the development version now support SSL. + +[test.mosquitto.org]: http://test.mosquitto.org/ +[mosquitto.py]: http://test.mosquitto.org/ssl/mosquitto.py +[ssub.py]: http://test.mosquitto.org/ssl/ssub.py diff --git a/www/posts/2012/07/upcoming-release.md b/www/posts/2012/07/upcoming-release.md new file mode 100644 index 00000000..4c58b5d7 --- /dev/null +++ b/www/posts/2012/07/upcoming-release.md @@ -0,0 +1,47 @@ + + +The next release of mosquitto is approaching. There is currently only one +feature left on the todo list to complete and I've pencilled in the end of the +month as the release date. The date may slip a week or two after that depending +on any bugs reported. + +Despite the development being carried out in the 0.16 branch and the current +in-development version numbers being 0.15.90, this will be version 1.0 of +mosquitto. There has been significant API changes (now a lot more sane +hopefully) which means the client library interface version has been +incremented, and the number of changes involved in this release far outreach +any previous release, including SSL support, a pure Python client +implementation, a healthy start on tests and an associated improvement in +protocol compliance, and threaded client support. I think it is well worthy of +the version number. + +I am, however, very keen that this be as bug free a release as possible. To +this end, if you're a mosquitto user I'd be very appreciative if you'd download +the current source code and give it a try. Maybe read through the documentation +and check it makes sense + +The source for the current version is at either of these links (ignore the +"0.16", that is just the branch name): + + * + * + +If you want to test but with a minimum amount of effort, please download the +source, run "make test" and report back any problems. This would be +particularly  useful if you are using something other than a +Debian/Ubuntu/openSUSE based Linux. If you have any problems, bugs can be +reported at , by leaving a comment or by +getting in touch directly. I'm interested in anything, but would be especially +keen to hear from you if you think something to do with the client API needs +changing. + +Thanks in advance! diff --git a/www/posts/2012/08/baby.attachments.json b/www/posts/2012/08/baby.attachments.json new file mode 100644 index 00000000..2ec37d97 --- /dev/null +++ b/www/posts/2012/08/baby.attachments.json @@ -0,0 +1 @@ +{"243": {"wordpress_user_name": "roger", "title": "IMAG0006", "date_utc": "2012-08-22 09:39:33", "files_meta": [{"height": 333, "width": 500, "meta": {"camera": "HTC Wildfire S A510e", "created_timestamp": 1345456796.0, "focal_length": 3.53, "iso": 165.0}}, {"height": 199, "size": "medium", "width": 300}, {"height": 150, "size": "thumbnail", "width": 150}], "files": ["/wp-content/uploads/2012/08/IMAG0006.jpg", "/wp-content/uploads/2012/08/IMAG0006-300x199.jpg", "/wp-content/uploads/2012/08/IMAG0006-150x150.jpg"]}} \ No newline at end of file diff --git a/www/posts/2012/08/baby.md b/www/posts/2012/08/baby.md new file mode 100644 index 00000000..aa3a4a47 --- /dev/null +++ b/www/posts/2012/08/baby.md @@ -0,0 +1,16 @@ + + +[![baby](/blog/uploads/2012/08/IMAG0006-300x199.jpg)](/blog/uploads/2012/08/IMAG0006.jpg) + +I've recently become a father, so please don't be offended if I take a while to +respond to any mosquitto related queries. diff --git a/www/posts/2012/08/bugfix-coming-soon.md b/www/posts/2012/08/bugfix-coming-soon.md new file mode 100644 index 00000000..a5adcb72 --- /dev/null +++ b/www/posts/2012/08/bugfix-coming-soon.md @@ -0,0 +1,21 @@ + + +A few bugs have been identified with the 1.0 release; thanks to everyone who +has got in touch about it. They're mostly documentation/build script mistakes +(see [ChangeLog.txt]), but there is a Python bug that makes it worthwhile +making a quick bugfix release. + +I intend to make the release this evening (in around 8 hours from this post), +so if you have anything you think needs fixing please try and get in touch +before then. + +[ChangeLog.txt]: /ChangeLog.txt diff --git a/www/posts/2012/08/version-1-0-1-released.md b/www/posts/2012/08/version-1-0-1-released.md new file mode 100644 index 00000000..385a167e --- /dev/null +++ b/www/posts/2012/08/version-1-0-1-released.md @@ -0,0 +1,50 @@ + + +This is a bugfix release. The important changes are fixing the `on_log()` +callback in the Python module and the `log_dest` option when running as a +Windows service. The rest of the fixes are documentation and build script +fixes. + +Downloads are available on the [download page] and include all supported +binaries (except for Ubuntu packages which are still waiting to build due to +Launchpad maintenance). The Python module has been uploaded to [Python Package +Index]. + +# Broker + + * Fix default `log_dest` when running as a Windows service. + +# Client library +  + * Fix incorrect parameters in Python `on_log()` callback call. Fixes bug + #1036818. + +# Clients + + * Clients now don't display TLS/TLS-PSK usage help if they don't support it. + +# Build scripts + + * Fix TLS-PSK support in the CMake build files. + * Fix man page installation in the CMake build files. + * Fix SYSCONFDIR in cmake on \*nix when installing to /usr. Fixes bug + #1036908. + +# Documentation +  + * Fix mqtt/MQTT capitalisation in man pages. + * Update compiling.txt. + * Fix incorrect callback docs in mosquitto.py. Fixes bug #1036607. + * Fix various doc typos and remove obsolete script. Fixes bug #1037088. + +[download page]: /download +[Python Package Index]: http://pypi.python.org/pypi diff --git a/www/posts/2012/08/version-1-0-2-released.md b/www/posts/2012/08/version-1-0-2-released.md new file mode 100644 index 00000000..c206545c --- /dev/null +++ b/www/posts/2012/08/version-1-0-2-released.md @@ -0,0 +1,35 @@ + + +This is a bugfix release. + +# Broker + * If the broker was configured for persistence, a durable client had a + subscription to topics in $SYS/# and had messages in its queue when the + broker restarted, then the persistent database would have messages missing + and so the broker would not restart properly. This has been fixed. + +# Library + + * Fix threading problem on some systems. + +# Tests + + * Close socket after 08-ssl-connect-no-auth-wrong-ca.py test to prevent + * subsequent tests having problems. + +# Build scripts + + * Install pskfile.example in CMake. Fixes bug #1037504. + +# Other + + * Fix db_dump parameter printing message store and sub chunks. diff --git a/www/posts/2012/08/version-1-0-released.md b/www/posts/2012/08/version-1-0-released.md new file mode 100644 index 00000000..b5794810 --- /dev/null +++ b/www/posts/2012/08/version-1-0-released.md @@ -0,0 +1,181 @@ + + +This is a feature and bugfix release. This is the most significant release for +the mosquitto project so far. It encompasses >20% of the total commits for +the project and has an increase in source tarball size of 95%, mostly down to +the new bundled tests and new man pages. It introduces lots of new features for +the broker and improves the API of the client libraries, although this does +mean that the libraries are incompatible with previous releases. I apologise +for this and hope you'll agree that the changes are worth it. + +I've been overwhelmed with the amount of feedback that I've received recently, +thanks to everyone that has got in touch to let me know where something could +be improved. I'd particularly like to thank Nicholas Humfrey for setting me on +the continuous integration path. + +On a slightly different note, my wife was expecting our first child two days +ago so it's quite likely I'll be less responsive to support requests for a +little while. + +# Significant changes + +These are what I think are the exciting changes for this release. + + * SSL/TLS support across the board - the broker, client libraries and pub/sub + clients. This provides certificate based network encryption in a very + similar manner to SSL in a web browser where the client verifies that the + server is valid. It is also possible to use client certificates to + authenticate the clients with the server. + * TLS-PSK support (not on Python). This is "pre-shared-key" network encryption + and represents a simpler encryption interface than certificate based + encryption which makes it much more suitable for embedded/constrained + devices. + * The Python client library is now written in pure Python so is much easier to + use. It supports Python 2.6, 2.7 and 3.\* (no SSL support for 2.6). + * All client libraries have had their interface overhauled and should now be + much saner and straightforward to use. + * The client libraries have thread support. + * Passwords files for the broker are stored hashed and salted and a utility + for maintaining them has been provided. + * It is now possible to write access and authentication plugins for the broker + for providing custom support for authentication against e.g. a SQL database. + * Implementation of a good test suite which has lead to improved protocol + compliance amongst other bug fixes. + * Masses of bug fixes. + +# Downloads + +Source is available on the [download page], the binary packages will follow as +soon as possible. Windows and Ubuntu packages are currently available, more to +follow. + +# Changes + +The complete list of changes is below: + +# The broker + + * Add SSL/TLS support. + * Add TLS-PSK support, providing a simpler encryption method for constrained + devices. + * Passwords are now salted+hashed if compiled with WITH_TLS (recommended). + * Add mosquitto_passwd for handling password files. + * Add $SYS/broker/publish/messages/{sent|received} to show the number of + PUBLISH messages sent/received. + * Add $SYS/broker/publish/bytes/{sent|received} to show the number of PUBLISH + bytes sent/received. + * Add reload parameter for security init/cleanup functions. + * Add option for expiring disconnected persistent clients. + * Add option for queueing of QoS 0 messages when persistent clients are + disconnected. + * Enforce client id limits in the broker (only when WITH_STRICT_PROTOCOL is + defined). + * Fix reloading of log configuration. + * Add support for `try_private` config option for bridge connections. + * Add support for `autosave_on_changes` config option. + * Add support for `include_dir` config option. + * Add support for topic remapping. + * Usernames were being lost when a non clean-session client reconnected, + potentially causing problems with ACLs. This has been fixed. + * Significant improvement to memory handling on Windows. + * Bridges with outgoing topics will now set the retain flag correctly so that + messages will be retained on the remote broker. + * Incoming bridge connections are now detected by checking if bit 8 of the + protocol version number is set. This requires support from the remote + broker. + * Add support for `notification_topic` option. + * Add $SYS/broker/subscriptions/count and $SYS/broker/retained messages/count. + * Add `restart_timeout` to control the amount of time an automatic bridge will + wait before reconnecting. + * Overlapping subscriptions are now handled properly. Fixes bug #928538. + * Fix reloading of `persistence_file` and `persistence_location`. + * Fix broker crash on incorrect protocol number. + * Fix missing COMPAT_ECONNRESET define on Windows. + * Clients that had disconnected were not always being detected immediately on + Linux. This has been fixed. + * Don't save $SYS messages to the on-disk persistent db. All $SYS messages + should be reconstructed on a restart. This means bridge connection + notifications will now be correct on a restart. + * Fix reloading of bridge clients from the persistent db. This means that + outgoing bridged topics should always work. + * Local bridges are now no longer restricted by local ACLs. + * Discard publish messages with zero length topics. + * Drop to "mosquitto" user even if no config file specified. + * Don't incorrectly allow topic access if ACL patterns but no normal ACL rules + are defined. + +## The client libraries + + * Add SSL/TLS support. + * Add TLS-PSK support, providing a simpler encryption method for constrained + devices. + * Add javascript/websockets client library. + * Add `struct mosquitto *mosq` parameter for all callbacks in the client + library. This is a binary incompatible change so the soversion of the + libraries has been incremented. The new parameter should make it easier to + use callbacks in practice. + * Add `mosquitto_want_write()` for use when using own select() loop with + `mosquitto_socket()`. + * Add `mosquitto_connect_async()` to provide a non-blocking connect client call. + * Add `mosquitto_user_data_set()` to allow user data pointer to be updated. + * Add "int rc" parameter to disconnect callback to indicate whether disconnect + was unexpected or the result of calling `mosquitto_disconnect()`. + * Add `mosquitto_strerror()` for obtaining a string description of error numbers. + * Add `mosquitto_connack_string()` for obtaining a string description of MQTT + connection results. + * Add `mosquitto_will_clear()` and change `mosquitto_will_set()` to only set the + will. + * Add `mosquitto_sub_topic_tokenise()` and `mosquitto_sub_topic_tokens_free()` + utility functions to tokenise a subscription/topic string into a string + array. + * Add `mosquitto_topic_matches_sub()` to check whether a topic matches a + subscription. + * Replaced `mosquitto_log_init()` with `mosquitto_log_callback_set()` to allow + clients to decide what to do with log messages. + * Client will now disconnect itself from the broker if it doesn't receive a + PINGRESP in the keepalive period after sending a PINGREQ. + * Client will now send a PINGREQ if it has not received a message from the + broker in keepalive seconds. + * `mosquitto_new()` will now generate a random client id if the id parameter + is NULL. + * Added `max_packets` to `mosquitto_loop()`, `mosquitto_loop_read()` and + `mosquitto_loop_write()` to control the maximum number of packets that are + handled per call. + * Payload parameters are now void * instead of uint8\_t \*. + * The `clean_session` parameter has been moved from `mosquitto_connect()` to + `mosquitto_new()` because it is a client parameter rather than a connection + parameter. + * Functions now use int instead of uint\*\_t where possible. + * `mosquitto_new()` now sets errno to indicate failure type. + * Return `MOSQ_ERR_INVAL` on zero length topic. + * Fix automatic client id generation on Windows. + * `mosquitto_loop_misq()` can now return `MOSQ_ERR_NO_CONN`. + * Compile static library as well as dynamic library with default makefiles. + * Rename C++ namespace from mosquittopp to mosqpp to remove ambiguity. + * C++ `lib_init()`, `lib_version()` and `lib_cleanup()` are now in the mosqpp + namespace directly, not mosquittopp class members. + * The Python library is now written in pure Python and so no longer depends on + libmosquitto. + * The Python library includes SSL/TLS support. + * The Python library should now be compatible with Python 3. + +## Other + + * Fix db_dump reading of retained messages. + * Add example of logging all messages to mysql. + * Add C++ client example. + * Fix potential buffer overflow in pub/sub clients. + * Add "make binary" target that doesn't make documents. + * Add `--help` arguments to pub/sub clients. + * Fix building on Solaris. + +[download page]: /download diff --git a/www/posts/2012/09/updating-password-files.md b/www/posts/2012/09/updating-password-files.md new file mode 100644 index 00000000..91f8c15d --- /dev/null +++ b/www/posts/2012/09/updating-password-files.md @@ -0,0 +1,16 @@ + + +Mosquitto 1.0 introduced the use of password files with hashed passwords but +had no way to convert from the old plain text password files. This feature will +be available in version 1.1 but if it is important to you then you can already +get the updated code for the mosquitto_passwd utility at + diff --git a/www/posts/2012/09/version-1-0-3-released.md b/www/posts/2012/09/version-1-0-3-released.md new file mode 100644 index 00000000..fbf15979 --- /dev/null +++ b/www/posts/2012/09/version-1-0-3-released.md @@ -0,0 +1,39 @@ + + +This is a bugfix release. + +# Broker + + * Fix loading of psk files. + * Don't return an error when reloading config if an ACL file isn't defined.  + This was preventing psk files being reloaded. + * Clarify meaning of $SYS/broker/clients/total in mosquitto(8) man page. + * Clarify meaning of $SYS/broker/messages/stored in mosquitto(8) man page. + * Fix non-retained message delivery when subscribing to #. + * Fix retained message delivery for subs to foo/# with retained messages at + foo. + * Include the filename in password/acl file loading errors. + +# Library + + * Fix possible AttributeError when `self._sock == None` in Python module. + * Fix reconnecting after a timeout in Python module. + * Fix reconnecting when there were outgoing packets in the queue in the Python + module. + * Fix problem with mutex initialisation causing crashes on some Windows + installations. + +Source is available on the [download page], the binary packages for Windows are +available now and Linux builds will be available as soon as the various build +servers complete their tasks. + +[download page]: /download diff --git a/www/posts/2012/10/version-1-0-4-released.md b/www/posts/2012/10/version-1-0-4-released.md new file mode 100644 index 00000000..6d756e7b --- /dev/null +++ b/www/posts/2012/10/version-1-0-4-released.md @@ -0,0 +1,27 @@ + + +This is a bugfix release. + +# Broker + + * Deal with poll() POLLIN/POLLOUT before POLL[RD]HUP to correctly handle the + case where a client sends data and immediately closes its socket. + +# Library + + * Fix memory leak with messages of QoS=2. Fixes bug #1064981. + * Fix potential thread synchronisation problem with outgoing packets in the + Python module. Fixes bug #1064977. + +# Clients + + * Fix `mosquitto_sub -l` incorrectly only sending one message per second. diff --git a/www/posts/2012/11/making-mosquitto-packages-for-debian-yourself.md b/www/posts/2012/11/making-mosquitto-packages-for-debian-yourself.md new file mode 100644 index 00000000..a758f88b --- /dev/null +++ b/www/posts/2012/11/making-mosquitto-packages-for-debian-yourself.md @@ -0,0 +1,55 @@ + + +As Debian has been in feature freeze since before Mosquitto 1.0 was released, +it will be a long time until there is an updated version of Mosquitto in +Debian. It is, however, fairly straightforward to do the packaging yourself. +Here's how to do that from the command line. + +Download and unpack the mosquitto source tarball: + +``` +wget http://mosquitto.org/files/source/mosquitto-1.1.2.tar.gz +tar -zxf mosquitto-1.1.2.tar.gz +``` + +Rename the tarball to match Debian requirements: + +``` +mv mosquitto-1.1.2.tar.gz mosquitto_1.1.2.orig.tar.gz +``` + +The current mosquitto packaging files are available at + - you want the +.debian.tar.xz. + +The next step is to build the package, but you may find that you need to +install some packages first: + +``` +sudo apt-get install build-essential python quilt libwrap0-dev libssl-dev devscripts python-setuptools +``` + +To build the packages do + +``` +cd mosquitto-1.1.2/ +debuild +``` + +You should now have a list of .deb files in the parent directory which you can +install with: + +``` +sudo dpkg -i <deb file> +``` + +Please leave comments if you find this useful or have any problems. diff --git a/www/posts/2012/11/version-1-0-5-released.md b/www/posts/2012/11/version-1-0-5-released.md new file mode 100644 index 00000000..fa12781c --- /dev/null +++ b/www/posts/2012/11/version-1-0-5-released.md @@ -0,0 +1,27 @@ + + +This is a bugfix release. + +# Broker + + * Fix crash when the broker has `use_identity_as_username` set to true but a + client connects without a certificate. + * mosquitto_passwd should only be installed if `WITH_TLS=yes`. + +# Library + + * Use symbolic errno values rather than numbers in Python module to avoid + cross platform issues (incorrect errno on Mac OS). + +# Other + + * Build script fixes for FreeBSD. diff --git a/www/posts/2012/12/libmosquitto-go-bindings.md b/www/posts/2012/12/libmosquitto-go-bindings.md new file mode 100644 index 00000000..7328683a --- /dev/null +++ b/www/posts/2012/12/libmosquitto-go-bindings.md @@ -0,0 +1,18 @@ + + +I just discovered that Shane Hanna has written a Go language binding for +libmosquitto available at . +Good work Shane! Note that the readme file states: + +> Doesn't expose all of libmosquitto, just what I've needed so far. + +so you shouldn't necessarily expect everything to work. diff --git a/www/posts/2012/12/version-1-1-released.md b/www/posts/2012/12/version-1-1-released.md new file mode 100644 index 00000000..221a589a --- /dev/null +++ b/www/posts/2012/12/version-1-1-released.md @@ -0,0 +1,83 @@ + + +This is a feature and bugfix release. + +# Broker + + * Add $SYS/broker/messages/dropped + * Add $SYS/broker/clients/expired + * Replace $SYS/broker/+/per second/+ with moving average versions published at + $SYS/broker/load/# + * Add $SYS/broker/load/sockets/+ and $SYS/broker/load/connections/+ + * Documentation on password file format has been fixed. + * Disable SSL compression. This reduces memory usage significantly and removes + the possibility of CRIME type attacks. + * Enable SSL_MODE_RELEASE_BUFFERS mode to reduce SSL memory usage further. + * Add allow_duplicate_messages option. + * ACL files can now have comment lines with # as the first character. + * Display message on startup about which config is being loaded. + * Fix `max_inflight_messages` and `max_queued_messages` not being applied. + * Fix documentation error in mosquitto.conf. + * Ensure that QoS 2 queued messages are sent out in a timely manner. + * Local bridges now act on `clean_session` correctly. + * Local bridges with `clean_session==false` now remove unused subscriptions on + broker restart. + * The $SYS/broker/heap/# messages now no longer include "bytes" as part of the + string for ease of use. + +# Client library + + * Free memory used by OpenSSL in `mosquitto_lib_cleanup()` where possible. + * Change WebSocket subprotocol name to mqttv3.1 to make future changes easier + and for compatibility with other implementations. + * `mosquitto_loop_read()` and `mosquitto_loop_write()` now handle errors + themselves rather than having `mosquitto_loop()` handle their errors. This + makes using them in a separate event loop more straightforward. + * Add `mosquitto_loop_forever()` / `loop_forever()` function call to make + simple clients easier. + * Disable SSL compression. This reduces memory usage significantly and removes + the possibility of CRIME type attacks. + * Enable SSL_MODE_RELEASE_BUFFERS mode to reduce SSL memory usage further. + * `mosquitto_tls_set()` will now return an error or raise an exception + immediately if the CA certificate or client certificate/key cannot be + accessed. + * Fix potential memory leaks on connection failures. + * Don't produce return error from `mosquitto_loop()` if a system call is + interrupted. This prevents disconnects/reconnects in threaded mode and + simplifies non-threaded client handling. + * Ignore SIGPIPE to prevent unnecessary client quits in threaded mode. + * Fix document error for `mosquitto_message_retry_set()`. + * Fix `mosquitto_topic_matches_sub()` for subscriptions with + as the final + character. Fixes bug #1085797. + * Rename all "obj" parameters to "userdata" for consistency with other + libraries. + * Reset errno before network read/write to ensure EAGAIN isn't mistakenly + returned. + * The message queue length is now tracked and used to determine the maximum + number of packets to process at once. This removes the need for the + `max_packets` parameter which is now unused. + * Fix incorrect error value in Python `error_string()` function. Fixes bug #1086777. + * Reset last message in/out timer in Python module when we send a PINGREQ. + Fixes too-early disconnects. + +# Clients + + * Clients now display their own version number and library version number in + their help messages. + * Fix `mosquitto_pub -l -q 2` disconnecting before all messages were + transmitted. + * Fix potential out-of-bounds array access with client ids. Fixes bug #1083182. + +# Other + + * mosquitto_passwd can now convert password files with plain text files to + hashed versions. diff --git a/www/posts/2013/01/mosquitto-debian-repository.md b/www/posts/2013/01/mosquitto-debian-repository.md new file mode 100644 index 00000000..2f5f8e47 --- /dev/null +++ b/www/posts/2013/01/mosquitto-debian-repository.md @@ -0,0 +1,62 @@ + + +On a previous post I described [how to make mosquitto debian packages]. This +turned out to be a bit problematic, so I've now put up an experimental debian +repository for mosquitto. It includes packages for the i386, amd64, armel and +raspberry pi (raspbian armhf ) architectures. + +It's worth repeating that this is experimental - there are package changes that +haven't been vetted by a Debian developer so it's possible something will +break. I've tested myself and had no problems so far. + +To use the new repository you should first import the repository package +signing key: + +``` +wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key +sudo apt-key add mosquitto-repo.gpg.key +``` + +Then make the repository available to apt: + +``` +cd /etc/apt/sources.list.d/ +``` + +Then one of the following, depending on which version of debian you are using: + +``` +sudo wget http://repo.mosquitto.org/debian/mosquitto-wheezy.list +sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list +``` + + + +Then update apt information: + +``` +apt-get update +``` + +And discover what mosquitto packages are available: + +``` +apt-cache search mosquitto +``` + +Or just install: + +``` +apt-get install mosquitto +``` + +[how to make mosquitto debian packages]: /blog/2012/11/making-mosquitto-packages-for-debian-yourself/ diff --git a/www/posts/2013/01/version-1-1-1-released.md b/www/posts/2013/01/version-1-1-1-released.md new file mode 100644 index 00000000..696c634f --- /dev/null +++ b/www/posts/2013/01/version-1-1-1-released.md @@ -0,0 +1,22 @@ + + +This is a bugfix release. + +# Broker + + * Fix crash on reload if using acl patterns. + +# Client library + + * Fix static C++ functions not being exported on Windows. Fixes bug #1098256. + +Binaries should be available shortly. diff --git a/www/posts/2013/01/version-1-1-2-released.md b/www/posts/2013/01/version-1-1-2-released.md new file mode 100644 index 00000000..9de1ed03 --- /dev/null +++ b/www/posts/2013/01/version-1-1-2-released.md @@ -0,0 +1,22 @@ + + +This is a bugfix release. + +# Client library + + * Fix `tls_cert_reqs` not being set to `SSL_VERIFY_PEER` by default. This + meant that clients were not verifying the server certificate when connecting + over TLS. This affects the C, C++ and Python libraries. + +Source and binaries are available on the [download page]. + +[download page]: /download diff --git a/www/posts/2013/02/mqtt-standardisation-oasis-call-for-participation.md b/www/posts/2013/02/mqtt-standardisation-oasis-call-for-participation.md new file mode 100644 index 00000000..07f9430b --- /dev/null +++ b/www/posts/2013/02/mqtt-standardisation-oasis-call-for-participation.md @@ -0,0 +1,21 @@ + + +The MQTT protocol is going for standardisation at OASIS. A technical committee +is being formed and there is a call for participation for interested parties. +There are details at the link below: + + + +The plan seems to be to take the 3.1 spec as it is for standardisation and see +about changes in the future. If you are interested in taking part see the link +above, but note that you need to be a paid up member of +OASIS. diff --git a/www/posts/2013/02/version-1-1-3-released.md b/www/posts/2013/02/version-1-1-3-released.md new file mode 100644 index 00000000..bad84865 --- /dev/null +++ b/www/posts/2013/02/version-1-1-3-released.md @@ -0,0 +1,23 @@ + + +This is a minor bugfix release that addresses some problems identified during +Debian packaging. + +# Broker + + * mosquitto_passwd utility now uses tmpfile() to generate its temporary data + storage file. It also creates a backup file that can be used to recover data + if an errors occur. + +

Other

+ + * Build script fixes to help packaging on Debian. diff --git a/www/posts/2013/04/some-interesting-mqtt-things.md b/www/posts/2013/04/some-interesting-mqtt-things.md new file mode 100644 index 00000000..3db91c30 --- /dev/null +++ b/www/posts/2013/04/some-interesting-mqtt-things.md @@ -0,0 +1,35 @@ + + +It's been a while since there has been an update here, so in lieu of one here +are some interesting links I've come across recently. Add a comment to the post +if you've done something cool not mentioned here! Work progresses on mosquitto +1.2. + +Initial release of an MQTT-S gateway, written in ruby: + + * + +And some MQTT-S tools: + + * + +A Pinoccio/MQTT/sensor powered Theramin: + + * + +Voice controlled MQTT LED: + + * + +An MQTT notification plugin for Jenkins/Hudson: + + * diff --git a/www/posts/2013/05/mosquitto-javascript-client-deprecated.md b/www/posts/2013/05/mosquitto-javascript-client-deprecated.md new file mode 100644 index 00000000..c6361435 --- /dev/null +++ b/www/posts/2013/05/mosquitto-javascript-client-deprecated.md @@ -0,0 +1,23 @@ + + +The [Paho] project recently made a new Javascript client available: + + +The mosquitto Javascript client, mosquitto.js, is neither as functional nor as +well written as the Paho client, so is being deprecated. If you are using +mosquitto.js I strongly recommend that you look to the Paho client for the +future. I will be carrying out minor bug fixes but no other development will +take place. + +There are no plans to remove the existing files. + +[Paho]: http://www.eclipse.org/paho/ diff --git a/www/posts/2013/07/authentication-plugins.md b/www/posts/2013/07/authentication-plugins.md new file mode 100644 index 00000000..008610ca --- /dev/null +++ b/www/posts/2013/07/authentication-plugins.md @@ -0,0 +1,31 @@ + + +There has been some interest in authentication plugins for mosquitto recently. +Some examples have appeared: + +Authentication based on md5 hashes: [mosquitto_auth_plugin_md5] + +Authentication based on md5 hashed passwords in postgresql: +[mosquitto_auth_plugin_pg_md5] + +Authentication and topic ACL with redis and a PBKDF2 +hash: [mosquitto-redis-auth] + +I particularly like the redis based plugin for the interesting additions like +the "superuser" that is exempt from ACL checks. + +If you've written an auth plugin and think it might be useful to others, let me +know. + +[mosquitto_auth_plugin_md5]: https://github.com/sskaje/mosquitto_auth_plugin_md5 +[mosquitto_auth_plugin_pg_md5]: https://github.com/sebaroesch/mosquitto_auth_plugin_pg_md5 +[mosquitto-redis-auth]: https://github.com/jpmens/mosquitto-redis-auth diff --git a/www/posts/2013/07/version-1-2-near-complete.md b/www/posts/2013/07/version-1-2-near-complete.md new file mode 100644 index 00000000..dcd61071 --- /dev/null +++ b/www/posts/2013/07/version-1-2-near-complete.md @@ -0,0 +1,26 @@ + + +With the most recent commit, "Implement TLSv1.2 and TLSv1.1 support," +everything that is planned for version 1.2 has been completed. If you haven't +tried it out yet, now would be a good time to take a look. + +Before the release is finalised, there still needs to be more testing done, +particularly on Windows. If you use another platform than Windows or Linux, I'd +be interested to hear if you have any problems with the 1.2 code. I will also +be updating the packaging for all of the binaries that I build or contribute to +directly, so there is still time for bug reports. + +You can get a copy of the source at one of the links below, or through the +mercurial repository directly on the 1.2 branch. + + * + * diff --git a/www/posts/2013/08/mosquitto-on-fedora.md b/www/posts/2013/08/mosquitto-on-fedora.md new file mode 100644 index 00000000..de98511e --- /dev/null +++ b/www/posts/2013/08/mosquitto-on-fedora.md @@ -0,0 +1,15 @@ + + +Mosquitto has been packaged for Fedora thanks to Rich Mattes. Fedora 19 users +will be able to install with "yum install mosquitto". + +Thanks Rich! diff --git a/www/posts/2013/08/mqtt-watchdir.md b/www/posts/2013/08/mqtt-watchdir.md new file mode 100644 index 00000000..0d0e84a8 --- /dev/null +++ b/www/posts/2013/08/mqtt-watchdir.md @@ -0,0 +1,24 @@ + + +Recursively watch a directory for modifications and publish file content to an +MQTT broker + +`mqtt-watchdir` is a Python program by [Jan-Piet Mens] to watch a directory and +publish new or modified files in that directory hierarchy to an MQTT broker, +using a matching topic. Source and instructions are available at + and it is also available via pypi. + +It is a similar idea to my [mqttfs] fuse filesystem, but ultimately implemented +in a better (and portable) manner. + +[Jan-Piet Mens]: https://twitter.com/jpmens +[mqttfs]: https://bitbucket.org/oojah/mqttfs diff --git a/www/posts/2013/08/version-1-2-released.md b/www/posts/2013/08/version-1-2-released.md new file mode 100644 index 00000000..ea321675 --- /dev/null +++ b/www/posts/2013/08/version-1-2-released.md @@ -0,0 +1,127 @@ + + +This is a (long overdue) feature release. + +There is a potential gotcha when upgrading to this release because the default +version of TLS used has changed from 1.0 to 1.2. Python does not yet have +support for TLS>1.0 so Python clients will be unable to communicate with +brokers using the default TLS settings. + +The source is available at the [download page] and binaries will become +available in the near future. + +# Broker + + * Replace O(n) username lookup on CONNECT with a roughly O(1) hashtable + version. + * It is now possible to disable $SYS at compile time. + * Add dropped publish messages to load tree in $SYS. Closes bug #1183318. + * Add support for logging SUBSCRIBE/UNSUBSCRIBE events. + * Add `log_dest file` logging support. + * Auth plugin ACL check function now passes the client id as well as username + and password. + * The `queue_qos0_messages` option wasn't working correctly, this has now been + fixed. Closes bug #1125200. + * Don't drop all messages for disconnected durable clients when + `max_queued_messages=0`. + * Add support for `log_type all`. + * Add support for `-v` option on the command line to provide the equivalent of + `log_type all` without needing a config file. + * Add the `upgrade_outgoing_qos` option, a non-standard feature. + * Persistence data is now written to a temporary file which is atomically + renamed on completion, so a crash during writing will not produce a corrupt + file. + * mosquitto.conf is now installed as mosquitto.conf.example + * Configuration file errors are now reported with filename and line number. + * The broker now uses a monotonic clock if available, to avoid changes in time + causing client disconnections or message retries. + * Clean session and keepalive status are now display the log when a client + connects. + * Add support for TLSv1.2 and TLSv1.1. + * Clients that connect with zero length will topics are now rejected. + * Add the ability to set a maximum allowed PUBLISH payload size. + * Fix an ACL with topic `#` incorrectly granting access to $SYS. + * Fix retained messages incorrectly being set on wildcard topics, leading to + duplicate retained messages being sent on subscription. Closes bug #1116233. + * Don't discard listener values when no "port" option given. Closes bug + #1131406. + * Client password check was always failing when security was being reapplied + after a config reload. This meant that all clients were being disconnected. + This has been fixed. + * Fix build when `WITH_TLS=no`. Closes bug #1174971. + * Fix single outgoing packets not being sent in a timely fashion if they were + not sent in one call to write(). Closes bug #1176796. + * Fix remapping of messages for clients connected to a listener with + `mount_point` set. Closes bug #1180765. + * Fix duplicate retained messages being sent for some wildcard patterns. + * If a client connects with a will topic to which they do not have write + access, they are now disconnected with CONNACK "not authorised". + * Fix retained messages on topic foo being incorrectly delivered to + subscriptions of /# + * Fix handling of SSL errors on SSL_accept(). + * Fix handling of QoS 2 messages on client reconnect. + * Drop privileges now sets supplementary groups correctly. + * Fix load reporting interval (is now 60s). + * Be strict with malformed PUBLISH packets - clients are now disconnected + rather than the packet discarded. This goes inline with future OASIS spec + changes and makes other changes more straightforward. + * Process incoming messages denied by ACL properly so that clients don't keep + resending them. + * Add support for `round_robin` bridge option. + * Add bridge support for verifying remote server certificate subject against + the remote hostname. + * Fix problem with out of order calls to free() when restarting a lazy bridge. + * The broker now attempts to resolve `bind_address` and bridge addresses + immediately when parsing the config file in order to detect invalid hosts. + * Bridges now set their notification state before attempting to connect, so if + they fail to connect the state can still be seen. + * Fix bridge notification payload length - no need to send a null byte. + * mosquitto_passwd utility now reports errors more clearly. + * Fix `mosquitto_passwd -U`. + +  +# Client library + + * Add support for TLSv1.2 and TLSv1.1, except for on the Python module. + * Add support for verifying remote server certificate subject against the + remote hostname. + * Add mosquitto_reconnect_async() support and make asynchronous connections + truely asynchronous rather than simply deferred. DNS lookups are still + blocking, so asynchronous connections require an IP address instead of + hostname. + * Allow control of reconnection timeouts in mosquitto_loop_forever() and after + mosquitto_loop_start() by using mosquitto_reconnect_delay_set(). + * Fix building on Android NDK. + * Re-raise unhandled errors in Python so as not to provide confusing error + messages later on. + * Python module supports IPv6 connections. + * mosquitto_sub_topic_tokenise() was behaving incorrectly if the last topic + hierarchy had only a single character. This has been fixed. Closes bug + #1163348. + * Fix possible crash after disconnects when using the threaded interface with + TLS. + * Allow build/install without Python. Closes bug #1174972. + * Add support for binding connection to a local interface. + * Implement maximum inflight messages handling. + * Fix Python client not handling `will_payload==None`. + * Fix potential memory leak when setting username/password. + * Fix handling of QoS 2 messages on reconnect. + * Improve handling of mosquitto_disconnect() with threaded mode. + +# Clients + + * Add support for TLSv1.2 and TLSv1.1. + * Sub client can now suppress printing of messages with the retain bit set. + * Add support for binding connection to a local interface. + * Implement maximum inflight messages handling for the pub client. + +[download page]: /download diff --git a/www/posts/2013/09/version-1-2-1-released.md b/www/posts/2013/09/version-1-2-1-released.md new file mode 100644 index 00000000..559b9411 --- /dev/null +++ b/www/posts/2013/09/version-1-2-1-released.md @@ -0,0 +1,36 @@ + + +This is a bugfix release. + +# Broker: + + * The broker no longer ignores the `auth_plugin_init()` return value. Closes + bug #1215084. + * Use `RTLD_GLOBAL` when opening authentication plugins on posix systems. + Fixes resolving of symbols in libraries used by authentication plugins. + * Add/fix some config documentation. + * Fix ACLs for topics with $SYS. + * Clients loaded from the persistence file on startup were not being added to + the client hash, causing subtle problems when the client reconnected, + including ACLs failing. This has been fixed. + * Add note to mosquitto-tls man page stating that certificates need to be + unique. Closes bug #1221285. + * Fix incorrect retained message delivery when using wildcard subs in some + circumstances. Fixes bug #1226040. + +# Client library + + * Fix support for Python 2.6, 3.0, 3.1. + * Fix TLS subjectAltName verification and segfaults. + * Handle EAGAIN in Python on Windows. Closes bug #1220004. + * Fix compilation when using `WITH_TLS=no`. + * Don't fail reconnecting in Python when broker is temporarily unavailable. diff --git a/www/posts/2013/10/version-1-2-2-released.md b/www/posts/2013/10/version-1-2-2-released.md new file mode 100644 index 00000000..d3b44b34 --- /dev/null +++ b/www/posts/2013/10/version-1-2-2-released.md @@ -0,0 +1,27 @@ + + +This is a bugfix release: + +# Broker + + * Fix compliance with `max_inflight_messages` when a non-clean session client + reconnects. Closes one of the issues on bug #1237389. + +# Client library + + * Fix incorrect inflight message accounting, which caused messages to go + * unsent. Partial fix for bug #1237351. + * Fix potential memory corruption when sending QoS>0 messages at a high + rate using the threaded interface. Further fix for #1237351. + * Fix incorrect delay scaling when exponential_backoff=true in + mosquitto_reconnect_delay_set(). + * Some pep8 fixes for Python. diff --git a/www/posts/2013/12/paho-mqtt-python-client.md b/www/posts/2013/12/paho-mqtt-python-client.md new file mode 100644 index 00000000..311fc8e2 --- /dev/null +++ b/www/posts/2013/12/paho-mqtt-python-client.md @@ -0,0 +1,49 @@ + + +The Mosquitto Python client was donated to the Eclipse Paho project in June of +this year. As mosquitto.py has been very popular, I have been maintaining both +code bases together. + +With the Mosquitto project also moving to Eclipse it is now even more redundant +to keep maintaining mosquitto.py so I would like to recommend that everybody +currently using mosquitto.py move over to using the Paho Python client. + +The current state of the Paho client is now available on [pypi] and can be +installed using `pip install paho-mqtt`. + +To port code from mosquitto.py, you should change: + +``` +import mosquitto +mqttc = mosquitto.Mosquitto() +``` + +to: + +``` +import paho.mqtt.client as paho +mqttc = paho.Client() +``` + +All error codes e.g. `MOSQ_ERR_SUCCESS` change to `MQTT_ERR_SUCCESS`. + +The Paho module has a compatibility Mosquitto class that means a very simple +(but not recommended for the long term) port can be achieved with the following +line, assuming none of the error codes are used: + +``` +import paho.mqtt.client as mosquitto +``` + +I will keep applying updates to mosquitto.py until the Paho 1.0 release. + +[pypi]: https://pypi.python.org/pypi/paho-mqtt diff --git a/www/posts/2013/12/version-1-2-3-released.md b/www/posts/2013/12/version-1-2-3-released.md new file mode 100644 index 00000000..91cccff7 --- /dev/null +++ b/www/posts/2013/12/version-1-2-3-released.md @@ -0,0 +1,43 @@ + + +In time for the second day of [Thingmonk], which I regret not being able to go +to, version 1.2.3 of mosquitto is released. This is a bugfix release. + +# All components + + * Various fixes caught by [Coverity Scan]. + +# Broker + + * Don't always attempt to call read() for SSL clients, irrespective of whether + they were ready to read or not. Reduces syscalls significantly. + * Possible memory leak fixes. + * Further fix for bug #1226040: multiple retained messages being delivered for + subscriptions ending in #. + * Fix bridge reconnections when using multiple bridge addresses. + +# Client library + + * Fix possible memory leak in C/C++ library when communicating with a broker + that doesn't follow the spec. + * Block in Python `loop_stop()` until all messages are sent, as the + documentation states should happen. + * Fix for asynchronous connections on Windows. Closes bug #1249202. + * Module version is now available in mosquitto.py. + +# Clients + + * mosquitto_sub now uses fwrite() instead of printf() to output messages, so + messages with NULL characters aren't truncated. + +[Thingmonk]: http://redmonk.com/thingmonk/ +[Coverity Scan]: https://scan.coverity.com/ diff --git a/www/posts/2014/03/version-1-3-1-released.md b/www/posts/2014/03/version-1-3-1-released.md new file mode 100644 index 00000000..c0e3a5c2 --- /dev/null +++ b/www/posts/2014/03/version-1-3-1-released.md @@ -0,0 +1,34 @@ + + +This is a bugfix release: + +# Broker + + * Prevent possible crash on client reconnect. Closes bug #1294108. + * Don't accept zero length unsubscription strings (MQTT v3.1.1 fix) + * Don't accept QoS 3 (MQTT v3.1.1 fix) + * Don't disconnect clients immediately on HUP to give chance for all data to + be read. + * Reject invalid un/subscriptions e.g. `foo/+bar` `#/bar`. + * Take more care not to disconnect clients that are sending large messages. + +# Client library + + * Fix socketpair code on the Mac. + * Fix compilation for `WITH_THREADING=no`. + * Break out of select() when calling `mosquitto_loop_stop()`. + * Reject invalid un/subscriptions e.g. `foo/+bar` `#/bar`. + +# Clients + + * Fix keepalive value on mosquitto_pub. + * Fix possibility of mosquitto_pub not exiting after sending messages when using -l. diff --git a/www/posts/2014/03/version-1-3-released.md b/www/posts/2014/03/version-1-3-released.md new file mode 100644 index 00000000..b28fbf55 --- /dev/null +++ b/www/posts/2014/03/version-1-3-released.md @@ -0,0 +1,71 @@ + + + +# Broker + + * The broker no longer ignores the `auth_plugin_init()` return value. + * Accept SSLv2/SSLv3 HELLOs when using TLSv1, whilst keeping SSLv2 and SSLv3 + disabled. This increases client compatibility without sacrificing security. + * The $SYS tree can now be disabled at runtime as well as at compile time. + * When remapping bridged topics, only check for matches when the message + direction is correct. This allows two identical topics to be remapped + differently for both in and out. + * Change `$SYS/broker/heap/current size` to `$SYS/broker/heap/current` for + easier parsing. + * Change `$SYS/broker/heap/maximum size` to `$SYS/broker/heap/maximum` for + easier parsing. + * Topics are no longer normalised from e.g `a///topic` to `a/topic`. This + matches the behaviour as clarified by the Oasis MQTT spec. This will lead to + unexpected behaviour if you were using topics of this form. + * Log when outgoing messages for a client begin to drop off the end of the + queue. + * Bridge clients are recognised as bridges even after reloading from + persistence. + * Basic support for MQTT v3.1.1. This does not include being able to bridge to + an MQTT v3.1.1 broker. + * Username is displayed in log if present when a client connects. + * Support for 0 length client ids (v3.1.1 only) that result in automatically + generated client ids on the broker (see option `allow_zero_length_clientid`). + * Ability to set the prefix of automatically generated client ids (see option + `auto_id_prefix`). + * Add support for TLS session resumption. + * When using TLS, the server now chooses the cipher to use when negotiating + with the client. + * Weak TLS ciphers are now disabled by default. + +# Client library + + * Fix support for Python 2.6, 3.0, 3.1. + * Add support for un/subscribing to multiple topics at once in un/subscribe(). + * Clients now close their socket after sending DISCONNECT. + * Python client now contains its version number. + * C library `mosquitto_want_write()` now supports TLS clients. + * Fix possible memory leak in C/C++ library when communicating with a broker + that doesn't follow the spec. + * Return strerror() through `mosquitto_strerror()` to make error printing + easier. + * Topics are no longer normalised from e.g `a///topic` to `a/topic`. This + matches the behaviour as clarified by the Oasis MQTT spec. This will lead to + unexpected behaviour if you were using topics of this form. + * Add support for SRV lookups. + * Break out of select() on publish(), subscribe() etc. when using the threaded + interface. Fixes bug #1270062. + * Handle incoming and outgoing messages separately. Fixes bug #1263172. + * Don't terminate threads on `mosquitto_destroy()` when a client is not using + the threaded interface but does use their own thread. Fixes bug #1291473. + +# Clients + + * Add `--ciphers` to allow specifying which TLS ciphers to support. + * Add support for SRV lookups. + * Add `-N` to sub client to suppress printing of EOL after the payload. + * Add `-T` to sub client to suppress printing of a topic hierarchy. diff --git a/www/posts/2014/05/new-arrival.attachments.json b/www/posts/2014/05/new-arrival.attachments.json new file mode 100644 index 00000000..80530106 --- /dev/null +++ b/www/posts/2014/05/new-arrival.attachments.json @@ -0,0 +1 @@ +{"322": {"wordpress_user_name": "roger", "title": "14098345978_c15d12f19a_z", "date_utc": "2014-05-27 22:29:02", "files_meta": [{"height": 427, "width": 640}, {"height": 200, "size": "medium", "width": 300}, {"height": 150, "size": "thumbnail", "width": 150}], "files": ["/wp-content/uploads/2014/05/14098345978_c15d12f19a_z.jpg", "/wp-content/uploads/2014/05/14098345978_c15d12f19a_z-300x200.jpg", "/wp-content/uploads/2014/05/14098345978_c15d12f19a_z-150x150.jpg"]}} \ No newline at end of file diff --git a/www/posts/2014/05/new-arrival.md b/www/posts/2014/05/new-arrival.md new file mode 100644 index 00000000..cff05aee --- /dev/null +++ b/www/posts/2014/05/new-arrival.md @@ -0,0 +1,21 @@ + + +I'm pleased to say that I'm a new father again. My 7lb 12 (3.57kg) boy arrived +today and is quite happy, as is his mother. + +Apologies to anybody who has emailed me recently and I've not yet replied - +this is the main reason! + +[![baby][baby]](/blog/uploads/2014/05/14098345978_c15d12f19a_z.jpg) + +[baby]:/blog/uploads/2014/05/14098345978_c15d12f19a_z-300x200.jpg diff --git a/www/posts/2014/07/version-1-3-2-released.md b/www/posts/2014/07/version-1-3-2-released.md new file mode 100644 index 00000000..13daa0e5 --- /dev/null +++ b/www/posts/2014/07/version-1-3-2-released.md @@ -0,0 +1,56 @@ + + +This is a security and bugfix release. + +# Security + +A bug in the way that mosquitto handles authentication plugins has been +identified. When using a plugin for authentication purposes, if the plugin +returns `MOSQ_ERR_UNKNOWN` when making an authentication check, as might happen +if a database was unavailable for example, then mosquitto incorrectly treats +this as a successful authentication. This has the potential for unauthorised +clients to access the running mosquitto broker and gain access to information +to which they are not authorised. This is an important update for users of +authentication plugins in mosquitto. + +# Broker + + * Don't allow access to clients when authenticating if a security plugin + returns an application error. Fixes bug [#1340782]. + * Ensure that bridges verify certificates by default when using TLS. + * Fix possible crash when using pattern ACLs that do not include a %u and + clients that connect without a username. + * Fix subscriptions being deleted when clients subscribed to a topic beginning + with a $ but that is not $SYS. + * When a durable client reconnects, its queued messages are now checked + against ACLs in case of a change in username/ACL state since it last + connected. + * Anonymous clients are no longer accidently disconnected from the broker + after a SIGHUP. + * Fix bug [#1324411], which could have had unexpected consequences for delayed + messages in rare circumstances. + +# Client library + + * Fix topic matching edge case. + * Fix callback deadlocks after calling `mosquitto_disconnect()`, when using + the threaded interfaces. Closes bug [#1313725]. + * Fix SRV support when building with CMake. + +# General + + * Use $(STRIP) for stripping binaries when installing, to allow easier cross + compilation. + +[#1313725]: https://bugs.launchpad.net/mosquitto/+bug/1313725 +[#1324411]: https://bugs.launchpad.net/mosquitto/+bug/1324411 +[#1340782]: https://bugs.launchpad.net/mosquitto/+bug/1340782 diff --git a/www/posts/2014/08/version-1-3-3-released.md b/www/posts/2014/08/version-1-3-3-released.md new file mode 100644 index 00000000..eea39248 --- /dev/null +++ b/www/posts/2014/08/version-1-3-3-released.md @@ -0,0 +1,18 @@ + + +This is a bugfix release. + +# Broker + + * Fix incorrect handling of anonymous bridges on the local broker. + +Binaries will follow shortly. diff --git a/www/posts/2014/08/version-1-3-4-released.md b/www/posts/2014/08/version-1-3-4-released.md new file mode 100644 index 00000000..8fb38213 --- /dev/null +++ b/www/posts/2014/08/version-1-3-4-released.md @@ -0,0 +1,22 @@ + + +This is a bugfix release. The reason for the rapid release of the past two +versions is down to a Debian developer reviewing the mosquitto package. This is +a good opportunity to ensure that as bug free a version as possible is present +in Debian. + +# Broker + + * Don't ask client for certificate when `require_certificate` is **false**. + * Backout incomplete functionality that was incorrectly included in 1.3.2. + +Binaries will follow shortly. diff --git a/www/posts/2014/10/mosquitto-and-poodle.md b/www/posts/2014/10/mosquitto-and-poodle.md new file mode 100644 index 00000000..2492b995 --- /dev/null +++ b/www/posts/2014/10/mosquitto-and-poodle.md @@ -0,0 +1,15 @@ + + +Details of the POODLE attack that targets SSLv3 have been released recently. +Mosquitto has never provided support for SSLv3 (or SSLv2) so should not be +vulnerable to this attack and does not require any configuration +changes. diff --git a/www/posts/2014/10/unintended-change-of-behaviour-in-1-3-4.md b/www/posts/2014/10/unintended-change-of-behaviour-in-1-3-4.md new file mode 100644 index 00000000..ca74526e --- /dev/null +++ b/www/posts/2014/10/unintended-change-of-behaviour-in-1-3-4.md @@ -0,0 +1,26 @@ + + +Version 1.3.4 introduced the change that when using TLS with +`require_certificate` set to false, the client is no longer asked for a client +certificate. This seemed to be causing problems in some situations, +particularly with embedded devices. + +If `use_identity_as_username` is set to true when `require_certificate` is set +to false, then the client will not be asked for a certificate, even if it has +one configured. This means that the client will be refused access with connack +code 4, "bad username or password", because if `use_identity_as_username` +currently requires that a certificate is present, even if `allow_anonymous` is +set to true. + +This change may cause unexpected results, but does not represent a security +flaw because the change results in more clients being rejected than would +otherwise have been. diff --git a/www/posts/2014/10/version-1-3-5-released.md b/www/posts/2014/10/version-1-3-5-released.md new file mode 100644 index 00000000..ff04d4cd --- /dev/null +++ b/www/posts/2014/10/version-1-3-5-released.md @@ -0,0 +1,29 @@ + + +This is a bugfix release. + +# Broker + + * Fix possible memory leak when using a topic that has a leading slash. Fixes + bug #1360985. + * Fix saving persistent database on Windows. + * Temporarily disable ACL checks on subscriptions when using MQTT v3.1.1. This + is due to the complexity of checking wildcard ACLs against wildcard + subscriptions. This does not have a negative impact on security because + checks are still made before a message is sent to a client. Fixes bug + #1374291. + * When using -v and the broker receives a SIGHUP, verbose logging was being + disabled. This has been fixed. + +# Client library + + * Fix mutex being incorrectly passed by value. Fixes bug #1373785. diff --git a/www/posts/2015/01/seeking-sponsorship.md b/www/posts/2015/01/seeking-sponsorship.md new file mode 100644 index 00000000..de0326b1 --- /dev/null +++ b/www/posts/2015/01/seeking-sponsorship.md @@ -0,0 +1,50 @@ + + +The mosquitto project has, or can get, access to a wide variety of different +systems to help with development. One important platform for which this is not +true is Mac OS X. There are sufficient differences between Macs and other +systems that this makes life difficult. + +To this end, I would like to reach out to the mosquitto community to ask for +help with obtaining either + + * A remote login on a Mac system + * Donation of hardware + * Donation of money to buy some hardware + +I have been offered a remote account by a few individuals in the past, for +which I'm very grateful, but only on a short term basis and, understandably, +with limited control. Something on a longer term, with the ability to install +packages would be much more useful. Unfortunately I realise this is relatively +difficult to offer. + +On the hardware side of things, there isn't a need for a modern, powerful +computer. A second hand Mac Mini of Core2Duo vintage with 1GB RAM and a +reasonably modern version of Mac OS X would be quite sufficient, and ideal for +me in terms of the space it takes up. Regrettably I feel I would have to turn +down offers of an old iMac or Mac Pro. + +2007-era Mac Minis go on Ebay UK for around £100. I'm hopeful that there is a +company out there using mosquitto, likes Macs and for whom £100 would be a drop +in the ocean. If so, or any individuals want to help out with a small donation +towards this, please get in touch directly to roger@atchoo.org or head over to +the downloads page to see the paypal donation link, and thanks very much in +advance. + +
+ +Update: + +I have now awaiting delivery of a Mac mini. Thanks very much to all of you that +have contributed, it is very much appreciated. If you would still like to +support mosquitto development please don't let this put you +off... diff --git a/www/posts/2015/02/version-1-4-released.md b/www/posts/2015/02/version-1-4-released.md new file mode 100644 index 00000000..13c1e6d3 --- /dev/null +++ b/www/posts/2015/02/version-1-4-released.md @@ -0,0 +1,122 @@ + + +This is a feature release and is also the first release of the mosquitto +project from the Eclipse Foundation umbrella. The code is now dual licenced +under the [EPL]. The EDL and BSD 3 clause license are essentially identical so +if you were happy with the BSD license then you should be happy with the EDL. + +Files distributed will remain in the same place but will in some cases also be +available on the Eclipse download servers. + +# Important changes + + * Websockets support in the broker. + * Bridge behaviour on the local broker has changed due to the introduction of + the `local_*` options. This may affect you if you are using authentication  + and/or ACLs with bridges. + * The default TLS behaviour has changed to accept all of TLS v1.2, v1.1 and + v1.0, rather than only one version of the protocol. It is still possible to + restrict a listener to a single version of TLS. + * The Python client has been removed now that the Eclipse Paho Python client + has had a release. + * When a durable client reconnects, its queued messages are now checked + against ACLs in case of a change in username/ACL state since it last + connected. + * New `use_username_as_clientid` option on the broker, for preventing + hijacking of a client id. + * The client library and clients now have experimental SOCKS5 support. + * Wildcard TLS certificates are now supported for bridges and clients. + * The clients have support for config files with default options. + * Client and client libraries have support for MQTT v3.1.1. + * Bridge support for MQTT v3.1.1. + +# Broker + + * Websockets support in the broker. + * Add `local_clientid`, `local_username`, `local_password` for bridge + connections to authenticate to the local broker. + * Default TLS mode now accepts TLS v1.2, v1.1 and v1.0. + * Support for ECDHE-ECDSA family ciphers. + * Fix bug #1324411, which could have had unexpected consequences for delayed + messages in rare circumstances. + * Add support for `session present` in CONNACK messages for MQTT v3.1.1. + * Remove strict protocol #ifdefs. + * Change $SYS/broker/clients/active -> $SYS/broker/clients/connected + * Change $SYS/broker/clients/inactive -> $SYS/broker/clients/disconnected + * When a durable client reconnects, its queued messages are now checked + against ACLs in case of a change in username/ACL state since it last + connected. + * libuuid is used to generate client ids, where it is available, when an MQTT + v3.1.1 client connects with a zero length client id. + * Anonymous clients are no longer accidently disconnected from the broker + after a SIGHUP. + * mosquitto_passwd now supports `-b` (batch mode) to allow the password to be + provided at the command line. + * Removed $SYS/broker/changeset. This was intended for use with debugging, but + in practice is of no use. + * Add support for `use_username_as_clientid` which can be used with + authentication to restrict ownership of client ids and hence prevent one + client disconnecting another by using the same client id. + * When `require_certificate` was false, the broker was incorrectly asking for + a certificate (but not checking it). This caused problems with some clients + and has been fixed so the broker no longer asks. + * When using syslog logging on non-Windows OSs, it is now possible to specify + the logging facility to one of local0-7 instead of the default "daemon". + * The `bridge_attempt_unsubscribe` option has been added, to allow the sending + of UNSUBSCRIBE requests to be disabled for topics with "out" direction. + Closes bug #456899. + * Wildcard TLS certificates are now supported for bridges. + * Support for "hour" client expiration lengths for the + `persistent_client_expiration` option. Closes bug #425835. + * Bridge support for MQTT v3.1.1. + * Root privileges are now dropped after starting listeners and loading + certificates/private keys, to allow private keys to have their permissions + restricted to the root user only. Closes bug #452914. + * Usernames and topics given in ACL files can now include a space. Closes bug + #431780. + * Fix hang if pattern acl contains a %u but an anonymous client connect. + Closes bug #455402. + * Fix man page installation with cmake. Closes bug #458843. + * When using `log_dest file` the output file is now flushed periodically. + +# Clients + + * Both clients can now load default configuration options from a file. + * Add `-C` option to mosquitto_sub to allow the client to quit after receiving + a certain count of messages. Closes bug #453850. + * Add `--proxy` SOCKS5 support for both clients. + * Pub client supports setting its keepalive. Closes bug #454852. + * Add support for config files with default options. + * Add support for MQTT v3.1.1. + +# Client library + + * Add experimental SOCKS5 support. + * mosquitto_loop_forever now quits after a fatal error, rather than blindly + retrying. + * SRV support is now not compiled in by default. + * Wildcard TLS certificates are now supported. + * mosquittopp now has a virtual destructor. Closes bug #452915. + * Add support for MQTT v3.1.1. + * Don't quit mosquitto_loop_forever() if broker not available on first + connect. Closes bug #453293, but requires more work. + +# Dependencies + +This release introduces two new dependencies, libwebsockets and libuuid. Both +are optional. libuuid comes from the e2fsprogs project and allows the broker to +generate random client ids for MQTT v.3.1.1. The libwebsockets dependency can +use either libwebsockets 1.3 or 1.2.x, with 1.3 being the preferred +choice. + +[EPL]: https://www.eclipse.org/legal/epl-v10.html +[EDL]: https://eclipse.org/org/documents/edl-v10.php diff --git a/www/posts/2015/04/version-1-4-1-released.md b/www/posts/2015/04/version-1-4-1-released.md new file mode 100644 index 00000000..eb8f21fa --- /dev/null +++ b/www/posts/2015/04/version-1-4-1-released.md @@ -0,0 +1,45 @@ + + +This is a bugfix and security release. Users of mosquitto 1.4 are strongly +advised to upgrade. Upgrading from earlier versions is recommended but not as +important. + +# Broker + + * Fix possible crash under heavy network load. Closes [#463241]. This bug only + affects version 1.4. + * Fix possible crash when using pattern ACLs. + * Fix problems parsing config strings with multiple leading spaces. Closes + [#462154]. + * Websockets clients are now periodically disconnected if they have not + maintained their keepalive timer. Closes [#461619]. + * Fix possible minor memory leak on acl parsing. + +# Client library + + * Inflight limits should only apply to outgoing messages. Closes [#461620]. + * Fix reconnect bug on Windows. Closes [#463000]. + * Return -1 on error from `mosquitto_socket()`. Closes [#461705]. + * Fix crash on multiple calls to `mosquitto_lib_init`/`mosquitto_lib_cleanup`. + Closes [#462780]. + * Allow longer paths on Windows. Closes [#462781]. + * Make `_mosquitto_mid_generate()` thread safe. Closes [#463479]. + +[#463241]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=463241 +[#462154]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=462154 +[#461619]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=461619 +[#461620]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=461620 +[#463000]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=463000 +[#461705]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=461705 +[#462780]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=462780 +[#462781]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=462781 +[#463479]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=463479 diff --git a/www/posts/2015/05/mosquitto-and-current-unreleased-libwebsockets-branch.md b/www/posts/2015/05/mosquitto-and-current-unreleased-libwebsockets-branch.md new file mode 100644 index 00000000..5b643a32 --- /dev/null +++ b/www/posts/2015/05/mosquitto-and-current-unreleased-libwebsockets-branch.md @@ -0,0 +1,22 @@ + + +The current unreleased libwebsockets master branch defines the VERSION macro in +its header files. I believe this to be a bug in libwebsockets. + +This bug causes compilation of mosquitto with websockets support to fail. + +Please use a released version of libwebsockets, either 1.2, 1.3 or 1.4. +Mosquitto will compile with all of these versions. + +I do not recommend using an unreleased version of libwebsockets, the project is +not shy about making ABI/API incompatible changes between releases so it is +impractical to provide support for. diff --git a/www/posts/2015/05/version-1-4-2-released.md b/www/posts/2015/05/version-1-4-2-released.md new file mode 100644 index 00000000..fb790ef1 --- /dev/null +++ b/www/posts/2015/05/version-1-4-2-released.md @@ -0,0 +1,41 @@ + + +This is a bugfix release. + +# Broker + + * Fix bridge prefixes only working for the first outgoing message. Closes [#464437]. + * Fix incorrect bridge connection notifications on local broker. + * Fix persistent db writing on Windows. Closes [#464779]. + * ACLs are now checked before sending a will message. + * Fix possible crash when using bridges on Windows. Closes [#465384]. + * Fix parsing of `auth_opt_` arguments with extra spaces/tabs. + * Broker will return CONNACK rc=5 when a username/password is not authorised. + This was being incorrectly set as rc=4. + * Fix handling of payload lengths>4096 with websockets. + +# Client library + + * Inflight message count wasn't being decreased for outgoing messages using + QoS 2, meaning that only up to 20 QoS 2 messages could be sent. This has + been fixed. Closes [#464436]. + * Fix CMake dependencies for C++ wrapper building. Closes [#463884]. + * Fix possibility of select() being called with a socket that is + >FD_SETSIZE. This is a fix for [#464632]. + * Fix calls to `mosquitto_connect*_async()` not completing. + +[#464437]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=464437 +[#464779]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=464779 +[#465384]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=465384 +[#463884]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=463884 +[#464436]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=464436 +[#464632]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=464632 diff --git a/www/posts/2015/08/version-1-4-3-released.md b/www/posts/2015/08/version-1-4-3-released.md new file mode 100644 index 00000000..2f57c898 --- /dev/null +++ b/www/posts/2015/08/version-1-4-3-released.md @@ -0,0 +1,44 @@ + + +This is a bugfix release. + +# Broker + + * Fix incorrect bridge notification on initial connection. Closes [#467096]. + * Build fixes for OpenBSD. + * Fix incorrect behaviour for `autosave_interval`, most noticable for + `autosave_interval=1`. Closes [#465438]. + * Fix handling of outgoing QoS>0 messages for bridges that could not be + sent because the bridge connection was down. + * Free unused topic tree elements. Closes [#468987]. + * Fix some potential memory leaks. Closes [#470253]. + * Fix potential crash on libwebsockets error. + +# Client library + + * Add missing error strings to `mosquitto_strerror`. + * Handle fragmented TLS packets without a delay. Closes [#470660]. + * Fix incorrect loop timeout being chosen when using threaded interface and + keepalive = 0. Closes [#471334]. + * Increment inflight messages count correctly. Closes [#474935]. + +# Clients + + * Report error string on connection failure rather than error code. + +[#467096]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=467096 +[#465438]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=465438 +[#468987]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=468987 +[#470253]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=470253 +[#470660]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=470660 +[#471334]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=471334 +[#474935]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=474935 diff --git a/www/posts/2015/09/version-1-4-4-released.md b/www/posts/2015/09/version-1-4-4-released.md new file mode 100644 index 00000000..265e2b73 --- /dev/null +++ b/www/posts/2015/09/version-1-4-4-released.md @@ -0,0 +1,22 @@ + + +This is a bugfix release. + + * Don't leak sockets when outgoing bridge with multiple addresses cannot + * connect. Closes [#477571]. + * Fix cross compiling of websockets. Closes [#475807]. + * Fix memory free related crashes on openwrt and FreeBSD. Closes [#475707]. + * Fix excessive calls to message retry check. + +[#477571]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=477571 +[#475707]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=475707 +[#475807]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=475807 diff --git a/www/posts/2015/11/version-1-4-5-released.md b/www/posts/2015/11/version-1-4-5-released.md new file mode 100644 index 00000000..14e2e754 --- /dev/null +++ b/www/posts/2015/11/version-1-4-5-released.md @@ -0,0 +1,27 @@ + + +This is a bugfix release: + +# Broker + + * Fix possible memory leak if bridge using SSL attempts to connect to a host + that is not up. + * Free unused topic tree elements (fix in 1.4.3 was incomplete). Closes + [#468987]. + +# Clients + + * `mosquitto_pub -l` now no longer limited to 1024 byte lines. Closes + [#478917]. + +[#468987]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=468987 +[#478917]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=478917 diff --git a/www/posts/2015/12/using-lets-encrypt-certificates-with-mosquitto.md b/www/posts/2015/12/using-lets-encrypt-certificates-with-mosquitto.md new file mode 100644 index 00000000..22eed9c9 --- /dev/null +++ b/www/posts/2015/12/using-lets-encrypt-certificates-with-mosquitto.md @@ -0,0 +1,29 @@ + + +If you want to use TLS certificates you've generated using the [Let's Encrypt] +service, this is how you should configure your listener (replace "example.com" +with your own domain of course): + +Then use the following for your mosquitto.conf: + +``` +listener 8883 +cafile /etc/ssl/certs/DST_Root_CA_X3.pem +certfile /etc/letsencrypt/live/example.com/fullchain.pem +keyfile /etc/letsencrypt/live/example.com/privkey.pem +``` + +You need to be aware that current versions of mosquitto never update listener +settings when running, so when you regenerate the server certificates you will +need to completely restart the broker. + +[Let's Encrypt]: https://letsencrypt.org/ diff --git a/www/posts/2015/12/version-1-4-7-released.md b/www/posts/2015/12/version-1-4-7-released.md new file mode 100644 index 00000000..c5b153f3 --- /dev/null +++ b/www/posts/2015/12/version-1-4-7-released.md @@ -0,0 +1,30 @@ + + +This is a bugfix release. The changes below include the changes for 1.4.6, +which wasn't announced. + +# Broker + + * Add support for libwebsockets 1.6. + +# Client library + + * Fix `_mosquitto_socketpair()` on Windows, reducing the chance of delays when + * publishing. Closes [#483979]. + +# Clients + + * Fix `mosquitto_pub -l` stripping the final character on a line. Closes + [#483981]. + +[#483979]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=483979 +[#483981]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=483981 diff --git a/www/posts/2016/01/test6-mosquitto-org.md b/www/posts/2016/01/test6-mosquitto-org.md new file mode 100644 index 00000000..fd63acc5 --- /dev/null +++ b/www/posts/2016/01/test6-mosquitto-org.md @@ -0,0 +1,15 @@ + + +Thanks to a short discussion on irc, test6.mosquitto.org now exists. This is a +DNS entry that points to the same address as test.mosquitto.org, but only with +an AAAA record. This means that test6.mosquitto.org can be used to test clients +using IPv6 and to be sure that IPv6 is actually being used. diff --git a/www/posts/2016/02/version-1-4-8-released.md b/www/posts/2016/02/version-1-4-8-released.md new file mode 100644 index 00000000..a79fffd9 --- /dev/null +++ b/www/posts/2016/02/version-1-4-8-released.md @@ -0,0 +1,36 @@ + + +This is a security bugfix release. Any users of the `mount_point` feature are +strongly advised to upgrade because versions prior to 1.4.8 allow clients to +inject messages outside of their `mount_point` through the use of a Will. + +# Broker + + * Wills published by clients connected to a listener with `mount_point` defined + now correctly obey the mount point. This was a potential security risk + because it allowed clients to publish messages outside of their restricted + mount point. This is only affects brokers where the `mount_point` option is in + use. Closes [#487178]. + * Fix detection of broken connections on Windows. Closes [#485143]. + * Close stdin etc. when daemonised. Closes [#485589]. + * Fix incorrect detection of FreeBSD and OpenBSD. Closes [#485131]. + +# Client library + + * `mosq->want_write` should be cleared immediately before a call to + `SSL_write`, to allow clients using `mosquitto_want_write()` to get accurate + results. + +[#487178]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=487178 +[#485143]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=485143 +[#485589]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=485589 +[#485131]: https://bugs.eclipse.org/bugs/show_bug.cgi?id=485131 diff --git a/www/posts/2016/03/logo-contest-results-for-shortlisting.md b/www/posts/2016/03/logo-contest-results-for-shortlisting.md new file mode 100644 index 00000000..16c644a5 --- /dev/null +++ b/www/posts/2016/03/logo-contest-results-for-shortlisting.md @@ -0,0 +1,22 @@ + + +The first round of the logo contest has closed and we now need to shortlist 6 +designers. A selection of 20 logos have been chosen out of the 100 entrants and +you are invited to vote on them and make comments. If you like a particular +logo but not the colour, or like an idea behind the logo but not another +element then please say so. + +The links for voting (please do look at them all) are: + + + + diff --git a/www/posts/2016/03/logo-contest.md b/www/posts/2016/03/logo-contest.md new file mode 100644 index 00000000..6e39c236 --- /dev/null +++ b/www/posts/2016/03/logo-contest.md @@ -0,0 +1,18 @@ + + +We have initiated a paid contest to create a new logo for the Mosquitto +project. + +If you have graphics design skills or know someone who has,  please head over +to the link below to see the design brief and submit your idea. + + diff --git a/www/posts/2016/03/repository-moved-to-github.md b/www/posts/2016/03/repository-moved-to-github.md new file mode 100644 index 00000000..e442276b --- /dev/null +++ b/www/posts/2016/03/repository-moved-to-github.md @@ -0,0 +1,26 @@ + + +The mosquitto repository is now hosted on github: + This is now the canonical location for +mosquitto development work. + +Bug reports should also be made on github and the existing bug reports will be +migrated over shortly. + +The documentation still needs updating with the new location and processes, so +please do be patient with regards that. + +Contributions can now be made through a github pull request. If you want to +contribute a bug fix, please base your work off the "fixes" branch, if you are +developing a new feature please use the "develop" branch. + +Here's to a new stage in the mosquitto project! diff --git a/www/posts/2016/05/stickers.attachments.json b/www/posts/2016/05/stickers.attachments.json new file mode 100644 index 00000000..cf2ab138 --- /dev/null +++ b/www/posts/2016/05/stickers.attachments.json @@ -0,0 +1 @@ +{"385": {"wordpress_user_name": "roger", "title": "stickers", "date_utc": "2016-05-10 14:43:38", "files_meta": [{"height": 253, "width": 338, "meta": {"created_timestamp": 1462563610.0, "shutter_speed": 0.5, "focal_length": 48.0, "camera": "NIKON D3200", "aperture": 5.3, "iso": 800.0}}, {"height": 225, "size": "medium", "width": 300}, {"height": 150, "size": "thumbnail", "width": 150}], "files": ["/wp-content/uploads/2016/05/stickers.jpg", "/wp-content/uploads/2016/05/stickers-300x225.jpg", "/wp-content/uploads/2016/05/stickers-150x150.jpg"]}} \ No newline at end of file diff --git a/www/posts/2016/05/stickers.md b/www/posts/2016/05/stickers.md new file mode 100644 index 00000000..dec1284d --- /dev/null +++ b/www/posts/2016/05/stickers.md @@ -0,0 +1,44 @@ + + +To celebrate the new mosquitto logo, stickers are now available: + +[![stickers](/blog/uploads/2016/05/stickers-300x225.jpg)](/blog/uploads/2016/05/stickers.jpg) + +If you would like to obtain some stickers for yourself you have two options. + +The first is to get in touch and I'll send you some for a small contribution. +This contribution is to cover the cost of the stickers plus postage: (cost of +postage)+N\*£0.45, where N is the number of sheets of 6 stickers that you want. +Cost of postage for a letter can be calculated using the [Royal Mail price +finder], but should be £1.05 for destinations outside of the UK. Please also +consider Paypal fees using a [fees calculator] to calculate the final sum. So +for a single sheet of stickers posted internationally, the cost would be £1.76 +including paypal fees. Two sheets would be £2.23. + +The second option is to buy a full sticker book through moo.com. This can be +done very easily by navigating to This +allows you to easily order a sticker book of 90 stickers with either the colour +or blue monochrome stickers, or a mix of both. + +There is a third option - get in touch to say why you deserve some stickers and +maybe we'll send you some. We're looking for things that make us say "wow!" If +you will be sending your sticker to space, getting mosquitto on television or +using MQTT in your Formula 1 technology, these are all things that would +exciting to see with a mosquitto sticker in place. If you want to give out +stickers at a local IoT related event or similar that's great, but we'd ask +that you make a small donation. It's only a small cost for you, but there are +many people in your situation and it becomes a noticeable cost for the project. + +Please do post links of your kit sporting any stickers you use! + +[Royal Mail price finder]: http://www.royalmail.com/price-finder +[fees calculator]: http://www.clothnappytree.com/ppcalculator/ diff --git a/www/posts/2016/06/version-1-4-9-released.md b/www/posts/2016/06/version-1-4-9-released.md new file mode 100644 index 00000000..c63af1e2 --- /dev/null +++ b/www/posts/2016/06/version-1-4-9-released.md @@ -0,0 +1,72 @@ + + +This is a bugfix release. + +# Broker + + * Ensure websockets clients that previously connected with clean session set + to false have their queued messages delivered immediately on reconnecting. + Closes [#5]. + * Reconnecting client with clean session set to false doesn't start with mid=1 + again. + * Will topic isn't truncated by one byte when using a `mount_point` any more. + * Network errors are printed correctly on Windows. + * Fix incorrect $SYS heap memory reporting when using ACLs. + * Bridge config parameters couldn't contain a space, this has been fixed. + Closes [#150]. + * Fix saving of persistence messages that start with a '/'. Closes [#151]. + * Fix reconnecting for bridges that use TLS on Windows. Closes [#154]. + * Broker and bridges can now cope with unknown incoming PUBACK, PUBREC, + PUBREL, PUBCOMP without disconnecting. Closes [#57]. + * Fix websockets listeners not being able to bind to an IP address. Closes + [#170]. + * mosquitto_passwd utility now correctly deals with unknown command line + arguments in all cases. Closes [#169]. + * Fix publishing of $SYS/broker/clients/maximum + * Fix order of #includes in lib/send_mosq.c to ensure struct mosquitto doesn't + differ between source files when websockets is being used. Closes [#180]. + * Fix possible rare crash when writing out persistence file and a client has + incomplete messages inflight that it has been denied the right to publish. + +# Client library + + * Fix the case where a message received just before the keepalive timer + expired would cause the client to miss the keepalive timer. + * Return value of pthread_create is now checked. + * _mosquitto_destroy should not cancel threads that weren't created by + libmosquitto. Closes [#166]. + * Clients can now cope with unknown incoming PUBACK, PUBREC, PUBREL, PUBCOMP + without disconnecting. Closes [#57]. + * Fix mosquitto_topic_matches_sub() reporting matches on some invalid + subscriptions. + +# Clients + + * Handle some unchecked malloc() calls. Closes [#1]. + +# Build + + * Fix string quoting in CMakeLists.txt. Closes [#4]. + * Fix building on Visual Studio 2015. Closes [#136]. + +[#1]: https://github.com/eclipse/mosquitto/issues/1 +[#4]: https://github.com/eclipse/mosquitto/issues/4 +[#5]: https://github.com/eclipse/mosquitto/issues/5 +[#57]: https://github.com/eclipse/mosquitto/issues/57 +[#136]: https://github.com/eclipse/mosquitto/issues/136 +[#150]: https://github.com/eclipse/mosquitto/issues/150 +[#151]: https://github.com/eclipse/mosquitto/issues/151 +[#154]: https://github.com/eclipse/mosquitto/issues/154 +[#166]: https://github.com/eclipse/mosquitto/issues/166 +[#169]: https://github.com/eclipse/mosquitto/issues/169 +[#170]: https://github.com/eclipse/mosquitto/issues/170 +[#180]: https://github.com/eclipse/mosquitto/issues/180 diff --git a/www/posts/2016/08/mqtt-v5-draft-features.md b/www/posts/2016/08/mqtt-v5-draft-features.md new file mode 100644 index 00000000..009051dd --- /dev/null +++ b/www/posts/2016/08/mqtt-v5-draft-features.md @@ -0,0 +1,128 @@ + + +The [MQTT Technical Committee] at OASIS continue to work on improvements to +MQTT. The next version looks set to be MQTT version 5 and has reached the +"working draft" stage. This post lists some of the changes that are in the +working draft 02 and so gives at least a flavour of the improvements coming up. +Take this with a pinch of salt, I may have missed some changes and there is no +commitment that any of these features will remain in the final specification as +they are described here. + +# Session management + +In MQTT v3.1.1 and earlier, a client could control how the server treats its +session with the clean session flag. If set to 1, the server would delete any +existing session for that client and would not persist the session after +disconnecting. If set to 0, the server would restore any existing session for a +client when it reconnected, and persist the session when the client +disconnected. + +A session here means the subscriptions for a client and any queued messages. + +The new spec changes this behaviour. The clean session flag has been renamed to +clean start (this was actually the name of the flag in the old MQTT v3 spec) +and now only affects how the broker handles a client session when the client +connects. If set to 1, the server discards any previous session information, +otherwise session information is kept. + +To deal with removing of sessions at any other time, a new identifier/value +pair has been introduced. These identifier/value pairs are an addition to the +variable header part of some MQTT packets and allow configuring of different +behaviour. In the case of the CONNECT packet, a Session Expiry interval can be +specified which is a 4 byte integer that gives the number of seconds after a +client has disconnected that the server should remove session information for +that client. If the Session Expiry interval is absent from the CONNECT packet, +then the session will never expire. If it is set to 0, then the session is +removed as soon as the client disconnects. + +The new clean start flag and session expiry interval allow the existing clean +session behaviour to be duplicated but also allow client sessions to be expired +based on time. + +# Updated Connect Return codes + +The return codes passed to the client in a CONNACK packet have been expanded to +include: + + * 6: Connection Refused, reason unspecified + * 7: Connection Refused, implementation specific + * 8: Connection Refused, CONNECT packet was malformed + +# Repeated topics when publishing + +When publishing data to a single topic, a new feature will help reduce +bandwidth use. A client or server can set the topic in a PUBLISH message to be +a zero length string. This tells the client/server being published to, to use +the previous topic instead. This goes some way to reducing the current overhead +associated with publishing - a shame it isn't quite as good as the registered +topics available in MQTT-SN. + +# Payload Format Indicator + +Another identifier/value pair is available for use when sending a PUBLISH +message. This is the Payload Format indicator. If present and set to 1, this +indicates that the PUBLISH payload is UTF-8 encoded data. If set to 0, or if +the indicator is not present then the payload is an unspecified byte format, +exactly as with MQTT v3.1.1. + +# Publication Expiry interval + +This is an identifier/value pair for use when publishing. If present, this +value is a 4 byte integer which gives the number of seconds for which the +server will attempt to deliver this message to a subscriber. This means that an +offline client with messages being queued may not receive all of the messages +when it reconnects, due to some of them expiring. Interestingly, when the +server does deliver a message that had a Publication Expiry set, it sets the +Publication Expiry on the outgoing message to the client but with the amount of +time that there is left until the message expires. This means that the true +time to expiry will propagate through bridges or similar. + +# Publish Return Codes + +The PUBACK and PUBREC packets have a new entry in their variable header which +is the Publish Return Code. This can be used to tell the client a message has +been refused for various reasons, accepted, or accepted with no matching +subscribers.  For the PUBREC packet, if the message is refused or accepted with +no matching subscribers then there is no expectation for the PUBREL/PUBCOMP +messages to be sent for that message. + +The PUBCOMP packet also has a similar entry which has the same set of return +codes and an additional one for the case when a message had expired. This is +for the case when a client reconnects with clean start set to 0 and it has a +QoS 2 message part way through its handshake, but the server has already +expired the message. + +There is still no way to tell a client that its QoS 0 message was refused. + +# Disconnect notification + +In MQTT v3.1.1 and before, only the client sends a DISCONNECT packet. In the +draft spec, either the client or the server can send DISCONNECT and it is used +to indicate a reason for disconnection. The disconnect return codes are: + + * 0: Connection disconnected by application (sent by client) + * 1: Server temporarily unavailable (server) + * 2: Server unavailable (server) + * 3: Malformed UNSUBSCRIBE packet received (server) + * 4: Session taken over (server - for when another client connects with the same ID) + * 5: Malformed packet received + +It is clear that there is some duplication there, so I think this is a likely +place that changes will be made. + +# Disconnect expiry notification + +The DISCONNECT packet can also include a Session Expiry interval value, as with +CONNECT. This allows a client to clean up when it disconnects, or to set a long +expiry time, even if these were not specified at the initial connect. + +[MQTT Technical Committee]: https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=mqtt diff --git a/www/posts/2016/08/version-1-4-10-released.md b/www/posts/2016/08/version-1-4-10-released.md new file mode 100644 index 00000000..adec67f0 --- /dev/null +++ b/www/posts/2016/08/version-1-4-10-released.md @@ -0,0 +1,47 @@ + + +This is a bugfix release. + +# Broker + + * Fix TLS operation with websockets listeners and libwebsockets 2.x. Closes + [#186]. + * Don't disconnect client on HUP before reading the pending data. Closes [#7]. + * Fix some $SYS messages being incorrectly persisted. Closes [#191]. + * Support OpenSSL 1.1.0. + * Call fsync after persisting data to ensure it is correctly written. Closes + [#189]. + * Fix persistence saving of subscription QoS on big-endian machines. + * Fix will retained flag handling on Windows. Closes [#222]. + * Broker now displays an error if it is unable to open the log file. Closes + [#234]. + +# Client library + + * Support OpenSSL 1.1.0. + * Fixed the C++ library not allowing SOCKS support to be used. Closes [#198]. + * Fix memory leak when verifying a server certificate with a subjectAltName + section. Closes [#237]. + +# Build + + * Don't attempt to install docs when `WITH_DOCS=no`. Closes [#184]. + +[#7]: https://github.com/eclipse/mosquitto/issues/7 +[#184]: https://github.com/eclipse/mosquitto/issues/184 +[#186]: https://github.com/eclipse/mosquitto/issues/186 +[#189]: https://github.com/eclipse/mosquitto/issues/189 +[#191]: https://github.com/eclipse/mosquitto/issues/191 +[#198]: https://github.com/eclipse/mosquitto/issues/198 +[#222]: https://github.com/eclipse/mosquitto/issues/222 +[#234]: https://github.com/eclipse/mosquitto/issues/234 +[#237]: https://github.com/eclipse/mosquitto/issues/237 diff --git a/www/posts/2016/12/pre-christmas-update.md b/www/posts/2016/12/pre-christmas-update.md new file mode 100644 index 00000000..c63dd59e --- /dev/null +++ b/www/posts/2016/12/pre-christmas-update.md @@ -0,0 +1,42 @@ + + +I have taken a bit of a break from Mosquitto for the past few months, partly +because I needed a break but also to work on another unrelated project. I'm now +back and working on Mosquitto again, primarily implementing support for the +upcoming MQTT v5 spec which has added even more features since I mentioned last +wrote about it. Once that is in a state that is reasonably compliant if +incomplete, I will be looking for testers. + +There are a few fixes in the repository waiting for release, I anticipate +releasing 1.4.11 before the end of the year. + +There have been some changes to test.mosquitto.org. On its original host I was +seeing lots of bandwidth being used by lots of clients, but in particular lots +and lots of tiny connections being made which not showing up on my bandwidth +monitoring, but were consuming bandwidth and causing problems at my provider. +My provider got in touch to say that at times approximately half of the network +flows for their network were related to test.mosquitto.org, and could would I +please have a chat with the transit provider to discuss how best to manage this +service. In the face of that and the risk of exceeding 2TB bandwidth usage per +month, test.mosquitto.org has been moved to a lower spec host with smaller +pipes and "automatic DDOS protection". This means I now get half a dozen emails +per day to say that test.mosquitto.org is under attack. If you find you can't +connect to test.mosquitto.org, it might be because you have been blocked by +this DDOS protection - if so, maybe think about how you are using the service. + +The final thought for this post - if you are part of a company that uses +mosquitto and it adds value to your company, please consider making a +[donation] to the project that reflects that value. If it is difficult for your +company to make donations but you would still like to contribute back, please +get in touch and maybe we can arrange something. + +[donation]: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=J66JWQ3N76L5A diff --git a/www/posts/2017/02/version-1-4-11-released.md b/www/posts/2017/02/version-1-4-11-released.md new file mode 100644 index 00000000..58bb6049 --- /dev/null +++ b/www/posts/2017/02/version-1-4-11-released.md @@ -0,0 +1,45 @@ + + +This is a bugfix release. + +# Broker + + * Fix crash when "lazy" type bridge attempts to reconnect. Closes [#259]. + * `maximum_connections` now applies to websockets listeners. Closes [#271]. + * Allow bridges to use TLS with IPv6. + * Don't error on zero length persistence files. Closes [#316]. + * For http only websockets clients, close files served over http in all cases + when the client disconnects. Closes [#354]. + * Fix error message when websockets `http_dir` directory does not exist. + * Improve password utility error message. Closes [#379]. + * Bridges can use asynchronous DNS lookups on systems with glibc. This can be + enabled at compile time using `WITH_ADNS=yes`. + +# Clients + + * Use of `--ciphers` no longer requires you to also pass `--tls-version`. + Closes [#380]. + +# Client library + + * Clients can now use TLS with IPv6. + * Fix potential socket leakage when reconnecting. Closes [#304]. + * Fix potential negative timeout being passed to pselect. Closes [#329]. + +[#259]: https://github.com/eclipse/mosquitto/issues/259 +[#271]: https://github.com/eclipse/mosquitto/issues/271 +[#304]: https://github.com/eclipse/mosquitto/issues/304 +[#316]: https://github.com/eclipse/mosquitto/issues/316 +[#329]: https://github.com/eclipse/mosquitto/issues/329 +[#354]: https://github.com/eclipse/mosquitto/issues/354 +[#379]: https://github.com/eclipse/mosquitto/issues/379 +[#380]: https://github.com/eclipse/mosquitto/issues/380 diff --git a/www/posts/2017/03/for-the-final-time.attachments.json b/www/posts/2017/03/for-the-final-time.attachments.json new file mode 100644 index 00000000..d8d27ba2 --- /dev/null +++ b/www/posts/2017/03/for-the-final-time.attachments.json @@ -0,0 +1 @@ +{"410": {"wordpress_user_name": "roger", "title": "img_20170308_155049248_33196894011_o", "date_utc": "2017-03-09 19:08:45", "files_meta": [{"height": 720, "width": 1280, "meta": {"created_timestamp": 1488988249.0, "shutter_speed": 0.02999, "focal_length": 2.471, "camera": "MotoE2(4G-LTE)", "aperture": 2.2, "iso": 125.0}}, {"height": 432, "size": "medium_large", "width": 768}, {"height": 169, "size": "medium", "width": 300}, {"height": 150, "size": "thumbnail", "width": 150}, {"height": 576, "size": "large", "width": 1024}], "files": ["/wp-content/uploads/2017/03/img_20170308_155049248_33196894011_o.jpg", "/wp-content/uploads/2017/03/img_20170308_155049248_33196894011_o-768x432.jpg", "/wp-content/uploads/2017/03/img_20170308_155049248_33196894011_o-300x169.jpg", "/wp-content/uploads/2017/03/img_20170308_155049248_33196894011_o-150x150.jpg", "/wp-content/uploads/2017/03/img_20170308_155049248_33196894011_o-1024x576.jpg"]}} \ No newline at end of file diff --git a/www/posts/2017/03/for-the-final-time.md b/www/posts/2017/03/for-the-final-time.md new file mode 100644 index 00000000..494e9d1b --- /dev/null +++ b/www/posts/2017/03/for-the-final-time.md @@ -0,0 +1,16 @@ + + +This guy arrived on Tuesday, two weeks early and weighing 9lb 6oz / 4.26kg. +Apologies if I'm a bit out of touch for a while. + +[![baby picture](/blog/uploads/2017/03/img_20170308_155049248_33196894011_o-300x169.jpg "baby picture")](/blog/uploads/2017/03/img_20170308_155049248_33196894011_o.jpg) diff --git a/www/posts/2017/05/security-advisory-cve-2017-7650.md b/www/posts/2017/05/security-advisory-cve-2017-7650.md new file mode 100644 index 00000000..a29b8324 --- /dev/null +++ b/www/posts/2017/05/security-advisory-cve-2017-7650.md @@ -0,0 +1,57 @@ + + +A vulnerability exists in Mosquitto versions 0.15 to 1.4.11 inclusive known as +[CVE-2017-7650]. + +Pattern based ACLs can be bypassed by clients that set their username/client id +to '#' or '+'. This allows locally or remotely connected clients to access MQTT +topics that they do have the rights to. The same issue may be present in third +party authentication/access control plugins for Mosquitto. + +The vulnerability only comes into effect where pattern based ACLs are in use, +or potentially where third party plugins are in use. + +The issue is fixed in Mosquitto 1.4.12, which has just been released. Patches +for older versions are available at + +The fix addresses the problem by restricting access for clients with a '#', +'+', or '/' in their username or client id. '/' has been included in the list +of characters disallowed because it also has a special meaning in a topic and +may represent an additional risk. The restriction placed on clients is that +they may not receive or send messages that are subject to a pattern based ACL +check, nor any message that is subject to a plugin check. + +Thanks to Artem Zinenko from HackerDom CTF team for finding this vulnerability +and responsibly reporting it. + +Complete list of fixes addressed in version 1.4.12: + +# Broker + + * Fix mosquitto.db from becoming corrupted due to client messages being + persisted with no stored message. Closes [#424]. + * Fix bridge not restarting properly. Closes [#428]. + * Fix unitialized memory in `gets_quiet` on Windows. Closes [#426]. + * Fix building with `WITH_ADNS=no` for systems that don't use glibc. Closes + [#415]. + * Fixes to readme.md. + * Fix deprecation warning for OpenSSL 1.1. PR [#416]. + * Don't segfault on duplicate bridge names. Closes [#446]. + * Fix [CVE-2017-7650]. + +[CVE-2017-7650]: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-7650 +[#415]: https://github.com/eclipse/mosquitto/issues/415 +[#416]: https://github.com/eclipse/mosquitto/issues/416 +[#424]: https://github.com/eclipse/mosquitto/issues/424 +[#428]: https://github.com/eclipse/mosquitto/issues/428 +[#426]: https://github.com/eclipse/mosquitto/issues/426 +[#446]: https://github.com/eclipse/mosquitto/issues/446 diff --git a/www/posts/2017/06/citing-eclipse-mosquitto.md b/www/posts/2017/06/citing-eclipse-mosquitto.md new file mode 100644 index 00000000..54776147 --- /dev/null +++ b/www/posts/2017/06/citing-eclipse-mosquitto.md @@ -0,0 +1,26 @@ + + +A short paper has been published on Mosquitto in [The Journal of Open Source +Software] If you use Mosquitto in your academic work, please now use this paper +as your citation. + +> R. A. Light, "Mosquitto: server and client implementation of the MQTT +> protocol," *The Journal of Open Source Software*, vol. 2, no. 13, May 2017, +> DOI: [10.21105/joss.00265] + +The paper link is + +A [bibtex] entry is available. + +[The Journal of Open Source Software]: http://joss.theoj.org +[10.21105/joss.00265]: http://dx.doi.org/10.21105/joss.00265 +[bibtek]: http://www.doi2bib.org/#/doi/10.21105/joss.00265 diff --git a/www/posts/2017/06/security-advisory-cve-2017-9868.md b/www/posts/2017/06/security-advisory-cve-2017-9868.md new file mode 100644 index 00000000..6a601d01 --- /dev/null +++ b/www/posts/2017/06/security-advisory-cve-2017-9868.md @@ -0,0 +1,32 @@ + + +A vulnerability exists in Mosquitto versions 0.15 to 1.4.12 inclusive known as +[CVE-2017-9868]. + +If persistence is enabled, then the persistence file is created world readable, +which has the potential to make sensitive information available to any local +user. + +Patches are available to fix this for Unix like operating systems (i.e. not +Windows): + +This will be fixed in version 1.4.13, due to be released shortly. + +This can also be fixed administratively by removing world read permissions for +the directory that the persistence file is stored in. In many systems this can +be achieved with: + +``` +chmod 700 /var/lib/mosquitto +``` + +[CVE-2017-9868]: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-9868 diff --git a/www/posts/2017/07/version-1-4-13-released.md b/www/posts/2017/07/version-1-4-13-released.md new file mode 100644 index 00000000..d9b1631c --- /dev/null +++ b/www/posts/2017/07/version-1-4-13-released.md @@ -0,0 +1,49 @@ + + +This is a bugfix and security release. + +# Security + + * Fix [CVE-2017-9868]. + The persistence file was readable by all local users, potentially allowing + sensitive information to be leaked. This can also be fixed + administratively, by restricting access to the directory in which the + persistence file is stored. + +# Broker + + * Fix for poor websockets performance. + * Fix lazy bridges not timing out for `idle_timeout`. Closes [#417]. + * Fix problems with large retained messages over websockets. Closes [#427]. + * Set persistence file to only be readable by owner, except on Windows. Closes + [#468]. + * Fix CONNECT check for reserved=0, as per MQTT v3.1.1 check MQTT-3.1.2-3. + * When the broker stop, wills for any connected clients are now "sent". Closes + [#477]. + * Auth plugins can be configured to disable the check for +# in + usernames/client ids with the `auth_plugin_deny_special_chars` option. + Partially closes [#462]. + * Restrictions for [CVE-2017-7650] have been relaxed - '/' is allowed in + usernames/client ids. + * Remainder of fix for [#462]. + +# Clients + + * Don't use / in auto-generated client ids. + +[CVE-2017-7650]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-7650 +[CVE-2017-9868]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-9868 +[#417]: https://github.com/eclipse/mosquitto/issues/417 +[#427]: https://github.com/eclipse/mosquitto/issues/427 +[#462]: https://github.com/eclipse/mosquitto/issues/462 +[#468]: https://github.com/eclipse/mosquitto/issues/468 +[#477]: https://github.com/eclipse/mosquitto/issues/477 diff --git a/www/posts/2017/07/version-1-4-14-released.md b/www/posts/2017/07/version-1-4-14-released.md new file mode 100644 index 00000000..75b2eeb3 --- /dev/null +++ b/www/posts/2017/07/version-1-4-14-released.md @@ -0,0 +1,18 @@ + + +This is a bugfix release. + +Version 1.4.13 contained a regression that meant persistence data was only +being saved after client information had been freed. This release fixes that. + +If you use persistence then it is strongly recommended to avoid 1.4.13 so you +do not suffer data loss. diff --git a/www/posts/2018/01/mosquitto-debian-repo-key-updated.md b/www/posts/2018/01/mosquitto-debian-repo-key-updated.md new file mode 100644 index 00000000..a3a18980 --- /dev/null +++ b/www/posts/2018/01/mosquitto-debian-repo-key-updated.md @@ -0,0 +1,21 @@ + + +If you are using the [debian repository] at repo.mosquitto.org you may have +noticed that the repository signing key expired at the end of 2017. To get the +updated key use the following commands: + +``` +wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key +sudo apt-key add mosquitto-repo.gpg.key +``` + +[debian repository]:/blog/2013/01/mosquitto-debian-repository diff --git a/www/posts/2018/02/security-advisory-cve-2017-7651-cve-2017-7652.md b/www/posts/2018/02/security-advisory-cve-2017-7651-cve-2017-7652.md new file mode 100644 index 00000000..977c9cf8 --- /dev/null +++ b/www/posts/2018/02/security-advisory-cve-2017-7651-cve-2017-7652.md @@ -0,0 +1,109 @@ + + +Mosquitto 1.4.15 has been released to address two security vulnerabilities. + +# CVE-2017-7651 + +A vulnerability exists in all Mosquitto versions up to and including 1.4.14 +known as [CVE-2017-7651]. + +Unauthenticated clients can send a crafted CONNECT packet which causes large +amounts of memory use in the broker. If multiple clients do this, an out of +memory situation can occur and the system may become unresponsive or the broker +will be killed by the operating system. + +The issue is fixed in Mosquitto 1.4.15. Patches for older versions are +available at + +The fix addresses the problem by limiting the permissible size for CONNECT +packet, and by adding a `memory_limit` configuration option that allows the +broker to self limit the amount of memory it uses. + +Thanks to Felipe Balabanian for finding this vulnerability and responsibly +reporting it. + +# CVE-2017-7652 + +A vulnerability exists in Mosquitto versions 1.0 to 1.4.14 inclusive +known as [CVE-2017-7652]. + +If the broker has exhausted all of its free sockets/file descriptors and then a +SIGHUP signal is received to trigger reloading of the configuration, then the +reloading will fail. This results in many of the configuration options, +including security options, being set to their default value. This means that +authorisation and access control may no longer be in place. + +The issue is fixed in Mosquitto 1.4.15. Patches for older versions are +available at + +The fix addresses the problem by only copying the new configuration options to +the in use configuration after a successful reload has taken place. + +# Version 1.4.15 Changes + +The complete list of fixes addressed in version 1.4.15 is: + +## Security +* Fix [CVE-2017-7652]. If a SIGHUP is sent to the broker when there are no more + file descriptors, then opening the configuration file will fail and security + settings will be set back to their default values. +* Fix [CVE-2017-7651]. Unauthenticated clients can cause excessive memory use by + setting "remaining length" to be a large value. This is now mitigated by + limiting the size of remaining length to valid values. A `memory_limit` + configuration option has also been added to allow the overall memory used by + the broker to be limited. + +## Broker +* Use constant time memcmp for password comparisons. +* Fix incorrect PSK key being used if it had leading zeroes. +* Fix memory leak if a client provided a username/password for a listener with + `use_identity_as_username` configured. +* Fix `use_identity_as_username` not working on websockets clients. +* Don't crash if an auth plugin returns `MOSQ_ERR_AUTH` for a username check on + a websockets client. Closes [#490]. +* Fix 08-ssl-bridge.py test when using async dns lookups. Closes [#507]. +* Lines in the config file are no longer limited to 1024 characters long. + Closes [#652]. +* Fix $SYS counters of messages and bytes sent when message is sent over + a Websockets. Closes [#250]. +* Fix `upgrade_outgoing_qos` for retained message. Closes [#534]. +* Fix CONNACK message not being sent for unauthorised connect on websockets. + Closes [#8]. + +## Client library +* Fix incorrect PSK key being used if it had leading zeroes. +* Initialise "result" variable as soon as possible in + `mosquitto_topic_matches_sub`. Closes [#654]. +* No need to close socket again if setting non-blocking failed. Closes [#649]. +* Fix `mosquitto_topic_matches_sub()` not correctly matching `foo/bar` against + `foo/+/#`. Closes [#670]. + +## Clients +* Correctly handle empty files with `mosquitto_pub -l`. Closes [#676]. + +## Build +* Don't run TLS-PSK tests if TLS-PSK disabled at compile time. Closes [#636]. + + +[CVE-2017-7651]: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-7651 +[CVE-2017-7652]: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-7652 +[#8]: https://github.com/eclipse/mosquitto/issues/8 +[#250]: https://github.com/eclipse/mosquitto/issues/250 +[#490]: https://github.com/eclipse/mosquitto/issues/490 +[#507]: https://github.com/eclipse/mosquitto/issues/507 +[#534]: https://github.com/eclipse/mosquitto/issues/534 +[#636]: https://github.com/eclipse/mosquitto/issues/636 +[#649]: https://github.com/eclipse/mosquitto/issues/649 +[#652]: https://github.com/eclipse/mosquitto/issues/652 +[#654]: https://github.com/eclipse/mosquitto/issues/654 +[#670]: https://github.com/eclipse/mosquitto/issues/670 +[#676]: https://github.com/eclipse/mosquitto/issues/676 diff --git a/www/posts/2018/05/press-release.md b/www/posts/2018/05/press-release.md new file mode 100644 index 00000000..8a744d86 --- /dev/null +++ b/www/posts/2018/05/press-release.md @@ -0,0 +1,53 @@ + + +I am pleased to announce that I am being paid to work on Mosquitto by Cedalo AG. +I will be leaving my current job at the end of June this year, but have already +started work for Cedalo on a limited basis. + +The press release for this change is below: + +# New 1.5 release, MQTT 5.0 roadmap and commercial sponsor for Open-Source Eclipse Mosquitto MQTT Broker + +Open-Source MQTT Broker Version 1.5 released – Estimate for availability of +MQTT 5.0 compliant version – German based Cedalo AG becomes commercial sponsor +for future Mosquitto Open Source development + +A new version of the open source Eclipse Mosquitto MQTT broker is available on +the Mosquitto website at [mosquitto.org](https://mosquitto.org). Mosquitto version 1.5 brings a +host of changes to the broker, including performance improvements and more +flexible authentication and access control, as well as numerous bug fixes. The +client library has added some helper functions to allow the creation of +extremely simple MQTT clients. + +The initiator and core developer of the Mosquitto project is now employed by +the German based company Cedalo AG ([www.cedalo.com](https://www.cedalo.com)). Cedalo has hired Roger +Light to sponsor the further development of Mosquitto and to accelerate the +public availability of a powerful MQTT broker. Cedalo is the creator of the +end-user oriented IoT modelling tool “Streamsheets”. + +With the new sponsorship the project is now able to accelerate the path towards +new releases. The next version of Mosquitto will add support for MQTT version +5, which is the most substantial revision of the protocol since the first +public specification was released. MQTT v5 adds error reporting, enhancements +for scalability at the server side, features to help resource constrained +clients, and extensible metadata - which is used amongst other things to +introduce support for a request/response capability. + +The MQTT v5 compliant release is planned for the end of August 2018. + +Press Contact: +Cedalo AG +79098 Freiburg, +Schnewlinstr. 6 + +Kristian Raue +Mail: presse@cedalo.com diff --git a/www/posts/2018/05/version-1-5-released.md b/www/posts/2018/05/version-1-5-released.md new file mode 100644 index 00000000..d9eabdad --- /dev/null +++ b/www/posts/2018/05/version-1-5-released.md @@ -0,0 +1,167 @@ + + +1.5 - 20180502 +============== + +This is a features release. Updated binaries will be available shortly. + +# Security + + * Fix memory leak that could be caused by a malicious CONNECT packet. This + does not yet have a CVE assigned. Closes #533493 (on Eclipse bugtracker) + +# Broker features + + * Add `per_listener_settings` to allow authentication and access control to be + per listener. + * Add limited support for reloading listener settings. This allows settings + for an already defined listener to be reloaded, but port numbers must not be + changed. + * Add ability to deny access to SUBSCRIBE messages as well as the current + read/write accesses. Currently for auth plugins only. + * Reduce calls to malloc through the use of UHPA. + * Outgoing messages with QoS>1 are no longer retried after a timeout period. + Messages will be retried when a client reconnects. This change in behaviour + can be justified by considering when the timeout may have occurred. + * If a connection is unreliable and has dropped, but without one end + noticing, the messages will be retried on reconnection. Sending + additional PUBLISH or PUBREL would not have changed anything. + * If a client is overloaded/unable to respond/has a slow connection then + sending additional PUBLISH or PUBREL would not help the client catch + up. Once the backlog has cleared the client will respond. If it is not + able to catch up, sending additional duplicates would not help either. + * Add `use_subject_as_username` option for certificate based client + authentication to use the entire certificate subject as a username, rather + than just the CN. Closes #469467. + * Change sys tree printing output. This format shouldn't be relied upon and + may change at any time. Closes #470246. + * Minimum supported libwebsockets version is now 1.3. + * Add systemd startup notification and services. Closes #471053. + * Reduce unnecessary malloc and memcpy when receiving a message and storing + it. Closes #470258. + * Support for Windows XP has been dropped. + * Bridge connections now default to using MQTT v3.1.1. + * `mosquitto_db_dump` tool can now output some stats on clients. + * Perform utf-8 validation on incoming will, subscription and unsubscription + topics. + * new $SYS/broker/store/messages/count (deprecates $SYS/broker/messages/stored) + * new $SYS/broker/store/messages/bytes + * `max_queued_bytes` feature to limit queues by real size rather than + than just message count. Closes Eclipse #452919 or Github #100 + * Add support for bridges to be configured to only send notifications to the + local broker. + * Add `set_tcp_nodelay` option to allow Nagle's algorithm to be disabled on + client sockets. Closes #433. + * The behaviour of `allow_anonymous` has changed. In the old behaviour, the + default if not set was to allow anonymous access. The new behaviour is to + default is to allow anonymous access unless another security option is set. + For example, if `password_file` is set and `allow_anonymous` is not set, + then anonymous access will be denied. It is still possible to allow + anonymous access by setting it explicitly. + +# Broker fixes + * Fix UNSUBSCRIBE with no topic is accepted on MQTT 3.1.1. Closes #665. + * Produce an error if two bridges share the same `local_clientid`. + * Miscellaneous fixes on Windows. + * `queue_qos0_messages` was not observing `max_queued_**` limits + * When using the `include_dir` configuration option sort the files + alphabetically before loading them. Closes #17. + * IPv6 is no longer disabled for websockets listeners. + * Remove all build timestamp information including $SYS/broker/timestamp. + Closes #651. + * Correctly handle incoming strings that contain a NULL byte. Closes #693. + * Use constant time memcmp for password comparisons. + * Fix incorrect PSK key being used if it had leading zeroes. + * Fix memory leak if a client provided a username/password for a listener with + `use_identity_as_username` configured. + * Fix `use_identity_as_username` not working on websockets clients. + * Don't crash if an auth plugin returns `MOSQ_ERR_AUTH` for a username check on + a websockets client. Closes #490. + * Fix 08-ssl-bridge.py test when using async dns lookups. Closes #507. + * Lines in the config file are no longer limited to 1024 characters long. + Closes #652. + * Fix $SYS counters of messages and bytes sent when message is sent over + a Websockets. Closes #250. + * Fix `upgrade_outgoing_qos` for retained message. Closes #534. + * Fix CONNACK message not being sent for unauthorised connect on websockets. + Closes #8. + * Maximum connections on Windows increased to 2048. + * When a client with an in-use client-id connects, if the old client has a + will, send the will message. Closes #26. + * Fix parsing of configuration options that end with a space. Closes #804. + +# Client library features + * Outgoing messages with QoS>1 are no longer retried after a timeout period. + Messages will be retried when a client reconnects. + * DNS-SRV support is now disabled by default. + * Add `mosquitto_subscribe_simple()` This is a helper function to make + retrieving messages from a broker very straightforward. Examples of its use + are in `examples/subscribe_simple`. + * Add `mosquitto_subscribe_callback()` This is a helper function to make + processing messages from a broker very straightforward. An example of its use + is in `examples/subscribe_simple`. + * Connections now default to using MQTT v3.1.1. + * Add `mosquitto_validate_utf8()` to check whether a string is valid UTF-8 + according to the UTF-8 spec and to the additional restrictions imposed by + the MQTT spec. + * Topic inputs are checked for UTF-8 validity. + * Add `mosquitto_userdata` function to allow retrieving the client userdata + member variable. Closes #111. + * Add `mosquitto_pub_topic_check2()`, `mosquitto_sub_topic_check2()`, and + `mosquitto_topic_matches_sub2()` which are identical to the similarly named + functions but also take length arguments. + * Add `mosquitto_connect_with_flags_callback_set()`, which allows a second + connect callback to be used which also exposes the connect flags parameter. + Closes #738 and #128. + * Add `MOSQ_OPT_SSL_CTX` option to allow a user specified `SSL_CTX` to be used + instead of the one generated by libmosquitto. This allows greater control + over what options can be set. Closes #715. + * Add `MOSQ_OPT_SSL_CTX_WITH_DEFAULTS` to work with `MOSQ_OPT_SSL_CTX` and have + the default libmosquitto `SSL_CTX` configuration applied to the user provided + `SSL_CTX`. Closes #567. + +# Client library fixes + * Fix incorrect PSK key being used if it had leading zeroes. + * Initialise "result" variable as soon as possible in + `mosquitto_topic_matches_sub`. Closes #654. + * No need to close socket again if setting non-blocking failed. Closes #649. + * Fix `mosquitto_topic_matches_sub()` not correctly matching foo/bar against + foo/+/#. Closes #670. + * SNI host support added. + +# Client features + * Add -F to `mosquitto_sub` to allow the user to choose the output format. + * Add -U to `mosquitto_sub` for unsubscribing from topics. + * Add -c (clean session) to `mosquitto_pub`. + * Add --retained-only to `mosquitto_sub` to exit after receiving all retained + messages. + * Add -W to allow `mosquitto_sub` to stop processing incoming messages after a + timeout. + * Connections now default to using MQTT v3.1.1. + * Default to using port 8883 when using TLS. + * `mosquitto_sub` doesn't continue to keep connecting if CONNACK tells it the + connection was refused. + +# Client fixes + * Correctly handle empty files with `mosquitto_pub -l`. Closes #676. + +# Build + * Add `WITH_STRIP` option (defaulting to "no") that when set to "yes" will strip + executables and shared libraries when installing. + * Add `WITH_STATIC_LIBRARIES` (defaulting to "no") that when set to "yes" will + build and install static versions of the client libraries. + * Don't run TLS-PSK tests if TLS-PSK disabled at compile time. Closes #636. + * Support for openssl versions 1.0.0 and 1.0.1 has been removed as these are + no longer supported by openssl. + +# Documentation + * Replace mentions of deprecated `c_rehash` with `openssl rehash`. diff --git a/www/templates/book.tmpl b/www/templates/book.tmpl new file mode 100644 index 00000000..d8087296 --- /dev/null +++ b/www/templates/book.tmpl @@ -0,0 +1,117 @@ +## -*- coding: utf-8 -*- +<%namespace name="helper" file="post_helper.tmpl"/> +<%namespace name="pheader" file="post_header.tmpl"/> +<%namespace name="comments" file="comments_helper.tmpl"/> +<%inherit file="post.tmpl"/> + +<%block name="extra_head"> + ${parent.extra_head()} + + + + +<%block name="content"> +
+
+
+
+

${post.title()}

+ ${post.text()} +
+
+
+
+ + +<%block name="extra_js"> + + + diff --git a/www/themes/mosquitto/assets/css/bulma.css b/www/themes/mosquitto/assets/css/bulma.css new file mode 100644 index 00000000..3abc7eee --- /dev/null +++ b/www/themes/mosquitto/assets/css/bulma.css @@ -0,0 +1,10666 @@ +/*! bulma.io v0.6.1 | MIT License | github.com/jgthms/bulma */ +@-webkit-keyframes spinAround { + from { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes spinAround { + from { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +/*! minireset.css v0.0.2 | MIT License | github.com/jgthms/minireset.css */ +html, +body, +p, +ol, +ul, +li, +dl, +dt, +dd, +blockquote, +figure, +fieldset, +legend, +textarea, +pre, +iframe, +hr, +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + padding: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: 100%; + font-weight: normal; +} + +ul { + list-style: none; +} + +button, +input, +select, +textarea { + margin: 0; +} + +html { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +* { + -webkit-box-sizing: inherit; + box-sizing: inherit; +} + +*:before, *:after { + -webkit-box-sizing: inherit; + box-sizing: inherit; +} + +img, +embed, +object, +audio, +video { + max-width: 100%; +} + +iframe { + border: 0; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; + text-align: left; +} + +html { + background-color: white; + font-size: 16px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + min-width: 300px; + overflow-x: hidden; + overflow-y: scroll; + text-rendering: optimizeLegibility; + -webkit-text-size-adjust: 100%; + -moz-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + text-size-adjust: 100%; +} + +article, +aside, +figure, +footer, +header, +hgroup, +section { + display: block; +} + +body, +button, +input, +select, +textarea { + font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif; +} + +code, +pre { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; + font-family: monospace; +} + +body { + color: #4a4a4a; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; +} + +a { + color: #7a91c1; + cursor: pointer; + text-decoration: none; +} + +a strong { + color: currentColor; +} + +a:hover { + color: #363636; +} + +code { + background-color: whitesmoke; + color: #ff3860; + font-size: 0.875em; + font-weight: normal; + padding: 0.25em 0.5em 0.25em; +} + +hr { + background-color: #dbdbdb; + border: none; + display: block; + height: 1px; + margin: 1.5rem 0; +} + +img { + height: auto; + max-width: 100%; +} + +input[type="checkbox"], +input[type="radio"] { + vertical-align: baseline; +} + +small { + font-size: 0.875em; +} + +span { + font-style: inherit; + font-weight: inherit; +} + +strong { + color: #363636; + font-weight: 700; +} + +pre { + -webkit-overflow-scrolling: touch; + background-color: whitesmoke; + color: #4a4a4a; + font-size: 0.875em; + overflow-x: auto; + padding: 1.25rem 1.5rem; + white-space: pre; + word-wrap: normal; +} + +pre code { + background-color: transparent; + color: currentColor; + font-size: 1em; + padding: 0; +} + +table td, +table th { + text-align: left; + vertical-align: top; +} + +table th { + color: #363636; +} + +.is-clearfix:after { + clear: both; + content: " "; + display: table; +} + +.is-pulled-left { + float: left !important; +} + +.is-pulled-right { + float: right !important; +} + +.is-clipped { + overflow: hidden !important; +} + +.is-overlay { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +.is-size-1 { + font-size: 3rem !important; +} + +.is-size-2 { + font-size: 2.5rem !important; +} + +.is-size-3 { + font-size: 2rem !important; +} + +.is-size-4 { + font-size: 1.5rem !important; +} + +.is-size-5 { + font-size: 1.25rem !important; +} + +.is-size-6 { + font-size: 1rem !important; +} + +.is-size-7 { + font-size: 0.75rem !important; +} + +@media screen and (max-width: 768px) { + .is-size-1-mobile { + font-size: 3rem !important; + } + .is-size-2-mobile { + font-size: 2.5rem !important; + } + .is-size-3-mobile { + font-size: 2rem !important; + } + .is-size-4-mobile { + font-size: 1.5rem !important; + } + .is-size-5-mobile { + font-size: 1.25rem !important; + } + .is-size-6-mobile { + font-size: 1rem !important; + } + .is-size-7-mobile { + font-size: 0.75rem !important; + } +} + +@media screen and (min-width: 769px), print { + .is-size-1-tablet { + font-size: 3rem !important; + } + .is-size-2-tablet { + font-size: 2.5rem !important; + } + .is-size-3-tablet { + font-size: 2rem !important; + } + .is-size-4-tablet { + font-size: 1.5rem !important; + } + .is-size-5-tablet { + font-size: 1.25rem !important; + } + .is-size-6-tablet { + font-size: 1rem !important; + } + .is-size-7-tablet { + font-size: 0.75rem !important; + } +} + +@media screen and (max-width: 1023px) { + .is-size-1-touch { + font-size: 3rem !important; + } + .is-size-2-touch { + font-size: 2.5rem !important; + } + .is-size-3-touch { + font-size: 2rem !important; + } + .is-size-4-touch { + font-size: 1.5rem !important; + } + .is-size-5-touch { + font-size: 1.25rem !important; + } + .is-size-6-touch { + font-size: 1rem !important; + } + .is-size-7-touch { + font-size: 0.75rem !important; + } +} + +@media screen and (min-width: 1024px) { + .is-size-1-desktop { + font-size: 3rem !important; + } + .is-size-2-desktop { + font-size: 2.5rem !important; + } + .is-size-3-desktop { + font-size: 2rem !important; + } + .is-size-4-desktop { + font-size: 1.5rem !important; + } + .is-size-5-desktop { + font-size: 1.25rem !important; + } + .is-size-6-desktop { + font-size: 1rem !important; + } + .is-size-7-desktop { + font-size: 0.75rem !important; + } +} + +@media screen and (min-width: 1216px) { + .is-size-1-widescreen { + font-size: 3rem !important; + } + .is-size-2-widescreen { + font-size: 2.5rem !important; + } + .is-size-3-widescreen { + font-size: 2rem !important; + } + .is-size-4-widescreen { + font-size: 1.5rem !important; + } + .is-size-5-widescreen { + font-size: 1.25rem !important; + } + .is-size-6-widescreen { + font-size: 1rem !important; + } + .is-size-7-widescreen { + font-size: 0.75rem !important; + } +} + +@media screen and (min-width: 1408px) { + .is-size-1-fullhd { + font-size: 3rem !important; + } + .is-size-2-fullhd { + font-size: 2.5rem !important; + } + .is-size-3-fullhd { + font-size: 2rem !important; + } + .is-size-4-fullhd { + font-size: 1.5rem !important; + } + .is-size-5-fullhd { + font-size: 1.25rem !important; + } + .is-size-6-fullhd { + font-size: 1rem !important; + } + .is-size-7-fullhd { + font-size: 0.75rem !important; + } +} + +.has-text-centered { + text-align: center !important; +} + +@media screen and (max-width: 768px) { + .has-text-centered-mobile { + text-align: center !important; + } +} + +@media screen and (min-width: 769px), print { + .has-text-centered-tablet { + text-align: center !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .has-text-centered-tablet-only { + text-align: center !important; + } +} + +@media screen and (max-width: 1023px) { + .has-text-centered-touch { + text-align: center !important; + } +} + +@media screen and (min-width: 1024px) { + .has-text-centered-desktop { + text-align: center !important; + } +} + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .has-text-centered-desktop-only { + text-align: center !important; + } +} + +@media screen and (min-width: 1216px) { + .has-text-centered-widescreen { + text-align: center !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-centered-widescreen-only { + text-align: center !important; + } +} + +@media screen and (min-width: 1408px) { + .has-text-centered-fullhd { + text-align: center !important; + } +} + +.has-text-justified { + text-align: justify !important; +} + +@media screen and (max-width: 768px) { + .has-text-justified-mobile { + text-align: justify !important; + } +} + +@media screen and (min-width: 769px), print { + .has-text-justified-tablet { + text-align: justify !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .has-text-justified-tablet-only { + text-align: justify !important; + } +} + +@media screen and (max-width: 1023px) { + .has-text-justified-touch { + text-align: justify !important; + } +} + +@media screen and (min-width: 1024px) { + .has-text-justified-desktop { + text-align: justify !important; + } +} + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .has-text-justified-desktop-only { + text-align: justify !important; + } +} + +@media screen and (min-width: 1216px) { + .has-text-justified-widescreen { + text-align: justify !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-justified-widescreen-only { + text-align: justify !important; + } +} + +@media screen and (min-width: 1408px) { + .has-text-justified-fullhd { + text-align: justify !important; + } +} + +.has-text-left { + text-align: left !important; +} + +@media screen and (max-width: 768px) { + .has-text-left-mobile { + text-align: left !important; + } +} + +@media screen and (min-width: 769px), print { + .has-text-left-tablet { + text-align: left !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .has-text-left-tablet-only { + text-align: left !important; + } +} + +@media screen and (max-width: 1023px) { + .has-text-left-touch { + text-align: left !important; + } +} + +@media screen and (min-width: 1024px) { + .has-text-left-desktop { + text-align: left !important; + } +} + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .has-text-left-desktop-only { + text-align: left !important; + } +} + +@media screen and (min-width: 1216px) { + .has-text-left-widescreen { + text-align: left !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-left-widescreen-only { + text-align: left !important; + } +} + +@media screen and (min-width: 1408px) { + .has-text-left-fullhd { + text-align: left !important; + } +} + +.has-text-right { + text-align: right !important; +} + +@media screen and (max-width: 768px) { + .has-text-right-mobile { + text-align: right !important; + } +} + +@media screen and (min-width: 769px), print { + .has-text-right-tablet { + text-align: right !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .has-text-right-tablet-only { + text-align: right !important; + } +} + +@media screen and (max-width: 1023px) { + .has-text-right-touch { + text-align: right !important; + } +} + +@media screen and (min-width: 1024px) { + .has-text-right-desktop { + text-align: right !important; + } +} + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .has-text-right-desktop-only { + text-align: right !important; + } +} + +@media screen and (min-width: 1216px) { + .has-text-right-widescreen { + text-align: right !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-right-widescreen-only { + text-align: right !important; + } +} + +@media screen and (min-width: 1408px) { + .has-text-right-fullhd { + text-align: right !important; + } +} + +.is-capitalized { + text-transform: capitalize !important; +} + +.is-lowercase { + text-transform: lowercase !important; +} + +.is-uppercase { + text-transform: uppercase !important; +} + +.has-text-white { + color: white !important; +} + +a.has-text-white:hover, a.has-text-white:focus { + color: #e6e6e6 !important; +} + +.has-text-black { + color: #0a0a0a !important; +} + +a.has-text-black:hover, a.has-text-black:focus { + color: black !important; +} + +.has-text-light { + color: whitesmoke !important; +} + +a.has-text-light:hover, a.has-text-light:focus { + color: #dbdbdb !important; +} + +.has-text-dark { + color: #363636 !important; +} + +a.has-text-dark:hover, a.has-text-dark:focus { + color: #1c1c1c !important; +} + +.has-text-primary { + color: #00d1b2 !important; +} + +a.has-text-primary:hover, a.has-text-primary:focus { + color: #009e86 !important; +} + +.has-text-link { + color: #7a91c1 !important; +} + +a.has-text-link:hover, a.has-text-link:focus { + color: #205bbc !important; +} + +.has-text-info { + color: #209cee !important; +} + +a.has-text-info:hover, a.has-text-info:focus { + color: #0f81cc !important; +} + +.has-text-success { + color: #23d160 !important; +} + +a.has-text-success:hover, a.has-text-success:focus { + color: #1ca64c !important; +} + +.has-text-warning { + color: #ffdd57 !important; +} + +a.has-text-warning:hover, a.has-text-warning:focus { + color: #ffd324 !important; +} + +.has-text-danger { + color: #ff3860 !important; +} + +a.has-text-danger:hover, a.has-text-danger:focus { + color: #ff0537 !important; +} + +.has-text-black-bis { + color: #121212 !important; +} + +.has-text-black-ter { + color: #242424 !important; +} + +.has-text-grey-darker { + color: #363636 !important; +} + +.has-text-grey-dark { + color: #4a4a4a !important; +} + +.has-text-grey { + color: #7a7a7a !important; +} + +.has-text-grey-light { + color: #b5b5b5 !important; +} + +.has-text-grey-lighter { + color: #dbdbdb !important; +} + +.has-text-white-ter { + color: whitesmoke !important; +} + +.has-text-white-bis { + color: #fafafa !important; +} + +.has-text-weight-light { + font-weight: 300 !important; +} + +.has-text-weight-normal { + font-weight: 400 !important; +} + +.has-text-weight-semibold { + font-weight: 600 !important; +} + +.has-text-weight-bold { + font-weight: 700 !important; +} + +.is-block { + display: block !important; +} + +@media screen and (max-width: 768px) { + .is-block-mobile { + display: block !important; + } +} + +@media screen and (min-width: 769px), print { + .is-block-tablet { + display: block !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .is-block-tablet-only { + display: block !important; + } +} + +@media screen and (max-width: 1023px) { + .is-block-touch { + display: block !important; + } +} + +@media screen and (min-width: 1024px) { + .is-block-desktop { + display: block !important; + } +} + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .is-block-desktop-only { + display: block !important; + } +} + +@media screen and (min-width: 1216px) { + .is-block-widescreen { + display: block !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-block-widescreen-only { + display: block !important; + } +} + +@media screen and (min-width: 1408px) { + .is-block-fullhd { + display: block !important; + } +} + +.is-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; +} + +@media screen and (max-width: 768px) { + .is-flex-mobile { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +@media screen and (min-width: 769px), print { + .is-flex-tablet { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .is-flex-tablet-only { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +@media screen and (max-width: 1023px) { + .is-flex-touch { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +@media screen and (min-width: 1024px) { + .is-flex-desktop { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .is-flex-desktop-only { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +@media screen and (min-width: 1216px) { + .is-flex-widescreen { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-flex-widescreen-only { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +@media screen and (min-width: 1408px) { + .is-flex-fullhd { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + } +} + +.is-inline { + display: inline !important; +} + +@media screen and (max-width: 768px) { + .is-inline-mobile { + display: inline !important; + } +} + +@media screen and (min-width: 769px), print { + .is-inline-tablet { + display: inline !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .is-inline-tablet-only { + display: inline !important; + } +} + +@media screen and (max-width: 1023px) { + .is-inline-touch { + display: inline !important; + } +} + +@media screen and (min-width: 1024px) { + .is-inline-desktop { + display: inline !important; + } +} + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .is-inline-desktop-only { + display: inline !important; + } +} + +@media screen and (min-width: 1216px) { + .is-inline-widescreen { + display: inline !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-widescreen-only { + display: inline !important; + } +} + +@media screen and (min-width: 1408px) { + .is-inline-fullhd { + display: inline !important; + } +} + +.is-inline-block { + display: inline-block !important; +} + +@media screen and (max-width: 768px) { + .is-inline-block-mobile { + display: inline-block !important; + } +} + +@media screen and (min-width: 769px), print { + .is-inline-block-tablet { + display: inline-block !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .is-inline-block-tablet-only { + display: inline-block !important; + } +} + +@media screen and (max-width: 1023px) { + .is-inline-block-touch { + display: inline-block !important; + } +} + +@media screen and (min-width: 1024px) { + .is-inline-block-desktop { + display: inline-block !important; + } +} + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .is-inline-block-desktop-only { + display: inline-block !important; + } +} + +@media screen and (min-width: 1216px) { + .is-inline-block-widescreen { + display: inline-block !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-block-widescreen-only { + display: inline-block !important; + } +} + +@media screen and (min-width: 1408px) { + .is-inline-block-fullhd { + display: inline-block !important; + } +} + +.is-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; +} + +@media screen and (max-width: 768px) { + .is-inline-flex-mobile { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media screen and (min-width: 769px), print { + .is-inline-flex-tablet { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .is-inline-flex-tablet-only { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media screen and (max-width: 1023px) { + .is-inline-flex-touch { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media screen and (min-width: 1024px) { + .is-inline-flex-desktop { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .is-inline-flex-desktop-only { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media screen and (min-width: 1216px) { + .is-inline-flex-widescreen { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-flex-widescreen-only { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media screen and (min-width: 1408px) { + .is-inline-flex-fullhd { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +.is-hidden { + display: none !important; +} + +@media screen and (max-width: 768px) { + .is-hidden-mobile { + display: none !important; + } +} + +@media screen and (min-width: 769px), print { + .is-hidden-tablet { + display: none !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .is-hidden-tablet-only { + display: none !important; + } +} + +@media screen and (max-width: 1023px) { + .is-hidden-touch { + display: none !important; + } +} + +@media screen and (min-width: 1024px) { + .is-hidden-desktop { + display: none !important; + } +} + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .is-hidden-desktop-only { + display: none !important; + } +} + +@media screen and (min-width: 1216px) { + .is-hidden-widescreen { + display: none !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-hidden-widescreen-only { + display: none !important; + } +} + +@media screen and (min-width: 1408px) { + .is-hidden-fullhd { + display: none !important; + } +} + +.is-invisible { + visibility: hidden !important; +} + +@media screen and (max-width: 768px) { + .is-invisible-mobile { + visibility: hidden !important; + } +} + +@media screen and (min-width: 769px), print { + .is-invisible-tablet { + visibility: hidden !important; + } +} + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .is-invisible-tablet-only { + visibility: hidden !important; + } +} + +@media screen and (max-width: 1023px) { + .is-invisible-touch { + visibility: hidden !important; + } +} + +@media screen and (min-width: 1024px) { + .is-invisible-desktop { + visibility: hidden !important; + } +} + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .is-invisible-desktop-only { + visibility: hidden !important; + } +} + +@media screen and (min-width: 1216px) { + .is-invisible-widescreen { + visibility: hidden !important; + } +} + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-invisible-widescreen-only { + visibility: hidden !important; + } +} + +@media screen and (min-width: 1408px) { + .is-invisible-fullhd { + visibility: hidden !important; + } +} + +.is-marginless { + margin: 0 !important; +} + +.is-paddingless { + padding: 0 !important; +} + +.is-radiusless { + border-radius: 0 !important; +} + +.is-shadowless { + -webkit-box-shadow: none !important; + box-shadow: none !important; +} + +.is-unselectable { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.box { + background-color: white; + border-radius: 5px; + -webkit-box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + color: #4a4a4a; + display: block; + padding: 1.25rem; +} + +.box:not(:last-child) { + margin-bottom: 1.5rem; +} + +a.box:hover, a.box:focus { + -webkit-box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #7a91c1; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #7a91c1; +} + +a.box:active { + -webkit-box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #7a91c1; + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #7a91c1; +} + +.button { + -moz-appearance: none; + -webkit-appearance: none; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border: 1px solid transparent; + border-radius: 3px; + -webkit-box-shadow: none; + box-shadow: none; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: white; + border-color: #dbdbdb; + color: #363636; + cursor: pointer; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding-left: 0.75em; + padding-right: 0.75em; + text-align: center; + white-space: nowrap; +} + +.button:focus, .button.is-focused, .button:active, .button.is-active { + outline: none; +} + +.button[disabled] { + cursor: not-allowed; +} + +.button strong { + color: inherit; +} + +.button .icon, .button .icon.is-small, .button .icon.is-medium, .button .icon.is-large { + height: 1.5em; + width: 1.5em; +} + +.button .icon:first-child:not(:last-child) { + margin-left: calc(-0.375em - 1px); + margin-right: 0.1875em; +} + +.button .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: calc(-0.375em - 1px); +} + +.button .icon:first-child:last-child { + margin-left: calc(-0.375em - 1px); + margin-right: calc(-0.375em - 1px); +} + +.button:hover, .button.is-hovered { + border-color: #b5b5b5; + color: #363636; +} + +.button:focus, .button.is-focused { + border-color: #7a91c1; + color: #363636; +} + +.button:focus:not(:active), .button.is-focused:not(:active) { + -webkit-box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); + box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); +} + +.button:active, .button.is-active { + border-color: #4a4a4a; + color: #363636; +} + +.button.is-text { + background-color: transparent; + border-color: transparent; + color: #4a4a4a; + text-decoration: underline; +} + +.button.is-text:hover, .button.is-text.is-hovered, .button.is-text:focus, .button.is-text.is-focused { + background-color: whitesmoke; + color: #363636; +} + +.button.is-text:active, .button.is-text.is-active { + background-color: #e8e8e8; + color: #363636; +} + +.button.is-text[disabled] { + background-color: transparent; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.button.is-white { + background-color: white; + border-color: transparent; + color: #0a0a0a; +} + +.button.is-white:hover, .button.is-white.is-hovered { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; +} + +.button.is-white:focus, .button.is-white.is-focused { + border-color: transparent; + color: #0a0a0a; +} + +.button.is-white:focus:not(:active), .button.is-white.is-focused:not(:active) { + -webkit-box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); +} + +.button.is-white:active, .button.is-white.is-active { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; +} + +.button.is-white[disabled] { + background-color: white; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.button.is-white.is-inverted { + background-color: #0a0a0a; + color: white; +} + +.button.is-white.is-inverted:hover { + background-color: black; +} + +.button.is-white.is-inverted[disabled] { + background-color: #0a0a0a; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: white; +} + +.button.is-white.is-loading:after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} + +.button.is-white.is-outlined { + background-color: transparent; + border-color: white; + color: white; +} + +.button.is-white.is-outlined:hover, .button.is-white.is-outlined:focus { + background-color: white; + border-color: white; + color: #0a0a0a; +} + +.button.is-white.is-outlined.is-loading:after { + border-color: transparent transparent white white !important; +} + +.button.is-white.is-outlined[disabled] { + background-color: transparent; + border-color: white; + -webkit-box-shadow: none; + box-shadow: none; + color: white; +} + +.button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; +} + +.button.is-white.is-inverted.is-outlined:hover, .button.is-white.is-inverted.is-outlined:focus { + background-color: #0a0a0a; + color: white; +} + +.button.is-white.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: #0a0a0a; + -webkit-box-shadow: none; + box-shadow: none; + color: #0a0a0a; +} + +.button.is-black { + background-color: #0a0a0a; + border-color: transparent; + color: white; +} + +.button.is-black:hover, .button.is-black.is-hovered { + background-color: #040404; + border-color: transparent; + color: white; +} + +.button.is-black:focus, .button.is-black.is-focused { + border-color: transparent; + color: white; +} + +.button.is-black:focus:not(:active), .button.is-black.is-focused:not(:active) { + -webkit-box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); +} + +.button.is-black:active, .button.is-black.is-active { + background-color: black; + border-color: transparent; + color: white; +} + +.button.is-black[disabled] { + background-color: #0a0a0a; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.button.is-black.is-inverted { + background-color: white; + color: #0a0a0a; +} + +.button.is-black.is-inverted:hover { + background-color: #f2f2f2; +} + +.button.is-black.is-inverted[disabled] { + background-color: white; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: #0a0a0a; +} + +.button.is-black.is-loading:after { + border-color: transparent transparent white white !important; +} + +.button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; +} + +.button.is-black.is-outlined:hover, .button.is-black.is-outlined:focus { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; +} + +.button.is-black.is-outlined.is-loading:after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; +} + +.button.is-black.is-outlined[disabled] { + background-color: transparent; + border-color: #0a0a0a; + -webkit-box-shadow: none; + box-shadow: none; + color: #0a0a0a; +} + +.button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + color: white; +} + +.button.is-black.is-inverted.is-outlined:hover, .button.is-black.is-inverted.is-outlined:focus { + background-color: white; + color: #0a0a0a; +} + +.button.is-black.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: white; + -webkit-box-shadow: none; + box-shadow: none; + color: white; +} + +.button.is-light { + background-color: whitesmoke; + border-color: transparent; + color: #363636; +} + +.button.is-light:hover, .button.is-light.is-hovered { + background-color: #eeeeee; + border-color: transparent; + color: #363636; +} + +.button.is-light:focus, .button.is-light.is-focused { + border-color: transparent; + color: #363636; +} + +.button.is-light:focus:not(:active), .button.is-light.is-focused:not(:active) { + -webkit-box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); +} + +.button.is-light:active, .button.is-light.is-active { + background-color: #e8e8e8; + border-color: transparent; + color: #363636; +} + +.button.is-light[disabled] { + background-color: whitesmoke; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.button.is-light.is-inverted { + background-color: #363636; + color: whitesmoke; +} + +.button.is-light.is-inverted:hover { + background-color: #292929; +} + +.button.is-light.is-inverted[disabled] { + background-color: #363636; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: whitesmoke; +} + +.button.is-light.is-loading:after { + border-color: transparent transparent #363636 #363636 !important; +} + +.button.is-light.is-outlined { + background-color: transparent; + border-color: whitesmoke; + color: whitesmoke; +} + +.button.is-light.is-outlined:hover, .button.is-light.is-outlined:focus { + background-color: whitesmoke; + border-color: whitesmoke; + color: #363636; +} + +.button.is-light.is-outlined.is-loading:after { + border-color: transparent transparent whitesmoke whitesmoke !important; +} + +.button.is-light.is-outlined[disabled] { + background-color: transparent; + border-color: whitesmoke; + -webkit-box-shadow: none; + box-shadow: none; + color: whitesmoke; +} + +.button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; +} + +.button.is-light.is-inverted.is-outlined:hover, .button.is-light.is-inverted.is-outlined:focus { + background-color: #363636; + color: whitesmoke; +} + +.button.is-light.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: #363636; + -webkit-box-shadow: none; + box-shadow: none; + color: #363636; +} + +.button.is-dark { + background-color: #363636; + border-color: transparent; + color: whitesmoke; +} + +.button.is-dark:hover, .button.is-dark.is-hovered { + background-color: #2f2f2f; + border-color: transparent; + color: whitesmoke; +} + +.button.is-dark:focus, .button.is-dark.is-focused { + border-color: transparent; + color: whitesmoke; +} + +.button.is-dark:focus:not(:active), .button.is-dark.is-focused:not(:active) { + -webkit-box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); +} + +.button.is-dark:active, .button.is-dark.is-active { + background-color: #292929; + border-color: transparent; + color: whitesmoke; +} + +.button.is-dark[disabled] { + background-color: #363636; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.button.is-dark.is-inverted { + background-color: whitesmoke; + color: #363636; +} + +.button.is-dark.is-inverted:hover { + background-color: #e8e8e8; +} + +.button.is-dark.is-inverted[disabled] { + background-color: whitesmoke; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: #363636; +} + +.button.is-dark.is-loading:after { + border-color: transparent transparent whitesmoke whitesmoke !important; +} + +.button.is-dark.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; +} + +.button.is-dark.is-outlined:hover, .button.is-dark.is-outlined:focus { + background-color: #363636; + border-color: #363636; + color: whitesmoke; +} + +.button.is-dark.is-outlined.is-loading:after { + border-color: transparent transparent #363636 #363636 !important; +} + +.button.is-dark.is-outlined[disabled] { + background-color: transparent; + border-color: #363636; + -webkit-box-shadow: none; + box-shadow: none; + color: #363636; +} + +.button.is-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: whitesmoke; + color: whitesmoke; +} + +.button.is-dark.is-inverted.is-outlined:hover, .button.is-dark.is-inverted.is-outlined:focus { + background-color: whitesmoke; + color: #363636; +} + +.button.is-dark.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: whitesmoke; + -webkit-box-shadow: none; + box-shadow: none; + color: whitesmoke; +} + +.button.is-primary { + background-color: #00d1b2; + border-color: transparent; + color: #fff; +} + +.button.is-primary:hover, .button.is-primary.is-hovered { + background-color: #00c4a7; + border-color: transparent; + color: #fff; +} + +.button.is-primary:focus, .button.is-primary.is-focused { + border-color: transparent; + color: #fff; +} + +.button.is-primary:focus:not(:active), .button.is-primary.is-focused:not(:active) { + -webkit-box-shadow: 0 0 0 0.125em rgba(0, 209, 178, 0.25); + box-shadow: 0 0 0 0.125em rgba(0, 209, 178, 0.25); +} + +.button.is-primary:active, .button.is-primary.is-active { + background-color: #00b89c; + border-color: transparent; + color: #fff; +} + +.button.is-primary[disabled] { + background-color: #00d1b2; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.button.is-primary.is-inverted { + background-color: #fff; + color: #00d1b2; +} + +.button.is-primary.is-inverted:hover { + background-color: #f2f2f2; +} + +.button.is-primary.is-inverted[disabled] { + background-color: #fff; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: #00d1b2; +} + +.button.is-primary.is-loading:after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-primary.is-outlined { + background-color: transparent; + border-color: #00d1b2; + color: #00d1b2; +} + +.button.is-primary.is-outlined:hover, .button.is-primary.is-outlined:focus { + background-color: #00d1b2; + border-color: #00d1b2; + color: #fff; +} + +.button.is-primary.is-outlined.is-loading:after { + border-color: transparent transparent #00d1b2 #00d1b2 !important; +} + +.button.is-primary.is-outlined[disabled] { + background-color: transparent; + border-color: #00d1b2; + -webkit-box-shadow: none; + box-shadow: none; + color: #00d1b2; +} + +.button.is-primary.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-primary.is-inverted.is-outlined:hover, .button.is-primary.is-inverted.is-outlined:focus { + background-color: #fff; + color: #00d1b2; +} + +.button.is-primary.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: #fff; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; +} + +.button.is-link { + background-color: #7a91c1; + border-color: transparent; + color: #fff; +} + +.button.is-link:hover, .button.is-link.is-hovered { + background-color: #276cda; + border-color: transparent; + color: #fff; +} + +.button.is-link:focus, .button.is-link.is-focused { + border-color: transparent; + color: #fff; +} + +.button.is-link:focus:not(:active), .button.is-link.is-focused:not(:active) { + -webkit-box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); + box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); +} + +.button.is-link:active, .button.is-link.is-active { + background-color: #2366d1; + border-color: transparent; + color: #fff; +} + +.button.is-link[disabled] { + background-color: #7a91c1; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.button.is-link.is-inverted { + background-color: #fff; + color: #7a91c1; +} + +.button.is-link.is-inverted:hover { + background-color: #f2f2f2; +} + +.button.is-link.is-inverted[disabled] { + background-color: #fff; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: #7a91c1; +} + +.button.is-link.is-loading:after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-link.is-outlined { + background-color: transparent; + border-color: #7a91c1; + color: #7a91c1; +} + +.button.is-link.is-outlined:hover, .button.is-link.is-outlined:focus { + background-color: #7a91c1; + border-color: #7a91c1; + color: #fff; +} + +.button.is-link.is-outlined.is-loading:after { + border-color: transparent transparent #7a91c1 #7a91c1 !important; +} + +.button.is-link.is-outlined[disabled] { + background-color: transparent; + border-color: #7a91c1; + -webkit-box-shadow: none; + box-shadow: none; + color: #7a91c1; +} + +.button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-link.is-inverted.is-outlined:hover, .button.is-link.is-inverted.is-outlined:focus { + background-color: #fff; + color: #7a91c1; +} + +.button.is-link.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: #fff; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; +} + +.button.is-info { + background-color: #209cee; + border-color: transparent; + color: #fff; +} + +.button.is-info:hover, .button.is-info.is-hovered { + background-color: #1496ed; + border-color: transparent; + color: #fff; +} + +.button.is-info:focus, .button.is-info.is-focused { + border-color: transparent; + color: #fff; +} + +.button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) { + -webkit-box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); + box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); +} + +.button.is-info:active, .button.is-info.is-active { + background-color: #118fe4; + border-color: transparent; + color: #fff; +} + +.button.is-info[disabled] { + background-color: #209cee; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.button.is-info.is-inverted { + background-color: #fff; + color: #209cee; +} + +.button.is-info.is-inverted:hover { + background-color: #f2f2f2; +} + +.button.is-info.is-inverted[disabled] { + background-color: #fff; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: #209cee; +} + +.button.is-info.is-loading:after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-info.is-outlined { + background-color: transparent; + border-color: #209cee; + color: #209cee; +} + +.button.is-info.is-outlined:hover, .button.is-info.is-outlined:focus { + background-color: #209cee; + border-color: #209cee; + color: #fff; +} + +.button.is-info.is-outlined.is-loading:after { + border-color: transparent transparent #209cee #209cee !important; +} + +.button.is-info.is-outlined[disabled] { + background-color: transparent; + border-color: #209cee; + -webkit-box-shadow: none; + box-shadow: none; + color: #209cee; +} + +.button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined:focus { + background-color: #fff; + color: #209cee; +} + +.button.is-info.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: #fff; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; +} + +.button.is-success { + background-color: #23d160; + border-color: transparent; + color: #fff; +} + +.button.is-success:hover, .button.is-success.is-hovered { + background-color: #22c65b; + border-color: transparent; + color: #fff; +} + +.button.is-success:focus, .button.is-success.is-focused { + border-color: transparent; + color: #fff; +} + +.button.is-success:focus:not(:active), .button.is-success.is-focused:not(:active) { + -webkit-box-shadow: 0 0 0 0.125em rgba(35, 209, 96, 0.25); + box-shadow: 0 0 0 0.125em rgba(35, 209, 96, 0.25); +} + +.button.is-success:active, .button.is-success.is-active { + background-color: #20bc56; + border-color: transparent; + color: #fff; +} + +.button.is-success[disabled] { + background-color: #23d160; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.button.is-success.is-inverted { + background-color: #fff; + color: #23d160; +} + +.button.is-success.is-inverted:hover { + background-color: #f2f2f2; +} + +.button.is-success.is-inverted[disabled] { + background-color: #fff; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: #23d160; +} + +.button.is-success.is-loading:after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-success.is-outlined { + background-color: transparent; + border-color: #23d160; + color: #23d160; +} + +.button.is-success.is-outlined:hover, .button.is-success.is-outlined:focus { + background-color: #23d160; + border-color: #23d160; + color: #fff; +} + +.button.is-success.is-outlined.is-loading:after { + border-color: transparent transparent #23d160 #23d160 !important; +} + +.button.is-success.is-outlined[disabled] { + background-color: transparent; + border-color: #23d160; + -webkit-box-shadow: none; + box-shadow: none; + color: #23d160; +} + +.button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-success.is-inverted.is-outlined:hover, .button.is-success.is-inverted.is-outlined:focus { + background-color: #fff; + color: #23d160; +} + +.button.is-success.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: #fff; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; +} + +.button.is-warning { + background-color: #ffdd57; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning:hover, .button.is-warning.is-hovered { + background-color: #ffdb4a; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning:focus, .button.is-warning.is-focused { + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning:focus:not(:active), .button.is-warning.is-focused:not(:active) { + -webkit-box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); + box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); +} + +.button.is-warning:active, .button.is-warning.is-active { + background-color: #ffd83d; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning[disabled] { + background-color: #ffdd57; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.button.is-warning.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; +} + +.button.is-warning.is-inverted:hover { + background-color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning.is-inverted[disabled] { + background-color: rgba(0, 0, 0, 0.7); + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: #ffdd57; +} + +.button.is-warning.is-loading:after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; +} + +.button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffdd57; + color: #ffdd57; +} + +.button.is-warning.is-outlined:hover, .button.is-warning.is-outlined:focus { + background-color: #ffdd57; + border-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning.is-outlined.is-loading:after { + border-color: transparent transparent #ffdd57 #ffdd57 !important; +} + +.button.is-warning.is-outlined[disabled] { + background-color: transparent; + border-color: #ffdd57; + -webkit-box-shadow: none; + box-shadow: none; + color: #ffdd57; +} + +.button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + color: rgba(0, 0, 0, 0.7); +} + +.button.is-warning.is-inverted.is-outlined:hover, .button.is-warning.is-inverted.is-outlined:focus { + background-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; +} + +.button.is-warning.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + -webkit-box-shadow: none; + box-shadow: none; + color: rgba(0, 0, 0, 0.7); +} + +.button.is-danger { + background-color: #ff3860; + border-color: transparent; + color: #fff; +} + +.button.is-danger:hover, .button.is-danger.is-hovered { + background-color: #ff2b56; + border-color: transparent; + color: #fff; +} + +.button.is-danger:focus, .button.is-danger.is-focused { + border-color: transparent; + color: #fff; +} + +.button.is-danger:focus:not(:active), .button.is-danger.is-focused:not(:active) { + -webkit-box-shadow: 0 0 0 0.125em rgba(255, 56, 96, 0.25); + box-shadow: 0 0 0 0.125em rgba(255, 56, 96, 0.25); +} + +.button.is-danger:active, .button.is-danger.is-active { + background-color: #ff1f4b; + border-color: transparent; + color: #fff; +} + +.button.is-danger[disabled] { + background-color: #ff3860; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.button.is-danger.is-inverted { + background-color: #fff; + color: #ff3860; +} + +.button.is-danger.is-inverted:hover { + background-color: #f2f2f2; +} + +.button.is-danger.is-inverted[disabled] { + background-color: #fff; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: #ff3860; +} + +.button.is-danger.is-loading:after { + border-color: transparent transparent #fff #fff !important; +} + +.button.is-danger.is-outlined { + background-color: transparent; + border-color: #ff3860; + color: #ff3860; +} + +.button.is-danger.is-outlined:hover, .button.is-danger.is-outlined:focus { + background-color: #ff3860; + border-color: #ff3860; + color: #fff; +} + +.button.is-danger.is-outlined.is-loading:after { + border-color: transparent transparent #ff3860 #ff3860 !important; +} + +.button.is-danger.is-outlined[disabled] { + background-color: transparent; + border-color: #ff3860; + -webkit-box-shadow: none; + box-shadow: none; + color: #ff3860; +} + +.button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; +} + +.button.is-danger.is-inverted.is-outlined:hover, .button.is-danger.is-inverted.is-outlined:focus { + background-color: #fff; + color: #ff3860; +} + +.button.is-danger.is-inverted.is-outlined[disabled] { + background-color: transparent; + border-color: #fff; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; +} + +.button.is-small { + border-radius: 2px; + font-size: 0.75rem; +} + +.button.is-medium { + font-size: 1.25rem; +} + +.button.is-large { + font-size: 1.5rem; +} + +.button[disabled] { + background-color: white; + border-color: #dbdbdb; + -webkit-box-shadow: none; + box-shadow: none; + opacity: 0.5; +} + +.button.is-fullwidth { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + width: 100%; +} + +.button.is-loading { + color: transparent !important; + pointer-events: none; +} + +.button.is-loading:after { + -webkit-animation: spinAround 500ms infinite linear; + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; + position: absolute; + left: calc(50% - (1em / 2)); + top: calc(50% - (1em / 2)); + position: absolute !important; +} + +.button.is-static { + background-color: whitesmoke; + border-color: #dbdbdb; + color: #7a7a7a; + -webkit-box-shadow: none; + box-shadow: none; + pointer-events: none; +} + +.buttons { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.buttons .button { + margin-bottom: 0.5rem; +} + +.buttons .button:not(:last-child) { + margin-right: 0.5rem; +} + +.buttons:last-child { + margin-bottom: -0.5rem; +} + +.buttons:not(:last-child) { + margin-bottom: 1rem; +} + +.buttons.has-addons .button:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.buttons.has-addons .button:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + margin-right: -1px; +} + +.buttons.has-addons .button:last-child { + margin-right: 0; +} + +.buttons.has-addons .button:hover, .buttons.has-addons .button.is-hovered { + z-index: 2; +} + +.buttons.has-addons .button:focus, .buttons.has-addons .button.is-focused, .buttons.has-addons .button:active, .buttons.has-addons .button.is-active, .buttons.has-addons .button.is-selected { + z-index: 3; +} + +.buttons.has-addons .button:focus:hover, .buttons.has-addons .button.is-focused:hover, .buttons.has-addons .button:active:hover, .buttons.has-addons .button.is-active:hover, .buttons.has-addons .button.is-selected:hover { + z-index: 4; +} + +.buttons.is-centered { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.buttons.is-right { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.container { + margin: 0 auto; + position: relative; +} + +@media screen and (min-width: 1024px) { + .container { + max-width: 960px; + width: 960px; + } + .container.is-fluid { + margin-left: 32px; + margin-right: 32px; + max-width: none; + width: auto; + } +} + +@media screen and (max-width: 1215px) { + .container.is-widescreen { + max-width: 1152px; + width: auto; + } +} + +@media screen and (max-width: 1407px) { + .container.is-fullhd { + max-width: 1344px; + width: auto; + } +} + +@media screen and (min-width: 1216px) { + .container { + max-width: 1152px; + width: 1152px; + } +} + +@media screen and (min-width: 1408px) { + .container { + max-width: 1344px; + width: 1344px; + } +} + +.content:not(:last-child) { + margin-bottom: 1.5rem; +} + +.content li + li { + margin-top: 0.25em; +} + +.content p:not(:last-child), +.content dl:not(:last-child), +.content ol:not(:last-child), +.content ul:not(:last-child), +.content blockquote:not(:last-child), +.content pre:not(:last-child), +.content table:not(:last-child) { + margin-bottom: 1em; +} + +.content h1, +.content h2, +.content h3, +.content h4, +.content h5, +.content h6 { + color: #363636; + font-weight: 400; + line-height: 1.125; +} + +.content h1 { + font-size: 2em; + margin-bottom: 0.5em; +} + +.content h1:not(:first-child) { + margin-top: 1em; +} + +.content h2 { + font-size: 1.75em; + margin-bottom: 0.5714em; +} + +.content h2:not(:first-child) { + margin-top: 1.1428em; +} + +.content h3 { + font-size: 1.5em; + margin-bottom: 0.6666em; +} + +.content h3:not(:first-child) { + margin-top: 1.3333em; +} + +.content h4 { + font-size: 1.25em; + margin-bottom: 0.8em; +} + +.content h5 { + font-size: 1.125em; + margin-bottom: 0.8888em; +} + +.content h6 { + font-size: 1em; + margin-bottom: 1em; +} + +.content blockquote { + background-color: whitesmoke; + border-left: 5px solid #dbdbdb; + padding: 1.25em 1.5em; +} + +.content ol { + list-style: decimal outside; + margin-left: 2em; + margin-top: 1em; +} + +.content ul { + list-style: disc outside; + margin-left: 2em; + margin-top: 1em; +} + +.content ul ul { + list-style-type: circle; + margin-top: 0.5em; +} + +.content ul ul ul { + list-style-type: square; +} + +.content dd { + margin-left: 2em; +} + +.content figure { + margin-left: 2em; + margin-right: 2em; + text-align: center; +} + +.content figure:not(:first-child) { + margin-top: 2em; +} + +.content figure:not(:last-child) { + margin-bottom: 2em; +} + +.content figure img { + display: inline-block; +} + +.content figure figcaption { + font-style: italic; +} + +.content pre { + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding: 1.25em 1.5em; + white-space: pre; + word-wrap: normal; +} + +.content sup, +.content sub { + font-size: 75%; +} + +.content table { + width: 100%; +} + +.content table td, +.content table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; +} + +.content table th { + color: #363636; + text-align: left; +} + +.content table tr:hover { + background-color: whitesmoke; +} + +.content table thead td, +.content table thead th { + border-width: 0 0 2px; + color: #363636; +} + +.content table tfoot td, +.content table tfoot th { + border-width: 2px 0 0; + color: #363636; +} + +.content table tbody tr:last-child td, +.content table tbody tr:last-child th { + border-bottom-width: 0; +} + +.content.is-small { + font-size: 0.75rem; +} + +.content.is-medium { + font-size: 1.25rem; +} + +.content.is-large { + font-size: 1.5rem; +} + +.input, +.textarea { + -moz-appearance: none; + -webkit-appearance: none; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border: 1px solid transparent; + border-radius: 3px; + -webkit-box-shadow: none; + box-shadow: none; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; + background-color: white; + border-color: #dbdbdb; + color: #363636; + -webkit-box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + max-width: 100%; + width: 100%; +} + +.input:focus, .input.is-focused, .input:active, .input.is-active, +.textarea:focus, +.textarea.is-focused, +.textarea:active, +.textarea.is-active { + outline: none; +} + +.input[disabled], +.textarea[disabled] { + cursor: not-allowed; +} + +.input::-moz-placeholder, +.textarea::-moz-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.input::-webkit-input-placeholder, +.textarea::-webkit-input-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.input:-moz-placeholder, +.textarea:-moz-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.input:-ms-input-placeholder, +.textarea:-ms-input-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.input:hover, .input.is-hovered, +.textarea:hover, +.textarea.is-hovered { + border-color: #b5b5b5; +} + +.input:focus, .input.is-focused, .input:active, .input.is-active, +.textarea:focus, +.textarea.is-focused, +.textarea:active, +.textarea.is-active { + border-color: #7a91c1; + -webkit-box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); + box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); +} + +.input[disabled], +.textarea[disabled] { + background-color: whitesmoke; + border-color: whitesmoke; + -webkit-box-shadow: none; + box-shadow: none; + color: #7a7a7a; +} + +.input[disabled]::-moz-placeholder, +.textarea[disabled]::-moz-placeholder { + color: rgba(122, 122, 122, 0.3); +} + +.input[disabled]::-webkit-input-placeholder, +.textarea[disabled]::-webkit-input-placeholder { + color: rgba(122, 122, 122, 0.3); +} + +.input[disabled]:-moz-placeholder, +.textarea[disabled]:-moz-placeholder { + color: rgba(122, 122, 122, 0.3); +} + +.input[disabled]:-ms-input-placeholder, +.textarea[disabled]:-ms-input-placeholder { + color: rgba(122, 122, 122, 0.3); +} + +.input[type="search"], +.textarea[type="search"] { + border-radius: 290486px; +} + +.input[readonly], +.textarea[readonly] { + -webkit-box-shadow: none; + box-shadow: none; +} + +.input.is-white, +.textarea.is-white { + border-color: white; +} + +.input.is-white:focus, .input.is-white.is-focused, .input.is-white:active, .input.is-white.is-active, +.textarea.is-white:focus, +.textarea.is-white.is-focused, +.textarea.is-white:active, +.textarea.is-white.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); +} + +.input.is-black, +.textarea.is-black { + border-color: #0a0a0a; +} + +.input.is-black:focus, .input.is-black.is-focused, .input.is-black:active, .input.is-black.is-active, +.textarea.is-black:focus, +.textarea.is-black.is-focused, +.textarea.is-black:active, +.textarea.is-black.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); +} + +.input.is-light, +.textarea.is-light { + border-color: whitesmoke; +} + +.input.is-light:focus, .input.is-light.is-focused, .input.is-light:active, .input.is-light.is-active, +.textarea.is-light:focus, +.textarea.is-light.is-focused, +.textarea.is-light:active, +.textarea.is-light.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); +} + +.input.is-dark, +.textarea.is-dark { + border-color: #363636; +} + +.input.is-dark:focus, .input.is-dark.is-focused, .input.is-dark:active, .input.is-dark.is-active, +.textarea.is-dark:focus, +.textarea.is-dark.is-focused, +.textarea.is-dark:active, +.textarea.is-dark.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); +} + +.input.is-primary, +.textarea.is-primary { + border-color: #00d1b2; +} + +.input.is-primary:focus, .input.is-primary.is-focused, .input.is-primary:active, .input.is-primary.is-active, +.textarea.is-primary:focus, +.textarea.is-primary.is-focused, +.textarea.is-primary:active, +.textarea.is-primary.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(0, 209, 178, 0.25); + box-shadow: 0 0 0 0.125em rgba(0, 209, 178, 0.25); +} + +.input.is-link, +.textarea.is-link { + border-color: #7a91c1; +} + +.input.is-link:focus, .input.is-link.is-focused, .input.is-link:active, .input.is-link.is-active, +.textarea.is-link:focus, +.textarea.is-link.is-focused, +.textarea.is-link:active, +.textarea.is-link.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); + box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); +} + +.input.is-info, +.textarea.is-info { + border-color: #209cee; +} + +.input.is-info:focus, .input.is-info.is-focused, .input.is-info:active, .input.is-info.is-active, +.textarea.is-info:focus, +.textarea.is-info.is-focused, +.textarea.is-info:active, +.textarea.is-info.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); + box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); +} + +.input.is-success, +.textarea.is-success { + border-color: #23d160; +} + +.input.is-success:focus, .input.is-success.is-focused, .input.is-success:active, .input.is-success.is-active, +.textarea.is-success:focus, +.textarea.is-success.is-focused, +.textarea.is-success:active, +.textarea.is-success.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(35, 209, 96, 0.25); + box-shadow: 0 0 0 0.125em rgba(35, 209, 96, 0.25); +} + +.input.is-warning, +.textarea.is-warning { + border-color: #ffdd57; +} + +.input.is-warning:focus, .input.is-warning.is-focused, .input.is-warning:active, .input.is-warning.is-active, +.textarea.is-warning:focus, +.textarea.is-warning.is-focused, +.textarea.is-warning:active, +.textarea.is-warning.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); + box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); +} + +.input.is-danger, +.textarea.is-danger { + border-color: #ff3860; +} + +.input.is-danger:focus, .input.is-danger.is-focused, .input.is-danger:active, .input.is-danger.is-active, +.textarea.is-danger:focus, +.textarea.is-danger.is-focused, +.textarea.is-danger:active, +.textarea.is-danger.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(255, 56, 96, 0.25); + box-shadow: 0 0 0 0.125em rgba(255, 56, 96, 0.25); +} + +.input.is-small, +.textarea.is-small { + border-radius: 2px; + font-size: 0.75rem; +} + +.input.is-medium, +.textarea.is-medium { + font-size: 1.25rem; +} + +.input.is-large, +.textarea.is-large { + font-size: 1.5rem; +} + +.input.is-fullwidth, +.textarea.is-fullwidth { + display: block; + width: 100%; +} + +.input.is-inline, +.textarea.is-inline { + display: inline; + width: auto; +} + +.input.is-static { + background-color: transparent; + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + padding-left: 0; + padding-right: 0; +} + +.textarea { + display: block; + max-width: 100%; + min-width: 100%; + padding: 0.625em; + resize: vertical; +} + +.textarea:not([rows]) { + max-height: 600px; + min-height: 120px; +} + +.textarea[rows] { + height: unset; +} + +.textarea.has-fixed-size { + resize: none; +} + +.checkbox, +.radio { + cursor: pointer; + display: inline-block; + line-height: 1.25; + position: relative; +} + +.checkbox input, +.radio input { + cursor: pointer; +} + +.checkbox:hover, +.radio:hover { + color: #363636; +} + +.checkbox[disabled], +.radio[disabled] { + color: #7a7a7a; + cursor: not-allowed; +} + +.radio + .radio { + margin-left: 0.5em; +} + +.select { + display: inline-block; + max-width: 100%; + position: relative; + vertical-align: top; +} + +.select:not(.is-multiple) { + height: 2.25em; +} + +.select:not(.is-multiple)::after { + border: 1px solid #7a91c1; + border-right: 0; + border-top: 0; + content: " "; + display: block; + height: 0.5em; + pointer-events: none; + position: absolute; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -webkit-transform-origin: center; + transform-origin: center; + width: 0.5em; + margin-top: -0.375em; + right: 1.125em; + top: 50%; + z-index: 4; +} + +.select select { + -moz-appearance: none; + -webkit-appearance: none; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border: 1px solid transparent; + border-radius: 3px; + -webkit-box-shadow: none; + box-shadow: none; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; + background-color: white; + border-color: #dbdbdb; + color: #363636; + cursor: pointer; + display: block; + font-size: 1em; + max-width: 100%; + outline: none; +} + +.select select:focus, .select select.is-focused, .select select:active, .select select.is-active { + outline: none; +} + +.select select[disabled] { + cursor: not-allowed; +} + +.select select::-moz-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.select select::-webkit-input-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.select select:-moz-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.select select:-ms-input-placeholder { + color: rgba(54, 54, 54, 0.3); +} + +.select select:hover, .select select.is-hovered { + border-color: #b5b5b5; +} + +.select select:focus, .select select.is-focused, .select select:active, .select select.is-active { + border-color: #7a91c1; + -webkit-box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); + box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); +} + +.select select[disabled] { + background-color: whitesmoke; + border-color: whitesmoke; + -webkit-box-shadow: none; + box-shadow: none; + color: #7a7a7a; +} + +.select select[disabled]::-moz-placeholder { + color: rgba(122, 122, 122, 0.3); +} + +.select select[disabled]::-webkit-input-placeholder { + color: rgba(122, 122, 122, 0.3); +} + +.select select[disabled]:-moz-placeholder { + color: rgba(122, 122, 122, 0.3); +} + +.select select[disabled]:-ms-input-placeholder { + color: rgba(122, 122, 122, 0.3); +} + +.select select::-ms-expand { + display: none; +} + +.select select[disabled]:hover { + border-color: whitesmoke; +} + +.select select:not([multiple]) { + padding-right: 2.5em; +} + +.select select[multiple] { + height: unset; + padding: 0; +} + +.select select[multiple] option { + padding: 0.5em 1em; +} + +.select:hover::after { + border-color: #363636; +} + +.select.is-white select { + border-color: white; +} + +.select.is-white select:focus, .select.is-white select.is-focused, .select.is-white select:active, .select.is-white select.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); +} + +.select.is-black select { + border-color: #0a0a0a; +} + +.select.is-black select:focus, .select.is-black select.is-focused, .select.is-black select:active, .select.is-black select.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); +} + +.select.is-light select { + border-color: whitesmoke; +} + +.select.is-light select:focus, .select.is-light select.is-focused, .select.is-light select:active, .select.is-light select.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); +} + +.select.is-dark select { + border-color: #363636; +} + +.select.is-dark select:focus, .select.is-dark select.is-focused, .select.is-dark select:active, .select.is-dark select.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); +} + +.select.is-primary select { + border-color: #00d1b2; +} + +.select.is-primary select:focus, .select.is-primary select.is-focused, .select.is-primary select:active, .select.is-primary select.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(0, 209, 178, 0.25); + box-shadow: 0 0 0 0.125em rgba(0, 209, 178, 0.25); +} + +.select.is-link select { + border-color: #7a91c1; +} + +.select.is-link select:focus, .select.is-link select.is-focused, .select.is-link select:active, .select.is-link select.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); + box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25); +} + +.select.is-info select { + border-color: #209cee; +} + +.select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); + box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); +} + +.select.is-success select { + border-color: #23d160; +} + +.select.is-success select:focus, .select.is-success select.is-focused, .select.is-success select:active, .select.is-success select.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(35, 209, 96, 0.25); + box-shadow: 0 0 0 0.125em rgba(35, 209, 96, 0.25); +} + +.select.is-warning select { + border-color: #ffdd57; +} + +.select.is-warning select:focus, .select.is-warning select.is-focused, .select.is-warning select:active, .select.is-warning select.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); + box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); +} + +.select.is-danger select { + border-color: #ff3860; +} + +.select.is-danger select:focus, .select.is-danger select.is-focused, .select.is-danger select:active, .select.is-danger select.is-active { + -webkit-box-shadow: 0 0 0 0.125em rgba(255, 56, 96, 0.25); + box-shadow: 0 0 0 0.125em rgba(255, 56, 96, 0.25); +} + +.select.is-small { + border-radius: 2px; + font-size: 0.75rem; +} + +.select.is-medium { + font-size: 1.25rem; +} + +.select.is-large { + font-size: 1.5rem; +} + +.select.is-disabled::after { + border-color: #7a7a7a; +} + +.select.is-fullwidth { + width: 100%; +} + +.select.is-fullwidth select { + width: 100%; +} + +.select.is-loading::after { + -webkit-animation: spinAround 500ms infinite linear; + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; + margin-top: 0; + position: absolute; + right: 0.625em; + top: 0.625em; + -webkit-transform: none; + transform: none; +} + +.select.is-loading.is-small:after { + font-size: 0.75rem; +} + +.select.is-loading.is-medium:after { + font-size: 1.25rem; +} + +.select.is-loading.is-large:after { + font-size: 1.5rem; +} + +.file { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + position: relative; +} + +.file.is-white .file-cta { + background-color: white; + border-color: transparent; + color: #0a0a0a; +} + +.file.is-white:hover .file-cta, .file.is-white.is-hovered .file-cta { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; +} + +.file.is-white:focus .file-cta, .file.is-white.is-focused .file-cta { + border-color: transparent; + -webkit-box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); + box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); + color: #0a0a0a; +} + +.file.is-white:active .file-cta, .file.is-white.is-active .file-cta { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; +} + +.file.is-black .file-cta { + background-color: #0a0a0a; + border-color: transparent; + color: white; +} + +.file.is-black:hover .file-cta, .file.is-black.is-hovered .file-cta { + background-color: #040404; + border-color: transparent; + color: white; +} + +.file.is-black:focus .file-cta, .file.is-black.is-focused .file-cta { + border-color: transparent; + -webkit-box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); + box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); + color: white; +} + +.file.is-black:active .file-cta, .file.is-black.is-active .file-cta { + background-color: black; + border-color: transparent; + color: white; +} + +.file.is-light .file-cta { + background-color: whitesmoke; + border-color: transparent; + color: #363636; +} + +.file.is-light:hover .file-cta, .file.is-light.is-hovered .file-cta { + background-color: #eeeeee; + border-color: transparent; + color: #363636; +} + +.file.is-light:focus .file-cta, .file.is-light.is-focused .file-cta { + border-color: transparent; + -webkit-box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25); + box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25); + color: #363636; +} + +.file.is-light:active .file-cta, .file.is-light.is-active .file-cta { + background-color: #e8e8e8; + border-color: transparent; + color: #363636; +} + +.file.is-dark .file-cta { + background-color: #363636; + border-color: transparent; + color: whitesmoke; +} + +.file.is-dark:hover .file-cta, .file.is-dark.is-hovered .file-cta { + background-color: #2f2f2f; + border-color: transparent; + color: whitesmoke; +} + +.file.is-dark:focus .file-cta, .file.is-dark.is-focused .file-cta { + border-color: transparent; + -webkit-box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25); + box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25); + color: whitesmoke; +} + +.file.is-dark:active .file-cta, .file.is-dark.is-active .file-cta { + background-color: #292929; + border-color: transparent; + color: whitesmoke; +} + +.file.is-primary .file-cta { + background-color: #00d1b2; + border-color: transparent; + color: #fff; +} + +.file.is-primary:hover .file-cta, .file.is-primary.is-hovered .file-cta { + background-color: #00c4a7; + border-color: transparent; + color: #fff; +} + +.file.is-primary:focus .file-cta, .file.is-primary.is-focused .file-cta { + border-color: transparent; + -webkit-box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.25); + box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.25); + color: #fff; +} + +.file.is-primary:active .file-cta, .file.is-primary.is-active .file-cta { + background-color: #00b89c; + border-color: transparent; + color: #fff; +} + +.file.is-link .file-cta { + background-color: #7a91c1; + border-color: transparent; + color: #fff; +} + +.file.is-link:hover .file-cta, .file.is-link.is-hovered .file-cta { + background-color: #276cda; + border-color: transparent; + color: #fff; +} + +.file.is-link:focus .file-cta, .file.is-link.is-focused .file-cta { + border-color: transparent; + -webkit-box-shadow: 0 0 0.5em rgba(50, 115, 220, 0.25); + box-shadow: 0 0 0.5em rgba(50, 115, 220, 0.25); + color: #fff; +} + +.file.is-link:active .file-cta, .file.is-link.is-active .file-cta { + background-color: #2366d1; + border-color: transparent; + color: #fff; +} + +.file.is-info .file-cta { + background-color: #209cee; + border-color: transparent; + color: #fff; +} + +.file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta { + background-color: #1496ed; + border-color: transparent; + color: #fff; +} + +.file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta { + border-color: transparent; + -webkit-box-shadow: 0 0 0.5em rgba(32, 156, 238, 0.25); + box-shadow: 0 0 0.5em rgba(32, 156, 238, 0.25); + color: #fff; +} + +.file.is-info:active .file-cta, .file.is-info.is-active .file-cta { + background-color: #118fe4; + border-color: transparent; + color: #fff; +} + +.file.is-success .file-cta { + background-color: #23d160; + border-color: transparent; + color: #fff; +} + +.file.is-success:hover .file-cta, .file.is-success.is-hovered .file-cta { + background-color: #22c65b; + border-color: transparent; + color: #fff; +} + +.file.is-success:focus .file-cta, .file.is-success.is-focused .file-cta { + border-color: transparent; + -webkit-box-shadow: 0 0 0.5em rgba(35, 209, 96, 0.25); + box-shadow: 0 0 0.5em rgba(35, 209, 96, 0.25); + color: #fff; +} + +.file.is-success:active .file-cta, .file.is-success.is-active .file-cta { + background-color: #20bc56; + border-color: transparent; + color: #fff; +} + +.file.is-warning .file-cta { + background-color: #ffdd57; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.file.is-warning:hover .file-cta, .file.is-warning.is-hovered .file-cta { + background-color: #ffdb4a; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.file.is-warning:focus .file-cta, .file.is-warning.is-focused .file-cta { + border-color: transparent; + -webkit-box-shadow: 0 0 0.5em rgba(255, 221, 87, 0.25); + box-shadow: 0 0 0.5em rgba(255, 221, 87, 0.25); + color: rgba(0, 0, 0, 0.7); +} + +.file.is-warning:active .file-cta, .file.is-warning.is-active .file-cta { + background-color: #ffd83d; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); +} + +.file.is-danger .file-cta { + background-color: #ff3860; + border-color: transparent; + color: #fff; +} + +.file.is-danger:hover .file-cta, .file.is-danger.is-hovered .file-cta { + background-color: #ff2b56; + border-color: transparent; + color: #fff; +} + +.file.is-danger:focus .file-cta, .file.is-danger.is-focused .file-cta { + border-color: transparent; + -webkit-box-shadow: 0 0 0.5em rgba(255, 56, 96, 0.25); + box-shadow: 0 0 0.5em rgba(255, 56, 96, 0.25); + color: #fff; +} + +.file.is-danger:active .file-cta, .file.is-danger.is-active .file-cta { + background-color: #ff1f4b; + border-color: transparent; + color: #fff; +} + +.file.is-small { + font-size: 0.75rem; +} + +.file.is-medium { + font-size: 1.25rem; +} + +.file.is-medium .file-icon .fa { + font-size: 21px; +} + +.file.is-large { + font-size: 1.5rem; +} + +.file.is-large .file-icon .fa { + font-size: 28px; +} + +.file.has-name .file-cta { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.file.has-name .file-name { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.file.has-name.is-empty .file-cta { + border-radius: 3px; +} + +.file.has-name.is-empty .file-name { + display: none; +} + +.file.is-centered { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.file.is-right { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.file.is-boxed .file-label { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} + +.file.is-boxed .file-cta { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + height: auto; + padding: 1em 3em; +} + +.file.is-boxed .file-name { + border-width: 0 1px 1px; +} + +.file.is-boxed .file-icon { + height: 1.5em; + width: 1.5em; +} + +.file.is-boxed .file-icon .fa { + font-size: 21px; +} + +.file.is-boxed.is-small .file-icon .fa { + font-size: 14px; +} + +.file.is-boxed.is-medium .file-icon .fa { + font-size: 28px; +} + +.file.is-boxed.is-large .file-icon .fa { + font-size: 35px; +} + +.file.is-boxed.has-name .file-cta { + border-radius: 3px 3px 0 0; +} + +.file.is-boxed.has-name .file-name { + border-radius: 0 0 3px 3px; + border-width: 0 1px 1px; +} + +.file.is-right .file-cta { + border-radius: 0 3px 3px 0; +} + +.file.is-right .file-name { + border-radius: 3px 0 0 3px; + border-width: 1px 0 1px 1px; + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; +} + +.file.is-fullwidth .file-label { + width: 100%; +} + +.file.is-fullwidth .file-name { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: none; +} + +.file-label { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + cursor: pointer; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + overflow: hidden; + position: relative; +} + +.file-label:hover .file-cta { + background-color: #eeeeee; + color: #363636; +} + +.file-label:hover .file-name { + border-color: #d5d5d5; +} + +.file-label:active .file-cta { + background-color: #e8e8e8; + color: #363636; +} + +.file-label:active .file-name { + border-color: #cfcfcf; +} + +.file-input { + height: 0.01em; + left: 0; + outline: none; + position: absolute; + top: 0; + width: 0.01em; +} + +.file-cta, +.file-name { + -moz-appearance: none; + -webkit-appearance: none; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border: 1px solid transparent; + border-radius: 3px; + -webkit-box-shadow: none; + box-shadow: none; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; + border-color: #dbdbdb; + border-radius: 3px; + font-size: 1em; + padding-left: 1em; + padding-right: 1em; + white-space: nowrap; +} + +.file-cta:focus, .file-cta.is-focused, .file-cta:active, .file-cta.is-active, +.file-name:focus, +.file-name.is-focused, +.file-name:active, +.file-name.is-active { + outline: none; +} + +.file-cta[disabled], +.file-name[disabled] { + cursor: not-allowed; +} + +.file-cta { + background-color: whitesmoke; + color: #4a4a4a; +} + +.file-name { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px 1px 1px 0; + display: block; + max-width: 16em; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; +} + +.file-icon { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + height: 1em; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin-right: 0.5em; + width: 1em; +} + +.file-icon .fa { + font-size: 14px; +} + +.label { + color: #363636; + display: block; + font-size: 1rem; + font-weight: 700; +} + +.label:not(:last-child) { + margin-bottom: 0.5em; +} + +.label.is-small { + font-size: 0.75rem; +} + +.label.is-medium { + font-size: 1.25rem; +} + +.label.is-large { + font-size: 1.5rem; +} + +.help { + display: block; + font-size: 0.75rem; + margin-top: 0.25rem; +} + +.help.is-white { + color: white; +} + +.help.is-black { + color: #0a0a0a; +} + +.help.is-light { + color: whitesmoke; +} + +.help.is-dark { + color: #363636; +} + +.help.is-primary { + color: #00d1b2; +} + +.help.is-link { + color: #7a91c1; +} + +.help.is-info { + color: #209cee; +} + +.help.is-success { + color: #23d160; +} + +.help.is-warning { + color: #ffdd57; +} + +.help.is-danger { + color: #ff3860; +} + +.field:not(:last-child) { + margin-bottom: 0.75rem; +} + +.field.has-addons { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.field.has-addons .control:not(:last-child) { + margin-right: -1px; +} + +.field.has-addons .control:first-child .button, +.field.has-addons .control:first-child .input, +.field.has-addons .control:first-child .select select { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} + +.field.has-addons .control:last-child .button, +.field.has-addons .control:last-child .input, +.field.has-addons .control:last-child .select select { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; +} + +.field.has-addons .control .button, +.field.has-addons .control .input, +.field.has-addons .control .select select { + border-radius: 0; +} + +.field.has-addons .control .button:hover, .field.has-addons .control .button.is-hovered, +.field.has-addons .control .input:hover, +.field.has-addons .control .input.is-hovered, +.field.has-addons .control .select select:hover, +.field.has-addons .control .select select.is-hovered { + z-index: 2; +} + +.field.has-addons .control .button:focus, .field.has-addons .control .button.is-focused, .field.has-addons .control .button:active, .field.has-addons .control .button.is-active, +.field.has-addons .control .input:focus, +.field.has-addons .control .input.is-focused, +.field.has-addons .control .input:active, +.field.has-addons .control .input.is-active, +.field.has-addons .control .select select:focus, +.field.has-addons .control .select select.is-focused, +.field.has-addons .control .select select:active, +.field.has-addons .control .select select.is-active { + z-index: 3; +} + +.field.has-addons .control .button:focus:hover, .field.has-addons .control .button.is-focused:hover, .field.has-addons .control .button:active:hover, .field.has-addons .control .button.is-active:hover, +.field.has-addons .control .input:focus:hover, +.field.has-addons .control .input.is-focused:hover, +.field.has-addons .control .input:active:hover, +.field.has-addons .control .input.is-active:hover, +.field.has-addons .control .select select:focus:hover, +.field.has-addons .control .select select.is-focused:hover, +.field.has-addons .control .select select:active:hover, +.field.has-addons .control .select select.is-active:hover { + z-index: 4; +} + +.field.has-addons .control.is-expanded { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.field.has-addons.has-addons-centered { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.field.has-addons.has-addons-right { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.field.has-addons.has-addons-fullwidth .control { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.field.is-grouped { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.field.is-grouped > .control { + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.field.is-grouped > .control:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; +} + +.field.is-grouped > .control.is-expanded { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; +} + +.field.is-grouped.is-grouped-centered { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.field.is-grouped.is-grouped-right { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.field.is-grouped.is-grouped-multiline { + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +.field.is-grouped.is-grouped-multiline > .control:last-child, .field.is-grouped.is-grouped-multiline > .control:not(:last-child) { + margin-bottom: 0.75rem; +} + +.field.is-grouped.is-grouped-multiline:last-child { + margin-bottom: -0.75rem; +} + +.field.is-grouped.is-grouped-multiline:not(:last-child) { + margin-bottom: 0; +} + +@media screen and (min-width: 769px), print { + .field.is-horizontal { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } +} + +.field-label .label { + font-size: inherit; +} + +@media screen and (max-width: 768px) { + .field-label { + margin-bottom: 0.5rem; + } +} + +@media screen and (min-width: 769px), print { + .field-label { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; + margin-right: 1.5rem; + text-align: right; + } + .field-label.is-small { + font-size: 0.75rem; + padding-top: 0.375em; + } + .field-label.is-normal { + padding-top: 0.375em; + } + .field-label.is-medium { + font-size: 1.25rem; + padding-top: 0.375em; + } + .field-label.is-large { + font-size: 1.5rem; + padding-top: 0.375em; + } +} + +.field-body .field .field { + margin-bottom: 0; +} + +@media screen and (min-width: 769px), print { + .field-body { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 5; + -ms-flex-positive: 5; + flex-grow: 5; + -ms-flex-negative: 1; + flex-shrink: 1; + } + .field-body .field { + margin-bottom: 0; + } + .field-body > .field { + -ms-flex-negative: 1; + flex-shrink: 1; + } + .field-body > .field:not(.is-narrow) { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + } + .field-body > .field:not(:last-child) { + margin-right: 0.75rem; + } +} + +.control { + font-size: 1rem; + position: relative; + text-align: left; +} + +.control.has-icon .icon { + color: #dbdbdb; + height: 2.25em; + pointer-events: none; + position: absolute; + top: 0; + width: 2.25em; + z-index: 4; +} + +.control.has-icon .input:focus + .icon { + color: #7a7a7a; +} + +.control.has-icon .input.is-small + .icon { + font-size: 0.75rem; +} + +.control.has-icon .input.is-medium + .icon { + font-size: 1.25rem; +} + +.control.has-icon .input.is-large + .icon { + font-size: 1.5rem; +} + +.control.has-icon:not(.has-icon-right) .icon { + left: 0; +} + +.control.has-icon:not(.has-icon-right) .input { + padding-left: 2.25em; +} + +.control.has-icon.has-icon-right .icon { + right: 0; +} + +.control.has-icon.has-icon-right .input { + padding-right: 2.25em; +} + +.control.has-icons-left .input:focus ~ .icon, +.control.has-icons-left .select:focus ~ .icon, .control.has-icons-right .input:focus ~ .icon, +.control.has-icons-right .select:focus ~ .icon { + color: #7a7a7a; +} + +.control.has-icons-left .input.is-small ~ .icon, +.control.has-icons-left .select.is-small ~ .icon, .control.has-icons-right .input.is-small ~ .icon, +.control.has-icons-right .select.is-small ~ .icon { + font-size: 0.75rem; +} + +.control.has-icons-left .input.is-medium ~ .icon, +.control.has-icons-left .select.is-medium ~ .icon, .control.has-icons-right .input.is-medium ~ .icon, +.control.has-icons-right .select.is-medium ~ .icon { + font-size: 1.25rem; +} + +.control.has-icons-left .input.is-large ~ .icon, +.control.has-icons-left .select.is-large ~ .icon, .control.has-icons-right .input.is-large ~ .icon, +.control.has-icons-right .select.is-large ~ .icon { + font-size: 1.5rem; +} + +.control.has-icons-left .icon, .control.has-icons-right .icon { + color: #dbdbdb; + height: 2.25em; + pointer-events: none; + position: absolute; + top: 0; + width: 2.25em; + z-index: 4; +} + +.control.has-icons-left .input, +.control.has-icons-left .select select { + padding-left: 2.25em; +} + +.control.has-icons-left .icon.is-left { + left: 0; +} + +.control.has-icons-right .input, +.control.has-icons-right .select select { + padding-right: 2.25em; +} + +.control.has-icons-right .icon.is-right { + right: 0; +} + +.control.is-loading::after { + -webkit-animation: spinAround 500ms infinite linear; + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; + position: absolute !important; + right: 0.625em; + top: 0.625em; +} + +.control.is-loading.is-small:after { + font-size: 0.75rem; +} + +.control.is-loading.is-medium:after { + font-size: 1.25rem; +} + +.control.is-loading.is-large:after { + font-size: 1.5rem; +} + +.icon { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + height: 1.5rem; + width: 1.5rem; +} + +.icon.is-small { + height: 1rem; + width: 1rem; +} + +.icon.is-medium { + height: 2rem; + width: 2rem; +} + +.icon.is-large { + height: 3rem; + width: 3rem; +} + +.image { + display: block; + position: relative; +} + +.image img { + display: block; + height: auto; + width: 100%; +} + +.image.is-square img, .image.is-1by1 img, .image.is-4by3 img, .image.is-3by2 img, .image.is-16by9 img, .image.is-2by1 img { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + height: 100%; + width: 100%; +} + +.image.is-square, .image.is-1by1 { + padding-top: 100%; +} + +.image.is-4by3 { + padding-top: 75%; +} + +.image.is-3by2 { + padding-top: 66.6666%; +} + +.image.is-16by9 { + padding-top: 56.25%; +} + +.image.is-2by1 { + padding-top: 50%; +} + +.image.is-16x16 { + height: 16px; + width: 16px; +} + +.image.is-24x24 { + height: 24px; + width: 24px; +} + +.image.is-32x32 { + height: 32px; + width: 32px; +} + +.image.is-48x48 { + height: 48px; + width: 48px; +} + +.image.is-64x64 { + height: 64px; + width: 64px; +} + +.image.is-96x96 { + height: 96px; + width: 96px; +} + +.image.is-128x128 { + height: 128px; + width: 128px; +} + +.notification { + background-color: whitesmoke; + border-radius: 3px; + padding: 1.25rem 2.5rem 1.25rem 1.5rem; + position: relative; +} + +.notification:not(:last-child) { + margin-bottom: 1.5rem; +} + +.notification a:not(.button) { + color: currentColor; + text-decoration: underline; +} + +.notification strong { + color: currentColor; +} + +.notification code, +.notification pre { + background: white; +} + +.notification pre code { + background: transparent; +} + +.notification > .delete { + position: absolute; + right: 0.5em; + top: 0.5em; +} + +.notification .title, +.notification .subtitle, +.notification .content { + color: currentColor; +} + +.notification.is-white { + background-color: white; + color: #0a0a0a; +} + +.notification.is-black { + background-color: #0a0a0a; + color: white; +} + +.notification.is-light { + background-color: whitesmoke; + color: #363636; +} + +.notification.is-dark { + background-color: #363636; + color: whitesmoke; +} + +.notification.is-primary { + background-color: #00d1b2; + color: #fff; +} + +.notification.is-link { + background-color: #7a91c1; + color: #fff; +} + +.notification.is-info { + background-color: #209cee; + color: #fff; +} + +.notification.is-success { + background-color: #23d160; + color: #fff; +} + +.notification.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.notification.is-danger { + background-color: #ff3860; + color: #fff; +} + +.progress { + -moz-appearance: none; + -webkit-appearance: none; + border: none; + border-radius: 290486px; + display: block; + height: 1rem; + overflow: hidden; + padding: 0; + width: 100%; +} + +.progress:not(:last-child) { + margin-bottom: 1.5rem; +} + +.progress::-webkit-progress-bar { + background-color: #dbdbdb; +} + +.progress::-webkit-progress-value { + background-color: #4a4a4a; +} + +.progress::-moz-progress-bar { + background-color: #4a4a4a; +} + +.progress::-ms-fill { + background-color: #4a4a4a; + border: none; +} + +.progress.is-white::-webkit-progress-value { + background-color: white; +} + +.progress.is-white::-moz-progress-bar { + background-color: white; +} + +.progress.is-white::-ms-fill { + background-color: white; +} + +.progress.is-black::-webkit-progress-value { + background-color: #0a0a0a; +} + +.progress.is-black::-moz-progress-bar { + background-color: #0a0a0a; +} + +.progress.is-black::-ms-fill { + background-color: #0a0a0a; +} + +.progress.is-light::-webkit-progress-value { + background-color: whitesmoke; +} + +.progress.is-light::-moz-progress-bar { + background-color: whitesmoke; +} + +.progress.is-light::-ms-fill { + background-color: whitesmoke; +} + +.progress.is-dark::-webkit-progress-value { + background-color: #363636; +} + +.progress.is-dark::-moz-progress-bar { + background-color: #363636; +} + +.progress.is-dark::-ms-fill { + background-color: #363636; +} + +.progress.is-primary::-webkit-progress-value { + background-color: #00d1b2; +} + +.progress.is-primary::-moz-progress-bar { + background-color: #00d1b2; +} + +.progress.is-primary::-ms-fill { + background-color: #00d1b2; +} + +.progress.is-link::-webkit-progress-value { + background-color: #7a91c1; +} + +.progress.is-link::-moz-progress-bar { + background-color: #7a91c1; +} + +.progress.is-link::-ms-fill { + background-color: #7a91c1; +} + +.progress.is-info::-webkit-progress-value { + background-color: #209cee; +} + +.progress.is-info::-moz-progress-bar { + background-color: #209cee; +} + +.progress.is-info::-ms-fill { + background-color: #209cee; +} + +.progress.is-success::-webkit-progress-value { + background-color: #23d160; +} + +.progress.is-success::-moz-progress-bar { + background-color: #23d160; +} + +.progress.is-success::-ms-fill { + background-color: #23d160; +} + +.progress.is-warning::-webkit-progress-value { + background-color: #ffdd57; +} + +.progress.is-warning::-moz-progress-bar { + background-color: #ffdd57; +} + +.progress.is-warning::-ms-fill { + background-color: #ffdd57; +} + +.progress.is-danger::-webkit-progress-value { + background-color: #ff3860; +} + +.progress.is-danger::-moz-progress-bar { + background-color: #ff3860; +} + +.progress.is-danger::-ms-fill { + background-color: #ff3860; +} + +.progress.is-small { + height: 0.75rem; +} + +.progress.is-medium { + height: 1.25rem; +} + +.progress.is-large { + height: 1.5rem; +} + +.table { + background-color: white; + color: #363636; + margin-bottom: 1.5rem; +} + +.table td, +.table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; +} + +.table td.is-white, +.table th.is-white { + background-color: white; + border-color: white; + color: #0a0a0a; +} + +.table td.is-black, +.table th.is-black { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; +} + +.table td.is-light, +.table th.is-light { + background-color: whitesmoke; + border-color: whitesmoke; + color: #363636; +} + +.table td.is-dark, +.table th.is-dark { + background-color: #363636; + border-color: #363636; + color: whitesmoke; +} + +.table td.is-primary, +.table th.is-primary { + background-color: #00d1b2; + border-color: #00d1b2; + color: #fff; +} + +.table td.is-link, +.table th.is-link { + background-color: #7a91c1; + border-color: #7a91c1; + color: #fff; +} + +.table td.is-info, +.table th.is-info { + background-color: #209cee; + border-color: #209cee; + color: #fff; +} + +.table td.is-success, +.table th.is-success { + background-color: #23d160; + border-color: #23d160; + color: #fff; +} + +.table td.is-warning, +.table th.is-warning { + background-color: #ffdd57; + border-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.table td.is-danger, +.table th.is-danger { + background-color: #ff3860; + border-color: #ff3860; + color: #fff; +} + +.table td.is-narrow, +.table th.is-narrow { + white-space: nowrap; + width: 1%; +} + +.table td.is-selected, +.table th.is-selected { + background-color: #00d1b2; + color: #fff; +} + +.table td.is-selected a, +.table td.is-selected strong, +.table th.is-selected a, +.table th.is-selected strong { + color: currentColor; +} + +.table th { + color: #363636; + text-align: left; +} + +.table tr.is-selected { + background-color: #00d1b2; + color: #fff; +} + +.table tr.is-selected a, +.table tr.is-selected strong { + color: currentColor; +} + +.table tr.is-selected td, +.table tr.is-selected th { + border-color: #fff; + color: currentColor; +} + +.table thead td, +.table thead th { + border-width: 0 0 2px; + color: #363636; +} + +.table tfoot td, +.table tfoot th { + border-width: 2px 0 0; + color: #363636; +} + +.table tbody tr:last-child td, +.table tbody tr:last-child th { + border-bottom-width: 0; +} + +.table.is-bordered td, +.table.is-bordered th { + border-width: 1px; +} + +.table.is-bordered tr:last-child td, +.table.is-bordered tr:last-child th { + border-bottom-width: 1px; +} + +.table.is-fullwidth { + width: 100%; +} + +.table.is-hoverable tbody tr:not(.is-selected):hover { + background-color: #fafafa; +} + +.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { + background-color: whitesmoke; +} + +.table.is-narrow td, +.table.is-narrow th { + padding: 0.25em 0.5em; +} + +.table.is-striped tbody tr:not(.is-selected):nth-child(even) { + background-color: #fafafa; +} + +.tags { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.tags .tag { + margin-bottom: 0.5rem; +} + +.tags .tag:not(:last-child) { + margin-right: 0.5rem; +} + +.tags:last-child { + margin-bottom: -0.5rem; +} + +.tags:not(:last-child) { + margin-bottom: 1rem; +} + +.tags.has-addons .tag { + margin-right: 0; +} + +.tags.has-addons .tag:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.tags.has-addons .tag:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.tags.is-centered { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.tags.is-centered .tag { + margin-right: 0.25rem; + margin-left: 0.25rem; +} + +.tags.is-right { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.tags.is-right .tag:not(:first-child) { + margin-left: 0.5rem; +} + +.tags.is-right .tag:not(:last-child) { + margin-right: 0; +} + +.tag:not(body) { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + background-color: whitesmoke; + border-radius: 3px; + color: #4a4a4a; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + font-size: 0.75rem; + height: 2em; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + line-height: 1.5; + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; +} + +.tag:not(body) .delete { + margin-left: 0.25em; + margin-right: -0.375em; +} + +.tag:not(body).is-white { + background-color: white; + color: #0a0a0a; +} + +.tag:not(body).is-black { + background-color: #0a0a0a; + color: white; +} + +.tag:not(body).is-light { + background-color: whitesmoke; + color: #363636; +} + +.tag:not(body).is-dark { + background-color: #363636; + color: whitesmoke; +} + +.tag:not(body).is-primary { + background-color: #00d1b2; + color: #fff; +} + +.tag:not(body).is-link { + background-color: #7a91c1; + color: #fff; +} + +.tag:not(body).is-info { + background-color: #209cee; + color: #fff; +} + +.tag:not(body).is-success { + background-color: #23d160; + color: #fff; +} + +.tag:not(body).is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.tag:not(body).is-danger { + background-color: #ff3860; + color: #fff; +} + +.tag:not(body).is-medium { + font-size: 1rem; +} + +.tag:not(body).is-large { + font-size: 1.25rem; +} + +.tag:not(body) .icon:first-child:not(:last-child) { + margin-left: -0.375em; + margin-right: 0.1875em; +} + +.tag:not(body) .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: -0.375em; +} + +.tag:not(body) .icon:first-child:last-child { + margin-left: -0.375em; + margin-right: -0.375em; +} + +.tag:not(body).is-delete { + margin-left: 1px; + padding: 0; + position: relative; + width: 2em; +} + +.tag:not(body).is-delete:before, .tag:not(body).is-delete:after { + background-color: currentColor; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + -webkit-transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform: translateX(-50%) translateY(-50%) rotate(45deg); + -webkit-transform-origin: center center; + transform-origin: center center; +} + +.tag:not(body).is-delete:before { + height: 1px; + width: 50%; +} + +.tag:not(body).is-delete:after { + height: 50%; + width: 1px; +} + +.tag:not(body).is-delete:hover, .tag:not(body).is-delete:focus { + background-color: #e8e8e8; +} + +.tag:not(body).is-delete:active { + background-color: #dbdbdb; +} + +.tag:not(body).is-rounded { + border-radius: 290486px; +} + +a.tag:hover { + text-decoration: underline; +} + +.title, +.subtitle { + word-break: break-word; +} + +.title:not(:last-child), +.subtitle:not(:last-child) { + margin-bottom: 1.5rem; +} + +.title em, +.title span, +.subtitle em, +.subtitle span { + font-weight: inherit; +} + +.title .tag, +.subtitle .tag { + vertical-align: middle; +} + +.title { + color: #363636; + font-size: 2rem; + font-weight: 600; + line-height: 1.125; +} + +.title strong { + color: inherit; + font-weight: inherit; +} + +.title + .highlight { + margin-top: -0.75rem; +} + +.title:not(.is-spaced) + .subtitle { + margin-top: -1.5rem; +} + +.title.is-1 { + font-size: 3rem; +} + +.title.is-2 { + font-size: 2.5rem; +} + +.title.is-3 { + font-size: 2rem; +} + +.title.is-4 { + font-size: 1.5rem; +} + +.title.is-5 { + font-size: 1.25rem; +} + +.title.is-6 { + font-size: 1rem; +} + +.title.is-7 { + font-size: 0.75rem; +} + +.subtitle { + color: #4a4a4a; + font-size: 1.25rem; + font-weight: 400; + line-height: 1.25; +} + +.subtitle strong { + color: #363636; + font-weight: 600; +} + +.subtitle:not(.is-spaced) + .title { + margin-top: -1.5rem; +} + +.subtitle.is-1 { + font-size: 3rem; +} + +.subtitle.is-2 { + font-size: 2.5rem; +} + +.subtitle.is-3 { + font-size: 2rem; +} + +.subtitle.is-4 { + font-size: 1.5rem; +} + +.subtitle.is-5 { + font-size: 1.25rem; +} + +.subtitle.is-6 { + font-size: 1rem; +} + +.subtitle.is-7 { + font-size: 0.75rem; +} + +.block:not(:last-child) { + margin-bottom: 1.5rem; +} + +.delete { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -moz-appearance: none; + -webkit-appearance: none; + background-color: rgba(10, 10, 10, 0.2); + border: none; + border-radius: 290486px; + cursor: pointer; + display: inline-block; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + font-size: 0; + height: 20px; + max-height: 20px; + max-width: 20px; + min-height: 20px; + min-width: 20px; + outline: none; + position: relative; + vertical-align: top; + width: 20px; +} + +.delete:before, .delete:after { + background-color: white; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + -webkit-transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform: translateX(-50%) translateY(-50%) rotate(45deg); + -webkit-transform-origin: center center; + transform-origin: center center; +} + +.delete:before { + height: 2px; + width: 50%; +} + +.delete:after { + height: 50%; + width: 2px; +} + +.delete:hover, .delete:focus { + background-color: rgba(10, 10, 10, 0.3); +} + +.delete:active { + background-color: rgba(10, 10, 10, 0.4); +} + +.delete.is-small { + height: 16px; + max-height: 16px; + max-width: 16px; + min-height: 16px; + min-width: 16px; + width: 16px; +} + +.delete.is-medium { + height: 24px; + max-height: 24px; + max-width: 24px; + min-height: 24px; + min-width: 24px; + width: 24px; +} + +.delete.is-large { + height: 32px; + max-height: 32px; + max-width: 32px; + min-height: 32px; + min-width: 32px; + width: 32px; +} + +.heading { + display: block; + font-size: 11px; + letter-spacing: 1px; + margin-bottom: 5px; + text-transform: uppercase; +} + +.highlight { + font-weight: 400; + max-width: 100%; + overflow: hidden; + padding: 0; +} + +.highlight:not(:last-child) { + margin-bottom: 1.5rem; +} + +.highlight pre { + overflow: auto; + max-width: 100%; +} + +.loader { + -webkit-animation: spinAround 500ms infinite linear; + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; +} + +.number { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + background-color: whitesmoke; + border-radius: 290486px; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + font-size: 1.25rem; + height: 2em; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin-right: 1.5rem; + min-width: 2.5em; + padding: 0.25rem 0.5rem; + text-align: center; + vertical-align: top; +} + +.breadcrumb { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + font-size: 1rem; + overflow: hidden; + overflow-x: auto; + white-space: nowrap; +} + +.breadcrumb:not(:last-child) { + margin-bottom: 1.5rem; +} + +.breadcrumb a { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + color: #7a91c1; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding: 0.5em 0.75em; +} + +.breadcrumb a:hover { + color: #363636; +} + +.breadcrumb li { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.breadcrumb li:first-child a { + padding-left: 0; +} + +.breadcrumb li.is-active a { + color: #363636; + cursor: default; + pointer-events: none; +} + +.breadcrumb li + li::before { + color: #4a4a4a; + content: "\0002f"; +} + +.breadcrumb ul, .breadcrumb ol { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.breadcrumb .icon:first-child { + margin-right: 0.5em; +} + +.breadcrumb .icon:last-child { + margin-left: 0.5em; +} + +.breadcrumb.is-centered ol, .breadcrumb.is-centered ul { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.breadcrumb.is-right ol, .breadcrumb.is-right ul { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.breadcrumb.is-small { + font-size: 0.75rem; +} + +.breadcrumb.is-medium { + font-size: 1.25rem; +} + +.breadcrumb.is-large { + font-size: 1.5rem; +} + +.breadcrumb.has-arrow-separator li + li::before { + content: "\02192"; +} + +.breadcrumb.has-bullet-separator li + li::before { + content: "\02022"; +} + +.breadcrumb.has-dot-separator li + li::before { + content: "\000b7"; +} + +.breadcrumb.has-succeeds-separator li + li::before { + content: "\0227B"; +} + +.card { + background-color: white; + -webkit-box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + color: #4a4a4a; + max-width: 100%; + position: relative; +} + +.card-header { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + -webkit-box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.card-header-title { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + color: #363636; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + font-weight: 700; + padding: 0.75rem; +} + +.card-header-title.is-centered { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.card-header-icon { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + cursor: pointer; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding: 0.75rem; +} + +.card-image { + display: block; + position: relative; +} + +.card-content { + padding: 1.5rem; +} + +.card-footer { + border-top: 1px solid #dbdbdb; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.card-footer-item { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding: 0.75rem; +} + +.card-footer-item:not(:last-child) { + border-right: 1px solid #dbdbdb; +} + +.card .media:not(:last-child) { + margin-bottom: 0.75rem; +} + +.dropdown { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + position: relative; + vertical-align: top; +} + +.dropdown.is-active .dropdown-menu, .dropdown.is-hoverable:hover .dropdown-menu { + display: block; +} + +.dropdown.is-right .dropdown-menu { + left: auto; + right: 0; +} + +.dropdown.is-up .dropdown-menu { + bottom: 100%; + padding-bottom: 4px; + padding-top: unset; + top: auto; +} + +.dropdown-menu { + display: none; + left: 0; + min-width: 12rem; + padding-top: 4px; + position: absolute; + top: 100%; + z-index: 20; +} + +.dropdown-content { + background-color: white; + border-radius: 3px; + -webkit-box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + padding-bottom: 0.5rem; + padding-top: 0.5rem; +} + +.dropdown-item { + color: #4a4a4a; + display: block; + font-size: 0.875rem; + line-height: 1.5; + padding: 0.375rem 1rem; + position: relative; +} + +a.dropdown-item { + padding-right: 3rem; + white-space: nowrap; +} + +a.dropdown-item:hover { + background-color: whitesmoke; + color: #0a0a0a; +} + +a.dropdown-item.is-active { + background-color: #7a91c1; + color: #fff; +} + +.dropdown-divider { + background-color: #dbdbdb; + border: none; + display: block; + height: 1px; + margin: 0.5rem 0; +} + +.level { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.level:not(:last-child) { + margin-bottom: 1.5rem; +} + +.level code { + border-radius: 3px; +} + +.level img { + display: inline-block; + vertical-align: top; +} + +.level.is-mobile { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.level.is-mobile .level-left, +.level.is-mobile .level-right { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.level.is-mobile .level-left + .level-right { + margin-top: 0; +} + +.level.is-mobile .level-item { + margin-right: 0.75rem; +} + +.level.is-mobile .level-item:not(:last-child) { + margin-bottom: 0; +} + +.level.is-mobile .level-item:not(.is-narrow) { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +@media screen and (min-width: 769px), print { + .level { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } + .level > .level-item:not(.is-narrow) { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + } +} + +.level-item { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-preferred-size: auto; + flex-basis: auto; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.level-item .title, +.level-item .subtitle { + margin-bottom: 0; +} + +@media screen and (max-width: 768px) { + .level-item:not(:last-child) { + margin-bottom: 0.75rem; + } +} + +.level-left, +.level-right { + -ms-flex-preferred-size: auto; + flex-basis: auto; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.level-left .level-item.is-flexible, +.level-right .level-item.is-flexible { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +@media screen and (min-width: 769px), print { + .level-left .level-item:not(:last-child), + .level-right .level-item:not(:last-child) { + margin-right: 0.75rem; + } +} + +.level-left { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +@media screen and (max-width: 768px) { + .level-left + .level-right { + margin-top: 1.5rem; + } +} + +@media screen and (min-width: 769px), print { + .level-left { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } +} + +.level-right { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +@media screen and (min-width: 769px), print { + .level-right { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } +} + +.media { + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + text-align: left; +} + +.media .content:not(:last-child) { + margin-bottom: 0.75rem; +} + +.media .media { + border-top: 1px solid rgba(219, 219, 219, 0.5); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + padding-top: 0.75rem; +} + +.media .media .content:not(:last-child), +.media .media .control:not(:last-child) { + margin-bottom: 0.5rem; +} + +.media .media .media { + padding-top: 0.5rem; +} + +.media .media .media + .media { + margin-top: 0.5rem; +} + +.media + .media { + border-top: 1px solid rgba(219, 219, 219, 0.5); + margin-top: 1rem; + padding-top: 1rem; +} + +.media.is-large + .media { + margin-top: 1.5rem; + padding-top: 1.5rem; +} + +.media-left, +.media-right { + -ms-flex-preferred-size: auto; + flex-basis: auto; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.media-left { + margin-right: 1rem; +} + +.media-right { + margin-left: 1rem; +} + +.media-content { + -ms-flex-preferred-size: auto; + flex-basis: auto; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + text-align: left; +} + +.menu { + font-size: 1rem; +} + +.menu.is-small { + font-size: 0.75rem; +} + +.menu.is-medium { + font-size: 1.25rem; +} + +.menu.is-large { + font-size: 1.5rem; +} + +.menu-list { + line-height: 1.25; +} + +.menu-list a { + border-radius: 2px; + color: #4a4a4a; + display: block; + padding: 0.5em 0.75em; +} + +.menu-list a:hover { + background-color: whitesmoke; + color: #363636; +} + +.menu-list a.is-active { + background-color: #7a91c1; + color: #fff; +} + +.menu-list li ul { + border-left: 1px solid #dbdbdb; + margin: 0.75em; + padding-left: 0.75em; +} + +.menu-label { + color: #7a7a7a; + font-size: 0.75em; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.menu-label:not(:first-child) { + margin-top: 1em; +} + +.menu-label:not(:last-child) { + margin-bottom: 1em; +} + +.message { + background-color: whitesmoke; + border-radius: 3px; + font-size: 1rem; +} + +.message:not(:last-child) { + margin-bottom: 1.5rem; +} + +.message strong { + color: currentColor; +} + +.message a:not(.button):not(.tag) { + color: currentColor; + text-decoration: underline; +} + +.message.is-small { + font-size: 0.75rem; +} + +.message.is-medium { + font-size: 1.25rem; +} + +.message.is-large { + font-size: 1.5rem; +} + +.message.is-white { + background-color: white; +} + +.message.is-white .message-header { + background-color: white; + color: #0a0a0a; +} + +.message.is-white .message-body { + border-color: white; + color: #4d4d4d; +} + +.message.is-black { + background-color: #fafafa; +} + +.message.is-black .message-header { + background-color: #0a0a0a; + color: white; +} + +.message.is-black .message-body { + border-color: #0a0a0a; + color: #090909; +} + +.message.is-light { + background-color: #fafafa; +} + +.message.is-light .message-header { + background-color: whitesmoke; + color: #363636; +} + +.message.is-light .message-body { + border-color: whitesmoke; + color: #505050; +} + +.message.is-dark { + background-color: #fafafa; +} + +.message.is-dark .message-header { + background-color: #363636; + color: whitesmoke; +} + +.message.is-dark .message-body { + border-color: #363636; + color: #2a2a2a; +} + +.message.is-primary { + background-color: #f5fffd; +} + +.message.is-primary .message-header { + background-color: #00d1b2; + color: #fff; +} + +.message.is-primary .message-body { + border-color: #00d1b2; + color: #021310; +} + +.message.is-link { + background-color: #f6f9fe; +} + +.message.is-link .message-header { + background-color: #7a91c1; + color: #fff; +} + +.message.is-link .message-body { + border-color: #7a91c1; + color: #22509a; +} + +.message.is-info { + background-color: #f6fbfe; +} + +.message.is-info .message-header { + background-color: #209cee; + color: #fff; +} + +.message.is-info .message-body { + border-color: #209cee; + color: #12537e; +} + +.message.is-success { + background-color: #f6fef9; +} + +.message.is-success .message-header { + background-color: #23d160; + color: #fff; +} + +.message.is-success .message-body { + border-color: #23d160; + color: #0e301a; +} + +.message.is-warning { + background-color: #fffdf5; +} + +.message.is-warning .message-header { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.message.is-warning .message-body { + border-color: #ffdd57; + color: #3b3108; +} + +.message.is-danger { + background-color: #fff5f7; +} + +.message.is-danger .message-header { + background-color: #ff3860; + color: #fff; +} + +.message.is-danger .message-body { + border-color: #ff3860; + color: #cd0930; +} + +.message-header { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + background-color: #4a4a4a; + border-radius: 3px 3px 0 0; + color: #fff; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + line-height: 1.25; + padding: 0.5em 0.75em; + position: relative; +} + +.message-header .delete { + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + margin-left: 0.75em; +} + +.message-header + .message-body { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-top: none; +} + +.message-body { + border: 1px solid #dbdbdb; + border-radius: 3px; + color: #4a4a4a; + padding: 1em 1.25em; +} + +.message-body code, +.message-body pre { + background-color: white; +} + +.message-body pre code { + background-color: transparent; +} + +.modal { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: none; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + overflow: hidden; + position: fixed; + z-index: 20; +} + +.modal.is-active { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.modal-background { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + background-color: rgba(10, 10, 10, 0.86); +} + +.modal-content, +.modal-card { + margin: 0 20px; + max-height: calc(100vh - 160px); + overflow: auto; + position: relative; + width: 100%; +} + +@media screen and (min-width: 769px), print { + .modal-content, + .modal-card { + margin: 0 auto; + max-height: calc(100vh - 40px); + width: 640px; + } +} + +.modal-close { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -moz-appearance: none; + -webkit-appearance: none; + background-color: rgba(10, 10, 10, 0.2); + border: none; + border-radius: 290486px; + cursor: pointer; + display: inline-block; + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + font-size: 0; + height: 20px; + max-height: 20px; + max-width: 20px; + min-height: 20px; + min-width: 20px; + outline: none; + position: relative; + vertical-align: top; + width: 20px; + background: none; + height: 40px; + position: fixed; + right: 20px; + top: 20px; + width: 40px; +} + +.modal-close:before, .modal-close:after { + background-color: white; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + -webkit-transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform: translateX(-50%) translateY(-50%) rotate(45deg); + -webkit-transform-origin: center center; + transform-origin: center center; +} + +.modal-close:before { + height: 2px; + width: 50%; +} + +.modal-close:after { + height: 50%; + width: 2px; +} + +.modal-close:hover, .modal-close:focus { + background-color: rgba(10, 10, 10, 0.3); +} + +.modal-close:active { + background-color: rgba(10, 10, 10, 0.4); +} + +.modal-close.is-small { + height: 16px; + max-height: 16px; + max-width: 16px; + min-height: 16px; + min-width: 16px; + width: 16px; +} + +.modal-close.is-medium { + height: 24px; + max-height: 24px; + max-width: 24px; + min-height: 24px; + min-width: 24px; + width: 24px; +} + +.modal-close.is-large { + height: 32px; + max-height: 32px; + max-width: 32px; + min-height: 32px; + min-width: 32px; + width: 32px; +} + +.modal-card { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + max-height: calc(100vh - 40px); + overflow: hidden; +} + +.modal-card-head, +.modal-card-foot { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + background-color: whitesmoke; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + padding: 20px; + position: relative; +} + +.modal-card-head { + border-bottom: 1px solid #dbdbdb; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +.modal-card-title { + color: #363636; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; + font-size: 1.5rem; + line-height: 1; +} + +.modal-card-foot { + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + border-top: 1px solid #dbdbdb; +} + +.modal-card-foot .button:not(:last-child) { + margin-right: 10px; +} + +.modal-card-body { + -webkit-overflow-scrolling: touch; + background-color: white; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + overflow: auto; + padding: 20px; +} + +.navbar { + background-color: white; + min-height: 3.25rem; + position: relative; +} + +.navbar.is-white { + background-color: white; + color: #0a0a0a; +} + +.navbar.is-white .navbar-brand > .navbar-item, +.navbar.is-white .navbar-brand .navbar-link { + color: #0a0a0a; +} + +.navbar.is-white .navbar-brand > a.navbar-item:hover, .navbar.is-white .navbar-brand > a.navbar-item.is-active, +.navbar.is-white .navbar-brand .navbar-link:hover, +.navbar.is-white .navbar-brand .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; +} + +.navbar.is-white .navbar-brand .navbar-link::after { + border-color: #0a0a0a; +} + +@media screen and (min-width: 1024px) { + .navbar.is-white .navbar-start > .navbar-item, + .navbar.is-white .navbar-start .navbar-link, + .navbar.is-white .navbar-end > .navbar-item, + .navbar.is-white .navbar-end .navbar-link { + color: #0a0a0a; + } + .navbar.is-white .navbar-start > a.navbar-item:hover, .navbar.is-white .navbar-start > a.navbar-item.is-active, + .navbar.is-white .navbar-start .navbar-link:hover, + .navbar.is-white .navbar-start .navbar-link.is-active, + .navbar.is-white .navbar-end > a.navbar-item:hover, + .navbar.is-white .navbar-end > a.navbar-item.is-active, + .navbar.is-white .navbar-end .navbar-link:hover, + .navbar.is-white .navbar-end .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; + } + .navbar.is-white .navbar-start .navbar-link::after, + .navbar.is-white .navbar-end .navbar-link::after { + border-color: #0a0a0a; + } + .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f2f2f2; + color: #0a0a0a; + } + .navbar.is-white .navbar-dropdown a.navbar-item.is-active { + background-color: white; + color: #0a0a0a; + } +} + +.navbar.is-black { + background-color: #0a0a0a; + color: white; +} + +.navbar.is-black .navbar-brand > .navbar-item, +.navbar.is-black .navbar-brand .navbar-link { + color: white; +} + +.navbar.is-black .navbar-brand > a.navbar-item:hover, .navbar.is-black .navbar-brand > a.navbar-item.is-active, +.navbar.is-black .navbar-brand .navbar-link:hover, +.navbar.is-black .navbar-brand .navbar-link.is-active { + background-color: black; + color: white; +} + +.navbar.is-black .navbar-brand .navbar-link::after { + border-color: white; +} + +@media screen and (min-width: 1024px) { + .navbar.is-black .navbar-start > .navbar-item, + .navbar.is-black .navbar-start .navbar-link, + .navbar.is-black .navbar-end > .navbar-item, + .navbar.is-black .navbar-end .navbar-link { + color: white; + } + .navbar.is-black .navbar-start > a.navbar-item:hover, .navbar.is-black .navbar-start > a.navbar-item.is-active, + .navbar.is-black .navbar-start .navbar-link:hover, + .navbar.is-black .navbar-start .navbar-link.is-active, + .navbar.is-black .navbar-end > a.navbar-item:hover, + .navbar.is-black .navbar-end > a.navbar-item.is-active, + .navbar.is-black .navbar-end .navbar-link:hover, + .navbar.is-black .navbar-end .navbar-link.is-active { + background-color: black; + color: white; + } + .navbar.is-black .navbar-start .navbar-link::after, + .navbar.is-black .navbar-end .navbar-link::after { + border-color: white; + } + .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { + background-color: black; + color: white; + } + .navbar.is-black .navbar-dropdown a.navbar-item.is-active { + background-color: #0a0a0a; + color: white; + } +} + +.navbar.is-light { + background-color: whitesmoke; + color: #363636; +} + +.navbar.is-light .navbar-brand > .navbar-item, +.navbar.is-light .navbar-brand .navbar-link { + color: #363636; +} + +.navbar.is-light .navbar-brand > a.navbar-item:hover, .navbar.is-light .navbar-brand > a.navbar-item.is-active, +.navbar.is-light .navbar-brand .navbar-link:hover, +.navbar.is-light .navbar-brand .navbar-link.is-active { + background-color: #e8e8e8; + color: #363636; +} + +.navbar.is-light .navbar-brand .navbar-link::after { + border-color: #363636; +} + +@media screen and (min-width: 1024px) { + .navbar.is-light .navbar-start > .navbar-item, + .navbar.is-light .navbar-start .navbar-link, + .navbar.is-light .navbar-end > .navbar-item, + .navbar.is-light .navbar-end .navbar-link { + color: #363636; + } + .navbar.is-light .navbar-start > a.navbar-item:hover, .navbar.is-light .navbar-start > a.navbar-item.is-active, + .navbar.is-light .navbar-start .navbar-link:hover, + .navbar.is-light .navbar-start .navbar-link.is-active, + .navbar.is-light .navbar-end > a.navbar-item:hover, + .navbar.is-light .navbar-end > a.navbar-item.is-active, + .navbar.is-light .navbar-end .navbar-link:hover, + .navbar.is-light .navbar-end .navbar-link.is-active { + background-color: #e8e8e8; + color: #363636; + } + .navbar.is-light .navbar-start .navbar-link::after, + .navbar.is-light .navbar-end .navbar-link::after { + border-color: #363636; + } + .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e8e8e8; + color: #363636; + } + .navbar.is-light .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: #363636; + } +} + +.navbar.is-dark { + background-color: #363636; + color: whitesmoke; +} + +.navbar.is-dark .navbar-brand > .navbar-item, +.navbar.is-dark .navbar-brand .navbar-link { + color: whitesmoke; +} + +.navbar.is-dark .navbar-brand > a.navbar-item:hover, .navbar.is-dark .navbar-brand > a.navbar-item.is-active, +.navbar.is-dark .navbar-brand .navbar-link:hover, +.navbar.is-dark .navbar-brand .navbar-link.is-active { + background-color: #292929; + color: whitesmoke; +} + +.navbar.is-dark .navbar-brand .navbar-link::after { + border-color: whitesmoke; +} + +@media screen and (min-width: 1024px) { + .navbar.is-dark .navbar-start > .navbar-item, + .navbar.is-dark .navbar-start .navbar-link, + .navbar.is-dark .navbar-end > .navbar-item, + .navbar.is-dark .navbar-end .navbar-link { + color: whitesmoke; + } + .navbar.is-dark .navbar-start > a.navbar-item:hover, .navbar.is-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-dark .navbar-start .navbar-link:hover, + .navbar.is-dark .navbar-start .navbar-link.is-active, + .navbar.is-dark .navbar-end > a.navbar-item:hover, + .navbar.is-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-dark .navbar-end .navbar-link:hover, + .navbar.is-dark .navbar-end .navbar-link.is-active { + background-color: #292929; + color: whitesmoke; + } + .navbar.is-dark .navbar-start .navbar-link::after, + .navbar.is-dark .navbar-end .navbar-link::after { + border-color: whitesmoke; + } + .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #292929; + color: whitesmoke; + } + .navbar.is-dark .navbar-dropdown a.navbar-item.is-active { + background-color: #363636; + color: whitesmoke; + } +} + +.navbar.is-primary { + background-color: #00d1b2; + color: #fff; +} + +.navbar.is-primary .navbar-brand > .navbar-item, +.navbar.is-primary .navbar-brand .navbar-link { + color: #fff; +} + +.navbar.is-primary .navbar-brand > a.navbar-item:hover, .navbar.is-primary .navbar-brand > a.navbar-item.is-active, +.navbar.is-primary .navbar-brand .navbar-link:hover, +.navbar.is-primary .navbar-brand .navbar-link.is-active { + background-color: #00b89c; + color: #fff; +} + +.navbar.is-primary .navbar-brand .navbar-link::after { + border-color: #fff; +} + +@media screen and (min-width: 1024px) { + .navbar.is-primary .navbar-start > .navbar-item, + .navbar.is-primary .navbar-start .navbar-link, + .navbar.is-primary .navbar-end > .navbar-item, + .navbar.is-primary .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-primary .navbar-start > a.navbar-item:hover, .navbar.is-primary .navbar-start > a.navbar-item.is-active, + .navbar.is-primary .navbar-start .navbar-link:hover, + .navbar.is-primary .navbar-start .navbar-link.is-active, + .navbar.is-primary .navbar-end > a.navbar-item:hover, + .navbar.is-primary .navbar-end > a.navbar-item.is-active, + .navbar.is-primary .navbar-end .navbar-link:hover, + .navbar.is-primary .navbar-end .navbar-link.is-active { + background-color: #00b89c; + color: #fff; + } + .navbar.is-primary .navbar-start .navbar-link::after, + .navbar.is-primary .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #00b89c; + color: #fff; + } + .navbar.is-primary .navbar-dropdown a.navbar-item.is-active { + background-color: #00d1b2; + color: #fff; + } +} + +.navbar.is-link { + background-color: #7a91c1; + color: #fff; +} + +.navbar.is-link .navbar-brand > .navbar-item, +.navbar.is-link .navbar-brand .navbar-link { + color: #fff; +} + +.navbar.is-link .navbar-brand > a.navbar-item:hover, .navbar.is-link .navbar-brand > a.navbar-item.is-active, +.navbar.is-link .navbar-brand .navbar-link:hover, +.navbar.is-link .navbar-brand .navbar-link.is-active { + background-color: #2366d1; + color: #fff; +} + +.navbar.is-link .navbar-brand .navbar-link::after { + border-color: #fff; +} + +@media screen and (min-width: 1024px) { + .navbar.is-link .navbar-start > .navbar-item, + .navbar.is-link .navbar-start .navbar-link, + .navbar.is-link .navbar-end > .navbar-item, + .navbar.is-link .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-link .navbar-start > a.navbar-item:hover, .navbar.is-link .navbar-start > a.navbar-item.is-active, + .navbar.is-link .navbar-start .navbar-link:hover, + .navbar.is-link .navbar-start .navbar-link.is-active, + .navbar.is-link .navbar-end > a.navbar-item:hover, + .navbar.is-link .navbar-end > a.navbar-item.is-active, + .navbar.is-link .navbar-end .navbar-link:hover, + .navbar.is-link .navbar-end .navbar-link.is-active { + background-color: #2366d1; + color: #fff; + } + .navbar.is-link .navbar-start .navbar-link::after, + .navbar.is-link .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #2366d1; + color: #fff; + } + .navbar.is-link .navbar-dropdown a.navbar-item.is-active { + background-color: #7a91c1; + color: #fff; + } +} + +.navbar.is-info { + background-color: #209cee; + color: #fff; +} + +.navbar.is-info .navbar-brand > .navbar-item, +.navbar.is-info .navbar-brand .navbar-link { + color: #fff; +} + +.navbar.is-info .navbar-brand > a.navbar-item:hover, .navbar.is-info .navbar-brand > a.navbar-item.is-active, +.navbar.is-info .navbar-brand .navbar-link:hover, +.navbar.is-info .navbar-brand .navbar-link.is-active { + background-color: #118fe4; + color: #fff; +} + +.navbar.is-info .navbar-brand .navbar-link::after { + border-color: #fff; +} + +@media screen and (min-width: 1024px) { + .navbar.is-info .navbar-start > .navbar-item, + .navbar.is-info .navbar-start .navbar-link, + .navbar.is-info .navbar-end > .navbar-item, + .navbar.is-info .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-info .navbar-start > a.navbar-item:hover, .navbar.is-info .navbar-start > a.navbar-item.is-active, + .navbar.is-info .navbar-start .navbar-link:hover, + .navbar.is-info .navbar-start .navbar-link.is-active, + .navbar.is-info .navbar-end > a.navbar-item:hover, + .navbar.is-info .navbar-end > a.navbar-item.is-active, + .navbar.is-info .navbar-end .navbar-link:hover, + .navbar.is-info .navbar-end .navbar-link.is-active { + background-color: #118fe4; + color: #fff; + } + .navbar.is-info .navbar-start .navbar-link::after, + .navbar.is-info .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #118fe4; + color: #fff; + } + .navbar.is-info .navbar-dropdown a.navbar-item.is-active { + background-color: #209cee; + color: #fff; + } +} + +.navbar.is-success { + background-color: #23d160; + color: #fff; +} + +.navbar.is-success .navbar-brand > .navbar-item, +.navbar.is-success .navbar-brand .navbar-link { + color: #fff; +} + +.navbar.is-success .navbar-brand > a.navbar-item:hover, .navbar.is-success .navbar-brand > a.navbar-item.is-active, +.navbar.is-success .navbar-brand .navbar-link:hover, +.navbar.is-success .navbar-brand .navbar-link.is-active { + background-color: #20bc56; + color: #fff; +} + +.navbar.is-success .navbar-brand .navbar-link::after { + border-color: #fff; +} + +@media screen and (min-width: 1024px) { + .navbar.is-success .navbar-start > .navbar-item, + .navbar.is-success .navbar-start .navbar-link, + .navbar.is-success .navbar-end > .navbar-item, + .navbar.is-success .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-success .navbar-start > a.navbar-item:hover, .navbar.is-success .navbar-start > a.navbar-item.is-active, + .navbar.is-success .navbar-start .navbar-link:hover, + .navbar.is-success .navbar-start .navbar-link.is-active, + .navbar.is-success .navbar-end > a.navbar-item:hover, + .navbar.is-success .navbar-end > a.navbar-item.is-active, + .navbar.is-success .navbar-end .navbar-link:hover, + .navbar.is-success .navbar-end .navbar-link.is-active { + background-color: #20bc56; + color: #fff; + } + .navbar.is-success .navbar-start .navbar-link::after, + .navbar.is-success .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #20bc56; + color: #fff; + } + .navbar.is-success .navbar-dropdown a.navbar-item.is-active { + background-color: #23d160; + color: #fff; + } +} + +.navbar.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.navbar.is-warning .navbar-brand > .navbar-item, +.navbar.is-warning .navbar-brand .navbar-link { + color: rgba(0, 0, 0, 0.7); +} + +.navbar.is-warning .navbar-brand > a.navbar-item:hover, .navbar.is-warning .navbar-brand > a.navbar-item.is-active, +.navbar.is-warning .navbar-brand .navbar-link:hover, +.navbar.is-warning .navbar-brand .navbar-link.is-active { + background-color: #ffd83d; + color: rgba(0, 0, 0, 0.7); +} + +.navbar.is-warning .navbar-brand .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); +} + +@media screen and (min-width: 1024px) { + .navbar.is-warning .navbar-start > .navbar-item, + .navbar.is-warning .navbar-start .navbar-link, + .navbar.is-warning .navbar-end > .navbar-item, + .navbar.is-warning .navbar-end .navbar-link { + color: rgba(0, 0, 0, 0.7); + } + .navbar.is-warning .navbar-start > a.navbar-item:hover, .navbar.is-warning .navbar-start > a.navbar-item.is-active, + .navbar.is-warning .navbar-start .navbar-link:hover, + .navbar.is-warning .navbar-start .navbar-link.is-active, + .navbar.is-warning .navbar-end > a.navbar-item:hover, + .navbar.is-warning .navbar-end > a.navbar-item.is-active, + .navbar.is-warning .navbar-end .navbar-link:hover, + .navbar.is-warning .navbar-end .navbar-link.is-active { + background-color: #ffd83d; + color: rgba(0, 0, 0, 0.7); + } + .navbar.is-warning .navbar-start .navbar-link::after, + .navbar.is-warning .navbar-end .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); + } + .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #ffd83d; + color: rgba(0, 0, 0, 0.7); + } + .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); + } +} + +.navbar.is-danger { + background-color: #ff3860; + color: #fff; +} + +.navbar.is-danger .navbar-brand > .navbar-item, +.navbar.is-danger .navbar-brand .navbar-link { + color: #fff; +} + +.navbar.is-danger .navbar-brand > a.navbar-item:hover, .navbar.is-danger .navbar-brand > a.navbar-item.is-active, +.navbar.is-danger .navbar-brand .navbar-link:hover, +.navbar.is-danger .navbar-brand .navbar-link.is-active { + background-color: #ff1f4b; + color: #fff; +} + +.navbar.is-danger .navbar-brand .navbar-link::after { + border-color: #fff; +} + +@media screen and (min-width: 1024px) { + .navbar.is-danger .navbar-start > .navbar-item, + .navbar.is-danger .navbar-start .navbar-link, + .navbar.is-danger .navbar-end > .navbar-item, + .navbar.is-danger .navbar-end .navbar-link { + color: #fff; + } + .navbar.is-danger .navbar-start > a.navbar-item:hover, .navbar.is-danger .navbar-start > a.navbar-item.is-active, + .navbar.is-danger .navbar-start .navbar-link:hover, + .navbar.is-danger .navbar-start .navbar-link.is-active, + .navbar.is-danger .navbar-end > a.navbar-item:hover, + .navbar.is-danger .navbar-end > a.navbar-item.is-active, + .navbar.is-danger .navbar-end .navbar-link:hover, + .navbar.is-danger .navbar-end .navbar-link.is-active { + background-color: #ff1f4b; + color: #fff; + } + .navbar.is-danger .navbar-start .navbar-link::after, + .navbar.is-danger .navbar-end .navbar-link::after { + border-color: #fff; + } + .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #ff1f4b; + color: #fff; + } + .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { + background-color: #ff3860; + color: #fff; + } +} + +.navbar > .container { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + min-height: 3.25rem; + width: 100%; +} + +.navbar.has-shadow { + -webkit-box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1); + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1); +} + +.navbar.is-fixed-bottom, .navbar.is-fixed-top { + left: 0; + position: fixed; + right: 0; + z-index: 30; +} + +.navbar.is-fixed-bottom { + bottom: 0; +} + +.navbar.is-fixed-bottom.has-shadow { + -webkit-box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); +} + +.navbar.is-fixed-top { + top: 0; +} + +html.has-navbar-fixed-top { + padding-top: 3.25rem; +} + +html.has-navbar-fixed-bottom { + padding-bottom: 3.25rem; +} + +.navbar-brand, +.navbar-tabs { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-negative: 0; + flex-shrink: 0; + min-height: 3.25rem; +} + +.navbar-tabs { + -webkit-overflow-scrolling: touch; + max-width: 100vw; + overflow-x: auto; + overflow-y: hidden; +} + +.navbar-burger { + cursor: pointer; + display: block; + height: 3.25rem; + position: relative; + width: 3.25rem; + margin-left: auto; +} + +.navbar-burger span { + background-color: currentColor; + display: block; + height: 1px; + left: calc(50% - 8px); + position: absolute; + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transition-duration: 86ms; + transition-duration: 86ms; + -webkit-transition-property: background-color, opacity, -webkit-transform; + transition-property: background-color, opacity, -webkit-transform; + transition-property: background-color, opacity, transform; + transition-property: background-color, opacity, transform, -webkit-transform; + -webkit-transition-timing-function: ease-out; + transition-timing-function: ease-out; + width: 16px; +} + +.navbar-burger span:nth-child(1) { + top: calc(50% - 6px); +} + +.navbar-burger span:nth-child(2) { + top: calc(50% - 1px); +} + +.navbar-burger span:nth-child(3) { + top: calc(50% + 4px); +} + +.navbar-burger:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +.navbar-burger.is-active span:nth-child(1) { + -webkit-transform: translateY(5px) rotate(45deg); + transform: translateY(5px) rotate(45deg); +} + +.navbar-burger.is-active span:nth-child(2) { + opacity: 0; +} + +.navbar-burger.is-active span:nth-child(3) { + -webkit-transform: translateY(-5px) rotate(-45deg); + transform: translateY(-5px) rotate(-45deg); +} + +.navbar-menu { + display: none; +} + +.navbar-item, +.navbar-link { + color: #4a4a4a; + display: block; + line-height: 1.5; + padding: 0.5rem 1rem; + position: relative; +} + +a.navbar-item:hover, a.navbar-item.is-active, +a.navbar-link:hover, +a.navbar-link.is-active { + background-color: whitesmoke; + color: #7a91c1; +} + +.navbar-item { + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.navbar-item img { + max-height: 1.75rem; +} + +.navbar-item.has-dropdown { + padding: 0; +} + +.navbar-item.is-expanded { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; +} + +.navbar-item.is-tab { + border-bottom: 1px solid transparent; + min-height: 3.25rem; + padding-bottom: calc(0.5rem - 1px); +} + +.navbar-item.is-tab:hover { + background-color: transparent; + border-bottom-color: #7a91c1; +} + +.navbar-item.is-tab.is-active { + background-color: transparent; + border-bottom-color: #7a91c1; + border-bottom-style: solid; + border-bottom-width: 3px; + color: #7a91c1; + padding-bottom: calc(0.5rem - 3px); +} + +.navbar-content { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; +} + +.navbar-link { + padding-right: 2.5em; +} + +.navbar-dropdown { + font-size: 0.875rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; +} + +.navbar-dropdown .navbar-item { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.navbar-divider { + background-color: #dbdbdb; + border: none; + display: none; + height: 1px; + margin: 0.5rem 0; +} + +@media screen and (max-width: 1023px) { + .navbar > .container { + display: block; + } + .navbar-brand .navbar-item, + .navbar-tabs .navbar-item { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } + .navbar-menu { + background-color: white; + -webkit-box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); + box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); + padding: 0.5rem 0; + } + .navbar-menu.is-active { + display: block; + } + .navbar.is-fixed-bottom-touch, .navbar.is-fixed-top-touch { + left: 0; + position: fixed; + right: 0; + z-index: 30; + } + .navbar.is-fixed-bottom-touch { + bottom: 0; + } + .navbar.is-fixed-bottom-touch.has-shadow { + -webkit-box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); + } + .navbar.is-fixed-top-touch { + top: 0; + } + .navbar.is-fixed-top .navbar-menu, .navbar.is-fixed-top-touch .navbar-menu { + -webkit-overflow-scrolling: touch; + max-height: calc(100vh - 3.25rem); + overflow: auto; + } + html.has-navbar-fixed-top-touch { + padding-top: 3.25rem; + } + html.has-navbar-fixed-bottom-touch { + padding-bottom: 3.25rem; + } +} + +@media screen and (min-width: 1024px) { + .navbar, + .navbar-menu, + .navbar-start, + .navbar-end { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } + .navbar { + min-height: 3.25rem; + } + .navbar.is-transparent a.navbar-item:hover, .navbar.is-transparent a.navbar-item.is-active, + .navbar.is-transparent a.navbar-link:hover, + .navbar.is-transparent a.navbar-link.is-active { + background-color: transparent !important; + } + .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { + background-color: transparent !important; + } + .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { + background-color: whitesmoke; + color: #0a0a0a; + } + .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: #7a91c1; + } + .navbar-burger { + display: none; + } + .navbar-item, + .navbar-link { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } + .navbar-item.has-dropdown { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + } + .navbar-item.has-dropdown-up .navbar-link::after { + -webkit-transform: rotate(135deg) translate(0.25em, -0.25em); + transform: rotate(135deg) translate(0.25em, -0.25em); + } + .navbar-item.has-dropdown-up .navbar-dropdown { + border-bottom: 1px solid #dbdbdb; + border-radius: 5px 5px 0 0; + border-top: none; + bottom: 100%; + -webkit-box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); + box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); + top: auto; + } + .navbar-item.is-active .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown { + display: block; + } + .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { + opacity: 1; + pointer-events: auto; + -webkit-transform: translateY(0); + transform: translateY(0); + } + .navbar-link::after { + border: 1px solid #7a91c1; + border-right: 0; + border-top: 0; + content: " "; + display: block; + height: 0.5em; + pointer-events: none; + position: absolute; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -webkit-transform-origin: center; + transform-origin: center; + width: 0.5em; + margin-top: -0.375em; + right: 1.125em; + top: 50%; + } + .navbar-menu { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; + } + .navbar-start { + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + margin-right: auto; + } + .navbar-end { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + margin-left: auto; + } + .navbar-dropdown { + background-color: white; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + border-top: 1px solid #dbdbdb; + -webkit-box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); + display: none; + font-size: 0.875rem; + left: 0; + min-width: 100%; + position: absolute; + top: 100%; + z-index: 20; + } + .navbar-dropdown .navbar-item { + padding: 0.375rem 1rem; + white-space: nowrap; + } + .navbar-dropdown a.navbar-item { + padding-right: 3rem; + } + .navbar-dropdown a.navbar-item:hover { + background-color: whitesmoke; + color: #0a0a0a; + } + .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: #7a91c1; + } + .navbar-dropdown.is-boxed { + border-radius: 5px; + border-top: none; + -webkit-box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + display: block; + opacity: 0; + pointer-events: none; + top: calc(100% + (-4px)); + -webkit-transform: translateY(-5px); + transform: translateY(-5px); + -webkit-transition-duration: 86ms; + transition-duration: 86ms; + -webkit-transition-property: opacity, -webkit-transform; + transition-property: opacity, -webkit-transform; + transition-property: opacity, transform; + transition-property: opacity, transform, -webkit-transform; + } + .navbar-dropdown.is-right { + left: auto; + right: 0; + } + .navbar-divider { + display: block; + } + .navbar > .container .navbar-brand, + .container > .navbar .navbar-brand { + margin-left: -1rem; + } + .navbar > .container .navbar-menu, + .container > .navbar .navbar-menu { + margin-right: -1rem; + } + .navbar.is-fixed-bottom-desktop, .navbar.is-fixed-top-desktop { + left: 0; + position: fixed; + right: 0; + z-index: 30; + } + .navbar.is-fixed-bottom-desktop { + bottom: 0; + } + .navbar.is-fixed-bottom-desktop.has-shadow { + -webkit-box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); + } + .navbar.is-fixed-top-desktop { + top: 0; + } + html.has-navbar-fixed-top-desktop { + padding-top: 3.25rem; + } + html.has-navbar-fixed-bottom-desktop { + padding-bottom: 3.25rem; + } + a.navbar-item.is-active, + a.navbar-link.is-active { + color: #0a0a0a; + } + a.navbar-item.is-active:not(:hover), + a.navbar-link.is-active:not(:hover) { + background-color: transparent; + } + .navbar-item.has-dropdown:hover .navbar-link, .navbar-item.has-dropdown.is-active .navbar-link { + background-color: whitesmoke; + } +} + +.pagination { + font-size: 1rem; + margin: -0.25rem; +} + +.pagination.is-small { + font-size: 0.75rem; +} + +.pagination.is-medium { + font-size: 1.25rem; +} + +.pagination.is-large { + font-size: 1.5rem; +} + +.pagination, +.pagination-list { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + text-align: center; +} + +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis { + -moz-appearance: none; + -webkit-appearance: none; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border: 1px solid transparent; + border-radius: 3px; + -webkit-box-shadow: none; + box-shadow: none; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + font-size: 1em; + padding-left: 0.5em; + padding-right: 0.5em; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin: 0.25rem; + text-align: center; +} + +.pagination-previous:focus, .pagination-previous.is-focused, .pagination-previous:active, .pagination-previous.is-active, +.pagination-next:focus, +.pagination-next.is-focused, +.pagination-next:active, +.pagination-next.is-active, +.pagination-link:focus, +.pagination-link.is-focused, +.pagination-link:active, +.pagination-link.is-active, +.pagination-ellipsis:focus, +.pagination-ellipsis.is-focused, +.pagination-ellipsis:active, +.pagination-ellipsis.is-active { + outline: none; +} + +.pagination-previous[disabled], +.pagination-next[disabled], +.pagination-link[disabled], +.pagination-ellipsis[disabled] { + cursor: not-allowed; +} + +.pagination-previous, +.pagination-next, +.pagination-link { + border-color: #dbdbdb; + min-width: 2.25em; +} + +.pagination-previous:hover, +.pagination-next:hover, +.pagination-link:hover { + border-color: #b5b5b5; + color: #363636; +} + +.pagination-previous:focus, +.pagination-next:focus, +.pagination-link:focus { + border-color: #7a91c1; +} + +.pagination-previous:active, +.pagination-next:active, +.pagination-link:active { + -webkit-box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); +} + +.pagination-previous[disabled], +.pagination-next[disabled], +.pagination-link[disabled] { + background-color: #dbdbdb; + border-color: #dbdbdb; + -webkit-box-shadow: none; + box-shadow: none; + color: #7a7a7a; + opacity: 0.5; +} + +.pagination-previous, +.pagination-next { + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; +} + +.pagination-link.is-current { + background-color: #7a91c1; + border-color: #7a91c1; + color: #fff; +} + +.pagination-ellipsis { + color: #b5b5b5; + pointer-events: none; +} + +.pagination-list { + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +@media screen and (max-width: 768px) { + .pagination { + -ms-flex-wrap: wrap; + flex-wrap: wrap; + } + .pagination-previous, + .pagination-next { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + } + .pagination-list li { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + } +} + +@media screen and (min-width: 769px), print { + .pagination-list { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; + } + .pagination-previous { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; + } + .pagination-next { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; + } + .pagination { + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + } + .pagination.is-centered .pagination-previous { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; + } + .pagination.is-centered .pagination-list { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; + } + .pagination.is-centered .pagination-next { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; + } + .pagination.is-right .pagination-previous { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; + } + .pagination.is-right .pagination-next { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; + } + .pagination.is-right .pagination-list { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; + } +} + +.panel { + font-size: 1rem; +} + +.panel:not(:last-child) { + margin-bottom: 1.5rem; +} + +.panel-heading, +.panel-tabs, +.panel-block { + border-bottom: 1px solid #dbdbdb; + border-left: 1px solid #dbdbdb; + border-right: 1px solid #dbdbdb; +} + +.panel-heading:first-child, +.panel-tabs:first-child, +.panel-block:first-child { + border-top: 1px solid #dbdbdb; +} + +.panel-heading { + background-color: whitesmoke; + border-radius: 3px 3px 0 0; + color: #363636; + font-size: 1.25em; + font-weight: 300; + line-height: 1.25; + padding: 0.5em 0.75em; +} + +.panel-tabs { + -webkit-box-align: end; + -ms-flex-align: end; + align-items: flex-end; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + font-size: 0.875em; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.panel-tabs a { + border-bottom: 1px solid #dbdbdb; + margin-bottom: -1px; + padding: 0.5em; +} + +.panel-tabs a.is-active { + border-bottom-color: #4a4a4a; + color: #363636; +} + +.panel-list a { + color: #4a4a4a; +} + +.panel-list a:hover { + color: #7a91c1; +} + +.panel-block { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + color: #363636; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + padding: 0.5em 0.75em; +} + +.panel-block input[type="checkbox"] { + margin-right: 0.75em; +} + +.panel-block > .control { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + width: 100%; +} + +.panel-block.is-wrapped { + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +.panel-block.is-active { + border-left-color: #7a91c1; + color: #363636; +} + +.panel-block.is-active .panel-icon { + color: #7a91c1; +} + +a.panel-block, +label.panel-block { + cursor: pointer; +} + +a.panel-block:hover, +label.panel-block:hover { + background-color: whitesmoke; +} + +.panel-icon { + display: inline-block; + font-size: 14px; + height: 1em; + line-height: 1em; + text-align: center; + vertical-align: top; + width: 1em; + color: #7a7a7a; + margin-right: 0.75em; +} + +.panel-icon .fa { + font-size: inherit; + line-height: inherit; +} + +.tabs { + -webkit-overflow-scrolling: touch; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + font-size: 1rem; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + overflow: hidden; + overflow-x: auto; + white-space: nowrap; +} + +.tabs:not(:last-child) { + margin-bottom: 1.5rem; +} + +.tabs a { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + color: #4a4a4a; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin-bottom: -1px; + padding: 0.5em 1em; + vertical-align: top; +} + +.tabs a:hover { + border-bottom-color: #363636; + color: #363636; +} + +.tabs li { + display: block; +} + +.tabs li.is-active a { + border-bottom-color: #7a91c1; + color: #7a91c1; +} + +.tabs ul { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.tabs ul.is-left { + padding-right: 0.75em; +} + +.tabs ul.is-center { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding-left: 0.75em; + padding-right: 0.75em; +} + +.tabs ul.is-right { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + padding-left: 0.75em; +} + +.tabs .icon:first-child { + margin-right: 0.5em; +} + +.tabs .icon:last-child { + margin-left: 0.5em; +} + +.tabs.is-centered ul { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.tabs.is-right ul { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.tabs.is-boxed a { + border: 1px solid transparent; + border-radius: 3px 3px 0 0; +} + +.tabs.is-boxed a:hover { + background-color: whitesmoke; + border-bottom-color: #dbdbdb; +} + +.tabs.is-boxed li.is-active a { + background-color: white; + border-color: #dbdbdb; + border-bottom-color: transparent !important; +} + +.tabs.is-fullwidth li { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.tabs.is-toggle a { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px; + margin-bottom: 0; + position: relative; +} + +.tabs.is-toggle a:hover { + background-color: whitesmoke; + border-color: #b5b5b5; + z-index: 2; +} + +.tabs.is-toggle li + li { + margin-left: -1px; +} + +.tabs.is-toggle li:first-child a { + border-radius: 3px 0 0 3px; +} + +.tabs.is-toggle li:last-child a { + border-radius: 0 3px 3px 0; +} + +.tabs.is-toggle li.is-active a { + background-color: #7a91c1; + border-color: #7a91c1; + color: #fff; + z-index: 1; +} + +.tabs.is-toggle ul { + border-bottom: none; +} + +.tabs.is-small { + font-size: 0.75rem; +} + +.tabs.is-medium { + font-size: 1.25rem; +} + +.tabs.is-large { + font-size: 1.5rem; +} + +.column { + display: block; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + padding: 0.75rem; +} + +.columns.is-mobile > .column.is-narrow { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; +} + +.columns.is-mobile > .column.is-full { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; +} + +.columns.is-mobile > .column.is-three-quarters { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; +} + +.columns.is-mobile > .column.is-two-thirds { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.6666%; +} + +.columns.is-mobile > .column.is-half { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; +} + +.columns.is-mobile > .column.is-one-third { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.3333%; +} + +.columns.is-mobile > .column.is-one-quarter { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; +} + +.columns.is-mobile > .column.is-one-fifth { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 20%; +} + +.columns.is-mobile > .column.is-two-fifths { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 40%; +} + +.columns.is-mobile > .column.is-three-fifths { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 60%; +} + +.columns.is-mobile > .column.is-four-fifths { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 80%; +} + +.columns.is-mobile > .column.is-offset-three-quarters { + margin-left: 75%; +} + +.columns.is-mobile > .column.is-offset-two-thirds { + margin-left: 66.6666%; +} + +.columns.is-mobile > .column.is-offset-half { + margin-left: 50%; +} + +.columns.is-mobile > .column.is-offset-one-third { + margin-left: 33.3333%; +} + +.columns.is-mobile > .column.is-offset-one-quarter { + margin-left: 25%; +} + +.columns.is-mobile > .column.is-offset-one-fifth { + margin-left: 20%; +} + +.columns.is-mobile > .column.is-offset-two-fifths { + margin-left: 40%; +} + +.columns.is-mobile > .column.is-offset-three-fifths { + margin-left: 60%; +} + +.columns.is-mobile > .column.is-offset-four-fifths { + margin-left: 80%; +} + +.columns.is-mobile > .column.is-1 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 8.33333%; +} + +.columns.is-mobile > .column.is-offset-1 { + margin-left: 8.33333%; +} + +.columns.is-mobile > .column.is-2 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 16.66667%; +} + +.columns.is-mobile > .column.is-offset-2 { + margin-left: 16.66667%; +} + +.columns.is-mobile > .column.is-3 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; +} + +.columns.is-mobile > .column.is-offset-3 { + margin-left: 25%; +} + +.columns.is-mobile > .column.is-4 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.33333%; +} + +.columns.is-mobile > .column.is-offset-4 { + margin-left: 33.33333%; +} + +.columns.is-mobile > .column.is-5 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 41.66667%; +} + +.columns.is-mobile > .column.is-offset-5 { + margin-left: 41.66667%; +} + +.columns.is-mobile > .column.is-6 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; +} + +.columns.is-mobile > .column.is-offset-6 { + margin-left: 50%; +} + +.columns.is-mobile > .column.is-7 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 58.33333%; +} + +.columns.is-mobile > .column.is-offset-7 { + margin-left: 58.33333%; +} + +.columns.is-mobile > .column.is-8 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.66667%; +} + +.columns.is-mobile > .column.is-offset-8 { + margin-left: 66.66667%; +} + +.columns.is-mobile > .column.is-9 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; +} + +.columns.is-mobile > .column.is-offset-9 { + margin-left: 75%; +} + +.columns.is-mobile > .column.is-10 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 83.33333%; +} + +.columns.is-mobile > .column.is-offset-10 { + margin-left: 83.33333%; +} + +.columns.is-mobile > .column.is-11 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 91.66667%; +} + +.columns.is-mobile > .column.is-offset-11 { + margin-left: 91.66667%; +} + +.columns.is-mobile > .column.is-12 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; +} + +.columns.is-mobile > .column.is-offset-12 { + margin-left: 100%; +} + +@media screen and (max-width: 768px) { + .column.is-narrow-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + } + .column.is-full-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-three-quarters-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-two-thirds-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.6666%; + } + .column.is-half-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-one-third-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-one-fifth-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 20%; + } + .column.is-two-fifths-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 40%; + } + .column.is-three-fifths-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 60%; + } + .column.is-four-fifths-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-mobile { + margin-left: 75%; + } + .column.is-offset-two-thirds-mobile { + margin-left: 66.6666%; + } + .column.is-offset-half-mobile { + margin-left: 50%; + } + .column.is-offset-one-third-mobile { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-mobile { + margin-left: 25%; + } + .column.is-offset-one-fifth-mobile { + margin-left: 20%; + } + .column.is-offset-two-fifths-mobile { + margin-left: 40%; + } + .column.is-offset-three-fifths-mobile { + margin-left: 60%; + } + .column.is-offset-four-fifths-mobile { + margin-left: 80%; + } + .column.is-1-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 8.33333%; + } + .column.is-offset-1-mobile { + margin-left: 8.33333%; + } + .column.is-2-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 16.66667%; + } + .column.is-offset-2-mobile { + margin-left: 16.66667%; + } + .column.is-3-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-offset-3-mobile { + margin-left: 25%; + } + .column.is-4-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.33333%; + } + .column.is-offset-4-mobile { + margin-left: 33.33333%; + } + .column.is-5-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 41.66667%; + } + .column.is-offset-5-mobile { + margin-left: 41.66667%; + } + .column.is-6-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-offset-6-mobile { + margin-left: 50%; + } + .column.is-7-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 58.33333%; + } + .column.is-offset-7-mobile { + margin-left: 58.33333%; + } + .column.is-8-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.66667%; + } + .column.is-offset-8-mobile { + margin-left: 66.66667%; + } + .column.is-9-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-offset-9-mobile { + margin-left: 75%; + } + .column.is-10-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 83.33333%; + } + .column.is-offset-10-mobile { + margin-left: 83.33333%; + } + .column.is-11-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 91.66667%; + } + .column.is-offset-11-mobile { + margin-left: 91.66667%; + } + .column.is-12-mobile { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-offset-12-mobile { + margin-left: 100%; + } +} + +@media screen and (min-width: 769px), print { + .column.is-narrow, .column.is-narrow-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + } + .column.is-full, .column.is-full-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-three-quarters, .column.is-three-quarters-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-two-thirds, .column.is-two-thirds-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.6666%; + } + .column.is-half, .column.is-half-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-one-third, .column.is-one-third-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.3333%; + } + .column.is-one-quarter, .column.is-one-quarter-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-one-fifth, .column.is-one-fifth-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 20%; + } + .column.is-two-fifths, .column.is-two-fifths-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 40%; + } + .column.is-three-fifths, .column.is-three-fifths-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 60%; + } + .column.is-four-fifths, .column.is-four-fifths-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 80%; + } + .column.is-offset-three-quarters, .column.is-offset-three-quarters-tablet { + margin-left: 75%; + } + .column.is-offset-two-thirds, .column.is-offset-two-thirds-tablet { + margin-left: 66.6666%; + } + .column.is-offset-half, .column.is-offset-half-tablet { + margin-left: 50%; + } + .column.is-offset-one-third, .column.is-offset-one-third-tablet { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter, .column.is-offset-one-quarter-tablet { + margin-left: 25%; + } + .column.is-offset-one-fifth, .column.is-offset-one-fifth-tablet { + margin-left: 20%; + } + .column.is-offset-two-fifths, .column.is-offset-two-fifths-tablet { + margin-left: 40%; + } + .column.is-offset-three-fifths, .column.is-offset-three-fifths-tablet { + margin-left: 60%; + } + .column.is-offset-four-fifths, .column.is-offset-four-fifths-tablet { + margin-left: 80%; + } + .column.is-1, .column.is-1-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 8.33333%; + } + .column.is-offset-1, .column.is-offset-1-tablet { + margin-left: 8.33333%; + } + .column.is-2, .column.is-2-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 16.66667%; + } + .column.is-offset-2, .column.is-offset-2-tablet { + margin-left: 16.66667%; + } + .column.is-3, .column.is-3-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-offset-3, .column.is-offset-3-tablet { + margin-left: 25%; + } + .column.is-4, .column.is-4-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.33333%; + } + .column.is-offset-4, .column.is-offset-4-tablet { + margin-left: 33.33333%; + } + .column.is-5, .column.is-5-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 41.66667%; + } + .column.is-offset-5, .column.is-offset-5-tablet { + margin-left: 41.66667%; + } + .column.is-6, .column.is-6-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-offset-6, .column.is-offset-6-tablet { + margin-left: 50%; + } + .column.is-7, .column.is-7-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 58.33333%; + } + .column.is-offset-7, .column.is-offset-7-tablet { + margin-left: 58.33333%; + } + .column.is-8, .column.is-8-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.66667%; + } + .column.is-offset-8, .column.is-offset-8-tablet { + margin-left: 66.66667%; + } + .column.is-9, .column.is-9-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-offset-9, .column.is-offset-9-tablet { + margin-left: 75%; + } + .column.is-10, .column.is-10-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 83.33333%; + } + .column.is-offset-10, .column.is-offset-10-tablet { + margin-left: 83.33333%; + } + .column.is-11, .column.is-11-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 91.66667%; + } + .column.is-offset-11, .column.is-offset-11-tablet { + margin-left: 91.66667%; + } + .column.is-12, .column.is-12-tablet { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-offset-12, .column.is-offset-12-tablet { + margin-left: 100%; + } +} + +@media screen and (max-width: 1023px) { + .column.is-narrow-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + } + .column.is-full-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-three-quarters-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-two-thirds-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.6666%; + } + .column.is-half-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-one-third-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-one-fifth-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 20%; + } + .column.is-two-fifths-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 40%; + } + .column.is-three-fifths-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 60%; + } + .column.is-four-fifths-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-touch { + margin-left: 75%; + } + .column.is-offset-two-thirds-touch { + margin-left: 66.6666%; + } + .column.is-offset-half-touch { + margin-left: 50%; + } + .column.is-offset-one-third-touch { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-touch { + margin-left: 25%; + } + .column.is-offset-one-fifth-touch { + margin-left: 20%; + } + .column.is-offset-two-fifths-touch { + margin-left: 40%; + } + .column.is-offset-three-fifths-touch { + margin-left: 60%; + } + .column.is-offset-four-fifths-touch { + margin-left: 80%; + } + .column.is-1-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 8.33333%; + } + .column.is-offset-1-touch { + margin-left: 8.33333%; + } + .column.is-2-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 16.66667%; + } + .column.is-offset-2-touch { + margin-left: 16.66667%; + } + .column.is-3-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-offset-3-touch { + margin-left: 25%; + } + .column.is-4-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.33333%; + } + .column.is-offset-4-touch { + margin-left: 33.33333%; + } + .column.is-5-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 41.66667%; + } + .column.is-offset-5-touch { + margin-left: 41.66667%; + } + .column.is-6-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-offset-6-touch { + margin-left: 50%; + } + .column.is-7-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 58.33333%; + } + .column.is-offset-7-touch { + margin-left: 58.33333%; + } + .column.is-8-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.66667%; + } + .column.is-offset-8-touch { + margin-left: 66.66667%; + } + .column.is-9-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-offset-9-touch { + margin-left: 75%; + } + .column.is-10-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 83.33333%; + } + .column.is-offset-10-touch { + margin-left: 83.33333%; + } + .column.is-11-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 91.66667%; + } + .column.is-offset-11-touch { + margin-left: 91.66667%; + } + .column.is-12-touch { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-offset-12-touch { + margin-left: 100%; + } +} + +@media screen and (min-width: 1024px) { + .column.is-narrow-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + } + .column.is-full-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-three-quarters-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-two-thirds-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.6666%; + } + .column.is-half-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-one-third-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-one-fifth-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 20%; + } + .column.is-two-fifths-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 40%; + } + .column.is-three-fifths-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 60%; + } + .column.is-four-fifths-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-desktop { + margin-left: 75%; + } + .column.is-offset-two-thirds-desktop { + margin-left: 66.6666%; + } + .column.is-offset-half-desktop { + margin-left: 50%; + } + .column.is-offset-one-third-desktop { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-desktop { + margin-left: 25%; + } + .column.is-offset-one-fifth-desktop { + margin-left: 20%; + } + .column.is-offset-two-fifths-desktop { + margin-left: 40%; + } + .column.is-offset-three-fifths-desktop { + margin-left: 60%; + } + .column.is-offset-four-fifths-desktop { + margin-left: 80%; + } + .column.is-1-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 8.33333%; + } + .column.is-offset-1-desktop { + margin-left: 8.33333%; + } + .column.is-2-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 16.66667%; + } + .column.is-offset-2-desktop { + margin-left: 16.66667%; + } + .column.is-3-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-offset-3-desktop { + margin-left: 25%; + } + .column.is-4-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.33333%; + } + .column.is-offset-4-desktop { + margin-left: 33.33333%; + } + .column.is-5-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 41.66667%; + } + .column.is-offset-5-desktop { + margin-left: 41.66667%; + } + .column.is-6-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-offset-6-desktop { + margin-left: 50%; + } + .column.is-7-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 58.33333%; + } + .column.is-offset-7-desktop { + margin-left: 58.33333%; + } + .column.is-8-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.66667%; + } + .column.is-offset-8-desktop { + margin-left: 66.66667%; + } + .column.is-9-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-offset-9-desktop { + margin-left: 75%; + } + .column.is-10-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 83.33333%; + } + .column.is-offset-10-desktop { + margin-left: 83.33333%; + } + .column.is-11-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 91.66667%; + } + .column.is-offset-11-desktop { + margin-left: 91.66667%; + } + .column.is-12-desktop { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-offset-12-desktop { + margin-left: 100%; + } +} + +@media screen and (min-width: 1216px) { + .column.is-narrow-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + } + .column.is-full-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-three-quarters-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-two-thirds-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.6666%; + } + .column.is-half-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-one-third-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-one-fifth-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 20%; + } + .column.is-two-fifths-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 40%; + } + .column.is-three-fifths-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 60%; + } + .column.is-four-fifths-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-widescreen { + margin-left: 75%; + } + .column.is-offset-two-thirds-widescreen { + margin-left: 66.6666%; + } + .column.is-offset-half-widescreen { + margin-left: 50%; + } + .column.is-offset-one-third-widescreen { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-widescreen { + margin-left: 25%; + } + .column.is-offset-one-fifth-widescreen { + margin-left: 20%; + } + .column.is-offset-two-fifths-widescreen { + margin-left: 40%; + } + .column.is-offset-three-fifths-widescreen { + margin-left: 60%; + } + .column.is-offset-four-fifths-widescreen { + margin-left: 80%; + } + .column.is-1-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 8.33333%; + } + .column.is-offset-1-widescreen { + margin-left: 8.33333%; + } + .column.is-2-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 16.66667%; + } + .column.is-offset-2-widescreen { + margin-left: 16.66667%; + } + .column.is-3-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-offset-3-widescreen { + margin-left: 25%; + } + .column.is-4-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.33333%; + } + .column.is-offset-4-widescreen { + margin-left: 33.33333%; + } + .column.is-5-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 41.66667%; + } + .column.is-offset-5-widescreen { + margin-left: 41.66667%; + } + .column.is-6-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-offset-6-widescreen { + margin-left: 50%; + } + .column.is-7-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 58.33333%; + } + .column.is-offset-7-widescreen { + margin-left: 58.33333%; + } + .column.is-8-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.66667%; + } + .column.is-offset-8-widescreen { + margin-left: 66.66667%; + } + .column.is-9-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-offset-9-widescreen { + margin-left: 75%; + } + .column.is-10-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 83.33333%; + } + .column.is-offset-10-widescreen { + margin-left: 83.33333%; + } + .column.is-11-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 91.66667%; + } + .column.is-offset-11-widescreen { + margin-left: 91.66667%; + } + .column.is-12-widescreen { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-offset-12-widescreen { + margin-left: 100%; + } +} + +@media screen and (min-width: 1408px) { + .column.is-narrow-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + } + .column.is-full-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-three-quarters-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-two-thirds-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.6666%; + } + .column.is-half-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-one-third-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.3333%; + } + .column.is-one-quarter-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-one-fifth-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 20%; + } + .column.is-two-fifths-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 40%; + } + .column.is-three-fifths-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 60%; + } + .column.is-four-fifths-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 80%; + } + .column.is-offset-three-quarters-fullhd { + margin-left: 75%; + } + .column.is-offset-two-thirds-fullhd { + margin-left: 66.6666%; + } + .column.is-offset-half-fullhd { + margin-left: 50%; + } + .column.is-offset-one-third-fullhd { + margin-left: 33.3333%; + } + .column.is-offset-one-quarter-fullhd { + margin-left: 25%; + } + .column.is-offset-one-fifth-fullhd { + margin-left: 20%; + } + .column.is-offset-two-fifths-fullhd { + margin-left: 40%; + } + .column.is-offset-three-fifths-fullhd { + margin-left: 60%; + } + .column.is-offset-four-fifths-fullhd { + margin-left: 80%; + } + .column.is-1-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 8.33333%; + } + .column.is-offset-1-fullhd { + margin-left: 8.33333%; + } + .column.is-2-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 16.66667%; + } + .column.is-offset-2-fullhd { + margin-left: 16.66667%; + } + .column.is-3-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .column.is-offset-3-fullhd { + margin-left: 25%; + } + .column.is-4-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.33333%; + } + .column.is-offset-4-fullhd { + margin-left: 33.33333%; + } + .column.is-5-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 41.66667%; + } + .column.is-offset-5-fullhd { + margin-left: 41.66667%; + } + .column.is-6-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .column.is-offset-6-fullhd { + margin-left: 50%; + } + .column.is-7-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 58.33333%; + } + .column.is-offset-7-fullhd { + margin-left: 58.33333%; + } + .column.is-8-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.66667%; + } + .column.is-offset-8-fullhd { + margin-left: 66.66667%; + } + .column.is-9-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .column.is-offset-9-fullhd { + margin-left: 75%; + } + .column.is-10-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 83.33333%; + } + .column.is-offset-10-fullhd { + margin-left: 83.33333%; + } + .column.is-11-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 91.66667%; + } + .column.is-offset-11-fullhd { + margin-left: 91.66667%; + } + .column.is-12-fullhd { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } + .column.is-offset-12-fullhd { + margin-left: 100%; + } +} + +.columns { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; +} + +.columns:last-child { + margin-bottom: -0.75rem; +} + +.columns:not(:last-child) { + margin-bottom: calc(1.5rem - 0.75rem); +} + +.columns.is-centered { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.columns.is-gapless { + margin-left: 0; + margin-right: 0; + margin-top: 0; +} + +.columns.is-gapless > .column { + margin: 0; + padding: 0 !important; +} + +.columns.is-gapless:not(:last-child) { + margin-bottom: 1.5rem; +} + +.columns.is-gapless:last-child { + margin-bottom: 0; +} + +.columns.is-mobile { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.columns.is-multiline { + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +.columns.is-vcentered { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +@media screen and (min-width: 769px), print { + .columns:not(.is-desktop) { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } +} + +@media screen and (min-width: 1024px) { + .columns.is-desktop { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } +} + +.columns.is-variable { + --columnGap: 0.75rem; + margin-left: calc(-1 * var(--columnGap)); + margin-right: calc(-1 * var(--columnGap)); +} + +.columns.is-variable .column { + padding-left: var(--columnGap); + padding-right: var(--columnGap); +} + +.columns.is-variable.is-0 { + --columnGap: 0rem; +} + +.columns.is-variable.is-1 { + --columnGap: 0.25rem; +} + +.columns.is-variable.is-2 { + --columnGap: 0.5rem; +} + +.columns.is-variable.is-3 { + --columnGap: 0.75rem; +} + +.columns.is-variable.is-4 { + --columnGap: 1rem; +} + +.columns.is-variable.is-5 { + --columnGap: 1.25rem; +} + +.columns.is-variable.is-6 { + --columnGap: 1.5rem; +} + +.columns.is-variable.is-7 { + --columnGap: 1.75rem; +} + +.columns.is-variable.is-8 { + --columnGap: 2rem; +} + +.tile { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: block; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; + min-height: -webkit-min-content; + min-height: -moz-min-content; + min-height: min-content; +} + +.tile.is-ancestor { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; +} + +.tile.is-ancestor:last-child { + margin-bottom: -0.75rem; +} + +.tile.is-ancestor:not(:last-child) { + margin-bottom: 0.75rem; +} + +.tile.is-child { + margin: 0 !important; +} + +.tile.is-parent { + padding: 0.75rem; +} + +.tile.is-vertical { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} + +.tile.is-vertical > .tile.is-child:not(:last-child) { + margin-bottom: 1.5rem !important; +} + +@media screen and (min-width: 769px), print { + .tile:not(.is-child) { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } + .tile.is-1 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 8.33333%; + } + .tile.is-2 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 16.66667%; + } + .tile.is-3 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 25%; + } + .tile.is-4 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 33.33333%; + } + .tile.is-5 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 41.66667%; + } + .tile.is-6 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 50%; + } + .tile.is-7 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 58.33333%; + } + .tile.is-8 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 66.66667%; + } + .tile.is-9 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 75%; + } + .tile.is-10 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 83.33333%; + } + .tile.is-11 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 91.66667%; + } + .tile.is-12 { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; + width: 100%; + } +} + +.hero { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.hero .navbar { + background: none; +} + +.hero .tabs ul { + border-bottom: none; +} + +.hero.is-white { + background-color: white; + color: #0a0a0a; +} + +.hero.is-white a:not(.button), +.hero.is-white strong { + color: inherit; +} + +.hero.is-white .title { + color: #0a0a0a; +} + +.hero.is-white .subtitle { + color: rgba(10, 10, 10, 0.9); +} + +.hero.is-white .subtitle a:not(.button), +.hero.is-white .subtitle strong { + color: #0a0a0a; +} + +@media screen and (max-width: 1023px) { + .hero.is-white .navbar-menu { + background-color: white; + } +} + +.hero.is-white .navbar-item, +.hero.is-white .navbar-link { + color: rgba(10, 10, 10, 0.7); +} + +.hero.is-white a.navbar-item:hover, .hero.is-white a.navbar-item.is-active, +.hero.is-white .navbar-link:hover, +.hero.is-white .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; +} + +.hero.is-white .tabs a { + color: #0a0a0a; + opacity: 0.9; +} + +.hero.is-white .tabs a:hover { + opacity: 1; +} + +.hero.is-white .tabs li.is-active a { + opacity: 1; +} + +.hero.is-white .tabs.is-boxed a, .hero.is-white .tabs.is-toggle a { + color: #0a0a0a; +} + +.hero.is-white .tabs.is-boxed a:hover, .hero.is-white .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-white .tabs.is-boxed li.is-active a, .hero.is-white .tabs.is-boxed li.is-active a:hover, .hero.is-white .tabs.is-toggle li.is-active a, .hero.is-white .tabs.is-toggle li.is-active a:hover { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; +} + +.hero.is-white.is-bold { + background-image: linear-gradient(141deg, #e6e6e6 0%, white 71%, white 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-white.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #e6e6e6 0%, white 71%, white 100%); + } +} + +.hero.is-black { + background-color: #0a0a0a; + color: white; +} + +.hero.is-black a:not(.button), +.hero.is-black strong { + color: inherit; +} + +.hero.is-black .title { + color: white; +} + +.hero.is-black .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-black .subtitle a:not(.button), +.hero.is-black .subtitle strong { + color: white; +} + +@media screen and (max-width: 1023px) { + .hero.is-black .navbar-menu { + background-color: #0a0a0a; + } +} + +.hero.is-black .navbar-item, +.hero.is-black .navbar-link { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-black a.navbar-item:hover, .hero.is-black a.navbar-item.is-active, +.hero.is-black .navbar-link:hover, +.hero.is-black .navbar-link.is-active { + background-color: black; + color: white; +} + +.hero.is-black .tabs a { + color: white; + opacity: 0.9; +} + +.hero.is-black .tabs a:hover { + opacity: 1; +} + +.hero.is-black .tabs li.is-active a { + opacity: 1; +} + +.hero.is-black .tabs.is-boxed a, .hero.is-black .tabs.is-toggle a { + color: white; +} + +.hero.is-black .tabs.is-boxed a:hover, .hero.is-black .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-black .tabs.is-boxed li.is-active a, .hero.is-black .tabs.is-boxed li.is-active a:hover, .hero.is-black .tabs.is-toggle li.is-active a, .hero.is-black .tabs.is-toggle li.is-active a:hover { + background-color: white; + border-color: white; + color: #0a0a0a; +} + +.hero.is-black.is-bold { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-black.is-bold .navbar-menu { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); + } +} + +.hero.is-light { + background-color: whitesmoke; + color: #363636; +} + +.hero.is-light a:not(.button), +.hero.is-light strong { + color: inherit; +} + +.hero.is-light .title { + color: #363636; +} + +.hero.is-light .subtitle { + color: rgba(54, 54, 54, 0.9); +} + +.hero.is-light .subtitle a:not(.button), +.hero.is-light .subtitle strong { + color: #363636; +} + +@media screen and (max-width: 1023px) { + .hero.is-light .navbar-menu { + background-color: whitesmoke; + } +} + +.hero.is-light .navbar-item, +.hero.is-light .navbar-link { + color: rgba(54, 54, 54, 0.7); +} + +.hero.is-light a.navbar-item:hover, .hero.is-light a.navbar-item.is-active, +.hero.is-light .navbar-link:hover, +.hero.is-light .navbar-link.is-active { + background-color: #e8e8e8; + color: #363636; +} + +.hero.is-light .tabs a { + color: #363636; + opacity: 0.9; +} + +.hero.is-light .tabs a:hover { + opacity: 1; +} + +.hero.is-light .tabs li.is-active a { + opacity: 1; +} + +.hero.is-light .tabs.is-boxed a, .hero.is-light .tabs.is-toggle a { + color: #363636; +} + +.hero.is-light .tabs.is-boxed a:hover, .hero.is-light .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-light .tabs.is-boxed li.is-active a, .hero.is-light .tabs.is-boxed li.is-active a:hover, .hero.is-light .tabs.is-toggle li.is-active a, .hero.is-light .tabs.is-toggle li.is-active a:hover { + background-color: #363636; + border-color: #363636; + color: whitesmoke; +} + +.hero.is-light.is-bold { + background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-light.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); + } +} + +.hero.is-dark { + background-color: #363636; + color: whitesmoke; +} + +.hero.is-dark a:not(.button), +.hero.is-dark strong { + color: inherit; +} + +.hero.is-dark .title { + color: whitesmoke; +} + +.hero.is-dark .subtitle { + color: rgba(245, 245, 245, 0.9); +} + +.hero.is-dark .subtitle a:not(.button), +.hero.is-dark .subtitle strong { + color: whitesmoke; +} + +@media screen and (max-width: 1023px) { + .hero.is-dark .navbar-menu { + background-color: #363636; + } +} + +.hero.is-dark .navbar-item, +.hero.is-dark .navbar-link { + color: rgba(245, 245, 245, 0.7); +} + +.hero.is-dark a.navbar-item:hover, .hero.is-dark a.navbar-item.is-active, +.hero.is-dark .navbar-link:hover, +.hero.is-dark .navbar-link.is-active { + background-color: #292929; + color: whitesmoke; +} + +.hero.is-dark .tabs a { + color: whitesmoke; + opacity: 0.9; +} + +.hero.is-dark .tabs a:hover { + opacity: 1; +} + +.hero.is-dark .tabs li.is-active a { + opacity: 1; +} + +.hero.is-dark .tabs.is-boxed a, .hero.is-dark .tabs.is-toggle a { + color: whitesmoke; +} + +.hero.is-dark .tabs.is-boxed a:hover, .hero.is-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-dark .tabs.is-boxed li.is-active a, .hero.is-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark .tabs.is-toggle li.is-active a, .hero.is-dark .tabs.is-toggle li.is-active a:hover { + background-color: whitesmoke; + border-color: whitesmoke; + color: #363636; +} + +.hero.is-dark.is-bold { + background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); + } +} + +.hero.is-primary { + background-color: #00d1b2; + color: #fff; +} + +.hero.is-primary a:not(.button), +.hero.is-primary strong { + color: inherit; +} + +.hero.is-primary .title { + color: #fff; +} + +.hero.is-primary .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-primary .subtitle a:not(.button), +.hero.is-primary .subtitle strong { + color: #fff; +} + +@media screen and (max-width: 1023px) { + .hero.is-primary .navbar-menu { + background-color: #00d1b2; + } +} + +.hero.is-primary .navbar-item, +.hero.is-primary .navbar-link { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-primary a.navbar-item:hover, .hero.is-primary a.navbar-item.is-active, +.hero.is-primary .navbar-link:hover, +.hero.is-primary .navbar-link.is-active { + background-color: #00b89c; + color: #fff; +} + +.hero.is-primary .tabs a { + color: #fff; + opacity: 0.9; +} + +.hero.is-primary .tabs a:hover { + opacity: 1; +} + +.hero.is-primary .tabs li.is-active a { + opacity: 1; +} + +.hero.is-primary .tabs.is-boxed a, .hero.is-primary .tabs.is-toggle a { + color: #fff; +} + +.hero.is-primary .tabs.is-boxed a:hover, .hero.is-primary .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-primary .tabs.is-boxed li.is-active a, .hero.is-primary .tabs.is-boxed li.is-active a:hover, .hero.is-primary .tabs.is-toggle li.is-active a, .hero.is-primary .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #00d1b2; +} + +.hero.is-primary.is-bold { + background-image: linear-gradient(141deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-primary.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%); + } +} + +.hero.is-link { + background-color: #7a91c1; + color: #fff; +} + +.hero.is-link a:not(.button), +.hero.is-link strong { + color: inherit; +} + +.hero.is-link .title { + color: #fff; +} + +.hero.is-link .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-link .subtitle a:not(.button), +.hero.is-link .subtitle strong { + color: #fff; +} + +@media screen and (max-width: 1023px) { + .hero.is-link .navbar-menu { + background-color: #7a91c1; + } +} + +.hero.is-link .navbar-item, +.hero.is-link .navbar-link { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-link a.navbar-item:hover, .hero.is-link a.navbar-item.is-active, +.hero.is-link .navbar-link:hover, +.hero.is-link .navbar-link.is-active { + background-color: #2366d1; + color: #fff; +} + +.hero.is-link .tabs a { + color: #fff; + opacity: 0.9; +} + +.hero.is-link .tabs a:hover { + opacity: 1; +} + +.hero.is-link .tabs li.is-active a { + opacity: 1; +} + +.hero.is-link .tabs.is-boxed a, .hero.is-link .tabs.is-toggle a { + color: #fff; +} + +.hero.is-link .tabs.is-boxed a:hover, .hero.is-link .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-link .tabs.is-boxed li.is-active a, .hero.is-link .tabs.is-boxed li.is-active a:hover, .hero.is-link .tabs.is-toggle li.is-active a, .hero.is-link .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #7a91c1; +} + +.hero.is-link.is-bold { + background-image: linear-gradient(141deg, #1577c6 0%, #7a91c1 71%, #4366e5 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-link.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1577c6 0%, #7a91c1 71%, #4366e5 100%); + } +} + +.hero.is-info { + background-color: #209cee; + color: #fff; +} + +.hero.is-info a:not(.button), +.hero.is-info strong { + color: inherit; +} + +.hero.is-info .title { + color: #fff; +} + +.hero.is-info .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-info .subtitle a:not(.button), +.hero.is-info .subtitle strong { + color: #fff; +} + +@media screen and (max-width: 1023px) { + .hero.is-info .navbar-menu { + background-color: #209cee; + } +} + +.hero.is-info .navbar-item, +.hero.is-info .navbar-link { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active, +.hero.is-info .navbar-link:hover, +.hero.is-info .navbar-link.is-active { + background-color: #118fe4; + color: #fff; +} + +.hero.is-info .tabs a { + color: #fff; + opacity: 0.9; +} + +.hero.is-info .tabs a:hover { + opacity: 1; +} + +.hero.is-info .tabs li.is-active a { + opacity: 1; +} + +.hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a { + color: #fff; +} + +.hero.is-info .tabs.is-boxed a:hover, .hero.is-info .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #209cee; +} + +.hero.is-info.is-bold { + background-image: linear-gradient(141deg, #04a6d7 0%, #209cee 71%, #3287f5 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-info.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #04a6d7 0%, #209cee 71%, #3287f5 100%); + } +} + +.hero.is-success { + background-color: #23d160; + color: #fff; +} + +.hero.is-success a:not(.button), +.hero.is-success strong { + color: inherit; +} + +.hero.is-success .title { + color: #fff; +} + +.hero.is-success .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-success .subtitle a:not(.button), +.hero.is-success .subtitle strong { + color: #fff; +} + +@media screen and (max-width: 1023px) { + .hero.is-success .navbar-menu { + background-color: #23d160; + } +} + +.hero.is-success .navbar-item, +.hero.is-success .navbar-link { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-success a.navbar-item:hover, .hero.is-success a.navbar-item.is-active, +.hero.is-success .navbar-link:hover, +.hero.is-success .navbar-link.is-active { + background-color: #20bc56; + color: #fff; +} + +.hero.is-success .tabs a { + color: #fff; + opacity: 0.9; +} + +.hero.is-success .tabs a:hover { + opacity: 1; +} + +.hero.is-success .tabs li.is-active a { + opacity: 1; +} + +.hero.is-success .tabs.is-boxed a, .hero.is-success .tabs.is-toggle a { + color: #fff; +} + +.hero.is-success .tabs.is-boxed a:hover, .hero.is-success .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-success .tabs.is-boxed li.is-active a, .hero.is-success .tabs.is-boxed li.is-active a:hover, .hero.is-success .tabs.is-toggle li.is-active a, .hero.is-success .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #23d160; +} + +.hero.is-success.is-bold { + background-image: linear-gradient(141deg, #12af2f 0%, #23d160 71%, #2ce28a 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-success.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #12af2f 0%, #23d160 71%, #2ce28a 100%); + } +} + +.hero.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning a:not(.button), +.hero.is-warning strong { + color: inherit; +} + +.hero.is-warning .title { + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning .subtitle { + color: rgba(0, 0, 0, 0.9); +} + +.hero.is-warning .subtitle a:not(.button), +.hero.is-warning .subtitle strong { + color: rgba(0, 0, 0, 0.7); +} + +@media screen and (max-width: 1023px) { + .hero.is-warning .navbar-menu { + background-color: #ffdd57; + } +} + +.hero.is-warning .navbar-item, +.hero.is-warning .navbar-link { + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning a.navbar-item:hover, .hero.is-warning a.navbar-item.is-active, +.hero.is-warning .navbar-link:hover, +.hero.is-warning .navbar-link.is-active { + background-color: #ffd83d; + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning .tabs a { + color: rgba(0, 0, 0, 0.7); + opacity: 0.9; +} + +.hero.is-warning .tabs a:hover { + opacity: 1; +} + +.hero.is-warning .tabs li.is-active a { + opacity: 1; +} + +.hero.is-warning .tabs.is-boxed a, .hero.is-warning .tabs.is-toggle a { + color: rgba(0, 0, 0, 0.7); +} + +.hero.is-warning .tabs.is-boxed a:hover, .hero.is-warning .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-warning .tabs.is-boxed li.is-active a, .hero.is-warning .tabs.is-boxed li.is-active a:hover, .hero.is-warning .tabs.is-toggle li.is-active a, .hero.is-warning .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; +} + +.hero.is-warning.is-bold { + background-image: linear-gradient(141deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-warning.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%); + } +} + +.hero.is-danger { + background-color: #ff3860; + color: #fff; +} + +.hero.is-danger a:not(.button), +.hero.is-danger strong { + color: inherit; +} + +.hero.is-danger .title { + color: #fff; +} + +.hero.is-danger .subtitle { + color: rgba(255, 255, 255, 0.9); +} + +.hero.is-danger .subtitle a:not(.button), +.hero.is-danger .subtitle strong { + color: #fff; +} + +@media screen and (max-width: 1023px) { + .hero.is-danger .navbar-menu { + background-color: #ff3860; + } +} + +.hero.is-danger .navbar-item, +.hero.is-danger .navbar-link { + color: rgba(255, 255, 255, 0.7); +} + +.hero.is-danger a.navbar-item:hover, .hero.is-danger a.navbar-item.is-active, +.hero.is-danger .navbar-link:hover, +.hero.is-danger .navbar-link.is-active { + background-color: #ff1f4b; + color: #fff; +} + +.hero.is-danger .tabs a { + color: #fff; + opacity: 0.9; +} + +.hero.is-danger .tabs a:hover { + opacity: 1; +} + +.hero.is-danger .tabs li.is-active a { + opacity: 1; +} + +.hero.is-danger .tabs.is-boxed a, .hero.is-danger .tabs.is-toggle a { + color: #fff; +} + +.hero.is-danger .tabs.is-boxed a:hover, .hero.is-danger .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); +} + +.hero.is-danger .tabs.is-boxed li.is-active a, .hero.is-danger .tabs.is-boxed li.is-active a:hover, .hero.is-danger .tabs.is-toggle li.is-active a, .hero.is-danger .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #ff3860; +} + +.hero.is-danger.is-bold { + background-image: linear-gradient(141deg, #ff0561 0%, #ff3860 71%, #ff5257 100%); +} + +@media screen and (max-width: 768px) { + .hero.is-danger.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #ff0561 0%, #ff3860 71%, #ff5257 100%); + } +} + +.hero.is-small .hero-body { + padding-bottom: 1.5rem; + padding-top: 1.5rem; +} + +@media screen and (min-width: 769px), print { + .hero.is-medium .hero-body { + padding-bottom: 9rem; + padding-top: 9rem; + } +} + +@media screen and (min-width: 769px), print { + .hero.is-large .hero-body { + padding-bottom: 18rem; + padding-top: 18rem; + } +} + +.hero.is-halfheight .hero-body, .hero.is-fullheight .hero-body { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.hero.is-halfheight .hero-body > .container, .hero.is-fullheight .hero-body > .container { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 1; + flex-shrink: 1; +} + +.hero.is-halfheight { + min-height: 50vh; +} + +.hero.is-fullheight { + min-height: 100vh; +} + +.hero-video { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + overflow: hidden; +} + +.hero-video video { + left: 50%; + min-height: 100%; + min-width: 100%; + position: absolute; + top: 50%; + -webkit-transform: translate3d(-50%, -50%, 0); + transform: translate3d(-50%, -50%, 0); +} + +.hero-video.is-transparent { + opacity: 0.3; +} + +@media screen and (max-width: 768px) { + .hero-video { + display: none; + } +} + +.hero-buttons { + margin-top: 1.5rem; +} + +@media screen and (max-width: 768px) { + .hero-buttons .button { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } + .hero-buttons .button:not(:last-child) { + margin-bottom: 0.75rem; + } +} + +@media screen and (min-width: 769px), print { + .hero-buttons { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + } + .hero-buttons .button:not(:last-child) { + margin-right: 1.5rem; + } +} + +.hero-head, +.hero-foot { + -webkit-box-flex: 0; + -ms-flex-positive: 0; + flex-grow: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.hero-body { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-negative: 0; + flex-shrink: 0; + padding: 3rem 1.5rem; +} + +.section { + padding: 1.5rem 1.5rem; +} + +@media screen and (min-width: 1024px) { + .section.is-small { + padding: 1.5rem 1.5rem; + } + .section.is-medium { + padding: 9rem 1.5rem; + } + .section.is-large { + padding: 18rem 1.5rem; + } +} + +.footer { + background-color: whitesmoke; + padding: 3rem 1.5rem 6rem; +} +/*# sourceMappingURL=bulma.css.map */ diff --git a/www/themes/mosquitto/assets/css/local.css b/www/themes/mosquitto/assets/css/local.css new file mode 100644 index 00000000..591a6dde --- /dev/null +++ b/www/themes/mosquitto/assets/css/local.css @@ -0,0 +1,118 @@ +.title { + color: #363636; + font-size: 2rem; + font-weight: 300; + line-height: 1.125; +} + +finalfooter { + display: block; +} + +.finalfooter { + background-color: black; + color: whitesmoke; + padding: 1rem 1.5rem 1rem; + margin-top: 1rem; +} + +div.footerlink a { + color: whitesmoke; + cursor: pointer; + text-decoration: none; + -webkit-transition: none 86ms ease-out; + transition: none 86ms ease-out; + padding-right: 1.5rem; +} + +div.footerlink a:hover { + color: gray; +} + +.footer { + background-color: whitesmoke; + padding: 2rem 1.5rem 1rem; +} + +.column-justify { + text-align: justify; +} + +.column-justify h1 { + text-align: center; +} + +img.center { + display: block; + margin-left: auto; + margin-right: auto; +} + +/* Blog */ +h1.p-name, +.authorpage h1, +.tagpage h1 /* Tag page */{ + font-size: 36px; + margin-top: 20px; + margin-bottom: 10px; +} + +.e-content.entry-content h2 { + font-size: 150%; +} + +div.e-content { + margin-top: 14px; +} + +div.e-content.entry-content p, +div.e-content.entry-content div p, +div.e-content.entry-content div +{ + margin-bottom: 10px; +} + +div.e-content.entry-content ul { + padding-left: 40px; + margin-bottom: 10px; +} +div.e-content.entry-content ul li { + list-style-type: disc; +} + +div.e-content.entry-content div blockquote { + background-color: whitesmoke; + padding: 1.5rem; + margin: 0.5rem; +} + +.pager::before, +.pager::after { + clear: both; + display: table; + content: " "; +} +.pager .previous a { + float: left; +} +.pager .next a { + float: right; +} +.pager li { + display: inline; +} +.pager li a { + display: inline-block; + padding: 5px 14px; + border: 1px solid #ddd; + border-radius: 15px; +} + +.dateline { + margin-top: -1rem; +} + +/* Tag Page */ +.listdate { + margin-right: 3rem; +} diff --git a/www/themes/mosquitto/assets/css/man.css b/www/themes/mosquitto/assets/css/man.css new file mode 100644 index 00000000..315d5a4d --- /dev/null +++ b/www/themes/mosquitto/assets/css/man.css @@ -0,0 +1,180 @@ +/* DocBook Man Page */ + +.refentry { +} + +.refsynopsisdiv h3 { + font-size: 1.5rem; + font-weight: 350; + line-height: 1.125; + margin-top: 1rem; + margin-bottom: 0.5rem; +} + +.refnamediv h3 { + font-size: 1.5rem; + font-weight: 350; + line-height: 1.125; +} + +.refnamediv p { + +} + +.refsect1 { +} + +.refsect1 h3 { + margin-top: 1rem; + margin-bottom: 0.5rem; + font-weight: 350; + font-size: 1.5rem; +} + +.refsect1 p { + margin-top: 1rem; +} + +.refsect2 { +} + +.refsect2 h4 { + font-size: 1.25rem; + line-height: 1.5; + margin-top: 1rem; + margin-bottom: 1rem; +} + +.note h4 { + font-size: 1.25rem; + line-height: 1.5; + margin-top: 1rem; + margin-bottom: 0; +} + +.note { + margin-top: 1rem; +} + +.funcsynopsis { +} + +.funcprototype-table { +} + +.funcdef { + color: #d73a49; +} + +.funcprototype-table tr td { + font-size: 12px; + color: #d73a49; + background-color: whitesmoke; + font-family: monospace; +} + +.fsfunc { + font-size: 12px; + color: #6f42c1; + font-weight: normal; +} + +.pdparam { + font-size: 12px; + color: black; +} + +.email { + color: black; + background-color: inherit; +} + +.command { + color: black; +} + +.uri, +.literal { + background-color: inherit; + color: inherit; +} + +.filename { + color: inherit; +} + +.option { + font-family: monospace; + color: inherit; +} + +.listitem { + margin: 1rem 0 1rem 2rem; +} + +dl.variablelist dt { + margin-top: 1rem; +} + +dl.variablelist dd { + margin-left: 1rem; +} + + +.term { + background-color: whitesmoke; + font-size: 0.875rem; + padding: 0.25em 0.5em 0.25em 0; +} + +.term .option, +dd p .code, +.cmdsynopsis, +.cmdsynopsis p .command, +.cmdsynopsis p .option, +.replaceable code { + font-family: monospace; + background-color: whitesmoke; + color: black; + font-size: 0.875rem; +} + +.cmdsynopsis { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + text-indent: -2rem; + padding-left: 2rem; +} + +.informaltable { + padding: 0.5rem; +} + +.informaltable thead tr th, +.informaltable tbody tr td{ + padding: 0.5rem; +} + +.itemizedlist .listitem p { + display: inline-block; + padding: 0.25rem; + background-color: whitesmoke; + font-family: monospace; + font-size: 0.875rem; + list-style-type: none; + margin-top: 0; + margin-bottom: 0.5rem; +} + +.itemizedlist .listitem, +li.listitem { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +div.itemizedlist, +ul.itemizedlist { + margin-top: 0; + margin-bottom: 1rem; +} diff --git a/www/themes/mosquitto/engine b/www/themes/mosquitto/engine new file mode 100644 index 00000000..2951cdd4 --- /dev/null +++ b/www/themes/mosquitto/engine @@ -0,0 +1 @@ +mako diff --git a/www/themes/mosquitto/parent b/www/themes/mosquitto/parent new file mode 100644 index 00000000..df967b96 --- /dev/null +++ b/www/themes/mosquitto/parent @@ -0,0 +1 @@ +base diff --git a/www/themes/mosquitto/templates/base.tmpl b/www/themes/mosquitto/templates/base.tmpl new file mode 100644 index 00000000..c1f9d684 --- /dev/null +++ b/www/themes/mosquitto/templates/base.tmpl @@ -0,0 +1,26 @@ +## -*- coding: utf-8 -*- +<%namespace name="base" file="base_helper.tmpl" import="*"/> +<%namespace name="header" file="base_header.tmpl" import="*"/> +<%namespace name="footer" file="base_footer.tmpl" import="*"/> +<%namespace name="annotations" file="annotation_helper.tmpl"/> +${set_locale(lang)} +${base.html_headstart()} +<%block name="extra_head"> +### Leave this block alone. + +${template_hooks['extra_head']()} + + + ${header.html_header()} +
+
+ <%block name="content"> +
+
+ ${footer.html_footer()} + ${base.late_load_js()} + <%block name="extra_js"> + ${body_end} + ${template_hooks['body_end']()} + + diff --git a/www/themes/mosquitto/templates/base_footer.tmpl b/www/themes/mosquitto/templates/base_footer.tmpl new file mode 100644 index 00000000..62693ab8 --- /dev/null +++ b/www/themes/mosquitto/templates/base_footer.tmpl @@ -0,0 +1,24 @@ +## -*- coding: utf-8 -*- +<%namespace name="base" file="base_helper.tmpl" import="*"/> + +<%def name="html_footer()"> + %if content_footer: + + %endif + diff --git a/www/themes/mosquitto/templates/base_header.tmpl b/www/themes/mosquitto/templates/base_header.tmpl new file mode 100644 index 00000000..912a18ff --- /dev/null +++ b/www/themes/mosquitto/templates/base_header.tmpl @@ -0,0 +1,120 @@ +## -*- coding: utf-8 -*- +<%namespace name="base" file="base_helper.tmpl" import="*"/> + +<%def name="html_header()"> + + ${template_hooks['page_header']()} + + +<%def name="html_site_title()"> + % if (post and post.title): +
+
+
+ % if title == blog_title: +

Eclipse Mosquitto™

+

An open source MQTT broker

+ % elif post and post.title: +

${post.title()|h}

+ % endif +
+
+
+
+ % endif + + +<%def name="html_navigation_links()"> + +
+ +
+
+ + +<%def name="html_translation_header()"> + %if len(translations) > 1: +
+

${messages("Languages:")}

+ ${base.html_translations()} +
+ %endif + diff --git a/www/themes/mosquitto/templates/base_helper.tmpl b/www/themes/mosquitto/templates/base_helper.tmpl new file mode 100644 index 00000000..98439c1e --- /dev/null +++ b/www/themes/mosquitto/templates/base_helper.tmpl @@ -0,0 +1,140 @@ +## -*- coding: utf-8 -*- + +<%def name="html_headstart()"> + + + + + + + + + + % if use_base_tag: + + % endif + %if description: + + %endif + + %if title == blog_title: + ${blog_title|h} + %else: + ${title|h} | ${blog_title|h} + %endif + + ${html_stylesheets()} + + % if meta_generator_tag: + + % endif + ${html_feedlinks()} + + + %if favicons: + %for name, file, size in favicons: + + %endfor + %endif + + % if comment_system == 'facebook': + + % endif + + %if prevlink: + + %endif + %if nextlink: + + %endif + + %if use_cdn: + + %else: + + %endif + + ${extra_head_data} + + +<%def name="late_load_js()"> + ${social_buttons_code} + + +<%def name="html_stylesheets()"> + %if use_bundles: + %if use_cdn: + + %else: + + %endif + %else: + + + + + + %if has_custom_css: + + %endif + %endif + % if needs_ipython_css: + + + % endif + + +<%def name="html_feedlinks()"> + %if rss_link: + ${rss_link} + %elif generate_rss: + %if len(translations) > 1: + %for language in sorted(translations): + + %endfor + %else: + + %endif + %endif + %if generate_atom: + %if len(translations) > 1: + %for language in sorted(translations): + + %endfor + %else: + + %endif + %endif + + +<%def name="html_translations()"> + + diff --git a/www/themes/mosquitto/templates/index.tmpl b/www/themes/mosquitto/templates/index.tmpl new file mode 100644 index 00000000..8eb6f47f --- /dev/null +++ b/www/themes/mosquitto/templates/index.tmpl @@ -0,0 +1,57 @@ +## -*- coding: utf-8 -*- +<%namespace name="helper" file="index_helper.tmpl"/> +<%namespace name="math" file="math_helper.tmpl"/> +<%namespace name="comments" file="comments_helper.tmpl"/> +<%namespace name="pagination" file="pagination_helper.tmpl"/> +<%inherit file="base.tmpl"/> + +<%block name="extra_head"> + ${parent.extra_head()} + % if posts and (permalink == '/' or permalink == '/' + index_file): + + % endif + ${math.math_styles_ifposts(posts)} + + +<%block name="content"> +<%block name="content_header"> +% if 'main_index' in pagekind: + ${front_index_header} +% endif +% if page_links: + ${pagination.page_navigation(current_page, page_links, prevlink, nextlink, prev_next_links_reversed)} +% endif +
+% for post in posts: +
+
+

${post.title()|h}

+ +
+ %if index_teasers: +
+ ${post.text(teaser_only=True)} + %else: +
+ ${post.text(teaser_only=False)} + %endif +
+
+
+% endfor +
+${helper.html_pager()} +${comments.comment_link_script()} + diff --git a/www/themes/mosquitto/templates/post.tmpl b/www/themes/mosquitto/templates/post.tmpl new file mode 100644 index 00000000..47911a72 --- /dev/null +++ b/www/themes/mosquitto/templates/post.tmpl @@ -0,0 +1,50 @@ +## -*- coding: utf-8 -*- +<%namespace name="helper" file="post_helper.tmpl"/> +<%namespace name="pheader" file="post_header.tmpl"/> +<%namespace name="comments" file="comments_helper.tmpl"/> +<%namespace name="math" file="math_helper.tmpl"/> +<%inherit file="base.tmpl"/> + +<%block name="extra_head"> + ${parent.extra_head()} + % if post.meta('keywords'): + + % endif + ## + %if post.prev_post: + + %endif + %if post.next_post: + + %endif + % if post.is_draft: + + % endif + ${helper.open_graph_metadata(post)} + ${helper.twitter_card_information(post)} + ${helper.meta_translations(post)} + ${math.math_styles_ifpost(post)} + + +<%block name="content"> +
+ ${pheader.html_post_header()} +
+ ${post.text()} +
+ + % if not post.meta('nocomments') and site_has_comments: +
+

${messages("Comments")}

+ ${comments.comment_form(post.permalink(absolute=True), post.title(), post._base_path)} +
+ % endif + ${math.math_scripts_ifpost(post)} +
+${comments.comment_link_script()} + diff --git a/www/themes/mosquitto/templates/post_header.tmpl b/www/themes/mosquitto/templates/post_header.tmpl new file mode 100644 index 00000000..051fd8fd --- /dev/null +++ b/www/themes/mosquitto/templates/post_header.tmpl @@ -0,0 +1,61 @@ +## -*- coding: utf-8 -*- +<%namespace name="helper" file="post_helper.tmpl"/> +<%namespace name="comments" file="comments_helper.tmpl"/> + +<%def name="html_title()"> +%if title and not post.meta('hidetitle'): +

${post.title()|h}

+%endif + + +<%def name="html_translations(post)"> + % if len(post.translated_to) > 1: + + % endif + + +<%def name="html_sourcelink()"> + % if show_sourcelink: +

${messages("Source")}

+ % endif + + +<%def name="html_post_header()"> +
+ ##${html_title()} + + ${html_translations(post)} +
+ diff --git a/www/themes/mosquitto/templates/story.tmpl b/www/themes/mosquitto/templates/story.tmpl new file mode 100644 index 00000000..7bcfc7ed --- /dev/null +++ b/www/themes/mosquitto/templates/story.tmpl @@ -0,0 +1,25 @@ +## -*- coding: utf-8 -*- +<%namespace name="helper" file="post_helper.tmpl"/> +<%namespace name="pheader" file="post_header.tmpl"/> +<%namespace name="comments" file="comments_helper.tmpl"/> +<%namespace name="math" file="math_helper.tmpl"/> +<%inherit file="post.tmpl"/> + +<%block name="content"> +
+
+ ###${pheader.html_title()} + ${pheader.html_translations(post)} +
+
+ ${post.text()} +
+ %if site_has_comments and enable_comments and not post.meta('nocomments'): +
+

${messages("Comments")}

+ ${comments.comment_form(post.permalink(absolute=True), post.title(), post.base_path)} +
+ %endif + ${math.math_scripts_ifpost(post)} +
+